三名嫌疑人涉嫌抢劫,Alice,Bob,Carl。至少其中一人是有罪的。
以下是条件:
如果A有罪,他只有1个帮凶。
如果B有罪,他有两个同谋。
谁有罪?
如何编写Prolog
脚本来解决guilty(X)
给团伙带来的问题?
答案 0 :(得分:1)
以下是使用clpb的解决方案:
:- use_module(library(clpb)).
solve(A,B,C) :-
% there is a least one guilty
sat(A + B + C),
% If A is guilty, he has exactly 1 accomplice.
sat(A =< B # C),
% if B is guilty, he has exactly 2 accomplices.
sat(B =< A * C),
% Assigns truth values to the variables such that all constraints are satisfied.
labeling([A,B,C]).
现在我们得到:
?- solve(A,B,C).
A = B, B = 0,
C = 1 ;
A = C, C = 1,
B = 0.
答案A = B,B = 0,C = 1意味着C是有罪的另一个A和C是有罪的。
答案 1 :(得分:0)
让我们将世界的状态编码为三个数字,A,B和C.
每个号码都是 1 (有罪)或 0 (无辜)。
条件是:
at_least_one(A,B,C):- 0 < A+B+C.
one_accomplice(A,B,C):- A == 1 -> 1 is ....... ; true.
two_accomplices(A,B,C):- B == 1 -> ....... ; true.
共同遵守的三条规则是
ok(A,B,C):- at_least_one(A,B,C),
one_accomplice(A,B,C),
...... .
现在我们可以找到帮派,如
the_guilty([A,B,C]):-
( A = 0 ; A = 1 ),
....
....
ok( ..... ).
最后一件事是将三个给定的数字报告为人名。我们知道第一个号码是"Alice"
,第二个号码是"Bob"
等。
Prolog很容易。