Prolog implement and/2, or/2, nand/2, nor/2, xor/2



我想在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

因此,布尔约束在处理二进制值时可能是非常有用的工具。

相关内容

最新更新