Prolog premier ordre logique - Impression d'une table de vérité
-
21-09-2019 - |
Question
Je dois écrire le programme qui imprime une table de vérité des expressions. Alors, je l'ai écrit la fonction suivante:
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 expression qui contient A et B) n'a pas été évaluée, mais imprimé tel quel. 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é.
Je pensais à écrire un foncteur eval, mais ne serait-il avoir le même effet?
Comment puis-je résoudre ce problème?
Je suis en utilisant SWI-Prolog 5.8. Merci.
La solution
Voici 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.
Autres conseils
Comme d'habitude, ici en une ligne
?- 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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow