【发布时间】:2013-10-28 10:29:44
【问题描述】:
我想在 prolog 中实现以下谓词并将它们用于真值表:and/2、or/2、nand/2、nor/2、xor/2
也许有人可以告诉我如何实施和/2,例如,我可以自己做其他人并将它们发布在这里。
【问题讨论】:
标签: prolog implementation xor clpb nor
我想在 prolog 中实现以下谓词并将它们用于真值表:and/2、or/2、nand/2、nor/2、xor/2
也许有人可以告诉我如何实施和/2,例如,我可以自己做其他人并将它们发布在这里。
【问题讨论】:
标签: prolog implementation xor clpb nor
/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.
【讨论】:
false? 三元关系and/3 使这变得非常简单和明确:?- and(X, Y, false).。其他关系也是如此,当您明确显示真值时,它们都是三元谓词,以便在查询中易于访问。
or 更改为 or(A,B) :- A -> true ;B.(SWI Prolog 语法)以避免选择点。
注意:您可能指的是and/3,而不是and/2。 AND 是一个三元谓词,定义 3 个真值之间的关系,而不是 2。当然,您可以使用 Prolog 的内置机制,而不是具体化(= 使事情变得明确),其中真值是隐含的。但首先,我将从三元关系开始,因为这使得所有真值都变得明确,并且让您还可以询问例如:“对于给定的操作,哪些真值产生 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)中表示为原子:
| ?- sat(a*b =:= b*a).
yes
因此,布尔约束在处理二进制值时可能是非常有用的工具。
【讨论】:
and(X, Y) 这样的术语,并且不需要为此实现任何东西:当您写下它时它就存在了。您要做 需要实现的是一个谓词,它将这些术语与真值相关联。从expression_truth/2 开始。示例子句:expression_truth(true, true).。留作练习:expression_truth(and(X,Y), Truth) :- ...,它将and(X, Y) 形式的术语与其真值相关联。