2

我正在使用 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(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 ).

谁能给我一盏灯?

先感谢您!

4

1 回答 1

2
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])).
于 2021-10-13T14:52:44.147 回答