Prolog 一阶逻辑 - 打印真值表

发布于 2024-08-19 02:46:50 字数 651 浏览 5 评论 0原文

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

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。 谢谢。

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.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

梦里的微风 2024-08-26 02:46:50

这是一种方法

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.

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.
平定天下 2024-08-26 02:46:50

和往常一样,这里单行

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

As usual, one-liner here

?- 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
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文