Z3检查python字符串可满足性

时间:2021-07-18 14:55:13

标签: python z3 z3py

如果您事先不知道变量名称,有没有办法在 Z3 中检查像 'p 或 p -> p' 这样的 python 字符串的可满足性? 例如我见过这个:

p = Bool('p')
solve(Implies(Or(p, p), p))

但是我无法提前定义 Z3 中的变量,因为该命题是作为字符串提供给我的。我怎样才能用 z3 做到这一点?

我也看过 python 的 eval 函数,但似乎我也需要在之前的 z3 中定义变量名

1 个答案:

答案 0 :(得分:0)

一些需要思考的问题:该字符串的含义是什么?如果它有语法错误怎么办?你如何辨别什么是有效的运算符/变量?您是否只允许布尔值或其他类型?运算符的分组、优先级和结合性如何?

归根结底,如果你想直接从一个字符串开始,你真的别无选择,只能同意这些字符串含义的语法和语义。唯一的方法是为这些字符串编写一个解析器,并“解释”产生 z3 上下文。

一种选择是“坚持”到 SMTLib,即要求您的输入是格式良好的 SMTLib 脚本。如果您选择此选项,那么 z3 已经为它们提供了一个可以轻松使用的内置解析器。请看这里:https://z3prover.github.io/api/html/namespacez3py.html#a09fe122cbfbc6d3fa30a79850b2a2414 但我很确定你会发现这很丑陋,而且不是你想要的。但这是唯一的“开箱即用”解决方案。

处理这个问题的正确方法是编写一个基于布尔表达式的基本解析器,其语法(以及某种程度上的语义)你可以自由定义你想要的任何方式。此外,这并不是一件特别困难的事情。如果您在 Python 中执行此操作,则可以使用 ply (https://www.dabeaz.com/ply/),或者使用手写的递归下降解析器 (https://www.booleanworld.com/building-recursive-descent-parsers-definitive-guide/)。

随意探索并提出更多问题;如果是关于在 Python 中解析字符串,请确保适当地标记它们;与 z3/z3py 真的无关。