【问题标题】:Confusion whilst drawing query search tree?绘制查询搜索树时感到困惑?
【发布时间】:2015-01-02 08:48:40
【问题描述】:

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

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) 是一个变量这一事实也会导致更多的混乱?

请您指导我并解释当这个查询被提交给 Prolog 时发生了什么?

谢谢

【问题讨论】:

    标签: prolog logic search-tree


    【解决方案1】:

    原子与变量

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

    以下是事实:

    witch(hermione).
    

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

    如果我在 Prolog 提示符下查询这个事实,它会成功:

    | ?- witch(hermione).
    
    yes
    

    (注意,这是gprolog,所以它产生yes。我认为SWI Prolog 会说true,但它们都表示“成功”。)

    我也可以使用变量进行查询,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,它会发现如果Hermione = dobby,那么house_elf(Hermione) 将是真的,因此,magic(Hermione) 将是真的。它将显示作为第一个解决方案:Hermione = dobby:

    | ?- magic(Hermione).
    
    Hermione = dobby ? ;
    

    在此处按;(或SPACE),Prolog 将尝试找到下一个解决方案,在这种情况下,它不会找到下一个成功,直到它进入下一个子句magic(X):- wizard(X).。假设您有一些关于wizard/1 的事实,它将在这些方面取得成功。如果wizard/1 没有在你的事实或谓词中定义,那么你会从Prolog 中得到一个存在错误,指出它不知道wizard/1 是什么。 Prolog 将继续遍历您的谓词子句,寻找使其成功的方法,并告诉您 Hermione 的什么值(实例化)将使它如此,直到它用尽所有情况。然后它最终会停止。

    我将把它作为一个练习来计算搜索树,但在“Prolog 搜索树”上进行 Google 搜索以找到一些 good examples。我假设您有 Prolog 解释器,您可以在其中输入代码并使用查询来查看会发生什么。您可以启用跟踪(输入trace.)以查看有关 Prolog 在查询中所做的一些详细信息。所有这些方法都可以帮助理解 Prolog 操作的某些方面。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多