缩小量词的范围在Z3
问题描述:
有是可用于通过结合分配通用量词一个distribute-forall
战术。我对通用量词和存在量词都有一个更一般化的程序感兴趣,它们尽可能地缩小了量词的范围。 例如,我想式缩小量词的范围在Z3
(exists ((x Int)) (and (= z (* 2 x)) (<= z y)))
被转化成
(and (exists ((x Int)) (= z (* 2 x)) (<= z y)))
。
这可以通过一些其他的战术(S)来完成?
答
在Z3代码库的分支mcsat
有一个名为miniscope
新战术。它做你想要的。我们可以使用these instructions建立mcsat
分支。我们只需要将替换为mcsat
。
下面是使用这种战术的一些例子。
(declare-const z Int)
(declare-const x Int)
(declare-const y Int)
(assert (exists ((x Int)) (and (= z (* 2 x)) (<= z y))))
(apply miniscope)
和所产生的输出
(goals
(goal
(<= z y)
(exists ((x!1 Int)) (= z (* 2 x!1)))
:precision precise :depth 3)
)
下面是一个更复杂的例子:
(set-option :pp.max-depth 100)
(declare-fun p (Int) Bool)
(declare-fun q1 (Int Real) Bool)
(declare-fun q2 (Real Real) Bool)
(declare-fun q3 (Int Int) Bool)
(assert (forall ((x1 Int) (x2 Real))
(or (q2 x2 x2) (exists ((y Real)) (and (q1 y x2) (q1 x1 x2))))))
(apply miniscope)
和所产生的输出
(goals
(goal
(forall ((x2 Real))
(or (q2 x2 x2)
(and (forall ((x1 Int)) (q1 x1 x2))
(exists ((y Real)) (q1 (to_int y) x2)))))
:precision precise :depth 3)
)
EDIT
mcsat
分支包含正在进行的工作,最终将合并到master
分支中。但是,下一次正式发布(v4.3.2)可能不会发生合并。当我们发布新版本时,我们将unstable
和contrib
分支合并到master
分支中。
的mcsat
分支基本上是增加新的功能。它与unstable
和contrib
分支不兼容。
我们鼓励高级用户(熟悉的git)使用非官方发布和选择分支。当然,在报告错误/问题时,应该使用与提交相关联的git散列,而不是版本号。
编辑完
谢谢。 “miniscope”战术是一个特定分支的战术吗?我的意思是,你认为可以用较低的努力将它与主分支的源代码“集成”吗?我只是不知道mcsat分支如何与主分支不同,所以我不知道切换到该分支可能会有什么影响。你是否计划最终在主要分支中添加策略? – Egbert 2013-04-09 08:55:35
我扩展了有关'mcsat'分支的更多信息。 – 2013-04-09 17:14:52