2010-01-20 9 views
4

Je dois écrire un programme qui imprime une table de vérité d'expressions. Donc, j'ai écrit la fonction suivante:Logique de premier ordre Prolog - Impression d'une table de vérité

bool(true). 
bool(fail). 

tableBody(A,B,E) :- 
    bool(A), 
    bool(B) , 
    write(A) , 
    write(' '), 
    write(B), 
    write(' '), 
    write(E),nl, fail. 

Mon problème est que E (Wich est l'expression qui contient A et B) ne sont pas évalués, mais imprimé est. Par exemple:

296 ?- table(A,B,and(A,B)). 
A B expr(A,B) 
true true and(true, true) 
true fail and(true, fail) 
fail true and(fail, true) 
fail fail and(fail, fail) 
false. 

Je suis intéressé à écrire la valeur évaluée de and(true, true)and(X,Y) » est un foncteur je définissais plus tôt) au lieu de ce qui est affiché. J'ai pensé écrire un foncteur Eval, mais cela n'aurait-il pas le même effet? Comment puis-je résoudre ce problème? Je utilise SWI-Prolog 5.8. Merci.

+3

curieux, je ne comprends pas Prolog, mais même en utilisant les connaissances/expériences de programmation existantes, je ne peux même pas comprendre à distance ce que fait ce code. Haha. –

Répondre

6

est ici une façon de le faire:

and(A, B) :- A, B. 

evaluate(E, true) :- E, !. 
evaluate(_, false). 

bool(true). 
bool(false). 

tableBody(A,B,E) :- 
    bool(A), 
    bool(B), 
    write(A), 
    write(' \t '), 
    write(B), 
    write(' \t '), 
    evaluate(E, Result), 
    write(Result),nl, fail. 

Produit:

?- tableBody(A,B,and(A,B)). 
true true true 
true false false 
false true false 
false false false 
false. 
3

Comme d'habitude, un liner ici

?- forall((member(A,[true,false]),member(B,[true,false]),(A,B->C=true;C=false)),format('~w|~w|~w~n',[A,B,C])). 
true|true|true 
true|false|false 
false|true|false 
false|false|false