[英]Polymorphic Functions in SMTLIB2 / Z3
我理解一个人不能在Z3或SMTLIB2中创建“多态”函数的理解是否正确? 例如,我想写一些类似的东西:
(declare-fun Prop (A) Bool)
(declare-fun x1 () Int)
(declare-fun x2 () Bool)
(assert (and (Prop x1) (Prop x2)))
(我想我可以通过为Int + Bool
声明一个联合类型,然后使Prop
适用于该联合类型来获得类似的信息,但想首先仔细检查一下是否无法直接使用参数多态性?)
谢谢!
确实是正确的。 SMTLib使用多种一阶逻辑。 因此,在您的示例中, A可以是任何种类,但必须是已知种类; 不是类型参数。
话虽如此,SMTLib确实允许未解释的排序; 也就是说,您可以引入没有基础表示形式的新排序。 (就像未解释的函数一样。)然后,您可以使用这种注入函数,并模拟所需的函数。 (我知道,糟糕的双关语。)
这是一个示例,您可以使用自己喜欢的语言Ranjit来做到这一点: https : //gist.github.com/LeventErkok/163362a59060188f5e62
运行时,它会生成以下SMT-Lib代码,其中显示了生成或赠送自己所需的内容: https : //gist.github.com/LeventErkok/920aba57cf8cb1810b4a
这是该示例的Haskell输出:
Satisfiable. Model: x1 = 0 :: SInteger x2 = False
当然,您可以看中并查询SMT求解器以解释在构造过程中使用的未解释函数。 但是SMTLib本身不支持这些功能。 尽管Z3会给您一个模型,但前提是您会很好地询问它,并且是否愿意解析有些晦涩难懂的非标准输出。 这里是这个例子: https : //gist.github.com/LeventErkok/54cee74eb3def22dfb5f
另外请注意,通常需要在注射时提供一定的公理。 就像它们是一对一的并且彼此不相交; 这在SMTLib中也是可能的,尽管通常这些将需要量词,因此自进入半确定区域以来,可能会使求解器做出“未知”响应。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.