三名嫌疑人参与抢劫,爱丽丝、鲍勃、卡尔。其中至少有一个是有罪的。
以下是条件:
如果 A 有罪,他正好有 1 个同谋。
如果 B 有罪,他正好有 2 个同谋。
谁有罪?
我怎样才能写一个Prolog
脚本来解决这个guilty(X)
给帮派带来的问题?
三名嫌疑人参与抢劫,爱丽丝、鲍勃、卡尔。其中至少有一个是有罪的。
以下是条件:
如果 A 有罪,他正好有 1 个同谋。
如果 B 有罪,他正好有 2 个同谋。
谁有罪?
我怎样才能写一个Prolog
脚本来解决这个guilty(X)
给帮派带来的问题?
这是使用 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 有罪。
让我们将我们世界的状态编码为三个数字,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( ..... ).
最后一件事是将三个给定的数字报告为人名。我们知道第一个数字是 for "Alice"
,第二个是 for "Bob"
,以此类推。
Prolog 很简单。