z3 中的相互递归数据类型及其与内置类型的交互
Mutually recursive datatypes in z3 and their interaction with built-in types
我目前正在尝试使用 Z3 为具有多态列表的无类型语言编码简单的程序逻辑。
据我了解,从the Z3 tutorial by Moura and Bjorner到"nest recursive data-type definitions inside other types, such as arrays"是不可能的。
所以,假设我有以下 OCaml 类型:
type value =
| Num of float
| String of string
| List of value list
理想情况下,我想在 Z3 中使用内置的 Z3List 类型对这种类型进行编码,但我认为这是不可能的,因为 Z3 不支持递归数据类型和 其他类型。有人可以确认是这种情况吗?
如果是这样,我想唯一可能的方法是为值列表定义我自己的类型,比如 my_list,并且类型 my_list 和值是相互递归。在 OCaml 中:
type value =
| Num of float
| String of string
| List of my_list
and my_list =
| Cons of value * my_list
| nil
但这意味着我将无法利用 Z3 支持的内置推理基础设施用于 Z3Lists。有更好的方法吗?
您必须使用带有 my_list 的扁平化版本是正确的。
好消息是 Z3 中列表的内置推理使用与其他数据类型相同的机制,因此您将获得与平面数据类型声明相同的推理支持。
我目前正在尝试使用 Z3 为具有多态列表的无类型语言编码简单的程序逻辑。
据我了解,从the Z3 tutorial by Moura and Bjorner到"nest recursive data-type definitions inside other types, such as arrays"是不可能的。
所以,假设我有以下 OCaml 类型:
type value =
| Num of float
| String of string
| List of value list
理想情况下,我想在 Z3 中使用内置的 Z3List 类型对这种类型进行编码,但我认为这是不可能的,因为 Z3 不支持递归数据类型和 其他类型。有人可以确认是这种情况吗?
如果是这样,我想唯一可能的方法是为值列表定义我自己的类型,比如 my_list,并且类型 my_list 和值是相互递归。在 OCaml 中:
type value =
| Num of float
| String of string
| List of my_list
and my_list =
| Cons of value * my_list
| nil
但这意味着我将无法利用 Z3 支持的内置推理基础设施用于 Z3Lists。有更好的方法吗?
您必须使用带有 my_list 的扁平化版本是正确的。 好消息是 Z3 中列表的内置推理使用与其他数据类型相同的机制,因此您将获得与平面数据类型声明相同的推理支持。