我想在prolog中实现以下谓词并将它们用于真值表:and/2,or/2,nand/2,nor/2,xor/2
例如,也许有人可以向我展示如何实现 and/2,这样我就可以自己做其他事情并将它们发布在这里。
/2 是可能的,实际上非常优雅。
and(A,B) :- A,B.
or(A,B) :- A;B.
nand(A,B) :- not(and(A,B)).
nor(A,B) :- not(or(A,B)).
xor(A,B) :- or(A,B), nand(A,B).
要使用,只需将A/B替换为真/假。例如:
?- and(true,true).
true.
?- and(false, true).
false.
当心:你可能是指and/3
,而不是and/2
。AND 是一个三元谓词,定义 3 个真值之间的关系,而不是 2。当然,与其进行化(=使事情变得明确),不如使用Prolog的内置机制,其中真值是隐含的。但首先,我会从三元关系开始,因为这会使所有真值都明确,并且还可以询问例如:"对于给定的操作,哪些真值产生false
?为了帮助您入门,and/3
真值表的一个条目,我使用原子true
来表示布尔值 true:
and(true, true, true).
独立地,还可以考虑使用布尔约束,例如在SICStus Prolog和GNU Prolog中可用,并允许您以声明方式表达真值和布尔表达式之间的关系。
在SICStus Prolog中使用library(clpb)
的示例:
| ?- sat(X*Y =:= T), X = 0.
X = 0,
T = 0 ?
这表明,如果合取的第一个参数是假的,那么整个合相也是假的。此外,例如,我们可以使用 SICStus Prolog 的 CLP(B) 求解器来确定合相是可交换的,使用任一taut/2
| ?- taut(A*B =:= B*A, T).
T = 1 ?
或通用量化变量,表示为library(clpb)
中的原子:
| ?- sat(a*b =:= b*a).
yes
因此,布尔约束在处理二进制值时可能是非常有用的工具。