【问题标题】:Prolog First Order Logic - Printing a Truth TableProlog 一阶逻辑 - 打印真值表
【发布时间】: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,但即使使用现有的编程知识/经验,我什至无法远程理解该代码的作用。哈哈。

标签: prolog boolean-expression truthtable


【解决方案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
    

    【讨论】:

      猜你喜欢
      • 2012-09-20
      • 2015-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-27
      • 2019-07-04
      • 1970-01-01
      相关资源
      最近更新 更多