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