SMTLIB2 / Z3中的多态函数

时间:2015-02-02 18:55:53

标签: z3 smt

我理解一个人不能创造多态性" Z3或SMTLIB2中的功能?例如我想写一些类似的东西:

(declare-fun Prop (A) Bool)
(declare-fun x1   ()  Int)
(declare-fun x2   ()  Bool)
(assert (and (Prop x1) (Prop x2)))

(我想我可以通过声明一个联合类型来获得这样的东西 Int + Bool然后让Prop为联合类型工作,但是想要 先仔细检查一下是不是可以直接使用参数多态?)

谢谢!

1 个答案:

答案 0 :(得分:2)

这确实是正确的。 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中也是可能的,尽管通常这些都需要量词,因此可能导致求解器响应"未知"因为你进入了半可判的领域。