Coq中的构造函数是什么?

时间:2011-02-23 11:28:09

标签: constructor coq

我无法理解构造函数的原理及其工作原理。

例如,在Coq中,我们被教导如下定义自然数:

Inductive nat : Type :=
   | O : nat
   | S : nat -> nat.

有人告诉S是一个构造函数,但究竟是什么意思呢?

如果我这样做:

Check (S (S (S (S O)))).

我认为它是4且类型为nat

这是如何工作的,以及Coq如何知道(S (S (S (S O))))代表4

我猜这个问题的答案是Coq中一些非常聪明的背景魔法。

2 个答案:

答案 0 :(得分:7)

Inductive naturals : Type :=
   | Z : naturals
   | N : naturals -> naturals.

说以下内容:

  1. Znaturals

  2. 类型的术语
  3. enaturals类型的字词时,N enaturals类型的字词。

  4. 应用ZN是创建自然的唯一两种方法。当给予任意自然时,你知道它是由一个或另一个制成的。

  5. 类型e1的两个词e2naturals当且仅当它们都是Z或者它们分别是N t1时才相等和N t2 t1等于t2

  6. 您可以看到这些规则如何推广到任意归纳类型定义。通常,在t类型的任意归纳类型定义中:

    • 将构造函数应用于正确类型的参数会生成类型为t;
    • 的术语
    • t类型的任何术语都是应用其中一个与t类型相关联的构造函数的结果;换句话说,给定t类型的术语,可以假设它是应用t的构造函数之一的结果;
    • 类型t的两个术语只有在将相同的构造函数应用于相同的参数时才会相等。

    (旁注:当类型定义适用于ZN形状的构造函数时,这些属性或多或少准确对应自然数Peano's axioms。这就是为什么名为nat的类型是在Coq中预先定义的,这些形状的构造函数用于表示自然数。这种类型接受特殊处理,因为它很快就很难操纵原始形式,但特殊处理只在那里为方便起见。)

答案 1 :(得分:0)

在类型理论中,(类型)构造函数只是一种从现有类型(http://en.wikipedia.org/wiki/Type_constructor)构造新类型的方法。

在nat的归纳定义中,S是构造函数,因为(如果你看签名)它需要一个nat并产生另一个nat。

例如,一对nat的类型构造函数将是:

Inductive pair : Type := P: nat->nat->pair.

Check P (S (O)) (S(S(O))).