我目前正在尝试使用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的内置推理基础设施。有更好的方法吗?
答案 0 :(得分:2)
你必须使用带有my_list的扁平版本是正确的。 好消息是Z3中列表的内置推理使用与其他数据类型相同的机制,因此您可以使用平面数据类型声明获得相同的推理支持。