SMTLIB2 / Z3中的多态函数

兰吉特·贾拉(Ranjit Jhala)

我理解一个人不能在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中也是可能的,尽管通常这些将需要量词,因此由于您进入半确定区域,因此可能导致求解器做出“未知”响应。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用SMTLIB2在z3中查找最大数量

来自分类Dev

Z3Opt C ++ API:从文件中解析smtlib2公式

来自分类Dev

是否可以将一位的位向量转换为SMTLib2中的布尔变量?

来自分类Dev

如何在Z3中以SMTLIB格式表示集合成员身份?

来自分类Dev

SMTLIB / z3 / stp:下划线的含义?

来自分类Dev

在Z3 / cvc4中是否有任何函数可用于计算以2为底的对数?

来自分类Dev

在Z3 / cvc4中是否有任何可用的函数可以计算以2为底的对数?

来自分类Dev

将z3 C ++ API ast(或求解器)对象转换为SMTLIB字符串

来自分类Dev

将z3 C ++ API ast(或求解器)对象转换为SMTLIB字符串

来自分类Dev

如何将z3py表达式转换为smtlib 2格式

来自分类Dev

是否可以在z3中使用SMT-LIB2接口定义一个具有所有量化断言的函数?

来自分类Dev

haskell中的多态函数列表?

来自分类Dev

Scala中的多态函数是否“受限”?

来自分类Dev

记录类型Haskell中的多态函数

来自分类Dev

如何在Z3中写2次幂n即2 ^ n?

来自分类Dev

Z3:对Z3 int2bv有疑问吗?

来自分类Dev

Kotlin中多态函数中的参数定位

来自分类Dev

Z3中如何处理递归函数?

来自分类Dev

Z3中可确定的sqrt函数

来自分类Dev

在Z3中的函数上添加约束

来自分类Dev

使用SMT2 / Z3的谓词句子

来自分类Dev

Z3:int2bv的异常

来自分类Dev

实例化多态函数作为TypeScript中的参数

来自分类Dev

实现抽象类的类中的多态函数

来自分类Dev

PHP 中的多态静态和非静态函数

来自分类Dev

试图从多态函数中获得不同的输出

来自分类Dev

Java多态函数调用

来自分类Dev

多态函数的功能注释

来自分类Dev

haskell多态函数评估错误