0

三名嫌疑人参与抢劫,爱丽丝、鲍勃、卡尔。其中至少有一个是有罪的。

以下是条件:

如果 A 有罪,他正好有 1 个同谋。

如果 B 有罪,他正好有 2 个同谋。

谁有罪?

我怎样才能写一个Prolog脚本来解决这个guilty(X)给帮派带来的问题?

4

2 回答 2

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 有罪。

于 2017-10-21T21:36:46.303 回答
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( ..... ).

最后一件事是将三个给定的数字报告为人名。我们知道第一个数字是 for "Alice",第二个是 for "Bob",以此类推。

Prolog 很简单

于 2017-10-20T17:03:15.913 回答