如何有效解决Z3中的理论组合
我试图解决一个涉及命题可满足性(使用量词)和线性算术的问题 我已经制定了这个问题,Z3能够解决它,但它花费了不合理的时间 我一直试图通过指定战术来帮助Z3,但我没有取得多大进展(我不懂逻辑理论) 下面是一个高度简化的问题,它抓住了我试图解决的问题的本质。有人能提出建议吗 我试着读一些东西,比如Nelson-Oppen方法,但是有很多不熟悉的符号,学习它需要很长时间 另外,Z3是否允许用户调整这些配置?最后,我如何在z3py中使用这些策略如何有效解决Z3中的理论组合,z3,z3py,Z3,Z3py,我试图解决一个涉及命题可满足性(使用量词)和线性算术的问题 我已经制定了这个问题,Z3能够解决它,但它花费了不合理的时间 我一直试图通过指定战术来帮助Z3,但我没有取得多大进展(我不懂逻辑理论) 下面是一个高度简化的问题,它抓住了我试图解决的问题的本质。有人能提出建议吗 我试着读一些东西,比如Nelson-Oppen方法,但是有很多不熟悉的符号,学习它需要很长时间 另外,Z3是否允许用户调整这些配置?最后,我如何在z3py中使用这些策略 (declare-datatypes () ((newty
(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)
(声明数据类型()((newtype(item1)(item2)(item3)))
(声明fun f(newtype newtype)Bool)
(声明娱乐成本(newtype newtype)真实)
(断言(存在((x新类型)(y新类型))(f x y)))
(断言(所有((x新类型)(y新类型))(=>(f x y)(>(成本x y)0)))
(assert(forall((x newtype)(y newtype))(您编码的示例问题使用量化。Z3使用一个特定的过程来确定一类量化公式的可满足性,称为基于模型的量词实例化(mbqi选项)。它的工作原理是将公式中无量词部分的候选模型扩展为同时包含量词的模型。此过程可能涉及很多
您可以通过使用选项/st运行Z3从搜索过程中提取统计信息,它将显示搜索过程的选定统计信息,并大致了解搜索过程中发生的情况。没有专门针对带有算术和量词的公式类的特定策略组合(有一类公式使用位向量和量词,由此类公式的默认策略处理)
我试着读一些东西,比如Nelson-Oppen方法,但是有很多不熟悉的符号,学习它需要很长时间
这与理解量词的搜索问题有点相切
另外,Z3是否允许用户调整这些配置
是的,您可以从命令行配置Z3。
例如,可以使用命令行禁用MBQI:
z3 tt.smt2-st smt.auto_config=false smt.mbqi=false
Z3现在返回“unknown”,因为执行选定实例化的量词引擎较弱
无法确定公式是否满足要求。
您可以按照“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)
您可以使用z3py中的策略
如何组合战术的简要信息。
尽管如此,我认为你的问题课的难度确实与此有关
由于搜索涉及量词,所以很容易摆姿势
带有量词的公式,其中定理证明者作为这些类公式发散
通常是高度不确定的