Я использую помощник Coq Proof Assistant для реализации модели (небольшого) языка программирования (расширения реализации полулегкой Java от Bruno De Fraine, Erik Ernst, Mario Südholt). Одна вещь, которая продолжает развиваться при использовании тактики 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
, но без какого-либо прогресса.