为Z3和/或SMT建模通用数据类型(v2.6)

时间:2017-12-03 16:01:26

标签: z3 smt

我想在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需要做一些类型推断,我想。

如果你能给我一个提示,那会很棒。

1 个答案:

答案 0 :(得分:2)

SMT-Lib不允许多态用户定义的函数。 http://smtlib.cs.uiowa.edu/papers/smt-lib-reference-v2.6-r2017-07-18.pdf州的第4.1.5节:

  

使用排序或术语的命令所需的良好排序检查,   总是针对当前签名完成。这是一个错误   声明或定义当前已存在的符号   签名。这特别暗示与理论相反   功能符号,用户定义的功能符号不能重载。

在脚注29中进一步扩展:

  

不重载用户定义符号的动机是简化   他们由求解器处理。这种限制只对   想要扩展脚本使用的理论签名的用户   使用新的多态函数符号 - 即,其等级的符号   如果它是理论符号,则包含参数排序。例如,   想要在任意列表上声明“反向”功能的用户,   必须为每个(具体)定义一个不同的反向函数符号   列表中使用的列表排序。此限制可能会被删除   未来的版本。

因此,正如您所怀疑的那样,您无法在用户级别定义“多态”功能。但正如脚注所示,未来可能会消除这种限制,这种情况最有可能发生,因为SMT解算器的部署范围更广。然而,究竟什么时候可能会发生这种情况。任何人都在猜测。