现在学习Prolog:为什么回答练习1.5的第一个问题?

时间:2017-07-20 21:54:23

标签: prolog

我刚刚开始学习Prolog,我想知道这个exercise的第一个问题。

%% Suppose we are working with the following knowledge base:
wizard(ron).
hasWand(harry).
quidditchPlayer(harry).
wizard(X) :- hasBroom(X), hasWand(X).
hasBroom(X) :- quidditchPlayer(X).

Prolog如何回应以下查询?

  1. wizard(ron). -> true
  2. witch(ron). -> undefined procedure
  3. wizard(hermione). -> false
  4. witch(hermione). -> undefined procedure
  5. wizard(harry). -> true
  6. wizard(Y). -> Y = ron ; Y = harry.
  7. witch(Y). -> undefined procedure
  8. 在Ubuntu上使用swipl,导入本练习的知识库,当然首先尝试解读Prolog将返回的内容,最后自己检查。

    好的相当无聊的东西,直到现在,我已经看到了这些练习的一些答案超过Github(hereherethere),我不明白答案第一个:%% 1. wizard(ron). -> true

    首先,解释器抱怨什么是wizard的两个定义:

    Warning: /tmp/prolog/ex15.pl:4:
        Clauses of wizard/1 are not together in the source-file
          Earlier definition at /tmp/prolog/ex15.pl:1
          Current predicate: quidditchPlayer/1
          Use :- discontiguous wizard/1. to suppress this message
    

    其次,在查询时我获得:

    ?- wizard(ron).
    true ;
    false.
    

    我得到它的方式,首先Prolog从知识库返回第一个事实,然后应用规则头并发现ron既没有扫帚也没有魔杖。

    所有这些导致了我的问题:我错过了什么微妙之处让其他人写true作为这个查询的答案?

1 个答案:

答案 0 :(得分:2)

  

我错过了什么微妙之处,这使得其他人真实地回答了这个问题?

`?- wizard(ron).`
true;
false

您的KB中包含子句(事实)wizard(ron).

为了使事情更清楚,你可以将事实写成规则条款:

wizard(ron) :- true.

正如您所看到的,这是非常多余的符号,但在某些情况下作为一般事实表示非常有用。

因此您的查询可以解释如下:

是否有wizard名为ron

因为你有事实wizard(ron) :- true.

Prolog将首先统一目标和头脑。 在你的情况下,统一是微不足道的比较,因为目标和头脑中没有变量。

然后Prolog试图证明身体。主体内置谓词true,因此您可以快速得到答案 - true

然后按';'您开始寻找替代解决方案。 由于查询wizard(ron)不存在(更多)解决方案,Prolog会写 false

点运算符指定子句结束。所以你错误地在你的例子中输入了点:

->运算符表示if-then-else关系。它可以在子句体内使用。

例如,您可以将std_member/2写为if_member/2

std_member(X, [ X | _  ]).
std_member(X, [ _ | Xs ]) :-
    std_member(X, [ _ | Xs).

if_member(X, [ Y | Xs ]) :-
    X = Y ->  true;
       if_member( X, Xs ).