Prolog一阶逻辑 - 打印真值表

5

我需要编写一个可以打印表达式真值表的程序,因此我编写了以下函数:

bool(true).
bool(fail).

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

我的问题是,包含A和B的表达式E没有被计算,而是按原样打印出来。例如:

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.

我希望将and(true, true)的计算值("and(X,Y)"是我之前定义的一个函数)写入显示内容,而不是当前显示的内容。

我考虑编写一个eval函数,但它是否会产生相同的效果呢?

我正在使用SWI-Prolog 5.8。

谢谢。


4
有点好奇,我不太懂Prolog,但即使利用现有的编程知识和经验,我也无法远程了解那段代码在做什么。哈哈。 - Nick Bedford
2个回答

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.

输出:

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

3

通常情况下,这里是一行代码

?- 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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接