查找使二进制表达式求值为true的值

时间:2013-02-25 21:31:06

标签: algorithm parsing expression

给出像' x< 10和x> = 11或x> 20',并且还假设已经存在可用表达式的解析树(例如[或[[和[< [var:x] [10]] [> = [var:x] [11]] ]] [> [var:x] [20]]]),如何找到导致此表达式求值为真的x的范围/集?

对语法的一些限制是:

  1. 表达式中只有一个变量(示例中为x),因此没有像x + 2< ÿ
  2. 只有比较运算符,但可能是空的?表达式
  3. 中的[string expression]
  4. 没有算术表达式或函数调用 - 所以像x + 2< 3,或x< someFunc()是不可能的

2 个答案:

答案 0 :(得分:1)

SMT求解器的一个简单替代方法是:

  1. 提取表达式
  2. 中使用的所有数字
  3. 对数字列表进行排序
  4. 对于列表x中的每个点,计算x-eps,x和x + eps(其中eps是一个小数字)的表达式
  5. 表达式的值只能在这些点上更改,并且因为它们按排序顺序排列,您只需将结果连接在一起即可找到x的允许值的完整列表。

答案 1 :(得分:0)

听起来像Yices或Z3这样的SMT求解器会对你有所帮助。它们对你的问题来说是一种“大枪”,但应该做到这一点。 SMT求解器就像类固醇上的SAT求解器一样,你所拥有的实际上是使用非布尔变量的可满足性问题。