这可能很简单!
我在规则参数中有一个谓词 . 我用一个使谓词为真的事实来查询规则 . 我希望SWI-Prolog能够将谓词应用到事实中,推断出它的真值(真实)并且可以正确地返回(真实) . 但我确实是假的 .
我的事实:
key(cMaj). key(aMin). chord(key(X)).
我的查询:
?- chord(cMaj).
因为 key(cMaj) 是真的,我希望Prolog做出这个推论并返回true . 我确实是假的 . 任何人都可以解释原因吗?
key(cMaj)
这只是@mbratch在评论中写的扩展版本 . 但也许它可以帮助一些:
在Prolog中,我们可以阅读 chord(cMaj) 来说"C Major is a chord" . 要找出Prolog认为您对 chord/1 的定义所说的内容,请使用自由变量进行查询:
chord(cMaj)
chord/1
?- chord(X). X = key(_G1419).
Prolog将 chord/1 的定义读作复杂序言的描述:“术语 key(_) 是一个和弦” . 这是与术语匹配的模式的工作原理 . chord(X) 只要 X 与 key(_) 形式不相符就是真的,正如 list_head([Head|Tail], Head) 与 Head 与列表中的第一个元素统一并且 Tail 与其余元素统一一样 .
key(_)
chord(X)
X
list_head([Head|Tail], Head)
Head
Tail
您对 key/1 的定义说“ cMaj 和 cMin 是键”(它也是命名术语 - 在本例中是原子) . 要使 chord(cMaj) 结果为真,我们需要定义 chord/1 ,如果 key(X) 为真,则 chord(X) 为真:
key/1
cMaj
cMin
key(X)
chord(X) :- key(X).
key/1 现在显示为要评估的术语, X 与 cMaj 或 aMin 统一 . 这有效地 Build chord/1 作为 key/1 的同义词:它们各自描述相同的对象 .
aMin
1 回答
这只是@mbratch在评论中写的扩展版本 . 但也许它可以帮助一些:
在Prolog中,我们可以阅读
chord(cMaj)
来说"C Major is a chord" . 要找出Prolog认为您对chord/1
的定义所说的内容,请使用自由变量进行查询:Prolog将
chord/1
的定义读作复杂序言的描述:“术语key(_)
是一个和弦” . 这是与术语匹配的模式的工作原理 .chord(X)
只要X
与key(_)
形式不相符就是真的,正如list_head([Head|Tail], Head)
与Head
与列表中的第一个元素统一并且Tail
与其余元素统一一样 .您对
key/1
的定义说“cMaj
和cMin
是键”(它也是命名术语 - 在本例中是原子) . 要使chord(cMaj)
结果为真,我们需要定义chord/1
,如果key(X)
为真,则chord(X)
为真:key/1
现在显示为要评估的术语,X
与cMaj
或aMin
统一 . 这有效地 Buildchord/1
作为key/1
的同义词:它们各自描述相同的对象 .