首页 文章

Prolog将谓词统一为参数

提问于
浏览
3

这可能很简单!

我在规则参数中有一个谓词 . 我用一个使谓词为真的事实来查询规则 . 我希望SWI-Prolog能够将谓词应用到事实中,推断出它的真值(真实)并且可以正确地返回(真实) . 但我确实是假的 .

我的事实:

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

我的查询:

?- chord(cMaj).

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

1 回答

  • 3

    这只是@mbratch在评论中写的扩展版本 . 但也许它可以帮助一些:

    在Prolog中,我们可以阅读 chord(cMaj) 来说"C Major is a chord" . 要找出Prolog认为您对 chord/1 的定义所说的内容,请使用自由变量进行查询:

    ?- chord(X).
    X = key(_G1419).
    

    Prolog将 chord/1 的定义读作复杂序言的描述:“术语 key(_) 是一个和弦” . 这是与术语匹配的模式的工作原理 . chord(X) 只要 Xkey(_) 形式不相符就是真的,正如 list_head([Head|Tail], Head)Head 与列表中的第一个元素统一并且 Tail 与其余元素统一一样 .

    您对 key/1 的定义说“ cMajcMin 是键”(它也是命名术语 - 在本例中是原子) . 要使 chord(cMaj) 结果为真,我们需要定义 chord/1 ,如果 key(X) 为真,则 chord(X) 为真:

    chord(X) :- key(X).
    

    key/1 现在显示为要评估的术语, XcMajaMin 统一 . 这有效地 Build chord/1 作为 key/1 的同义词:它们各自描述相同的对象 .

相关问题