我有一个代表这些表达式的AST:
(<=10 && >=3) || ==0
==1 || ==2 || ==3
==1 && !=1
有数字和布尔(||
,&&
)和数字(<
,<=
,==
,!=
, >=
,>
)运营商。如果需要,可以将一个布尔not
运算符添加到AST。这些表达式用于约束可能的数字输入值(请注意,最后一个不允许任何内容)。
我正在寻找比较两个表达式的方法。我需要知道它们是否允许完全相同的数字集(等价),或者如果一个表达式允许另一个表达式的子集。
答案 0 :(得分:2)
你可以写一个函数
evaluate :: Expression -> ValueSet
将表达式计算为一组值为true的值。此值集可能类似于
data Value = MinusInfinity | Finite Integer | PositiveInfinity
type Range = (Value, Value)
type ValueSet = [Range]
其中ValueSet
是已关闭的不相交范围的排序列表。然后,您可以使用类似于排序合并的逻辑逐个实现evaluate
的情况。
答案 1 :(得分:1)
这个问题是NP难的。无论如何,当然感觉就像。
但可能有希望。如上所述,您的表达语言非常受限制。例如,您没有提及$status = addslashes($status);
query="INSERT INTO requests (ID,title) VALUES ('$ID','$status')";
运算符,这意味着永远不能将not
转换为&&
。
以下是答案的大纲:
||
,使其成为单个三操作数树节点A || ( B || C )
。如果节点与其父节点是相同的运算符,则可以折叠该节点。 or(A,B,C)
,||
,&&
和or
进行排序,以便and
也折叠为C || (B || A)
。并or(A,B,C)
和`A 此答案未考虑重叠集。例如, 它不会树的表达