Z3 检查 python 字符串可满足性

Z3 check python string satisfiability

如果您事先不知道变量名,有没有一种方法可以检查 python 字符串的可满足性,例如 Z3 中的 'p or p -> p'? 例如我看到了这个:

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

但是我不能预先定义Z3中的变量,因为命题是作为字符串提供给我的。我如何使用 z3 执行此操作?

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

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

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

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

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

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

无关