我正在使用 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 ).
谁能给我一盏灯?
先感谢您!