如何在Prolog中解决这个难题? (抢劫)

时间:2017-10-18 06:40:13

标签: prolog logic constraint-satisfaction

三名嫌疑人涉嫌抢劫,Alice,Bob,Carl。至少其中一人是有罪的。

以下是条件:

如果A有罪,他只有1个帮凶。

如果B有罪,他有两个同谋。

谁有罪?

如何编写Prolog脚本来解决guilty(X)给团伙带来的问题?

2 个答案:

答案 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很容易。