我无法理解构造函数的原理及其工作原理。
例如,在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中一些非常聪明的背景魔法。
答案 0 :(得分:7)
Inductive naturals : Type :=
| Z : naturals
| N : naturals -> naturals.
说以下内容:
Z
是naturals
当e
是naturals
类型的字词时,N e
是naturals
类型的字词。
应用Z
或N
是创建自然的唯一两种方法。当给予任意自然时,你知道它是由一个或另一个制成的。
类型e1
的两个词e2
和naturals
当且仅当它们都是Z
或者它们分别是N t1
时才相等和N t2
t1
等于t2
。
您可以看到这些规则如何推广到任意归纳类型定义。通常,在t
类型的任意归纳类型定义中:
t
; t
类型的任何术语都是应用其中一个与t
类型相关联的构造函数的结果;换句话说,给定t
类型的术语,可以假设它是应用t
的构造函数之一的结果; t
的两个术语只有在将相同的构造函数应用于相同的参数时才会相等。(旁注:当类型定义适用于Z
和N
形状的构造函数时,这些属性或多或少准确对应自然数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))).