限制定义排序的范围
Limit scope of defined sort
我正在尝试通过 SMT-LIB 限制新定义的排序的范围。这样做会减少必要断言的数量,从而简化我的脚本。
为此,我使用了 define-sort 和 forall。
(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,它有自己的输入语言,不再受支持。
我正在尝试通过 SMT-LIB 限制新定义的排序的范围。这样做会减少必要断言的数量,从而简化我的脚本。
为此,我使用了 define-sort 和 forall。
(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,它有自己的输入语言,不再受支持。