z3中的相互递归数据类型及其与内置类型的交互

时间:2017-04-24 15:17:19

标签: logic ocaml z3 smt recursive-datastructures

我目前正在尝试使用Z3为具有多态列表的无类型语言编写简单的程序逻辑。

据我了解,从the Z3 tutorial by Moura and Bjorner开始,不可能在其他类型中嵌套递归数据类型定义,例如数组"。

所以,假设我有以下OCaml类型:

@variable

理想情况下,我想使用内置的Z3List类型在Z3中对此类型进行编码,但我认为这是不可能的,因为Z3不支持递归数据类型和其他类型之间的相互递归< / strong>即可。有人可以确认是这种情况吗?

如果是这样的话,我想唯一可能的方法是为我定义一个值列表的自己的类型,比如my_list,以及my_list类型和值相互递归的类型。在OCaml:

type value =
    | Num of float
    | String of string
    | List of value list

但这意味着我将无法利用Z3支持Z3Lists的内置推理基础设施。有更好的方法吗?

1 个答案:

答案 0 :(得分:2)

你必须使用带有my_list的扁平版本是正确的。 好消息是Z3中列表的内置推理使用与其他数据类型相同的机制,因此您可以使用平面数据类型声明获得相同的推理支持。