
diff -r a7a537e0413a -r 6a0801279f4c src/ZF/Inductive_ZF.thy
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/ZF/Inductive_ZF.thy	Mon Feb 11 15:40:21 2008 +0100
@@ -0,0 +1,125 @@
+(*  Title:      ZF/Inductive.thy
+    ID:         $Id$
+    Author:     Lawrence C Paulson, Cambridge University Computer Laboratory
+    Copyright   1993  University of Cambridge
+
+Inductive definitions use least fixedpoints with standard products and sums
+Coinductive definitions use greatest fixedpoints with Quine products and sums
+
+Sums are used only for mutual recursion;
+Products are used only to derive "streamlined" induction rules for relations
+*)
+
+header{*Inductive and Coinductive Definitions*}
+
+theory Inductive_ZF imports Fixedpt QPair Nat_ZF
+  uses
+    "ind_syntax.ML"
+    "Tools/cartprod.ML"
+    "Tools/ind_cases.ML"
+    "Tools/inductive_package.ML"
+    "Tools/induct_tacs.ML"
+    "Tools/primrec_package.ML" begin
+
+setup IndCases.setup
+setup DatatypeTactics.setup
+
+ML_setup {*
+val iT = Ind_Syntax.iT
+and oT = FOLogic.oT;
+
+structure Lfp =
+  struct
+  val oper      = Const("Fixedpt.lfp", [iT,iT-->iT]--->iT)
+  val bnd_mono  = Const("Fixedpt.bnd_mono", [iT,iT-->iT]--->oT)
+  val bnd_monoI = @{thm bnd_monoI}
+  val subs      = @{thm def_lfp_subset}
+  val Tarski    = @{thm def_lfp_unfold}
+  val induct    = @{thm def_induct}
+  end;
+
+structure Standard_Prod =
+  struct
+  val sigma     = Const("Sigma", [iT, iT-->iT]--->iT)
+  val pair      = Const("Pair", [iT,iT]--->iT)
+  val split_name = "split"
+  val pair_iff  = @{thm Pair_iff}
+  val split_eq  = @{thm split}
+  val fsplitI   = @{thm splitI}
+  val fsplitD   = @{thm splitD}
+  val fsplitE   = @{thm splitE}
+  end;
+
+structure Standard_CP = CartProd_Fun (Standard_Prod);
+
+structure Standard_Sum =
+  struct
+  val sum       = Const(@{const_name sum}, [iT,iT]--->iT)
+  val inl       = Const("Inl", iT-->iT)
+  val inr       = Const("Inr", iT-->iT)
+  val elim      = Const("case", [iT-->iT, iT-->iT, iT]--->iT)
+  val case_inl  = @{thm case_Inl}
+  val case_inr  = @{thm case_Inr}
+  val inl_iff   = @{thm Inl_iff}
+  val inr_iff   = @{thm Inr_iff}
+  val distinct  = @{thm Inl_Inr_iff}
+  val distinct' = @{thm Inr_Inl_iff}
+  val free_SEs  = Ind_Syntax.mk_free_SEs
+            [distinct, distinct', inl_iff, inr_iff, Standard_Prod.pair_iff]
+  end;
+
+
+structure Ind_Package =
+    Add_inductive_def_Fun
+      (structure Fp=Lfp and Pr=Standard_Prod and CP=Standard_CP
+       and Su=Standard_Sum val coind = false);
+
+
+structure Gfp =
+  struct
+  val oper      = Const("Fixedpt.gfp", [iT,iT-->iT]--->iT)
+  val bnd_mono  = Const("Fixedpt.bnd_mono", [iT,iT-->iT]--->oT)
+  val bnd_monoI = @{thm bnd_monoI}
+  val subs      = @{thm def_gfp_subset}
+  val Tarski    = @{thm def_gfp_unfold}
+  val induct    = @{thm def_Collect_coinduct}
+  end;
+
+structure Quine_Prod =
+  struct
+  val sigma     = Const("QPair.QSigma", [iT, iT-->iT]--->iT)
+  val pair      = Const("QPair.QPair", [iT,iT]--->iT)
+  val split_name = "QPair.qsplit"
+  val pair_iff  = @{thm QPair_iff}
+  val split_eq  = @{thm qsplit}
+  val fsplitI   = @{thm qsplitI}
+  val fsplitD   = @{thm qsplitD}
+  val fsplitE   = @{thm qsplitE}
+  end;
+
+structure Quine_CP = CartProd_Fun (Quine_Prod);
+
+structure Quine_Sum =
+  struct
+  val sum       = Const("QPair.op <+>", [iT,iT]--->iT)
+  val inl       = Const("QPair.QInl", iT-->iT)
+  val inr       = Const("QPair.QInr", iT-->iT)
+  val elim      = Const("QPair.qcase", [iT-->iT, iT-->iT, iT]--->iT)
+  val case_inl  = @{thm qcase_QInl}
+  val case_inr  = @{thm qcase_QInr}
+  val inl_iff   = @{thm QInl_iff}
+  val inr_iff   = @{thm QInr_iff}
+  val distinct  = @{thm QInl_QInr_iff}
+  val distinct' = @{thm QInr_QInl_iff}
+  val free_SEs  = Ind_Syntax.mk_free_SEs
+            [distinct, distinct', inl_iff, inr_iff, Quine_Prod.pair_iff]
+  end;
+
+
+structure CoInd_Package =
+  Add_inductive_def_Fun(structure Fp=Gfp and Pr=Quine_Prod and CP=Quine_CP
+    and Su=Quine_Sum val coind = true);
+
+*}
+
+end




