检查数值约束表达式是否允许值的等价/子集

时间:2016-04-19 13:07:58

标签: algorithm haskell expression equivalence

我有一个代表这些表达式的AST:

  • (<=10 && >=3) || ==0
  • ==1 || ==2 || ==3
  • ==1 && !=1

有数字和布尔(||&&)和数字(<<===!=>=>)运营商。如果需要,可以将一个布尔not运算符添加到AST。这些表达式用于约束可能的数字输入值(请注意,最后一个不允许任何内容)。

我正在寻找比较两个表达式的方法。我需要知道它们是否允许完全相同的数字集(等价),或者如果一个表达式允许另一个表达式的子集。

2 个答案:

答案 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转换为&&

以下是答案的大纲:

  1. 规范化比较运算符:遍历树,通过交换操作数将所有&lt; = 转换为&gt; 。同时,将&gt; = 转换为&lt;
  2. 将重复的以及重复折叠为“多操作数树节点”。例如,重写||,使其成为单个三操作数树节点A || ( B || C )。如果节点与其父节点是相同的运算符,则可以折叠该节点。
  3. 使用稳定排序对操作数or(A,B,C)||&&or进行排序,以便and也折叠为C || (B || A) 。并or(A,B,C)和`A
  4. 现在树已归一化,递归树比较工作。
  5. 此答案未考虑重叠集。例如, 它不会树的表达