Ваши два определения 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
s, «ссылочно прозрачный», вы можете (вплоть до переименования переменной) всегда подставлять правую часть определения для любого вхождения его имени.
Inductive
, с другой стороны, определяет тип (элементы юниверсов Coqs), перечисляя набор конструкторов. В более логичном мышлении Inductive
определяет логическое суждение в терминах правил исключения / введения таким образом, чтобы обеспечить «гармонию».