Haskell 无点组合器中的模式,与SKI演算有何关系

Haskell 无点组合器中的模式,与SKI演算有何关系,haskell,lambda-calculus,pointfree,combinatory-logic,Haskell,Lambda Calculus,Pointfree,Combinatory Logic,作为练习,我将以下combinator转换为无点表示法: h f g x y z = f x (g y z) 通常的惯例是将f,g,h作为函数,将x,y,z作为表达式。(这不是家庭作业问题,只是为了好玩,看看我是否理解无点转换。) 在ghci的帮助下,经过漫长的手动重写过程后,我得到了以下结果: h = ((flip (.)) (flip (.)) . (flip (.))) . ((.)(.)) 我注意到h只包含两个组合词,“compose”(.)和“reverse compose”翻转(

作为练习,我将以下combinator转换为无点表示法:

h f g x y z = f x (g y z)
通常的惯例是将
f
g
h
作为函数,将
x
y
z
作为表达式。(这不是家庭作业问题,只是为了好玩,看看我是否理解无点转换。)

ghci
的帮助下,经过漫长的手动重写过程后,我得到了以下结果:

h = ((flip (.)) (flip (.)) . (flip (.))) . ((.)(.))
我注意到
h
只包含两个组合词,“compose”
(.)
和“reverse compose”
翻转(.)
。这样,原始combinator可以简洁地写成:

c = (.) -- compose
r = flip c -- "reverse compose"
h = ((r r) . r) . (c c)
   = c(c(r r)r)(c c)
“组合”和“反向组合”操作的结构(数量和顺序)似乎在某种程度上与原始组合器的结构有关

我认为这与组合逻辑和SKI演算直接相关。因此,我的问题是:

  • 有人能解释一下这里发生了什么:无点组合器中的“组合”和“反向组合”的结构与有点组合器中的函数和表达式的结构有什么关系

  • 这是否可以推广到任意组合子(即函数数、表达式数及其顺序是任意的)?更具体地说,每个组合词都可以用“组合”和“反向组合”来表达吗?是否有一个方案可以直接从有点组合词的结构中导出“组合”和“反向组合”的组合(即,不经过完整的重写过程)?例如,是否可以仅从函数结构直接派生出无点版本的
    \f g x y z->(f x y)g z

  • 在组合逻辑中,
    c
    r
    的名称是什么

  • 更新:


    似乎
    c
    B
    组合器,
    r
    CB
    。但我仍然很乐意深入了解我的问题,特别是问题1和问题2。

    首先,通过组合形式的直接操作通常更容易得出定义:

    h f g x y z = f x (g y z)
                = B(fx)(gy)z     -- B rule
                = B(B(fx))gyz    -- B rule
    h f g x = B(B(fx))g          -- eta-contraction
            = BBB(fx)g           -- B rule
            = B(BBB)fxg          -- B rule
            = C(B(BBB)f)gx       -- C rule
    h f = C(B(BBB)f)             -- eta-contraction
        = BC(B(BBB))f            -- B rule
    h   = BC(B(BBB))             -- eta-contraction
     -- = B(B(CB(CB))(CB))(BB)   -- your expression
    
    虽然我的表达式较短,但类型相同。这能作为组合形式是否应该遵循给定定义的反例吗?在规则的应用上有相当大的自由度,因此可以衍生出广泛不同的形式。我不认为从一个给定的组合表达式中可以得到多少洞见

    如果有什么区别的话,最终翻译中出现的组合词更能代表所采取的派生步骤,并且可以在任何给定的点上从适合的组合词中自由选择

    例如,在导出表达式时通常会执行以下步骤,显然:

    g(fx) = Bgfx = CBfgx 
    
    B (B (CB(CB)) (CB)) (BB) f g x y z
       = B (CB(CB)) (CB) (BB f) g x y z
       = CB (CB) (CB (BB f)) g x y z     --   and here
       = CB (BB f) (CB g) x y z          --  here
       = CB g (BB f x) y z               -- here
       = BB f x (g y) z
       = B (f x) (g y) z
       = f x (g y z)
    

    但是,如果您对规则应用程序进行优先级排序并使其具有确定性,那么您应该始终得到相同的结果——这取决于您应用规则的顺序

    如果一个变量在rhs上出现不止一次,则B和CB不再足够(需要例如S)。如果一个变量根本没有出现,那么它们对于2来说也是不够的(需要例如K),括号抽象是SKI的一个简单算法。你可以找到augustss提到的括号变换(我想)。augustss:非常有趣,谢谢。关于组合微积分,有什么好的介绍性文章可以学习?威尔:谢谢你的参考。操作组合形式确实比我的有点到无点转换过程简单得多(我有大约三倍的中间步骤)。但是,遗憾的是,显式转换似乎仍然是必要的。我希望组合形式的结构与有点形式直接相关。如果不是一般情况,至少对于特殊情况,例如
    f_{0,n_0}f_{1,n_1}。。。f{K-1,n{K-1}
    ,其中
    f{i,n}:=f{i xiu 0 xiu 1。。。xi{n-1}
    (即,
    K
    函数
    f_0,…,f_K
    ,每个函数都有一个相互不相交的变量[xiu 0,…,xi_{n-1}])。这似乎与所采取的转换步骤直接相关。