刚开始接触 Prolog,因为人工智能非常有趣,并且与许多其他编程语言不同,我偶然发现了一个逻辑难题:
http://www.brainbashers.com/showpuzzles.as
并想知道我如何开始编写这样一个难题?
让我非常困扰的是我们知道不良信息的事实,您将如何从人员列表中严格选择他们
刚开始接触 Prolog,因为人工智能非常有趣,并且与许多其他编程语言不同,我偶然发现了一个逻辑难题:
http://www.brainbashers.com/showpuzzles.as
并想知道我如何开始编写这样一个难题?
让我非常困扰的是我们知道不良信息的事实,您将如何从人员列表中严格选择他们
假设我们有一个 personPersons
列表和一个 liars 列表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
创建了选择点。
此代码使用 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.