首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Prolog实现和/2,或/2,nand/2,nor/2,xor/2

Prolog实现和/2,或/2,nand/2,nor/2,xor/2
EN

Stack Overflow用户
提问于 2013-10-28 10:29:44
回答 2查看 9.7K关注 0票数 4

我希望在prolog中实现以下谓词,并将它们用于真值表:和/2,或/2,nand/2,nor/2,xor/2

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-10-28 10:48:22

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

代码语言:javascript
运行
复制
and(true, true, true).

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

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

代码语言:javascript
运行
复制
| ?- sat(X*Y =:= T), X = 0.
X = 0,
T = 0 ?

这表明,如果连词的第一个参数是假的,那么整个连词也是假的。此外,例如,我们可以使用SICStus Prolog的CLP(B)求解器来确定连接是可交换的,使用任何一个taut/2

代码语言:javascript
运行
复制
| ?- taut(A*B =:= B*A, T).
T = 1 ?

或通用量化变量,在library(clpb)中表示为原子

代码语言:javascript
运行
复制
| ?- sat(a*b =:= b*a).
yes

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

票数 3
EN

Stack Overflow用户

发布于 2013-10-31 14:50:07

/2是可能的,实际上是非常优雅的。

代码语言:javascript
运行
复制
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就行了。例如:

代码语言:javascript
运行
复制
?- and(true,true).
true.
?- and(false, true).
false.
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19632405

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档