2017-10-18 142 views
0

三名涉嫌抢劫的犯罪嫌疑人,爱丽丝,鲍勃,卡尔。至少其中一人是有罪的。如何在Prolog中解决这个难题? (抢劫)

这里的条件是:

如果A是有罪的,他正好有1帮凶。

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

谁是有罪?

我该如何编写一个Prolog脚本来解决guilty(X)给帮派带来的问题?

+2

你应该看一看SWI-Prolog的库clpb – joel76

+0

只有A和C有罪,我想知道如何将事实编程到Prolog中并让计算机进行推理。 –

+0

自从我写了任何prolog代码以来,这已经很长一段时间(20年)了,但是我会想一个办法是编写谓词来表达两个嫌疑犯有罪但不是其中三个的事实。顺便说一句,只应该代表爱丽丝? – MartynA

回答

0

让我们这个世界的状态编码为三个数字,A,B和C.

每个号码可获要么(犯)或(无罪)。

的条件是:

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是容易

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