2

这就是问题 :

维克多被谋杀,亚瑟、伯特伦和卡尔顿是嫌疑人。亚瑟说他没有这样做。他说伯特伦是受害者的朋友,但卡尔顿讨厌受害者。伯特伦说他在谋杀那天不在城里,而且他甚至不认识那个人。卡尔顿说他是无辜的,他在谋杀前看到亚瑟和伯特伦与受害者在一起。假设每个人——可能除了凶手——都在说真话,用决心来解决罪行。

这是我在 SWI Prolog 中写的

% Facts:
p('Arthur').    % suspect
p('Bertram').   % suspect
p('Carleton').  % suspect
p('Victor').    % victim
% Arthur
says('Arthur', i('Arthur')).
says('Arthur', f('Bertram', 'Victor')).
says('Arthur', ht('Carleton', 'Victor')).
% Bertram
says('Bertram', o('Bertram')).
says('Bertram', nk('Bertram', 'Victor')).
% Carleton
says('Carleton', i('Carleton')).
says('Carleton', t('Arthur', 'Victor')).
says('Carleton', t('Bertram', 'Victor')).
% Rules:
holds(X) :- says(Y, X), \+m(Y).
holds(i(X)) :- p(X), \+m(X).
holds(f(X,Y)) :- p(X), p(Y), holds(f(Y,X)).
holds(f(X,Y)) :- p(X), p(Y), \+holds(nk(X,Y)).
holds(o(X)) :- p(X), p(Y), holds(t(X,Y)).
holds(o(X)) :- p(X), \+m(X).
holds(nk(X,Y)) :- p(X), p(Y), \+holds(nk(Y,X)).
holds(nk(X,Y)) :- p(X), p(Y), \+holds(f(X,Y)).
holds(t(X,Y)) :- p(X), p(Y), holds(t(Y,X)).
holds(t(X,Y)) :- p(X), p(Y), p(Z), holds(t(X,Z)), holds(t(Z,Y)).
m(X) :- p(X).

答案应该是伯特伦,但我一直在找亚瑟。不知道我在做什么错。

4

2 回答 2

1

我相当肯定规则会比这简单得多。

例如m(X) :- p(X).,鉴于 p(X) 始终为真,这意味着什么?维克多有话要说吗?

在逻辑上,必须坚持奥卡姆剃刀原则编程逻辑也不例外,尽管该术语具有更实际的内涵——参见KISS 原则

我认为我们只能同意谋杀应该是与其他两个矛盾的人。只有一个事实存在问题:一个人是否认识维克多。

那么我们对犯罪的了解可以总结为:

t(a) :- k(b), k(c).
t(b) :- \+ k(b).
t(c) :- k(a), k(b).
k(_).

其中 t(X) 代表X testimony that,而 k(X) 代表X known Victor。我们并不真正了解 k(X),那么我们必须添加 k(_)。

有了这个,Prolog 可以建议:

?- t(X).
X = a ;
X = c.

即只有a 或b 可以为真。

编辑:因为 Prolog 在否定时并不积极,所以这是一种征求解决方案的方法:

m(X) :- member(X, [a,b,c]), \+ t(X).

但是让我们采取更明确的方法:

如上所示,我们的事实库也可以表达为:

say(a, know_victim(b, yes)).
say(a, know_victim(c, yes)).

say(b, know_victim(b, no)).

say(c, know_victim(a, yes)).
say(c, know_victim(b, yes)).

现在让我们看看是否有人说与其他人相反

liar(I) :-
    select(I, [a,b,c], Js),
    say(I, Fact),
    maplist(negate(Fact), Js).
negate(know_victim(I, X), J) :-
    say(J, know_victim(I, Y)),
    X \= Y.

产量

?- liar(I).
I = b ;
false.
于 2013-05-11T05:44:13.380 回答
0

https://github.com/Anniepoo/prolog-examples

包含解决此问题的几种不同方法。

于 2013-05-12T03:35:46.890 回答