knights and knaves 谜题中的未知程序 card/2

Unknown procedure card/2 in knights and knaves puzzle

我正在使用 sat/1 和使用自定义命题 A 说 B 和 false() 的更自然的语言方法编写一些骑士和无赖的谜题。

问题3陈述如下:

你遇到了三个居民,A、B 和 C。

A说:“我们三个都是无赖”。

B 说:“正好我们中的一个人是骑士”。

但是,在我使用自定义命题的解决方案中,出于某种原因,prolog 为我提供了未知过程 card/2。这是代码(参见 question3_again 命题)。


question3(A,B,C):- sat(A =:= card([0],[A,B,C])), sat(B =:= card([1],[A,B,C])).

% Now let's make it more intuitive to work with prolog by creating our own operator:

:- op(900,xfy,says).

knight says S :- S.
knave  says S :- false(S).

false(A = B) :- dif(A,B).
false( (A ; B) ) :- false(A), false(B).
false( (A , B) ) :- false(A); false(B).

question3_again(A,B,C) :- A says ( A = knave, B = knave, C = knave ),
                         B says ( card( [1], [A = knight, B = knight, C = knight] ) ).

我尝试计算骑士的数量并改用下面的解决方案,但它给了我错误的答案(我添加了 false(A #= B) :- A #\= B. 所以 false 可以推理整数):

false(A #= B) :- A #\= B.

counte(_,[],Count,Count).
counte(E,[H|T],C,Count) :- (E = H, CC is C+1 ; CC is C), counte(E,T,CC,Count).
counte(E,L,Count) :- counte(E,L,0,Count).

question3_again(A,B,C) :- counte(knight,[A,B,C],Knights),
                          A says ( Knights #= 0 ),
                          B says ( Knights #= 1 ).

谁能给我一盏灯?

提前致谢!

question3_again(A,B,C) :- A says ( A = knave, B = knave, C = knave ),
                          B says (permutation([A, B, C], [knave, knave, knight])).
?- question3_again(A, B, C).
A = C, C = knave,
B = knight

使用permutation,您将多次获得相同的解决方案。如果你愿意,你可以通过以下方式避免这种情况:

one_knight(X) :- nth0(_, X, knight, [knave, knave]).
?- one_knight(X).
X = [knight, knave, knave] ;
X = [knave, knight, knave] ;
X = [knave, knave, knight] ;
false.

permutation 会给出 6 个选择。

现在您的解决方案将是:

question3_again(A,B,C) :- A says ( A = knave, B = knave, C = knave ),
                          B says (one_knight([A, B, C])).