记录和定义

时间:2012-03-06 02:11:33

标签: coq

我对RecordDefinition

有疑问

我有这个定义:

Definition rule := term -> term.

我为它写了一个布尔函数。

Definition beq_rule a b := beq_term a && beq_term b.

其中beq_term : term -> term -> bool.

所以我对beq_rule的定义实际上返回了beq_term的确切类型,这不是我想要的。我希望它为我返回一个类型:rule -> rule -> bool.

所以我改变了Record的规则定义:

Record rule := mkRule {lhs : term; rhs : term}.

Definition beq_rule (a b : rule) : bool :=
 beq_term (lhs a) (lhs b) && beq_term (rhs a) (rhs b).

我的问题是:

1)我首次定义的rule使用Definition和另一个使用Record之间有什么不同?

2)如果我想按Definition定义规则,我可以在lhs定义中提供别名rhsRecord吗?

1 个答案:

答案 0 :(得分:9)

rule的两个定义是完全不同的东西

Definition rule := term -> term

将规则定义为函数类型Prop的类型(或term -> term)别名。因此

Definition not_what_you_meant : rule := fun t => t.

很乐意编译。

关于RecordDefinition之间的关系。 Record只是一个转换为Inductive的宏。所以

Record rule := mkRule {lhs : term; rhs : term}.

相同
Inductive rule := mkRule : term -> term -> rule.

加上访问者功能

Definition lhs (r : rule) : term := 
 match r with
  mkRule l _ => l
 end.

etc.

您应该认为InductiveDefinition有根本的不同。 Definition定义别名。另一种说法Definition的方法是“引用透明”,你可以(最多可变重命名)总是用定义的右边替换它的名字。

另一方面,

Inductive通过列出一组构造函数来定义类型(Coqs Universe的元素)。更合乎逻辑的思维方式是,Inductive以确保“和谐”的方式从消除/引入规则的角度定义逻辑命题。