0

刚开始接触 Prolog,因为人工智能非常有趣,并且与许多其他编程语言不同,我偶然发现了一个逻辑难题:

http://www.brainbashers.com/showpuzzles.as

并想知道我如何开始编写这样一个难题?

让我非常困扰的是我们知道不良信息的事实,您将如何从人员列表中严格选择他们

4

2 回答 2

1

假设我们有一个 personPersons列表和一个 liars 列表Liars。您可以将问题分解为两个要求:

  1. 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
    
  2. 骗子有四个:

    length(Liars,4)
    

现在你可以把它和一个连词放在一起:

length(Liars,4),sublist(Persons,Liars)

我把length(Liars,4)它放在前面是因为它是确定性的,而sublist/2创建了选择点。

于 2014-08-14T18:05:03.110 回答
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.
于 2014-08-14T20:20:22.357 回答