Curried函数及其在Z3中的应用

Curried函数及其在Z3中的应用,z3,Z3,我正在研究一种非常类似于STLC的语言,我正在将其转换为Z3命题,因此有几个关于Z3如何处理(未解释)函数的(子)问题: 函数在我的语言中很自然地被套用,当我递归地转换语言的术语时,我希望能够递归地构建相应的Z3 AST。也就是说,当我有一个术语fxy时,我想首先将f应用于x,然后将其应用于y。有办法做到这一点吗?到目前为止,我发现的API(Z3_mk_func_decl/Z3_mk_app)似乎要求我首先收集所有参数,然后立即应用它们 是否有一种合理的方式来表示类似于(如果是b,那么是f,否则

我正在研究一种非常类似于STLC的语言,我正在将其转换为Z3命题,因此有几个关于Z3如何处理(未解释)函数的(子)问题:

  • 函数在我的语言中很自然地被套用,当我递归地转换语言的术语时,我希望能够递归地构建相应的Z3 AST。也就是说,当我有一个术语
    fxy
    时,我想首先将
    f
    应用于
    x
    ,然后将其应用于
    y
    。有办法做到这一点吗?到目前为止,我发现的API(
    Z3_mk_func_decl
    /
    Z3_mk_app
    )似乎要求我首先收集所有参数,然后立即应用它们
  • 是否有一种合理的方式来表示类似于
    (如果是b,那么是f,否则是g)x
  • 在这两种情况下,我完全可以不解释函数,并将推理限制为“
    b=True/\f x=0=>(如果b,则f else g)x=0
    成立”。

    SMTLib(如中所述)是一种多排序的一阶逻辑。所有函数(未解释或未解释)必须应用于它的所有参数,并且不能有任何形式的咖喱。此外,您不能执行高阶if-then-else,即if-then-else的分支必须是一阶值。(然而,它们可以是数组,你可以想象用数组“伪造”函数。但这不是重点。)

    应该注意的是,SMTLib(v3)的下一次迭代将基于一个高阶逻辑,在这一点上,您所要求的功能可能会变得可用。请参阅:。当然,这仍然是一个建议,需要一段时间才能解决,真正的解决者开始忠实地实施它。最终这会发生,但我不希望在短期内发生

    旁白:既然您提到了STLC(简单类型的lambda演算),我想您可能熟悉像Haskell这样的函数式语言。如果是这种情况,您可能需要研究使用SBV:。它提供了一个框架,通过在幕后仔细地翻译它们来完成这些事情。下面是一个例子:

    Prelude Data.SBV>sat$\b->(ite b(unterpret“f”)(unterpret“g”)(0::SInteger)。==(0::SInteger)
    令人满意的。型号:
    s0=True::Bool
    整数->整数
    f u=0
    整数->整数
    g u2=2
    

    在这里,我们创建了两个函数,并使用
    ite
    构造来“合并”它们;让解算器还给我们一个模型。在幕后,SBV将使这些应用程序完全饱和,并让您“假装”在高阶意义上编程,就像在STLC或Haskell中一样。当然,问题在于细节,这种方法也有局限性,但在Haskell中建模STLC对许多人来说是一种经典的消遣,使用SBV象征性地进行建模可能是一种有趣的练习。

    谢谢!看来我得等到smtlib v3了。谢谢你把我指给sbv!事实上,我的实现确实是在Haskell中实现的,尽管我现在正在使用Haskell-z3。我以前见过sbv,但对它不屑一顾,没有看到任何理由偏离更“经典”的解算器,但现在我已经到了它变得合理的地步。也许我应该重新考虑我的选择。