SMTLIB2/Z3中的多态函数

SMTLIB2/Z3中的多态函数,z3,smt,Z3,Smt,我对不能在Z3或SMTLIB2中创建“多态”函数的理解正确吗?e、 g.我想写一些类似于: (declare-fun Prop (A) Bool) (declare-fun x1 () Int) (declare-fun x2 () Bool) (assert (and (Prop x1) (Prop x2))) (我想我可以通过为 Int+Bool然后使Prop适用于联合类型,但需要 首先再次检查是否无法直接使用参数多态性?) 谢谢 这的确是正确的。SMTLib使用多个排序的一阶

我对不能在Z3或SMTLIB2中创建“多态”函数的理解正确吗?e、 g.我想写一些类似于:

(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实现的示例:

运行时,它会生成以下SMT Lib代码,其中显示了您自己生成所需的内容:

下面是该示例的Haskell输出:

令人满意。型号:
x1=0::SInteger
x2=假

当然,您可以使用SMT解算器查询构造过程中使用的未解释函数的解释;但这些都不是SMTLib本机支持的。尽管Z3会给你一个模型,如果你问得很好,如果你愿意解析一些模糊的,不幸的是非标准的输出。下面是这个例子:


还要注意的是,一般来说,你需要给出一些关于注射的公理;就像他们是一对一的,彼此不相交;这在SMTLib中也是可能的,尽管通常这些都需要量词,因此可能会导致解算器响应“未知”,因为您进入了半可判定区域。

谢谢Levent!我会试试你的方法!