在类型系统中证明分类操作


9

我想知道编程语言中的类型系统可以带来多大的好处。例如,我知道在依赖类型的编程语言中,我们可以创建一个Vector在类型签名中合并向量大小的类。这就像事实上的例子。我们还可以append使用这些签名编写函数,以便编译器证明结果列表的大小将是输入列表的总和。

例如,是否有一种方法可以对排序算法的类型签名进行编码,以便编译器保证结果列表是输入列表的排列?如果可能的话,如何做到这一点?

Answers:


13

是的,可以为排序例程表达一个精确的类型,这样具有该类型的任何函数都必须确实对输入列表进行排序。

虽然可能会有一个更高级,更优雅的解决方案,但我只会画一个简单的解决方案。

f: nat -> nat0..n1

Definition permutation (n: nat) (f: nat -> nat): Prop :=
  (* once restricted, its codomain is 0..n-1 *)
  (forall m, m < n -> f m < n) /\
  (* it is injective, hence surjective *)
  (forall m1 m2, m1 < n -> m2 < n -> f m1 = f m2 -> m1 = m2) .

一个简单的引理可以很容易地证明。

Lemma lem1: forall n f, permutation n f -> m < n -> f m < n.
... (* from the def *)

mnhm<n

Definition nth {A} {n} (l: list A n) m (h : m < n): A :=
... (* recursion over n *)

给定的排序A,我们可以表示列表已排序:

Definition ordering (A: Type) :=
   { leq: A->A->bool |
     (* axioms for ordering *)
     (forall a, leq a a = true) /\
     (forall a b c, leq a b = true -> leq b c = true -> leq a c = true) /\
     (forall a b, leq a b = true -> leq b a = true -> a = b)
    } .

Definition sorted {A} {n} (o: ordering A) (l: list A n): Prop :=
...

最后,这是排序算法的类型:

Definition mysort (A: Type) (o: ordering A) (n: nat) (l: list A n):
   {s: list A n | sorted o s /\
                  exists f (p: permutation n f),
                  forall (m: nat) (h: m < n), 
                     nth l m h = nth s (f m) (lem1 n f p h) } :=
... (* the sorting algorithm, and a certificate for its output *)

sn0..n1lsf(m)<nnth

但是请注意,必须由用户(即程序员)来证明其排序算法正确。编译器不会简单地验证排序是否正确:它所做的只是检查提供的证明。确实,编译器不能做更多的事情:诸如“该程序是一种排序算法”之类的语义属性是不确定的(根据莱斯定理),因此我们不能希望使证明步骤完全自动化。

在遥远的将来,我们仍然希望自动定理证明变得如此聪明,以至于可以自动证明“最”实用的算法是正确的。赖斯定理仅指出并非在所有情况下都可以这样做。我们所希望的只是一个正确,可广泛应用但本质上不完整的系统。

最后一点,有时甚至忘记了简单的类型系统也是不完整的!例如,即使在Java中

int f(int x) {
   if (x+2 != 2+x)
      return "Houston, we have a problem!";
   return 42;
}

从语义上讲是安全的类型(它总是返回整数),但是类型检查器将抱怨无法到达的返回。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.