我正在尝试解决涉及命题可满足性(使用量词)和线性算术的问题。
我已经解决了这个问题,而Z3能够解决它,但它花了不合理的时间。
我一直试图通过指定战术来帮助Z3,但我没有取得多大进展(我对逻辑理论一无所知)。
以下是一个高度简化的问题,它捕捉了我想要解决的问题的本质。谁能提出建议?
我试着阅读像Nelson Oppen这样的方法,但是有很多不熟悉的符号,并且需要很长时间来学习它。
此外,Z3是否允许用户调整这些配置?最后,我如何在z3py中使用这些策略?
(declare-datatypes () ((newtype (item1) (item2) (item3))))
(declare-fun f (newtype newtype) Bool)
(declare-fun cost (newtype newtype) Real)
(assert (exists ((x newtype)(y newtype)) (f x y)))
(assert (forall ((x newtype)(y newtype)) (=> (f x y) (> (cost x y) 0))))
(assert (forall ((x newtype) (y newtype)) (<= (cost x y) 5)))
(check-sat)
(get-model)
答案 0 :(得分:1)
您编码的示例问题使用量化。 Z3使用特定程序来确定一类量化公式的可满足性,称为基于模型的量词实例化(mbqi选项)。它的工作原理是将公式的无量词部分的候选模型扩展为量词的模型。这个过程可能涉及很多 搜索您可以通过使用选项/ st运行Z3来从搜索过程中提取统计信息,它将显示搜索过程的选定统计信息,并大致了解搜索过程中发生的情况。没有特定的策略组合专门用于具有算术和量词的公式类(有一类公式使用由这些公式的默认策略处理的位向量和量词)。
我试着阅读像Nelson Oppen这样的方法,但是有很多不熟悉的符号,并且需要很长时间来学习它。
这与使用量词理解搜索问题有点相关。
此外,Z3是否允许用户调整这些配置?
是的,您可以从命令行配置Z3。 例如,您可以使用命令行禁用MBQI:
z3 tt.smt2 -st smt.auto_config = false smt.mbqi = false
Z3现在返回“unknown”,因为执行所选实例化的较弱量词引擎 无法确定该公式是否可以满足。 您可以按照“z3 - ?”
中的说明学习命令行选项最后,我怎样才能将这些策略用于z3py?
您可以使用z3py的策略。文件z3.py包含 如何结合战术的简要信息。 虽然,我希望你的问题类的难度真的要做 搜索硬度与量词有关。摆姿势很容易 具有量词的公式,其中定理证明与这些公式类别不同 通常是非常不明智的。