我对Record
和Definition
我有这个定义:
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
定义中提供别名rhs
和Record
吗?
答案 0 :(得分:9)
rule
的两个定义是完全不同的东西
Definition rule := term -> term
将规则定义为函数类型Prop
的类型(或term -> term
)别名。因此
Definition not_what_you_meant : rule := fun t => t.
很乐意编译。
关于Record
和Definition
之间的关系。 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.
您应该认为Inductive
与Definition
有根本的不同。 Definition
定义别名。另一种说法Definition
的方法是“引用透明”,你可以(最多可变重命名)总是用定义的右边替换它的名字。
Inductive
通过列出一组构造函数来定义类型(Coqs Universe的元素)。更合乎逻辑的思维方式是,Inductive
以确保“和谐”的方式从消除/引入规则的角度定义逻辑命题。