
diff -r 77daf1b85cf0 -r a5f5b9336007 progtut/Essential.thy
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/progtut/Essential.thy	Sat Sep 13 10:07:14 2014 +0800
@@ -0,0 +1,197 @@
+theory Essential
+imports FirstStep
+begin
+
+ML {*
+fun pretty_helper aux env =
+  env |> Vartab.dest
+      |> map aux
+      |> map (fn (s1, s2) => Pretty.block [s1, Pretty.str " := ", s2])
+      |> Pretty.enum "," "[" "]"
+      |> pwriteln
+
+fun pretty_tyenv ctxt tyenv =
+let
+  fun get_typs (v, (s, T)) = (TVar (v, s), T)
+  val print = pairself (pretty_typ ctxt)
+in
+  pretty_helper (print o get_typs) tyenv
+end
+
+fun pretty_env ctxt env =
+let
+   fun get_trms (v, (T, t)) = (Var (v, T), t)
+   val print = pairself (pretty_term ctxt)
+in
+   pretty_helper (print o get_trms) env
+end
+
+fun prep_trm thy (x, (T, t)) =
+  (cterm_of thy (Var (x, T)), cterm_of thy t)
+
+fun prep_ty thy (x, (S, ty)) =
+  (ctyp_of thy (TVar (x, S)), ctyp_of thy ty)
+
+fun matcher_inst thy pat trm i =
+  let
+     val univ = Unify.matchers thy [(pat, trm)]
+     val env = nth (Seq.list_of univ) i
+     val tenv = Vartab.dest (Envir.term_env env)
+     val tyenv = Vartab.dest (Envir.type_env env)
+  in
+     (map (prep_ty thy) tyenv, map (prep_trm thy) tenv)
+  end
+*}
+
+ML {*
+  let
+     val pat = Logic.strip_imp_concl (prop_of @{thm spec})
+     val trm = @{term "Trueprop (Q True)"}
+     val inst = matcher_inst @{theory} pat trm 1
+  in
+     Drule.instantiate_normalize inst @{thm spec}
+  end
+*}
+
+ML {*
+let
+   val c = Const (@{const_name "plus"}, dummyT)
+   val o = @{term "1::nat"}
+   val v = Free ("x", dummyT)
+in
+   Syntax.check_term @{context} (c $ o $ v)
+end
+*}
+
+ML {*
+   val my_thm =
+   let
+      val assm1 = @{cprop "\<And> (x::nat). P x ==> Q x"}
+      val assm2 = @{cprop "(P::nat => bool) t"}
+
+      val Pt_implies_Qt =
+        Thm.assume assm1
+        |> tap (fn x => pwriteln (Pretty.str (@{make_string} x)))
+        |> Thm.forall_elim @{cterm "t::nat"}
+        |> tap (fn x => pwriteln (Pretty.str (@{make_string} x)))
+
+      val Qt = Thm.implies_elim Pt_implies_Qt (Thm.assume assm2)
+               |> tap (fn x => pwriteln (Pretty.str (@{make_string} x)))
+   in
+      Qt
+      |> Thm.implies_intr assm2
+      |> Thm.implies_intr assm1
+   end
+*}
+
+local_setup {*
+  Local_Theory.note ((@{binding "my_thm"}, []), [my_thm]) #> snd  
+*}
+
+local_setup {*
+  Local_Theory.note ((@{binding "my_thm_simp"},
+        [Attrib.internal (K Simplifier.simp_add)]), [my_thm]) #> snd
+*}
+
+(* pp 62 *)
+
+ML {*
+   Thm.reflexive @{cterm "True"}
+    |> Simplifier.rewrite_rule [@{thm True_def}]
+    |> pretty_thm @{context}
+    |> pwriteln
+*}
+
+
+ML {*
+  val thm = @{thm list.induct} |> forall_intr_vars;
+  thm |> forall_intr_vars |> cprop_of |> Object_Logic.atomize
+  |> (fn x => Raw_Simplifier.rewrite_rule [x] thm)
+*}
+
+ML {*
+fun atomize_thm thm =
+let
+  val thm' = forall_intr_vars thm
+  val thm'' = Object_Logic.atomize (cprop_of thm')
+in
+  Raw_Simplifier.rewrite_rule [thm''] thm'
+end
+*}
+
+ML {*
+  @{thm list.induct} |> atomize_thm
+*}
+
+ML {*
+   Skip_Proof.make_thm @{theory} @{prop "True = False"}
+*}
+
+ML {*
+fun pthms_of (PBody {thms, ...}) = map #2 thms
+val get_names = map #1 o pthms_of
+val get_pbodies = map (Future.join o #3) o pthms_of
+*}
+
+lemma my_conjIa:
+shows "A \<and> B \<Longrightarrow> A \<and> B"
+apply(rule conjI)
+apply(drule conjunct1)
+apply(assumption)
+apply(drule conjunct2)
+apply(assumption)
+done
+
+lemma my_conjIb:
+shows "A \<and> B \<Longrightarrow> A \<and> B"
+apply(assumption)
+done
+
+lemma my_conjIc:
+shows "A \<and> B \<Longrightarrow> A \<and> B"
+apply(auto)
+done
+
+
+ML {*
+@{thm my_conjIa}
+  |> Thm.proof_body_of
+  |> get_names
+*}
+
+ML {*
+@{thm my_conjIa}
+  |> Thm.proof_body_of
+  |> get_pbodies
+  |> map get_names
+  |> List.concat
+*}
+
+ML {*
+@{thm my_conjIb}
+ |> Thm.proof_body_of
+ |> get_pbodies
+ |> map get_names
+ |> List.concat
+*}
+
+ML {*
+@{thm my_conjIc}
+  |> Thm.proof_body_of
+  |> get_pbodies
+  |> map get_names
+  |> List.concat
+*}
+
+ML {*
+@{thm my_conjIa}
+  |> Thm.proof_body_of
+  |> get_pbodies
+  |> map get_pbodies
+  |> (map o map) get_names
+  |> List.concat
+  |> List.concat
+  |> duplicates (op=)
+*}
+
+end
\ No newline at end of file




