LFex.thy
author Cezary Kaliszyk <kaliszyk@in.tum.de>
Tue, 24 Nov 2009 08:36:28 +0100
changeset 356 51aafebf4d06
parent 301 40bb0c4718a6
child 393 196aa25daadf
permissions -rw-r--r--
Another theorem for which the new regularize differs from old one, so the goal is not proved. But it seems, that the new one is better.

theory LFex
imports Nominal QuotMain
begin

atom_decl name id

nominal_datatype kind = 
    Type
  | KPi "ty" "name" "kind"
and ty =  
    TConst "id"
  | TApp "ty" "trm"
  | TPi "ty" "name" "ty"
and trm = 
    Const "id"
  | Var "name"
  | App "trm" "trm"
  | Lam "ty" "name" "trm" 

function
    fv_kind :: "kind \<Rightarrow> name set"
and fv_ty   :: "ty \<Rightarrow> name set"
and fv_trm  :: "trm \<Rightarrow> name set"
where
  "fv_kind (Type) = {}"
| "fv_kind (KPi A x K) = (fv_ty A) \<union> ((fv_kind K) - {x})"
| "fv_ty (TConst i) = {}"
| "fv_ty (TApp A M) = (fv_ty A) \<union> (fv_trm M)"
| "fv_ty (TPi A x B) = (fv_ty A) \<union> ((fv_ty B) - {x})"
| "fv_trm (Const i) = {}"
| "fv_trm (Var x) = {x}"
| "fv_trm (App M N) = (fv_trm M) \<union> (fv_trm N)"
| "fv_trm (Lam A x M) = (fv_ty A) \<union> ((fv_trm M) - {x})"
sorry

termination fv_kind sorry

inductive
    akind :: "kind \<Rightarrow> kind \<Rightarrow> bool" ("_ \<approx>ki _" [100, 100] 100)
and aty   :: "ty \<Rightarrow> ty \<Rightarrow> bool"     ("_ \<approx>ty _" [100, 100] 100)
and atrm  :: "trm \<Rightarrow> trm \<Rightarrow> bool"   ("_ \<approx>tr _" [100, 100] 100)
where
  a1:  "(Type) \<approx>ki (Type)"
