Coq Proof Assistant を使用して、(小さな) プログラミング言語のモデルを実装しています (Bruno De Fraine、Erik Ernst、Mario Südholt による Featherweight Java の実装を拡張しています)。このタクティックを使用する際に常に頭に浮かぶことの 1 つ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
あり、使用可能な 2 種類の型を表します。
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)
usingは、 および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
情報は失われます。さらに悪いことに、このために Coq はそれを見ることができず、実際にはこの場合は同じでなければなりません。v
typ
H
t
u
v
Coqinversion
でタクティックを使用すると、 とが同じであることがわかります。ただし、およびケースを証明するために生成される誘導仮説が必要なため、この戦術はここでは適用できません。H
u
v
induction
st_trans
st_extends
コンストラクターにラップされているものに関する情報を破壊することなく、誘導仮説を生成し、等式を導出することの両方を組み合わせた戦術はありinversion
ますか? induction
または、必要な情報を手動で取得する方法はありますか? 両方とも、多くの変換が自動的に適用されることを示しています (特に を使用info inversion H
) 。これらにより、私は建設と一緒に戦術を試してみましたが、進歩はありませんでした.info induction H
inversion
change
let ... in