2017-10-18 13 views
0

Trois suspects sont impliqués dans un vol, Alice, Bob, Carl. Au moins l'un d'eux est coupable.Comment résoudre ce puzzle dans Prolog? (vol qualifié)

Voici les conditions:

Si A est coupable, il a exactement 1 complice.

Si B est coupable, il a exactement 2 complices.

Qui sont coupables?

Comment puis-je écrire un script Prolog pour résoudre ce problème que guilty(X) donne aux gangs?

+2

Vous devriez jeter un oeil à une bibliothèque clpb de SWI-Prolog – joel76

+0

Seuls A et C sont coupables, je veux savoir comment programmer les faits dans Prolog et laisser l'ordinateur faire l'inférence. –

+0

Cela fait longtemps (20 ans) que j'ai écrit un code prologue, mais j'aurais pensé qu'une façon de s'y prendre serait d'écrire des prédicats qui expriment le fait que deux des suspects sont coupables mais pas trois d'entre eux. BTW est A supposé représenter Alice? – MartynA

Répondre

0

Faisons encode l'état de notre monde comme trois chiffres, A, B et C.

Chaque numéro sera soit (coupable) ou (innocent).

Les conditions sont les suivantes:

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. 

Les trois règles tiennent ensemble est

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

Maintenant, nous pouvons trouver les gangs, comme

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

La dernière chose est à signaler les trois nombres donnés en tant que noms de personnes. Nous savons que le premier numéro est pour "Alice", le second est pour "Bob", etc.

Prolog est facile.

1

Voici une solution en utilisant 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]). 

Maintenant, nous obtenons:

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

La réponse A = B, B = 0, C = 1 signifie que C est coupable l'autre que A et C sont des guilties.