Я использую Coq Proof Assistant для реализации модели (небольшого) языка программирования (расширение реализации Featherweight Java Бруно Де Фрайне, Эриком Эрнстом, Марио Зюдхолтом). Одна вещь, которая постоянно возникает при использовании тактики induction
, - это как сохранить информацию, заключенную в конструкторы типов.
У меня есть подпрограмма Prop, реализованная как
Inductive sub_type : typ -> typ -> Prop :=
| st_refl : forall t, sub_type t t
| st_trans : forall t1 t2 t3, sub_type t1 t2 -> sub_type t2 t3 -> sub_type t1 t3
| st_extends : forall C D,
extends C D ->
sub_type (c_typ C) (c_typ D).
Hint Constructors sub_type.
где extends
- это механизм расширения класса, как замечено в Java, а typ
представляет два различных типа доступных типов,
Inductive typ : Set :=
| c_typ : cname -> typ
| r_typ : rname -> typ.
Примером того, где я хотел бы сохранить информацию о типе, является использование тактики induction
для гипотезы вроде
H: sub_type (c_typ u) (c_typ v)
E.g. in
u : cname
v : cname
fsv : flds
H : sub_type (c_typ u) (c_typ v)
H0 : fields v fsv
============================
exists fs : flds, fields u (fsv ++ fs)
использование induction H.
отбрасывает всю информацию о u
и v
. Случай st_refl
становится
u : cname
v : cname
fsv : flds
t : typ
H0 : fields v fsv
============================
exists fs : flds, fields u (fsv ++ fs)
Как видите, информация о том, что u
и v
относятся к typ
конструкторам в H
и, следовательно, к t
, потеряна. Что еще хуже, из-за этого Coq не может видеть, что u
и v
фактически должны быть одинаковыми в этом случае.
При использовании тактики inversion
на H
Coq удается увидеть, что u
и v
одинаковы. Однако эта тактика здесь неприменима, так как мне нужны индукционные гипотезы, которые induction
генерируют, чтобы доказать случаи st_trans
и st_extends
.
Есть ли тактика, которая сочетает в себе лучшее из inversion
и induction
, чтобы генерировать гипотезы индукции и вывести равенства, не разрушая информацию о том, что содержится в конструкторах? В качестве альтернативы, есть ли способ вручную получить нужную мне информацию? info inversion H
и info induction H
показывают, что многие преобразования применяются автоматически (особенно с inversion
). Это заставило меня экспериментировать с тактикой change
вместе с let ... in
построением, но без какого-либо прогресса.