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