将java布尔表达式转换为SMTlib

时间:2013-11-14 15:32:52

标签: java z3 smt

尝试将java布尔表达式转换为Z3能够理解的格式时,我遇到了一些问题。由于项目的某些要求,我无法使用任何其他工具来评估表达式。只能在表达式中使用标识符,而不能使用函数或更复杂的类型。

我考虑的可能性是:

  • 使用parboiled或类似工具构建解析器。这样做的缺点是我只想在将操作符转换为SMT等效操作符后移动操作符并可能添加括号,因此这个解决方案和涉及AST处理的工作似乎过度工作了。而且,我发现定义一个可以使所有嵌套级别适合的语法有点复杂。

  • 使用词法分析器或其他类型的工具获取令牌,然后使用类似于Shunting-yard algorithm的算法对其进行重新排序。在这种情况下,可能需要输入所有括号以避免一些问题。

  • 使用可以解析表达式的库并对其进行编辑。到目前为止,我还没有找到任何可以让你评估表达式的工具。

  • 使用可以在符号之间直接转换的内容。我一直在寻找,但我找不到。不过,这将是我的一天。

我已经查找了类似的问题,但我没有找到任何东西。我会很感激您的想法。提前谢谢!

2 个答案:

答案 0 :(得分:1)

您考虑过TXL了吗? TXL支持解析文件,将转换应用于抽象语法树并打印结果。它易于使用,并且有大量文档和大library个语法(包括Java)。

答案 1 :(得分:1)

您可以使用免费软件工具bc2ncf将布尔表达式转换为CNF(Conjunctive Normal Form)而不是SMT。 Z3能够输入CNF并解决所包含的可满足性问题。

Z3的命令行语法往往会有所改变。 前段时间,我使用了以下内容:

bc2cnf.exe -v test.bc.txt test.dimacs.txt

z3.exe /dimacs /v:1 test.dimacs.txt > test.solution.txt