我将集合编码为关系和操作集合作为普遍量化的含义。我通过选择满足一元谓词p的元素(例如:v< 4,v> 4,...)来生成新集合的集合上有选择运算符。由于这个运算符,我的公式中有简单的算术谓词。下面给出了这种公式的Z3编码示例 -
(set-option :mbqi true)
(set-option :model-compact true)
;; Rmem and Rmem1 are sets of Int
(declare-fun Rmem (Int) Bool)
(declare-fun Rmem1 (Int) Bool)
(declare-const v Int)
(declare-const v1 Int)
(declare-const x Int)
;; Rmem = Rmem1 U {x}
(assert (forall ((n Int)) (= (Rmem n)(or (Rmem1 n) (= n x)))))
;; Select(m<v1) from Rmem1 = {}
(assert (forall ((m Int)) (= false (and (Rmem1 m) (< m v1)))))
(assert (or (< v x) (= v x)))
(assert (or (< v v) (= v v1)))
(assert (exists ((q Int)) (and (Rmem q) (< q v))))
(check-sat)
(get-model)
正如预期的那样,Z3返回UNSAT以获得上述公式。但是,我的问题是 -
更新 - 上述公式集可以表示为关系代数中的联合查询,但具有不等式。
答案 0 :(得分:2)
您的公式是Z3支持的可判定片段。从技术上讲,该公式不在EPR中,因为您在量词中使用x < c
形式的原子。 Z3 guide(量词部分)描述了可以由Z3决定的许多片段。注意,这些片段中的一些非常昂贵(例如,NEXPTIME-hard)。因此,Z3可能仍然无法在合理的时间内解决它们,或者内存不足。