Prolog一阶逻辑 - 打印真值表

Art*_*ium 5 prolog boolean-expression truthtable

我必须编写打印表达式真值表的程序.所以,我写了以下函数:

bool(true).
bool(fail).

tableBody(A,B,E) :-
    bool(A),
    bool(B) ,
    write(A) ,
    write('    '),
    write(B),
    write('    '),
    write(E),nl, fail.
Run Code Online (Sandbox Code Playgroud)

我的问题是E(包含A和B的表达式)没有被评估,而是按原样打印.例如:

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.
Run Code Online (Sandbox Code Playgroud)

我有兴趣编写and(true, true)(" and(X,Y)"是我之前定义的仿函数)的评估值,而不是当前显示的值.我想过编写一个eval仿函数,但它不会产生同样的效果吗?我怎么解决这个问题?

我正在使用SWI-Prolog 5.8.谢谢.

Jef*_*ien 6

这是一种方法:

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.
Run Code Online (Sandbox Code Playgroud)

生产:

?- tableBody(A,B,and(A,B)).
true    true    true
true    false   false
false   true    false
false   false   false
false.
Run Code Online (Sandbox Code Playgroud)