转载自:https://mp.weixin.qq.com/s/kSCgQlrJw4h_tGW_MpFJBQ
1、逻辑表达式的真值表(1)
定义谓词and/2, or/2, nand/2, nor/2, xor/2, impl/2 and equ/2 (用于逻辑等价),这些谓词根据各自的运算结果而成功或失败;例如,且仅当A和B都成功时,and(A,B)才会成功。请注意,A和B可以成为Prolog目标(不仅是常数true和fail)。
然后,可以使用前缀表示法编写两个变量中的逻辑表达式,如以下示例所示:and(or(A,B),nand(A,B)).
and(A,B) :- %与关系
A, B. %A,B只要有其中一个为fail则为fail
or(A,_) :- %或关系
A. %A,B有一个为true则为true
or(_,B) :-
B.
equ(A,B) :- %A,B相同则为true
or(and(A,B), and(not(A),not(B))).
xor(A,B) :- %异或关系
not(equ(A,B)). %A,B不同则为true
nor(A,B) :- %或非关系
not(or(A,B)). %A,B都为fail则为true
nand(A,B) :- %A,B都为true则为fail
not(and(A,B)). %A,B只要其中一个为fail则为true
impl(A,B) :- %A,B只有当A为trueB为fail时为fail
or(not(A),B).
% bind(X) :- 依次实例化X为真和假
bind(true).
bind(fail).
table(A,B,Expr) :-
bind(A),
bind(B),
do(A,B,Expr),
fail. %强制失败
do(A,B,_) :-
write(A),
write(' '),
write(B),
write(' '),
fail. %强制失败,去匹配do的下一个子句
do(_,_,Expr) :-
Expr,
!, %截断,组织回溯
write(true),
nl.
do(_,_,<