限制定义排序的范围

Limit scope of defined sort

我正在尝试通过 SMT-LIB 限制新定义的排序的范围。这样做会减少必要断言的数量,从而简化我的脚本。

为此,我使用了 define-sortforall

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

但是 z3 总是 returns unsat 无论如何。所以我想这是不可能的。是吗?

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

正如 Christoph 指出的那样,您的查询是 unsat,因为量化断言是错误的;这会将求解器置于 unsat 状态,而不管您可能有什么其他约束。

根据我的经验,处理这些情况的最佳方法是不直接使用 SMTLib;但取而代之的是更高级别的 API 并使用这些环境提供的编程功能根据需要吐出所有 > 0 约束。它既多毛又丑陋,但它是当今 SMTLib 中处理这些问题的唯一方法。唯一支持这种 "predicate subtyping" 的求解器是 Yices v1.0,它有自己的输入语言,不再受支持。