Попробуйте использовать встроенные предикаты true/0
и false/0
напрямую и используйте верхний уровень для отображения результатов (независимо от нескольких последующих вызовов write/1
, используйте format/2
):
boolean(true).
boolean(false).
cnf(X, Y, Z) :-
maplist(boolean, [X,Y,Z]),
(\+ X; Y ; \+ Z),
( X ; \+ Y ; Z),
( X ; Y ; Z),
( \+ X ; \+ Y ; Z).
Пример:
?- cnf(X, Y, Z).
X = true,
Y = true,
Z = true .
РЕДАКТИРОВАТЬ : Как объясняется @repeat, также серьезно взгляните на CLP (B): решение ограничений по логическим значениям.
С CLP (B), вы можете написать всю программу выше как:
:- use_module(library(clpb)).
cnf(X, Y, Z) :-
sat(~X + Y + ~Z),
sat(X + ~Y + Z),
sat(X + Y + Z),
sat(~X + ~Y + Z).
Пожалуйста, смотрите ответ @repeat для получения дополнительной информации об этом.