Prolog:艺术盗窃。解决逻辑难题

时间:2014-08-14 14:20:02

标签: prolog logic artificial-intelligence puzzle negation

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

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

并想知道我怎么能开始编写这样的谜题?

令我烦恼的事情是,我们知道不良信息,你如何严格选择他们的人名单

2 个答案:

答案 0 :(得分:1)

假设我们有一个人员列表Persons和一个骗子列表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)
    
  3. 现在你可以把它与一个连词放在一起:

    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.