SMTLIB2 / Z3 中的多态函数
Polymorphic Functions in SMTLIB2 / Z3
我的理解是否正确,不能在 Z3 或 SMTLIB2 中创建 "polymorphic" 函数?例如我想写这样的东西:
(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 求解器,以获取对构造过程中使用的未解释函数的解释;但其中 none 由 SMTLib 原生支持。尽管 Z3 会给你一个模型,如果你问得好,并且如果你愿意解析有点晦涩和不幸的非标准输出。这是这个例子:https://gist.github.com/LeventErkok/54cee74eb3def22dfb5f
另请注意,您通常需要在注入时给出某些公理;就像它们是一对一的并且彼此不相交;这在 SMTLib 中也是可能的,尽管通常这些将需要量词,因此可能会导致求解器响应 "unknown",因为您进入了半可判定区域。
我的理解是否正确,不能在 Z3 或 SMTLIB2 中创建 "polymorphic" 函数?例如我想写这样的东西:
(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 求解器,以获取对构造过程中使用的未解释函数的解释;但其中 none 由 SMTLib 原生支持。尽管 Z3 会给你一个模型,如果你问得好,并且如果你愿意解析有点晦涩和不幸的非标准输出。这是这个例子:https://gist.github.com/LeventErkok/54cee74eb3def22dfb5f
另请注意,您通常需要在注入时给出某些公理;就像它们是一对一的并且彼此不相交;这在 SMTLib 中也是可能的,尽管通常这些将需要量词,因此可能会导致求解器响应 "unknown",因为您进入了半可判定区域。