我是prolog的新手,我得到了以下问题。这实际上是一个额外的挑战课,但我甚至不知道开始。我会感谢任何想法或小例子(更好)。
在太平洋的一个岛上,有两种类型的居民:总是说真话的人和总是撒谎的人。然而,两者都深刻地意识到命题演算。到达十字路口,你会发现其中一个居民,但你不知道他/她属于哪个部落。您也知道其中一种方式可以安全地带您到酒店,另一种方式可以带您到致命的峡谷。知道原住民只会对一个问题回答“是”或“否”。在PROLOG中开发一个程序,找到一个命题性的微积分句子,允许你选择正确的安全返回方式,无论这个问题是否被问到骗子部落的居民或真相出纳员。
答案 0 :(得分:0)
您可以做的是:
% initialize which way is safe
isSafe(left).
% predicates for truth and lie tellers
truthTeller(X) :- X.
lieTeller(X) :- \+ X.
wouldTheOtherSay(X) :- truthTeller(lieTeller(X)).
然后你要问的是:
? - willTheOtherSay(isSafe(左))。
这将永远是谎言,所以如果答案是yes
你应该正确而反之亦然。
这是另一个版本:
% initialize which way is safe
isSafe(left).
% initialize who is a truth-teller & who is a lie-teller
truthTeller(dean).
lieTeller(sean).
% a truth-teller would say Y is true if Y is true
% a lie-teller would say Y is true if Y is false
wouldSay(X,Y) :-
truthTeller(X),Y;
lieTeller(X),\+Y.
% a truth-teller would say the other would say Y is true if Y is false
% a lie-teller would lie and say the other would say Y is true if Y is false
wouldTheOtherSay(X,Y) :-
truthTeller(X),lieTeller(Z),wouldSay(Z,Y);
lieTeller(X),truthTeller(Z),wouldSay(Z,\+Y).
% this is so you don't get true then false -- we keep the first result
onceWouldTheOtherSay(X,Y) :- once(wouldTheOtherSay(X,Y)).
然后:
?- onceWouldTheOtherSay(sean,isSafe(left)).
?- onceWouldTheOtherSay(dean,isSafe(left)).
会给你no
,并且:
?- onceWouldTheOtherSay(sean,isSafe(right)).
?- onceWouldTheOtherSay(dean,isSafe(right)).
会给你yes
。
但是,当lie*truth
等于truth*lie
等于lie
时,您应该反过来。