繁体   English   中英

smtlib 中的参数函数

[英]parametric functions in smtlib

我知道有一种方法可以在 SMTLIB 中声明参数数据类型。 有没有办法定义一个接受这种类型的函数? 例如标准文档有:

( declare - datatypes ( ( Pair 2) ) (
( par ( X Y ) ( ( pair ( first X ) ( second Y )) ))))

现在我如何声明一个接受参数Pair类型的函数?

SMTLib不允许参数函数的定义。 请注意,内部函数,如 +、- 等,可以是多排序/参数化的,例如,它们可以很好地处理整数和实数。 但是用户定义的函数不允许是多排序的。 也就是说,您可以编写一个接受(Pair Int Bool)的函数,但不能编写接受(Pair ab)的函数,其中ab是类型变量; 即多态。

这在https://smtlib.cs.uiowa.edu/papers/smt-lib-reference-v2.6-r2021-05-12.pdf 的第 4.1.5 节中有解释:

使用排序或术语的命令所需的良好排序检查始终针对当前签名进行。 声明或定义已在当前签名中的符号是错误的。 这特别意味着,与理论函数符号相反,用户定义的函数符号不能被重载。 (29)

后来在脚注 29 中,它说:

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

TLDR; 不,您不能在 SMTLib 中定义参数函数。 但随着逻辑变得更丰富,这在未来可能会改变。 当前的解决方法是“单态化”过程,即在您使用的每个具体类型上生成函数的新版本。 这可以手动完成,也可以由为您生成 SMTLib 的更高级别工具自动完成。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM