automatic proofs for equivariance of alphas
authorChristian Urban <urbanc@in.tum.de>
Fri, 16 Apr 2010 16:29:11 +0200
changeset 1866 6d4e4bf9bce6
parent 1865 b71b838b0a75
child 1867 f4477d3fe520
child 1873 a08eaea622d1
automatic proofs for equivariance of alphas
Nominal-General/Nominal2_Eqvt.thy
Nominal-General/nominal_eqvt.ML
Nominal-General/nominal_permeq.ML
Nominal/Ex/Classical.thy
Nominal/Ex/Lambda.thy
--- a/Nominal-General/Nominal2_Eqvt.thy	Fri Apr 16 11:09:32 2010 +0200
+++ b/Nominal-General/Nominal2_Eqvt.thy	Fri Apr 16 16:29:11 2010 +0200
@@ -369,6 +369,7 @@
 
 text {* Problem: there is no raw eqvt-rule for The *}
 lemma "p \<bullet> (THE x. P x) = foo"
+apply(tactic {* Nominal_Permeq.eqvt_tac @{context} [] [@{const_name "The"}] 1*})
 apply(perm_simp)
 (* apply(perm_strict_simp) *)
 oops
--- a/Nominal-General/nominal_eqvt.ML	Fri Apr 16 11:09:32 2010 +0200
+++ b/Nominal-General/nominal_eqvt.ML	Fri Apr 16 16:29:11 2010 +0200
@@ -86,22 +86,28 @@
 
 (** equivariance tactics **)
 
+val perm_boolE = @{thm permute_boolE}
+val perm_cancel = @{thms permute_minus_cancel(2)}
+val perm_expand_bool = @{thms permute_fun_def minus_minus permute_bool_def}
+
 fun eqvt_rel_case_tac ctxt pred_names pi intro  = 
 let
   val thy = ProofContext.theory_of ctxt
   val cpi = Thm.cterm_of thy (mk_minus pi)
-  val rule = Drule.instantiate' [] [SOME cpi] @{thm permute_boolE}
-  val permute_cancel = @{thms permute_minus_cancel(2)}
+  val pi_intro_rule = Drule.instantiate' [] [SOME cpi] perm_boolE
+  val simps = HOL_basic_ss addsimps perm_expand_bool
 in
