我正在使用Coq Proof Assistant來實現(小)編程語言的模型(擴展了Bruno De Fraine,Erik Ernst,MarioSüdholt的Featherweight Java的實現)。在使用induction
策略時不斷出現的一件事是如何保留包裝在類型構造函數中的信息。使用歸納時保存信息?
我有一個子打字道具實現爲
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.在
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
構建,但沒有任何進展。
@Matthias:是否泛化相關的H0。感應H.`幫助?這是我無法提供給Coq自己的東西所能提供的所有東西(您的問題缺少更多的定義,我不願意填寫,我對Java的類型系統不夠熟悉)。 – Gilles 2010-12-24 11:52:38
這並沒有說服Coq做正確的事情。我創建了一個zip文件,其中只包含了使用`Fact`所必需的定義,我無法證明:[Problem.v包含定義和`Fact`,其餘部分是輔助](http://cs.au。 DK /〜MDI/coq_keeping_type_info_distilled.zip)。我感謝您的幫助。 – mdiin 2010-12-24 12:53:04