【问题标题】:Check numeric constraint expressions for equivalence/subset of allowed values检查数值约束表达式以获取允许值的等价/子集
【发布时间】:2016-04-20 00:40:36
【问题描述】:

我有一个表示如下表达式的 AST:

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

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

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

【问题讨论】:

    标签: algorithm haskell expression equivalence


    【解决方案1】:

    你可以写一个函数

    evaluate :: Expression -> ValueSet
    

    将表达式计算为一组值,其中它为真。该值集可能类似于

    data Value = MinusInfinity | Finite Integer | PositiveInfinity
    type Range = (Value, Value)
    type ValueSet = [Range]
    

    其中ValueSet 是封闭的、不相交的范围的排序列表。然后你就可以用类似排序合并的逻辑来一一实现evaluate的案例了。

    【讨论】:

    • 它还必须处理小数值,所以我需要开区间和闭区间边界,这使得一切变得更加复杂 - 但这种方法有效。谢谢!
    【解决方案2】:

    这个问题是 NP 难的。无论如何,肯定会喜欢它。

    但可能会有希望。如前所述,您的表达语言非常受限制。例如,您没有提到not 运算符,这意味着&& 永远无法转换为||

    这是答案的大纲:

    1. 标准化比较运算符:遍历树,通过交换操作数将所有 转换为 >。同时,将>=转换为
    2. 将重复的 andor 折叠到“多操作数树节点”。例如,重写A || ( B || C ) 使其成为单个三操作数树节点or(A,B,C)。如果一个节点与其父节点是同一个操作符,那么它可以被折叠。
    3. 使用稳定排序对操作数||&&orand 进行排序,这样C || (B || A) 也可以折叠为or(A,B,C)。还有B || A 和`A
    4. 现在树已经标准化,递归树比较可以工作了。

    此答案未考虑重叠集。例如, 它不会树表达式

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-13
      • 1970-01-01
      • 1970-01-01
      • 2016-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多