Prolog 一阶逻辑 - 打印真值表
Posted
技术标签:
【中文标题】Prolog 一阶逻辑 - 打印真值表【英文标题】:Prolog First Order Logic - Printing a Truth Table 【发布时间】:2010-01-20 15:30:35 【问题描述】:我必须编写打印表达式真值表的程序。 所以,我写了以下函数:
bool(true).
bool(fail).
tableBody(A,B,E) :-
bool(A),
bool(B) ,
write(A) ,
write(' '),
write(B),
write(' '),
write(E),nl, fail.
我的问题是 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.
我有兴趣编写and(true, true)
的评估值(“and(X,Y)
”是我之前定义的函子)而不是当前显示的值。
我想过写一个 eval 函子,但它不会有同样的效果吗?
我该如何解决这个问题?
我正在使用 SWI-Prolog 5.8。 谢谢。
【问题讨论】:
很好奇,我不懂 Prolog,但即使使用现有的编程知识/经验,我什至无法远程理解该代码的作用。哈哈。 【参考方案1】:这是一种方法:
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.
【讨论】:
【参考方案2】:和往常一样,这里是单行
?- 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
【讨论】:
以上是关于Prolog 一阶逻辑 - 打印真值表的主要内容,如果未能解决你的问题,请参考以下文章