【问题标题】:What is a constructor in Coq?Coq 中的构造函数是什么?
【发布时间】:2011-02-23 11:28:08
【问题描述】:

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

例如,在 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 中一些非常聪明的背景魔法。

【问题讨论】:

  • (S (S (S (S O)))) 的漂亮打印为4 只是一种方便,您不应该让您分心。如果您想了解构造函数是什么,请使用构造函数Z(为零)和N(下一个)定义您自己的类型naturals。那么魔法就不会发生了。

标签: constructor coq


【解决方案1】:
Inductive naturals : Type :=
   | Z : naturals
   | N : naturals -> naturals.

说了以下几点:

  1. Znaturals 类型的术语

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

  3. 应用ZN 是创建自然的仅有的两种方法。当给定一个任意的自然时,您知道它是由一个或另一个制成的。

  4. naturals 类型的两个项 e1e2 相等当且仅当它们都是 Z 或者它们分别是 N t1N t2t1 等于t2

您可以看到这些规则如何推广到任意归纳类型定义。一般来说,在t 类型的任意归纳类型定义中:

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

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

【讨论】:

  • 在项目符号 2 中,您的意思是说 N e 是自然类型的术语吗?
  • @mushroom 是的,我做到了。
  • 您的回答很好地解释了这个例子,但实际上并没有解决“什么是构造函数”的问题标题。对我来说,构造函数是一个函数,它给出正确的参数返回某种类型的实际对象/值。这就是我将如何解释什么是构造函数。
  • @PascalCuoq 我的描述正确吗?我想知道问题的答案。
  • 我不在乎我的建议是错误的还是不完整的。我正在寻找 Coq 上下文中构造函数的完整答案/定义。不多也不少。
【解决方案2】:

在类型理论中,(类型)构造函数只是一种从现有类型(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))).

【讨论】:

  • 这个答案有点误导:S 是构造函数这一事实并非由其类型决定。例如 plus 1 不是构造函数(即使它与 S 具有相同的类型,甚至 eta-reduces 为它)。 S 是一个构造函数,因为它是构建 nat 的“规范”方式之一。重要的是,类型的构造函数是构建该类型对象的唯一方法。
  • 是的,值得澄清的是,我是在(归纳)类型定义的上下文中讨论的。普通函数不是类型构造函数,即使它共享相同的类型签名。 (如果这就是你所说的)
  • 我可能混淆了名称,我认为它们被称为值构造函数
猜你喜欢
  • 2013-12-16
  • 2012-10-16
  • 1970-01-01
  • 2011-08-13
  • 2012-04-16
  • 2012-03-08
相关资源
最近更新 更多