你如何证明一个函数对于它的类型是唯一的?

时间:2012-11-27 00:33:39

标签: haskell types proof

ida -> a类型的唯一函数,并且 fst类型(a,b) -> a的唯一功能。在这些简单的情况下,这是非常简单的。但总的来说,你会如何证明这一点?如果有多个相同类型的可能功能怎么办?

或者,给定函数的类型,如何导出该类型的唯一(如果这是真的)函数?

编辑:当我们开始在类型中添加约束时,我特别感兴趣。

1 个答案:

答案 0 :(得分:15)

您正在寻找的结果来自雷诺兹的参数化,并且是Wadler在theorems for free中最为人所知的。

证明基本参数化结果的最优雅方法我见过使用“单例类型”的概念。基本上,给定任何ADT

data Nat = Zero | Succ Nat

存在索引族(也称为GADT)

data SNat n where
   SZero :: SNat Zero
   SSucc :: SNat n -> SNat (Succ n)

我们可以通过将所有类型“删除”为无类型语言来为我们的语言提供语义,以便NatSNat擦除相同的内容。然后,按语言的输入规则

id (x :: SNat n) :: SNat n

SNat n只有一个居民(它的单身人士),因为语义是通过擦除来给出的,所以函数不能使用他们的参数类型,所以id可以在Nat上返回唯一值{{1}} 1}}是你给它的数字。这个基本论证可以扩展到证明大多数参数化结果,并由Karl Crary在A Simple Proof Technique for Parametricity Results中使用,尽管我在这里的演示文稿受到Stone and Harper的启发