| a21: "\<lbrakk>A \<approx>ty A'; K \<approx>ki K'\<rbrakk> \<Longrightarrow> (KPi A x K) \<approx>ki (KPi A' x K')"
| a22: "\<lbrakk>A \<approx>ty A'; K \<approx>ki ([(x,x')]\<bullet>K'); x \<notin> (fv_ty A'); x \<notin> ((fv_kind K') - {x'})\<rbrakk> 
        \<Longrightarrow> (KPi A x K) \<approx>ki (KPi A' x' K')"
| a3:  "i = j \<Longrightarrow> (TConst i) \<approx>ty (TConst j)"
| a4:  "\<lbrakk>A \<approx>ty A'; M \<approx>tr M'\<rbrakk> \<Longrightarrow> (TApp A M) \<approx>ty (TApp A' M')"
| a51: "\<lbrakk>A \<approx>ty A'; B \<approx>ty B'\<rbrakk> \<Longrightarrow> (TPi A x B) \<approx>ty (TPi A' x B')"
| a52: "\<lbrakk>A \<approx>ty A'; B \<approx>ty ([(x,x')]\<bullet>B'); x \<notin> (fv_ty B'); x \<notin> ((fv_ty B') - {x'})\<rbrakk> 
        \<Longrightarrow> (TPi A x B) \<approx>ty (TPi A' x' B')"
| a6:  "i = j \<Longrightarrow> (Const i) \<approx>trm (Const j)"
| a7:  "x = y \<Longrightarrow> (Var x) \<approx>trm (Var y)"
| a8:  "\<lbrakk>M \<approx>trm M'; N \<approx>tr N'\<rbrakk> \<Longrightarrow> (App M N) \<approx>tr (App M' N')"
| a91: "\<lbrakk>A \<approx>ty A'; M \<approx>tr M'\<rbrakk> \<Longrightarrow> (Lam A x M) \<approx>tr (Lam A' x M')"
| a92: "\<lbrakk>A \<approx>ty A'; M \<approx>tr ([(x,x')]\<bullet>M'); x \<notin> (fv_ty B'); x \<notin> ((fv_trm M') - {x'})\<rbrakk> 
        \<Longrightarrow> (Lam A x M) \<approx>tr (Lam A' x' M')"

lemma al_refl:
  fixes K::"kind" 
  and   A::"ty"
  and   M::"trm"
  shows "K \<approx>ki K"
  and   "A \<approx>ty A"
  and   "M \<approx>tr M"
  apply(induct K and A and M rule: kind_ty_trm.inducts)
  apply(auto intro: akind_aty_atrm.intros)
  done

lemma alpha_EQUIVs:
  shows "EQUIV akind"
  and   "EQUIV aty"
  and   "EQUIV atrm"
sorry

quotient KIND = kind / akind
  by (rule alpha_EQUIVs)

quotient TY = ty / aty
   and   TRM = trm / atrm
  by (auto intro: alpha_EQUIVs)

print_quotients

quotient_def 
  TYP :: "KIND"
where
  "TYP \<equiv> Type"

quotient_def 
  KPI :: "TY \<Rightarrow> name \<Rightarrow> KIND \<Rightarrow> KIND"
where
  "KPI \<equiv> KPi"

quotient_def 
  TCONST :: "id \<Rightarrow> TY"
where
  "TCONST \<equiv> TConst"

quotient_def 
  TAPP :: "TY \<Rightarrow> TRM \<Rightarrow> TY"
where
  "TAPP \<equiv> TApp"

quotient_def 
  TPI :: "TY \<Rightarrow> name \<Rightarrow> TY \<Rightarrow> TY"
where
  "TPI \<equiv> TPi"

(* FIXME: does not work with CONST *)
quotient_def 
  CONS :: "id \<Rightarrow> TRM"
where
  "CONS \<equiv> Const"

quotient_def 
  VAR :: "name \<Rightarrow> TRM"
where
  "VAR \<equiv> Var"

quotient_def 
  APP :: "TRM \<Rightarrow> TRM \<Rightarrow> TRM"
where
  "APP \<equiv> App"

quotient_def 
  LAM :: "TY \<Rightarrow> name \<Rightarrow> TRM \<Rightarrow> TRM"
where
  "LAM \<equiv> Lam"

thm TYP_def
thm KPI_def
thm TCONST_def
thm TAPP_def
thm TPI_def
thm VAR_def
thm CONS_def
thm APP_def
thm LAM_def

(* FIXME: print out a warning if the type contains a liftet type, like kind \<Rightarrow> name set *)
quotient_def 
  FV_kind :: "KIND \<Rightarrow> name set"
where
  "FV_kind \<equiv> fv_kind"

quotient_def 
  FV_ty :: "TY \<Rightarrow> name set"
where
  "FV_ty \<equiv> fv_ty"

quotient_def 
  FV_trm :: "TRM \<Rightarrow> name set"
where
  "FV_trm \<equiv> fv_trm"

thm FV_kind_def
thm FV_ty_def
thm FV_trm_def

(* FIXME: does not work yet *)
overloading
    perm_kind \<equiv> "perm :: 'x prm \<Rightarrow> KIND \<Rightarrow> KIND"   (unchecked)
    perm_ty   \<equiv> "perm :: 'x prm \<Rightarrow> TY \<Rightarrow> TY"       (unchecked)
    perm_trm  \<equiv> "perm :: 'x prm \<Rightarrow> TRM \<Rightarrow> TRM"     (unchecked) 
begin

quotient_def 
  perm_kind :: "'x prm \<Rightarrow> KIND \<Rightarrow> KIND"
where
  "perm_kind \<equiv> (perm::'x prm \<Rightarrow> kind \<Rightarrow> kind)"

quotient_def 
  perm_ty :: "'x prm \<Rightarrow> TY \<Rightarrow> TY"
where
  "perm_ty \<equiv> (perm::'x prm \<Rightarrow> ty \<Rightarrow> ty)"

quotient_def 
  perm_trm :: "'x prm \<Rightarrow> TRM \<Rightarrow> TRM"
where
  "perm_trm \<equiv> (perm::'x prm \<Rightarrow> trm \<Rightarrow> trm)"










ML {* val defs =
  @{thms TYP_def KPI_def TCONST_def TAPP_def TPI_def VAR_def CONS_def APP_def LAM_def
    FV_kind_def FV_ty_def FV_trm_def perm_kind_def perm_ty_def perm_trm_def}
*}
ML {* val consts = lookup_quot_consts defs *}

thm akind_aty_atrm.induct

ML {*
val rty_qty_rel =
  [(@{typ kind}, (@{typ KIND}, @{term akind})),
   (@{typ ty}, (@{typ TY}, @{term aty})),
   (@{typ trm}, (@{typ TRM}, @{term atrm}))]
*}

print_quotients

ML {* val rty = [@{typ }]
ML {* val defs_sym = flat (map (add_lower_defs @{context}) defs) *}
ML {* val t_a = atomize_thm @{thm akind_aty_atrm.induct} *}
prove {* build_regularize_goal t_a rty rel @{context}

end