Я использую 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)
Например,
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
, но без какого-либо прогресса.