Prolog实现and/2、or/2、nand/2、nor/2、xor/2

Prolog实现and/2、or/2、nand/2、nor/2、xor/2,prolog,implementation,xor,clpb,nor,Prolog,Implementation,Xor,Clpb,Nor,我想在prolog中实现以下谓词,并将它们用于真值表:and/2、or/2、nand/2、nor/2、xor/2 例如,也许有人可以告诉我如何实现和/2,这样我就可以自己做其他的,并将它们发布在这里 注意:你的意思可能是和/3,而不是和/2。是一个三元谓词,定义了3真值之间的关系,而不是2。当然,您可以使用Prolog的内置机制,而不是具体化(=使事情明确化),其中真理值是隐式的。但首先,我将从三元关系开始,因为这使所有真值都显式,并允许您询问例如:“对于给定的操作,哪些真值产生false?”开

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


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

注意:你的意思可能是
和/3
,而不是
和/2
。是一个三元谓词,定义了3真值之间的关系,而不是2。当然,您可以使用Prolog的内置机制,而不是具体化(=使事情明确化),其中真理值是隐式的。但首先,我将从三元关系开始,因为这使所有真值都显式,并允许您询问例如:“对于给定的操作,哪些真值产生
false
?”开始,为
和/3
的真值表输入一项,其中,我使用atom
true
表示布尔值true:


独立地,也考虑使用布尔约束,例如在SICSTUS PROlog和GNU PROLO中可用,并允许声明性地表达真值与布尔表达式之间的关系。 在SICStus Prolog中使用

库(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 ?
或通用量化变量,在
库(clpb)
中表示为原子:


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

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

iam被告知实施和/或/或塔菲尔(A,B和(A,或(A,B)))。真-真-真-真-真-真-真-真-真-失败-失败-失败你可以写下像
和(X,Y)
这样的术语,而不需要为此实现任何东西:它在你写下时就存在了。您需要实现的是将这些术语与真值关联起来的谓词。从
表达式\u truth/2
开始。一个示例子句:
expression\u truth(true,true)。
。左为练习:
表达式\u真值(和(X,Y),真值):-…
,它将形式为
和(X,Y)
的术语与其真值联系起来。谢谢你的提示,我今天没有做,但我有了一个想法,我会尽快尝试解决。我们有很多事情要做,这真的很耗时。但感谢二元关系,实际结果隐含在目标是否成功中,因此很难回答以下可能很重要的问题:哪些真值组合产生
?三元关系
和/3
使得这一点非常简单和明确:
?-和(X,Y,false)。
。其他关系也是如此,当你将真值显式化,以便在查询中容易访问时,它们都是三元谓词。我会使用a/3,但问题是如何使用/2。我必须将
更改为
或(a,B):-a->true;B.
(SWI Prolog语法)以避免选择点。
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).
?- and(true,true).
true.
?- and(false, true).
false.