2017-10-18 144 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是有罪的。