绘制查询搜索树时的困惑?

时间:2015-01-02 08:48:41

标签: prolog logic search-tree

我们正在使用以下知识库:

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提出此查询时会发生什么?

由于

1 个答案:

答案 0 :(得分:1)

原子与变量

以大写字母开头的字符串,如Hermione,是一个变量。如果它以小写字母开头,例如hermione,则它是一个原子(将其视为"常数"与其他语言一样)。或者如果它在单引号中,如'Hermione',它也是一个原子。

以下是事实:

witch(hermione).

可以阅读: hermionewitch 。它是如何真正阅读的(或更具体地说,它的语义是什么)取决于你,程序员。

如果我在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).

从语义上讲,如果Xmagic,或者Xhouse_elf,则可以将其视为 Xmagic如果Xwizard,如果Xmagic ,则Xwitch

如果我们再查询:

| ?- 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操作的某些方面。