真相和Lier-teller Prolog

时间:2017-04-22 11:54:40

标签: prolog logic

我是prolog的新手,我得到了以下问题。这实际上是一个额外的挑战课,但我甚至不知道开始。我会感谢任何想法或小例子(更好)。

在太平洋的一个岛上,有两种类型的居民:总是说真话的人和总是撒谎的人。然而,两者都深刻地意识到命题演算。到达十字路口,你会发现其中一个居民,但你不知道他/她属于哪个部落。您也知道其中一种方式可以安全地带您到酒店,另一种方式可以带您到致命的峡谷。知道原住民只会对一个问题回答“是”或“否”。在PROLOG中开发一个程序,找到一个命题性的微积分句子,允许你选择正确的安全返回方式,无论这个问题是否被问到骗子部落的居民或真相出纳员。

1 个答案:

答案 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时,您应该反过来。