Proof of append_rsp
authorCezary Kaliszyk <kaliszyk@in.tum.de>
Wed, 28 Oct 2009 10:17:07 +0100
changeset 214 a66f81c264aa
parent 213 7610d2bbca48
child 215 89a2ff3f82c7
Proof of append_rsp
FSet.thy
QuotMain.thy
--- a/FSet.thy	Wed Oct 28 01:49:31 2009 +0100
+++ b/FSet.thy	Wed Oct 28 10:17:07 2009 +0100
@@ -94,12 +94,7 @@
 lemma card1_0:
   fixes a :: "'a list"
   shows "(card1 a = 0) = (a = [])"
-  apply (induct a)
-   apply (simp)
-  apply (simp_all)
-   apply meson
-  apply (simp_all)
-  done
+  by (induct a) auto
 
 lemma not_mem_card1:
   fixes x :: "'a"
@@ -107,16 +102,12 @@
   shows "~(x memb xs) \<Longrightarrow> card1 (x # xs) = Suc (card1 xs)"
   by simp
 
-
 lemma mem_cons:
   fixes x :: "'a"
   fixes xs :: "'a list"
   assumes a : "x memb xs"
   shows "x # xs \<approx> xs"
-  using a
-  apply (induct xs)
-  apply (auto intro: list_eq.intros)
-  done
+  using a by (induct xs) (auto intro: list_eq.intros )
 
 lemma card1_suc:
   fixes xs :: "'a list"
@@ -177,30 +168,18 @@
 thm fmap_def
 
 
-
+ML {* val fset_defs = @{thms EMPTY_def IN_def UNION_def card_def INSERT_def fmap_def fold_def} *}
+ML {* val consts = map (fst o dest_Const o fst o Logic.dest_equals o concl_of) fset_defs *}
 
-ML {*
+(* ML {*
   val consts = [@{const_name "Nil"}, @{const_name "Cons"},
                 @{const_name "membship"}, @{const_name "card1"},
                 @{const_name "append"}, @{const_name "fold1"},
                 @{const_name "map"}];
-*}
-
-ML {* val fset_defs = @{thms EMPTY_def IN_def UNION_def card_def INSERT_def fmap_def fold_def} *}
+*} *)
 
-ML {*
-fun add_lower_defs ctxt defs =
-  let
-    val defs_pre_sym = map symmetric defs
-    val defs_atom = map atomize_thm defs_pre_sym
-    val defs_all = flat (map (add_lower_defs_aux ctxt) defs_atom)
-  in
-    map Thm.varifyT defs_all
-  end
-*}
 ML {* val fset_defs_sym = add_lower_defs @{context} fset_defs *}
 
-
 lemma memb_rsp:
   fixes z
   assumes a: "list_eq x y"
@@ -209,22 +188,16 @@
 
 lemma ho_memb_rsp:
   "(op = ===> (op \<approx> ===> op =)) (op memb) (op memb)"
-  apply (simp add: FUN_REL.simps)
-  apply (metis memb_rsp)
-  done
+  by (simp add: memb_rsp)
 
 lemma card1_rsp:
   fixes a b :: "'a list"
   assumes e: "a \<approx> b"
   shows "card1 a = card1 b"
-  using e apply induct
-  apply (simp_all add:memb_rsp)
-  done
+  using e by induct (simp_all add:memb_rsp)
 
 lemma ho_card1_rsp: "op \<approx> ===> op = card1 card1"
-  apply (simp add: FUN_REL.simps)
-  apply (metis card1_rsp)
-  done
+  by (simp add: card1_rsp)
 
 lemma cons_rsp:
   fixes z
@@ -234,27 +207,64 @@
 
 lemma ho_cons_rsp:
   "op = ===> op \<approx> ===> op \<approx> op # op #"
-  apply (simp add: FUN_REL.simps)
-  apply (metis cons_rsp)
-  done
+  by (simp add: cons_rsp)
 
 lemma append_rsp_fst:
   assumes a : "list_eq l1 l2"
-  shows "list_eq (l1 @ s) (l2 @ s)"
+  shows "(l1 @ s) \<approx> (l2 @ s)"
   using a
-  apply(induct)
-  apply(auto intro: list_eq.intros)
-  apply(rule list_eq_refl)
-done
+  by (induct) (auto intro: list_eq.intros list_eq_refl)
+
+lemma append_end:
+  shows "(e # l) \<approx> (l @ [e])"
+  apply (induct l)
+  apply (auto intro: list_eq.intros list_eq_refl)
+  done
+
+lemma rev_rsp:
+  shows "a \<approx> rev a"
+  apply (induct a)
+  apply simp
+  apply (rule list_eq_refl)
+  apply simp_all
+  apply (rule list_eq.intros(6))
+  prefer 2
+  apply (rule append_rsp_fst)
+  apply assumption
+  apply (rule append_end)
+  done
 
-(* Need stronger induction... *)
-lemma "(a @ b) \<approx> (b @ a)"
-  apply(induct a)
-  sorry
+lemma append_sym_rsp:
+  shows "(a @ b) \<approx> (b @ a)"
+  apply (rule list_eq.intros(6))
+  apply (rule append_rsp_fst)
+  apply (rule rev_rsp)
+  apply (rule list_eq.intros(6))
+  apply (rule rev_rsp)
+  apply (simp)
+  apply (rule append_rsp_fst)
+  apply (rule list_eq.intros(3))
+  apply (rule rev_rsp)
+  done
+
+lemma append_rsp:
+  assumes a : "list_eq l1 r1"
+  assumes b : "list_eq l2 r2 "
+  shows "(l1 @ l2) \<approx> (r1 @ r2)"
+  apply (rule list_eq.intros(6))
+  apply (rule append_rsp_fst)
+  using a apply (assumption)
+  apply (rule list_eq.intros(6))
+  apply (rule append_sym_rsp)
+  apply (rule list_eq.intros(6))
+  apply (rule append_rsp_fst)
+  using b apply (assumption)
+  apply (rule append_sym_rsp)
+  done
 
 lemma ho_append_rsp:
   "op \<approx> ===> op \<approx> ===> op \<approx> op @ op @"
-sorry
+  by (simp add: append_rsp)
 
 lemma map_rsp:
   assumes a: "a \<approx> b"
--- a/QuotMain.thy	Wed Oct 28 01:49:31 2009 +0100
+++ b/QuotMain.thy	Wed Oct 28 10:17:07 2009 +0100
@@ -810,9 +810,8 @@
     val defs_pre_sym = map symmetric defs
     val defs_atom = map atomize_thm defs_pre_sym
     val defs_all = flat (map (add_lower_defs_aux ctxt) defs_atom)
-    val defs_sym = map (fn t => eq_reflection OF [t]) defs_all
   in
-    map Thm.varifyT defs_sym
+    map Thm.varifyT defs_all
   end
 *}