Prolog First Order Logic - Printing a Truth Table

boolean-expression, prolog, truthtable

Solution

Here's one way to do it:

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.

Produces:

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

Problem

I have to write program that prints a truth table of expressions. So, I wrote the following function: ``` bool(true). bool(fail). tableBody(A,B,E) :- bool(A), bool(B) , write(A) , write(' '), write(B), write(' '), write(E),nl, fail. ``` My problem is that E (wich is expression that contains A and B) is not evaluated, but printed as is. For example: ``` 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. ``` I am interested to write the evaluated value of `and(true, true)` ("`and(X,Y)`" is a functor I defined earlier) instead of what is currently displayed. I thought about writing an eval functor, but would not it have the same effect? How can I solve this? I am using SWI-Prolog 5.8. Thank you.

Original source