我想在prolog中实现以下谓词并将它们用于真值表:和/ 2,或/ 2,nand / 2,也不是/ 2,xor / 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
因此,在处理二进制值时,布尔约束可能是非常有用的工具。