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

时间:2014-03-16 14:00:22

标签: haskell lambda-calculus pointfree combinatory-logic

作为练习,我将以下组合器转换为无点符号:

h f g x y z = f x (g y z)

通常使用fgh作为函数,xyz作为表达式。 (这不是一个家庭作业问题,只是为了好玩,看看我是否理解无点转换。)

经过ghci辅助的漫长的手动重写过程后,我最终得到了以下内容:

h = ((flip (.)) (flip (.)) . (flip (.))) . ((.)(.))

我注意到h只包含两个组合器,"撰写" (.)和"反向撰写" flip (.)。有了这个,原始的组合器可以简洁地写成:

c = (.) -- compose
r = flip c -- "reverse compose"
h = ((r r) . r) . (c c)
   = c(c(r r)r)(c c)

"组成"的结构(数量和顺序)和#34;反向撰写"操作似乎与原始组合器的结构有某种关系。

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

  1. 有更多洞察力的人可以解释一下这里发生了什么:"的结构如何构成"和#34;反向撰写"在与无点组合器中的函数和表达式结构相关的无点组合器中?

  2. 这可以推广到任意组合器(即函数的数量,表达式的数量,它们的顺序是任意的)?更具体地说,每个组合器都可以表达为" compose"并且"反向撰写",并且有一个方案来推导"撰写"的组合。和#34;反向撰写" 直接来自有点组合器的结构(即,没有经过完整的重写过程)?例如,是否可以直接从查看函数结构中直接派生\ f g x y z -> (f x y) g z的无点版本?

  3. cr的组合逻辑中的名称是什么?

  4. 更新

    似乎cB组合子而r来自B, C, K, W system CB。但我仍然乐于更深入地了解我的问题,特别是问题1和问题2。

1 个答案:

答案 0 :(得分: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)

但是,如果您优先考虑规则应用程序并使其具有确定性,则应始终得出相同的结果 - 这取决于您应用规则的顺序。