2017-10-18 12 views
0

3人の容疑者が強盗に巻き込まれている、アリス、ボブ、カール。少なくとも1人は有罪です。ここでPrologでこのパズルを解決するには? (強盗)

が条件です:

Aが有罪であれば、彼は正確に1人の共犯があります。

Bが有罪である場合、彼は正確に2人の共犯者を持っています。

誰が有罪ですか?

Prologスクリプトを作成して、guilty(X)がギャングを与えるこの問題を解決するにはどうすればよいですか?

+2

SWI-Prologのライブラリclpbを見てください。 – joel76

+0

AとCのみが有罪です。事実をPrologにプログラムして、コンピュータに推論をさせる方法を知りたいのですが。 –

+0

私はプロローグコードを書いてから長い間(20年)ですが、容疑者の2人が有罪だが3人ではないという事実を表現する述語を書くことが1つの方法だと思ったでしょう。 Btwはアリスのためだけに立っているはずですか? – MartynA

答えて

0

は、各番号は(有罪)または(無実)のいずれかになりますのは、3つの数字、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. 

3つのルールは、最後のものは報告している

the_guilty([A,B,C]):- 
    (A = 0 ; A = 1), 
    .... 
    .... 
    ok(.....). 

として、今、私たちはギャングを見つけることができます一緒に保持

ok(A,B,C):- at_least_one(A,B,C), 
      one_accomplice(A,B,C), 
      ...... . 

です3つの数字は人の名前です。私たちは、プロローグは簡単ある

など、第二は "Bob"用で、最初の数は "Alice"ためのものであることを知って 。今、私たちが得る

:- 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]). 

:ここ

1

がCLPBを使用したソリューションである

?- solve(A,B,C). 
A = B, B = 0, 
C = 1 ; 
A = C, C = 1, 
B = 0. 

回答A = B、B = 0、C = 1は、Cは、他の1有罪であることを意味しAとCは罪悪感です。

関連する問題