我想在SMT v2.6中模拟通用数据类型的行为。我使用Z3作为约束求解器。我基于official example将通用列表建模为参数化数据类型,方法如下:
(declare-datatypes (T) ((MyList nelem (cons (hd T) (tl MyList)))))
我希望该列表对于数据类型是通用的。稍后,我想以下列方式声明常量:
(declare-const x (MyList Int))
(declare-const y (MyList Real))
但是,现在我想在泛型数据类型MyList
上定义函数(例如,长度操作,空操作,......),以便它们可以重用于所有T
& #39; S。你知道我怎么能做到这一点吗?我确实尝试过这样的事情:
(declare-sort K)
(define-fun isEmpty ((in (MyList K))) Bool
(= in nelem)
)
但是这给了我一个错误信息;对于这个例子来说,Z3需要做一些类型推断,我想。
如果你能给我一个提示,那会很棒。
答案 0 :(得分:2)
SMT-Lib不允许多态用户定义的函数。 http://smtlib.cs.uiowa.edu/papers/smt-lib-reference-v2.6-r2017-07-18.pdf州的第4.1.5节:
使用排序或术语的命令所需的良好排序检查, 总是针对当前签名完成。这是一个错误 声明或定义当前已存在的符号 签名。这特别暗示与理论相反 功能符号,用户定义的功能符号不能重载。
在脚注29中进一步扩展:
不重载用户定义符号的动机是简化 他们由求解器处理。这种限制只对 想要扩展脚本使用的理论签名的用户 使用新的多态函数符号 - 即,其等级的符号 如果它是理论符号,则包含参数排序。例如, 想要在任意列表上声明“反向”功能的用户, 必须为每个(具体)定义一个不同的反向函数符号 列表中使用的列表排序。此限制可能会被删除 未来的版本。
因此,正如您所怀疑的那样,您无法在用户级别定义“多态”功能。但正如脚注所示,未来可能会消除这种限制,这种情况最有可能发生,因为SMT解算器的部署范围更广。然而,究竟什么时候可能会发生这种情况。任何人都在猜测。