我刚刚开始学习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如何回应以下查询?
wizard(ron). -> true
witch(ron). -> undefined procedure
wizard(hermione). -> false
witch(hermione). -> undefined procedure
wizard(harry). -> true
wizard(Y). -> Y = ron ; Y = harry.
witch(Y). -> undefined procedure
在Ubuntu上使用swipl
,导入本练习的知识库,当然首先尝试解读Prolog将返回的内容,最后自己检查。
好的相当无聊的东西,直到现在,我已经看到了这些练习的一些答案超过Github(here,here和there),我不明白答案第一个:%% 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
作为这个查询的答案?
答案 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 ).