限定类别的限制范围

时间:2019-09-18 07:51:58

标签: z3 smt

我试图通过SMT-LIB限制新定义的排序范围。这样做可以通过减少必要的断言数量来简化我的脚本。

为此,我玩了 define-sort forall

(define-sort R () Real)
(assert (forall ((x R)) (< 0 x)))
(declare-const r R)
(check-sat)

但是z3无论如何都会始终返回 unsat 。所以我想这是不可能的。是吗?

1 个答案:

答案 0 :(得分:1)

不幸的是,这在SMTLib中是不可能的。有关详细信息,请参见以下答案:Is there an UnsignedIntSort in Z3?

正如Christoph指出的那样,您的查询为unsat,因为量化的断言为假;不论您有什么其他约束,都会使求解器处于unsat状态。

以我的经验,应对这些情况的最佳方法是不直接使用SMTLib;而是使用更高级别的API,并使用这些环境提供的编程功能根据需要吐出所有> 0约束。它长毛又丑陋,但这是当今SMTLib处理这些问题的唯一方法。支持这种“谓词子类型”的唯一求解器是具有自己的输入语言的Yices v1.0,该语言不再受支持。