缩小量词的范围在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)可能不会发生合并。当我们发布新版本时,我们将unstablecontrib分支合并到master分支中。

mcsat分支基本上是增加新的功能。它与unstablecontrib分支不兼容。

我们鼓励高级用户(熟悉的git)使用非官方发布和选择分支。当然,在报告错误/问题时,应该使用与提交相关联的git散列,而不是版本号。

编辑完

+0

谢谢。 “miniscope”战术是一个特定分支的战术吗?我的意思是,你认为可以用较低的努力将它与主分支的源代码“集成”吗?我只是不知道mcsat分支如何与主分支不同,所以我不知道切换到该分支可能会有什么影响。你是否计划最终在主要分支中添加策略? – Egbert 2013-04-09 08:55:35

+1

我扩展了有关'mcsat'分支的更多信息。 – 2013-04-09 17:14:52