我们正在使用以下知识库:
house_elf(dobby).
witch(hermione).
witch('McGonagall').
witch(rita_skeeter).
magic(X):- house_elf(X).
magic(X):- wizard(X).
magic(X):- witch(X).
演习的问题是:
满足以下哪些查询?在相关的情况下,给出导致成功的所有变量实例化。
我遇到问题5:
?- magic(Hermione).
还绘制查询魔法的搜索树(Hermione)。
虽然我理解查询发生了什么,但我对如何绘制查询搜索树感到困惑。此外,我们的查询(Hermione)中的变量也是一个变量,这也会导致更多混乱?
请您介意指导我并解释在向Prolog提出此查询时会发生什么?
由于
答案 0 :(得分:1)
原子与变量
以大写字母开头的字符串,如Hermione
,是一个变量。如果它以小写字母开头,例如hermione
,则它是一个原子(将其视为"常数"与其他语言一样)。或者如果它在单引号中,如'Hermione'
,它也是一个原子。
以下是事实:
witch(hermione).
可以阅读: hermione
是witch
。它是如何真正阅读的(或更具体地说,它的语义是什么)取决于你,程序员。
如果我在Prolog提示符中查询此事实,它将成功:
| ?- witch(hermione).
yes
(注意,这是gprolog
,因此它会产生yes
。我认为SWI Prolog会说true
,但它们都意味着&#34;成功&#34;。)< / p>
我也可以用变量查询,Prolog会告诉你变量的实例化(设置)是否正确:
| ?- witch(Hermione).
Hermione = hermione ? ;
Hermione = 'McGonagall' ? ;
Hermione = rita_skeeter
(1 ms) yes
请记住:Hermione
是一个变量,而hermione
是一个原子。它们不是同一件事。因此,变量Hermione
可以具有上述值中的任何一个,以使witch(Hermione)
成立。您也可以查询witch(Fred)
,并使用Fred
代替Hermione
获得相同的结果。
基本谓词逻辑
现在让我们看一下谓词,magic/1
(此处1
表示 arity ,或者magic
参数可能如何):
magic(X):- house_elf(X).
magic(X):- wizard(X).
magic(X):- witch(X).
从语义上讲,如果X
是magic
,或者X
是house_elf
,则可以将其视为 X
为magic
如果X
是wizard
,如果X
是magic
,则X
为witch
。
如果我们再查询:
| ?- magic(Hermione).
Prolog将尝试找出Hermione
的哪些实例会使其成功并告诉您这些值是什么。在您的所有事实和谓词中,它将在magic(X):- house_elf(X).
子句中找到第一个匹配项,使用Hermione
作为变量代替X
,它会发现{{1} }},然后Hermione = dobby
将为真,因此house_elf(Hermione)
将为真。它将显示为第一个解决方案:magic(Hermione)
:
Hermione = dobby
通过在此处按| ?- magic(Hermione).
Hermione = dobby ? ;
(或SPACE),Prolog将尝试找到下一个解决方案,在这种情况下,它将无法找到下一个成功,直到它转到下一个子句{{1 }}。假设你有;
的一些事实,那么它就会成功。如果您的事实或谓词中未定义magic(X):- wizard(X).
,那么您将从Prolog中获得存在错误,指出它不知道wizard/1
是什么。 Prolog将继续浏览你的谓词条款,寻找使它成功的方法,并告诉你wizard/1
的什么价值(实例化)将会如此,直到它已经用尽所有的情况。然后它最终会停止。
我会将其留作练习以找出搜索树,但是在&#34; Prolog搜索树上进行Google搜索&#34;找到一些good examples。我假设您有Prolog解释器,您可以在其中输入代码并使用查询来查看会发生什么。您可以启用跟踪(输入wizard/1
)以查看Prolog正在对查询执行的操作的一些详细信息。所有这些方法都有助于理解Prolog操作的某些方面。