我目前正在尝试使用Z3为带有集合的无类型语言编码一个简单的程序逻辑。
然后我们将其编码为以下SMT-LIB公式:
(define-sort Set () (Array Real Bool))
(define-fun singleton ((x Real)) Set
(store
((as const (Array Real Bool)) false)
x
true))
(define-fun set-union ((x Set) (y Set)) Set
((_ map (or (Bool Bool) Bool)) x y))
(declare-const head Real)
(declare-const tail Set)
(declare-const result Set)
(declare-const value Real)
(assert (forall ((x Real)) (=> (select tail x) (> x head))))
(assert (> head value))
(assert
(forall ((result Set))
(let ((phi1
(forall ((x Real)) (=> (select result x) (> x value))))
(phi2
(= result (union (singleton head) tail))))
(not (and phi1 phi2)))))
(check-sat)
当给出此公式时,求解器立即输出未知。
我的猜测是问题在于量化绑定到集合的变量。
为了检查这一点,我简化了上面的公式,得到:
然后我们将其编码为以下SMT-LIB公式:
(define-sort Set () (Array Real Bool))
(define-fun singleton ((x Real)) Set
(store
((as const (Array Real Bool)) false)
x
true))
(define-fun set-union ((x Set) (y Set)) Set
((_ map (or (Bool Bool) Bool)) x y))
(declare-const head Real)
(declare-const tail Set)
(declare-const result Set)
(declare-const value Real)
(assert (forall ((x Real))(=> (select tail x) (> x head))))
(assert (> head value))
(assert
(not
(forall ((x Real))
(=> (select (union (singleton head) tail) x)
(not (<= x value))))))
(check-sat)
给定此公式时,求解器立即输出 的不饱和度即可。 这证实了我的猜测,问题在于量化 在绑定到集合的变量上。 我的问题是Z3是否支持包含的公式 集合量化。而且,如果是这样,我做错了什么?
答案 0 :(得分:0)
对于SMT求解器来说,量词推理总是很难,在这种情况下,你有嵌套的量词。听到Z3在第一种情况下简单地说“未知”,我并不感到惊讶。另请注意,您正在量化什么是基本上是一个函数(您实现的集合实际上是函数),这使得它更加困难。但即使你量化了更简单的东西,嵌套量词也不会轻易放电。
你有没有尝试过将你的配方化,将其置于正常状态,并摆脱存在感?这可能会让你更进一步,虽然你可能需要提出适当的实例化模式。