Prolog将谓词统一为参数

时间:2014-04-02 01:35:15

标签: parameters prolog predicate

这可能很简单!

我在规则参数中有一个谓词。我用一个使谓词为真的事实来查询规则。我希望SWI-Prolog能够将谓词应用于事实,推断它的真值(真实)并按顺序返回(真实)。但我确实是假的。

我的事实:

key(cMaj).
key(aMin).
chord(key(X)).

我的查询:

?- chord(cMaj).

因为key(cMaj)是真的,我希望Prolog做出这个推论并返回true。我做错了。任何人都可以解释原因吗?

1 个答案:

答案 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现在显示为要评估的字词,aMinchord/1key/1统一。这有效地将{{1}}建立为{{1}}的同义词:它们各自描述相同的对象。