4

我想在 prolog 中实现以下谓词并将它们用于真值表:and/2、or/2、nand/2、nor/2、xor/2

也许有人可以告诉我如何实现和/2,例如,我可以自己做其他人并将它们发布在这里。

4

2 回答 2

8

/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 替换为 true/false。例如:

?- and(true,true).
true.
?- and(false, true).
false.
于 2013-10-31T14:50:07.510 回答
3

当心:您可能是指and/3, 而不是and/2. AND 是一个三元谓词,定义了3 个真值之间的关系,而不是 2 个。当然,您可以使用 Prolog 的内置机制,而不是具体化(= 使事情变得明确),其中真值是隐式的。但首先,我将从三元关系开始,因为这使所有真值都变得明确,并让您还可以询问例如:“false对于给定的操作,哪些真值会产生?” 为了让您开始,为 的真值表输入一个条目and/3,其中我使用原子true表示布尔值true

and(true, true, true).

独立地,还可以考虑使用布尔约束,例如在 SICStus Prolog 和 GNU Prolog 中可用,并让您以声明方式表达真值和布尔表达式之间的关系。

library(clpb)在 SICStus Prolog 中使用的示例:

| ?- 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

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

于 2013-10-28T10:48:22.507 回答