-  eqvt_strict_tac ctxt [] [] THEN' 
-  SUBPROOF (fn {prems, context, ...} =>
+  eqvt_strict_tac ctxt [] pred_names THEN' 
+  SUBPROOF (fn {prems, context as ctxt, ...} =>
     let
       val prems' = map (transform_prem ctxt pred_names) prems
-      val side_cond_tac = EVERY' 
-        [ rtac rule, eqvt_strict_tac context permute_cancel [],
-          resolve_tac prems' ]
+      val tac1 = resolve_tac prems'
+      val tac2 = EVERY' [ rtac pi_intro_rule, 
+            eqvt_strict_tac ctxt perm_cancel pred_names, resolve_tac prems' ]
+      val tac3 = EVERY' [ rtac pi_intro_rule, 
+            eqvt_strict_tac ctxt perm_cancel pred_names, simp_tac simps, resolve_tac prems']
     in
-      (rtac intro THEN_ALL_NEW (resolve_tac prems' ORELSE' side_cond_tac)) 1 
+      (rtac intro THEN_ALL_NEW FIRST' [tac1, tac2, tac3]) 1 
     end) ctxt
 end
 
--- a/Nominal-General/nominal_permeq.ML	Fri Apr 16 11:09:32 2010 +0200
+++ b/Nominal-General/nominal_permeq.ML	Fri Apr 16 16:29:11 2010 +0200
@@ -106,11 +106,16 @@
 
 (* conversion that raises an error or prints a warning message, 
    if a permutation on a constant or application cannot be analysed *)
-fun progress_info_conv ctxt strict_flag ctrm =
+fun progress_info_conv ctxt strict_flag bad_hds ctrm =
 let
-  fun msg trm = 
-    (if strict_flag then error else warning) 
-      ("Cannot solve equivariance for " ^ (Syntax.string_of_term ctxt trm))
+  fun msg trm =
+    let
+      val hd = head_of trm 
+    in 
+    if is_Const hd andalso (fst (dest_Const hd)) mem bad_hds then ()
+    else (if strict_flag then error else warning) 
+           ("Cannot solve equivariance for " ^ (Syntax.string_of_term ctxt trm))
+    end
 
   val _ = case (term_of ctrm) of
       Const (@{const_name "permute"}, _) $ _ $ (trm as Const _) => msg trm
@@ -136,7 +141,7 @@
       eqvt_apply_conv bad_hds,
       eqvt_lambda_conv,
       More_Conv.rewrs_conv post_thms,
-      progress_info_conv ctxt strict_flag
+      progress_info_conv ctxt strict_flag bad_hds
     ] ctrm
 end
 
--- a/Nominal/Ex/Classical.thy	Fri Apr 16 11:09:32 2010 +0200
+++ b/Nominal/Ex/Classical.thy	Fri Apr 16 16:29:11 2010 +0200
@@ -63,6 +63,14 @@
    alpha (ImpR_raw coname1 name trm_raw coname2)
          (ImpR_raw coname1a namea trm_rawa coname2a)"
 
+thm alpha.intros
+
+declare permute_trm_raw.simps[eqvt]
+declare alpha_gen_eqvt[eqvt]
+
+equivariance alpha
+thm eqvts_raw
+
 
 end
 
--- a/Nominal/Ex/Lambda.thy	Fri Apr 16 11:09:32 2010 +0200
+++ b/Nominal/Ex/Lambda.thy	Fri Apr 16 16:29:11 2010 +0200
@@ -188,56 +188,28 @@
 
 declare permute_lam_raw.simps[eqvt]
 declare alpha_gen_eqvt[eqvt]
-(*equivariance alpha_lam_raw'*)
+equivariance alpha_lam_raw'
 thm eqvts_raw
 
+
+
+(* HERE *)
+
 lemma
   assumes a: "alpha_lam_raw' t1 t2"
   shows "alpha_lam_raw' (p \<bullet> t1) (p \<bullet> t2)"
 using a
 apply(induct)
-apply(perm_simp)
-apply(rule a1)
-apply(simp)
-apply(perm_simp)
-apply(rule a2)
-apply(simp)
-apply(simp)
-
-apply simp
-apply (rule a3)
-apply (erule exi[of _ _ "p"])
-apply (simp add: alphas)
-apply (erule conjE)+
-apply (rule conjI)
-apply (rule permute_eq_iff[of "- p", THEN iffD1])
-apply (simp add: eqvts)
-apply (rule conjI)
-apply (rule fresh_star_permute_iff[of "- p", THEN iffD1])
-apply (simp add: eqvts)
-apply (rule conjI)
-apply (simp add: permute_eqvt[symmetric])
-apply (rule permute_eq_iff[of "- p", THEN iffD1])
-apply (subst permute_eqvt)
-apply (simp add: eqvts)
-done
-
-lemma
-  assumes a: "alpha_lam_raw' t1 t2"
-  shows "alpha_lam_raw' (p \<bullet> t1) (p \<bullet> t2)"
-using a
-apply(induct)
-ML_prf {*
-val ({names, ...}, {raw_induct, intrs, ...}) =
-    Inductive.the_inductive @{context} (Sign.intern_const @{theory} "alpha_lam_raw")
-*}
+apply(tactic {* Nominal_Eqvt.eqvt_rel_case_tac 
+  @{context} ["Lambda.alpha_lam_raw'"] @{term "p::perm"} @{thm a1} 1*})
 apply(tactic {* Nominal_Eqvt.eqvt_rel_case_tac 
-  @{context} ["Lambda.alpha_lam_raw"] @{term "p::perm"} @{thm a1} 1*})
+  @{context} ["Lambda.alpha_lam_raw'"] @{term "p::perm"} @{thm a2} 1*})
+(*
 apply(tactic {* Nominal_Eqvt.eqvt_rel_case_tac 
-  @{context} ["Lambda.alpha_lam_raw"] @{term "p::perm"} @{thm a2} 1*})
+  @{context} ["Lambda.alpha_lam_raw'"] @{term "p::perm"} @{thm a3} 1*})
+*)
 oops
 
-
 section {* size function *}
 
 lemma size_eqvt_raw: