
diff -r 7e1c309bf820 -r 248546bfeb16 Nominal/Ex/LetSimple2.thy
--- a/Nominal/Ex/LetSimple2.thy	Wed Jul 06 23:11:30 2011 +0200
+++ b/Nominal/Ex/LetSimple2.thy	Mon Jul 11 12:23:24 2011 +0100
@@ -123,7 +123,6 @@
   apply(simp_all)[5]
   apply(simp)
   apply(erule conjE)+
-  thm alpha_bn_cases
   apply(erule alpha_bn_cases)
   apply(simp)
   apply (subgoal_tac "height_trm_sumC b = height_trm_sumC ba")
@@ -153,7 +152,6 @@
   apply(simp_all)[5]
   apply(simp)
   apply(erule conjE)+
-  thm alpha_bn_cases
   apply(erule alpha_bn_cases)
   apply(simp)
   apply(simp add: trm_assn.bn_defs)
@@ -166,17 +164,29 @@
 
 section {* direct definitions --- problems *}
 
+lemma cheat: "P" sorry
 
-nominal_primrec
-    height_trm :: "trm \<Rightarrow> nat"
-and height_assn :: "assn \<Rightarrow> nat"
+nominal_primrec (invariant "\<lambda>x y. case x of Inl x1 \<Rightarrow> True | Inr x2 \<Rightarrow> \<forall>p. (permute_bn p x2) = x2 \<longrightarrow> (p \<bullet> y) = y")
+    height_trm2 :: "trm \<Rightarrow> nat"
+and height_assn2 :: "assn \<Rightarrow> nat"
 where
-  "height_trm (Var x) = 1"
-| "height_trm (App l r) = max (height_trm l) (height_trm r)"
-| "height_trm (Let as b) = max (height_assn as) (height_trm b)"
-| "height_assn (Assn x t) = (height_trm t)"
-  apply (simp only: eqvt_def height_trm_height_assn_graph_def)
-  apply (rule, perm_simp, rule, rule TrueI)
+  "height_trm2 (Var x) = 1"
+| "height_trm2 (App l r) = max (height_trm2 l) (height_trm2 r)"
+| "height_trm2 (Let as b) = max (height_assn2 as) (height_trm2 b)"
+| "height_assn2 (Assn x t) = (height_trm2 t)"
+  thm height_trm2_height_assn2_graph.intros
+  thm height_trm2_height_assn2_graph_def
+  apply (simp only: eqvt_def height_trm2_height_assn2_graph_def)
+  apply (rule, perm_simp, rule)
+  apply(erule height_trm2_height_assn2_graph.induct)
+  -- "invariant"
+  apply(simp)
+  apply(simp)
+  apply(simp)
+  apply(simp)
+  apply(rule cheat)
+  apply -
+  --"completeness"
   apply (case_tac x)
   apply(simp)
   apply (case_tac a rule: trm_assn.exhaust(1))
@@ -190,47 +200,45 @@
   apply(simp_all)[7]
   prefer 2
   apply(simp)
+  prefer 2
+  apply(simp)
   --"let case"
-  apply (simp only: meta_eq_to_obj_eq[OF height_trm_def, symmetric, unfolded fun_eq_iff])
-  apply (simp only: meta_eq_to_obj_eq[OF height_assn_def, symmetric, unfolded fun_eq_iff])
-  apply (subgoal_tac "eqvt_at height_assn as")
-  apply (subgoal_tac "eqvt_at height_assn asa")
-  apply (subgoal_tac "eqvt_at height_trm b")
-  apply (subgoal_tac "eqvt_at height_trm ba")
-  apply (thin_tac "eqvt_at height_trm_height_assn_sumC (Inr as)")
-  apply (thin_tac "eqvt_at height_trm_height_assn_sumC (Inr asa)")
-  apply (thin_tac "eqvt_at height_trm_height_assn_sumC (Inl b)")
-  apply (thin_tac "eqvt_at height_trm_height_assn_sumC (Inl ba)")
+  apply (simp only: meta_eq_to_obj_eq[OF height_trm2_def, symmetric, unfolded fun_eq_iff])
+  apply (simp only: meta_eq_to_obj_eq[OF height_assn2_def, symmetric, unfolded fun_eq_iff])
+  apply (subgoal_tac "eqvt_at height_assn2 as")
+  apply (subgoal_tac "eqvt_at height_assn2 asa")
+  apply (subgoal_tac "eqvt_at height_trm2 b")
+  apply (subgoal_tac "eqvt_at height_trm2 ba")
+  apply (thin_tac "eqvt_at height_trm2_height_assn2_sumC (Inr as)")
+  apply (thin_tac "eqvt_at height_trm2_height_assn2_sumC (Inr asa)")
+  apply (thin_tac "eqvt_at height_trm2_height_assn2_sumC (Inl b)")
+  apply (thin_tac "eqvt_at height_trm2_height_assn2_sumC (Inl ba)")
   defer
-  apply (simp add: eqvt_at_def height_trm_def)
-  apply (simp add: eqvt_at_def height_trm_def)
-  apply (simp add: eqvt_at_def height_assn_def)
-  apply (simp add: eqvt_at_def height_assn_def)
-  prefer 2
-  apply (subgoal_tac "height_assn as = height_assn asa")
-  apply (subgoal_tac "height_trm b = height_trm ba")
+  apply (simp add: eqvt_at_def height_trm2_def)
+  apply (simp add: eqvt_at_def height_trm2_def)
+  apply (simp add: eqvt_at_def height_assn2_def)
+  apply (simp add: eqvt_at_def height_assn2_def)
+  apply (subgoal_tac "height_assn2 as = height_assn2 asa")
+  apply (subgoal_tac "height_trm2 b = height_trm2 ba")
   apply simp
   apply(simp)
   apply(erule conjE)+
   apply(erule alpha_bn_cases)
   apply(simp)
   apply(simp add: trm_assn.bn_defs)
-  thm Abs_lst_fcb2
   apply(erule_tac c="()" in Abs_lst_fcb2)
   apply(simp_all add: fresh_star_def pure_fresh)[3]
   apply(simp add: eqvt_at_def)
   apply(simp add: eqvt_at_def)
-  defer
-  apply(simp)
-  apply(frule Inl_inject)
-  apply(subst (asm) trm_assn.eq_iff)
   apply(drule Inl_inject)
+  apply(simp (no_asm_use))
   apply(clarify)
   apply(erule alpha_bn_cases)
   apply(simp del: trm_assn.eq_iff)
-  apply(rename_tac as s as' s' t' t x x')
   apply(simp only: trm_assn.bn_defs)
-  (* HERE *)
+  apply(erule_tac c="()" in Abs_lst1_fcb2')
+  apply(simp_all add: fresh_star_def pure_fresh)[3]
+
   oops
 
 




