多态编码的递归代数数据类型的值是什么?

时间:2014-06-25 08:36:17

标签: haskell recursion polymorphism semantics

以下问题与Recursive algebraic data types via polymorphism in Haskell有关。

递归代数数据类型可以使用通用参数多态在具有System F功能的任何语言中实现。例如,自然数的类型可以作为

引入(在Haskell中)
newtype Nat = Nat { runNat :: forall t. (t -> (t -> t) -> t) }

通常'自然数n被实现为

\ x0 f -> f(f(...(f x0)...))

使用了nf次迭代。

同样,布尔的类型可以作为

引入
newtype Bool = Bool { runBool :: forall t. t -> t -> t }

预期值' true'并且' false'被实现为

true = \ t f -> t
false = \ t f -> f

问:类型BoolNat的所有术语或上述形式的任何其他潜在递归代数数据类型(以这种方式编码),都可以减少一些操作语义规则?

示例1(自然数):类似forall t. t -> (t -> t) -> t'等同的任何术语'在某种意义上,对于\ x0 f -> f (f ( ... (f x0) ... ))形式的术语?

示例2(布尔值):类似forall t. t -> t -> t'等同的任何术语'在某种意义上,\ t f -> t\ t f -> f

附录(内部版本):如果所考虑的语言甚至能够表达命题平等,这个元数学问题可以内化如下,如果有人愿意,我会很高兴想出一个解决方案:

对于任何仿函数m,我们可以在其上定义通用模块和一些解码编码功能,如下所示:

type ModStr m t = m t -> t
UnivMod m = UnivMod { univProp :: forall t. (ModStr m t) -> t }

classifyingMap :: forall m. forall t. (ModStr m t) -> (UnivMod m -> t)
classifyingMap f = \ x -> (univProp x) f

univModStr :: (Functor m) => ModStr m (UnivMod m)
univModStr = \ f -> UnivMod $ \ g -> g (fmap (classifyingMap g) f)

dec_enc :: (Functor m) => UnivMod m -> UnivMod m
dec_enc x = (univProp x) univModStr

问:如果语言能够表达:是否存在等同类型dec_enc = id

2 个答案:

答案 0 :(得分:4)

如果我们忽略了底部和unsafe的东西,那么你可以用函数a -> a普遍做的就是组合它们。但是,这并不能完全阻止我们使用有限的f (f ( ... (f x0) ... ))表达式:我们也有无限的组合infty x f = f $ infty x f

同样,唯一的非递归布尔值确实是\t _ -> t\_ f -> f,但你也可以在这里打结,比如

blarg t f = blarg (blarg t f) (blarg f t)

答案 1 :(得分:4)

在系统F(AKAλ2)中,∀α.α→α→α的所有居民确实λ等于KK*

首先,如果M : ∀α.α→α→α那么它具有正常形式N(因为系统F正常化)和主题缩减定理(参见Barendregt: Lambda calculi with types)也N : ∀α.α→α→α

让我们来看看这些正常形式的外观。 (我们将使用生成引理用于λ2,请参阅Barendregt的书以获取正式细节。)

如果N是普通表单,则N(或其任何子表达式)必须采用头部正常形式,即λx1 ... xn. y P1 ... Pk形式的表达式,其中{{1} }和/或n也可以是0。

对于k的情况,必须至少有一个λ,因为最初我们在输入上下文中没有任何变量绑定代替N。所以yN = λx.U

现在,x:α |- U:α→α的情况下必须至少有一个λ,因为如果U只是U,那么y P1 ... Pk会有一个函数类型(即使对于y k = 0我们需要y:α→α),但我们在上下文中只有x:α。所以N = λxy.Vx:α, y:α |- V:α

V不能是λ..,因为它有函数类型τ→σ。因此V必须只是z P1 ... Pk形式,但由于我们在上下文中没有任何函数类型变量,k必须为0,因此V可以仅限xy

因此,∀α.α→α→α类型的正常形式只有两个字词:λxy.xλxy.y,此类型的所有其他字词都等于其中之一。


使用类似的推理,我们可以证明∀α.α→(α→α)→α的所有居民都与教会数字相等。 (我认为对于类型∀α.(α→α)→α→α,情况稍微更糟;我们还需要η-相等,因为λf.fλfx.fx对应1,但不是β -equal,只是βη-相等。)