Логика первого порядка пролога - печать таблицы истинности

Я должен записать программу, которая печатает таблицу истинности выражений. Так, я записал следующую функцию:

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)"функтор, который я определил ранее) вместо того, что в настоящее время отображается. Я думал о записи функтора оценки, но разве она не будет иметь того же эффекта? Как я могу решить это?

Я использую SWI-пролог 5.8.Спасибо.

5
задан mdb 20 January 2010 в 17:05
поделиться

2 ответа

Вот один из способов сделать это:

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.
6
ответ дан 14 December 2019 в 01:08
поделиться

Как обычно, одноклассник здесь

?- 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
3
ответ дан 14 December 2019 в 01:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: