types - 如何在 z3 中定义 Int 排序(SMT-LIB 2.0 Ints 理论)和动态声明的排序?

标签 types set z3 smt

这是我使用 z3 执行的 SMT-LIB 2.0 基准测试:

(set-logic AUFLIA)
(declare-sort PZ 0)
(declare-fun MS (Int PZ) Bool)

(assert (forall ((x Int)) (exists ((X PZ)) 
            (and (MS x X) 
                 (forall ((y Int)) (=> (MS y X) (= y x)))))))
(check-sat)

我预计结果是sat ,至少有一个模型,其中 PZ是 Z(整数)和 MS 的幂集是一个谓词,它测试一个整数在 Z 的子集中的成员资格(PZ 的一个元素)。

但是 z3 回答了 unsat .

你能帮我理解这个结果吗?具体来说,z3如何解释排序Int ?它真的被认为是无限的吗?动态声明的排序(这里是排序 PZ)怎么样?

最佳答案

在 Z3,Int是无限的。你是对的,结果一定是sat . unsat结果是由于 Z3 模块之一中的错误造成的。我已经修复了这个错误。实现中的一个临时缓存没有被重置。该修复程序将在下一个版本中提供。
同时,您可以在脚本开头使用以下命令禁用错误模块。

(set-option :mbqi false)

顺便说一句,该错误仅影响包含 (= x y) 形式的文字的示例在哪里 xy是通用变量。

顺便说一句,尽管您的示例令人满意,但 Z3 无法为其构建模型(即使在错误修复之后)。实际上,在修复错误之后,Z3 会产生答案 unknown .
模型查找器(在 Z3 中使用)仅能够查找未解释类型(例如 PZ)的解释是有限的模型。此限制将来可能会改变。

关于types - 如何在 z3 中定义 Int 排序(SMT-LIB 2.0 Ints 理论)和动态声明的排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8169734/

相关文章:

Haskell 递归类型

c# - C# 和 C++ 之间可以传输什么类型的数据

Java:SortedSet "cursor"风格的迭代器

java - Java 泛型中的问号

javascript - 为什么 Javascript 仅对已分配的字符串进行字符串连接的类型转换?

TypeScript:如何键入返回函数的返回类型

java - set.contains() 和多态性?

z3 - 创建一个固定大小的数组并对其进行初始化

Z3 支持非线性算术

floating-point - 如何在 SMT-LIB 标准中表示浮点常量(如 1e307)?