刚开始进入Prolog作为人工智能非常有趣,并且与其他编程语言不同,我偶然发现了一个逻辑难题:
http://www.brainbashers.com/showpuzzles.as
并想知道我怎么能开始编写这样的谜题?
令我烦恼的事情是,我们知道不良信息,你如何严格选择他们的人名单
答案 0 :(得分:1)
假设我们有一个人员列表Persons
和一个骗子列表Liars
。
您可以将问题分解为两个要求:
Liars
是"子列表" Persons
:我们需要一个额外的谓词,例如sublist(Persons,Liars)
:
sublist([],[]). % base case: empty list
sublist([H|T],[H|Rest]) :- sublist(T,Rest). % the sublist may contain H ...
sublist([_|T],Rest) :- sublist(T,Rest). % ... or not
正好有四个骗子:
length(Liars,4)
现在你可以把它与一个连词放在一起:
length(Liars,4),sublist(Persons,Liars)
我将length(Liars,4)
置于前面,因为它是确定性的,而sublist/2
创造了选择点。
答案 1 :(得分:0)
此代码使用SWI-Prolog'库(聚合)来轻松计算......
s(a, b, d, e).
s(b, a, c, e).
s(c, b, f, e).
s(d, a, f, c).
s(e, c, d, f).
s(f, c, d, a).
count_lies(T, N) :-
aggregate_all(count, (s(_, X,Y,Z), (T==X;T==Y;T==Z)), N).
solve(P) :-
member(P, [a,b,c,d,e,f]), count_lies(P, 4).
试验:
?- solve(P).
P = c ;
false.