我希望在prolog中实现以下谓词,并将它们用于真值表:和/2,或/2,nand/2,nor/2,xor/2
例如,也许有人可以教我如何实现和/2,这样我就可以自己做其他人,并在这里发布它们。
发布于 2013-10-28 10:48:22
注意:您可能指的是and/3
,而不是and/2
。它是一个三元谓词,定义了3真值之间的关系,而不是2。当然,您可以使用Prolog的内置机制,其中真值是隐式的,而不是具体化(=使事情变得明确)。但首先,我将从三元关系开始,因为这使得所有真值都显化,并且让您也可以问:“哪个真值产生给定操作的false
?”为了让您开始,and/3
的真值表有一个条目,其中我使用原子true
来表示布尔值true。
and(true, true, true).
独立地,还可以考虑使用布尔约束(例如,在SICStus Prolog和GNU中可用),并允许您声明性地表达真值和布尔表达式之间的关系。
在library(clpb)
Prolog中使用SICStus的示例:
| ?- 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-31 14:50:07
/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.
https://stackoverflow.com/questions/19632405
复制相似问题