Prolog工具和/ 2,或/ 2,nand / 2,也不是/ 2,xor / 2

时间:2013-10-28 10:29:45

标签: prolog implementation xor clpb nor

我想在prolog中实现以下谓词并将它们用于真值表:和/ 2,或/ 2,nand / 2,也不是/ 2,xor / 2

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

2 个答案:

答案 0 :(得分:5)

/ 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.

答案 1 :(得分:3)

注意:您可能代表and/3,而不是and/2。 AND是一个三元谓词,定义 3 真值之间的关系,而不是2.当然,你可以使用Prolog的内置机制,而不是reifying(=使事情明确),其中真值是隐含的。但首先,我将从三元关系开始,因为这会使所有真值都明确,并让你也举例说:“对于给定的操作,哪个真值会产生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)中表示为 atoms

| ?- sat(a*b =:= b*a).
yes

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