src/HOL/MetisExamples/Tarski.thy
changeset 27681 8cedebf55539
parent 27368 9f90ac19e32b
child 28486 873726bdfd47
equal deleted inserted replaced
27680:5a557a5afc48 27681:8cedebf55539
    66 
    66 
    67   CompleteLattice :: "('a potype) set"
    67   CompleteLattice :: "('a potype) set"
    68   "CompleteLattice == {cl. cl: PartialOrder &
    68   "CompleteLattice == {cl. cl: PartialOrder &
    69                         (\<forall>S. S \<subseteq> pset cl --> (\<exists>L. isLub S cl L)) &
    69                         (\<forall>S. S \<subseteq> pset cl --> (\<exists>L. isLub S cl L)) &
    70                         (\<forall>S. S \<subseteq> pset cl --> (\<exists>G. isGlb S cl G))}"
    70                         (\<forall>S. S \<subseteq> pset cl --> (\<exists>G. isGlb S cl G))}"
    71 
       
    72   CLF :: "('a potype * ('a => 'a)) set"
       
    73   "CLF == SIGMA cl: CompleteLattice.
       
    74             {f. f: pset cl -> pset cl & monotone f (pset cl) (order cl)}"
       
    75 
    71 
    76   induced :: "['a set, ('a * 'a) set] => ('a *'a)set"
    72   induced :: "['a set, ('a * 'a) set] => ('a *'a)set"
    77   "induced A r == {(a,b). a : A & b: A & (a,b): r}"
    73   "induced A r == {(a,b). a : A & b: A & (a,b): r}"
    78 
    74 
    79 constdefs
    75 constdefs
    91 
    87 
    92 constdefs
    88 constdefs
    93   dual :: "'a potype => 'a potype"
    89   dual :: "'a potype => 'a potype"
    94   "dual po == (| pset = pset po, order = converse (order po) |)"
    90   "dual po == (| pset = pset po, order = converse (order po) |)"
    95 
    91 
    96 locale (open) PO =
    92 locale PO =
    97   fixes cl :: "'a potype"
    93   fixes cl :: "'a potype"
    98     and A  :: "'a set"
    94     and A  :: "'a set"
    99     and r  :: "('a * 'a) set"
    95     and r  :: "('a * 'a) set"
   100   assumes cl_po:  "cl : PartialOrder"
    96   assumes cl_po:  "cl : PartialOrder"
   101   defines A_def: "A == pset cl"
    97   defines A_def: "A == pset cl"
   102      and  r_def: "r == order cl"
    98      and  r_def: "r == order cl"
   103 
    99 
   104 locale (open) CL = PO +
   100 locale CL = PO +
   105   assumes cl_co:  "cl : CompleteLattice"
   101   assumes cl_co:  "cl : CompleteLattice"
   106 
   102 
   107 locale (open) CLF = CL +
   103 definition CLF_set :: "('a potype * ('a => 'a)) set" where
       
   104   "CLF_set = (SIGMA cl: CompleteLattice.
       
   105             {f. f: pset cl -> pset cl & monotone f (pset cl) (order cl)})"
       
   106 
       
   107 locale CLF = CL +
   108   fixes f :: "'a => 'a"
   108   fixes f :: "'a => 'a"
   109     and P :: "'a set"
   109     and P :: "'a set"
   110   assumes f_cl:  "(cl,f) : CLF" (*was the equivalent "f : CLF``{cl}"*)
   110   assumes f_cl:  "(cl,f) : CLF_set" (*was the equivalent "f : CLF``{cl}"*)
   111   defines P_def: "P == fix f A"
   111   defines P_def: "P == fix f A"
   112 
   112 
   113 
   113 
   114 locale (open) Tarski = CLF +
   114 locale Tarski = CLF +
   115   fixes Y     :: "'a set"
   115   fixes Y     :: "'a set"
   116     and intY1 :: "'a set"
   116     and intY1 :: "'a set"
   117     and v     :: "'a"
   117     and v     :: "'a"
   118   assumes
   118   assumes
   119     Y_ss: "Y \<subseteq> P"
   119     Y_ss: "Y \<subseteq> P"
   228 lemma CL_subset_PO: "CompleteLattice \<subseteq> PartialOrder"
   228 lemma CL_subset_PO: "CompleteLattice \<subseteq> PartialOrder"
   229 by (simp add: PartialOrder_def CompleteLattice_def, fast)
   229 by (simp add: PartialOrder_def CompleteLattice_def, fast)
   230 
   230 
   231 lemmas CL_imp_PO = CL_subset_PO [THEN subsetD]
   231 lemmas CL_imp_PO = CL_subset_PO [THEN subsetD]
   232 
   232 
   233 declare CL_imp_PO [THEN PO.PO_imp_refl, simp]
   233 declare PO.PO_imp_refl  [OF PO.intro [OF CL_imp_PO], simp]
   234 declare CL_imp_PO [THEN PO.PO_imp_sym, simp]
   234 declare PO.PO_imp_sym   [OF PO.intro [OF CL_imp_PO], simp]
   235 declare CL_imp_PO [THEN PO.PO_imp_trans, simp]
   235 declare PO.PO_imp_trans [OF PO.intro [OF CL_imp_PO], simp]
   236 
   236 
   237 lemma (in CL) CO_refl: "refl A r"
   237 lemma (in CL) CO_refl: "refl A r"
   238 by (rule PO_imp_refl)
   238 by (rule PO_imp_refl)
   239 
   239 
   240 lemma (in CL) CO_antisym: "antisym r"
   240 lemma (in CL) CO_antisym: "antisym r"
   383 lemma (in CL) glb_in_lattice: "S \<subseteq> A ==> glb S cl \<in> A"
   383 lemma (in CL) glb_in_lattice: "S \<subseteq> A ==> glb S cl \<in> A"
   384 apply (subst glb_dual_lub)
   384 apply (subst glb_dual_lub)
   385 apply (simp add: A_def)
   385 apply (simp add: A_def)
   386 apply (rule dualA_iff [THEN subst])
   386 apply (rule dualA_iff [THEN subst])
   387 apply (rule CL.lub_in_lattice)
   387 apply (rule CL.lub_in_lattice)
       
   388 apply (rule CL.intro)
       
   389 apply (rule PO.intro)
   388 apply (rule dualPO)
   390 apply (rule dualPO)
       
   391 apply (rule CL_axioms.intro)
   389 apply (rule CL_dualCL)
   392 apply (rule CL_dualCL)
   390 apply (simp add: dualA_iff)
   393 apply (simp add: dualA_iff)
   391 done
   394 done
   392 
   395 
   393 lemma (in CL) glb_lower: "[|S \<subseteq> A; x \<in> S|] ==> (glb S cl, x) \<in> r"
   396 lemma (in CL) glb_lower: "[|S \<subseteq> A; x \<in> S|] ==> (glb S cl, x) \<in> r"
   394 apply (subst glb_dual_lub)
   397 apply (subst glb_dual_lub)
   395 apply (simp add: r_def)
   398 apply (simp add: r_def)
   396 apply (rule dualr_iff [THEN subst])
   399 apply (rule dualr_iff [THEN subst])
   397 apply (rule CL.lub_upper)
   400 apply (rule CL.lub_upper)
       
   401 apply (rule CL.intro)
       
   402 apply (rule PO.intro)
   398 apply (rule dualPO)
   403 apply (rule dualPO)
       
   404 apply (rule CL_axioms.intro)
   399 apply (rule CL_dualCL)
   405 apply (rule CL_dualCL)
   400 apply (simp add: dualA_iff A_def, assumption)
   406 apply (simp add: dualA_iff A_def, assumption)
   401 done
   407 done
   402 
   408 
   403 text {*
   409 text {*
   412   allow reasoning with rules like conjE, which is essential here.*)
   418   allow reasoning with rules like conjE, which is essential here.*)
   413 ML_command{*ResAtp.problem_name:="Tarski__CLF_unnamed_lemma"*}
   419 ML_command{*ResAtp.problem_name:="Tarski__CLF_unnamed_lemma"*}
   414 lemma (in CLF) [simp]:
   420 lemma (in CLF) [simp]:
   415     "f: pset cl -> pset cl & monotone f (pset cl) (order cl)" 
   421     "f: pset cl -> pset cl & monotone f (pset cl) (order cl)" 
   416 apply (insert f_cl)
   422 apply (insert f_cl)
   417 apply (unfold CLF_def)
   423 apply (unfold CLF_set_def)
   418 apply (erule SigmaE2) 
   424 apply (erule SigmaE2) 
   419 apply (erule CollectE) 
   425 apply (erule CollectE) 
   420 apply assumption; 
   426 apply assumption
   421 done
   427 done
   422 
   428 
   423 lemma (in CLF) f_in_funcset: "f \<in> A -> A"
   429 lemma (in CLF) f_in_funcset: "f \<in> A -> A"
   424 by (simp add: A_def)
   430 by (simp add: A_def)
   425 
   431 
   426 lemma (in CLF) monotone_f: "monotone f A r"
   432 lemma (in CLF) monotone_f: "monotone f A r"
   427 by (simp add: A_def r_def)
   433 by (simp add: A_def r_def)
   428 
   434 
   429 (*never proved, 2007-01-22*)
   435 (*never proved, 2007-01-22*)
   430 ML_command{*ResAtp.problem_name:="Tarski__CLF_CLF_dual"*}
   436 ML_command{*ResAtp.problem_name:="Tarski__CLF_CLF_dual"*}
   431   declare (in CLF) CLF_def[simp] CL_dualCL[simp] monotone_dual[simp] dualA_iff[simp]
   437 declare (in CLF) CLF_set_def [simp] CL_dualCL [simp] monotone_dual [simp] dualA_iff [simp]
   432 lemma (in CLF) CLF_dual: "(dual cl, f) \<in> CLF" 
   438 
       
   439 lemma (in CLF) CLF_dual: "(dual cl, f) \<in> CLF_set" 
   433 apply (simp del: dualA_iff)
   440 apply (simp del: dualA_iff)
   434 apply (simp)
   441 apply (simp)
   435 done
   442 done
   436   declare  (in CLF) CLF_def[simp del] CL_dualCL[simp del] monotone_dual[simp del]
   443 
       
   444 declare (in CLF) CLF_set_def[simp del] CL_dualCL[simp del] monotone_dual[simp del]
   437           dualA_iff[simp del]
   445           dualA_iff[simp del]
   438 
   446 
   439 
   447 
   440 subsection {* fixed points *}
   448 subsection {* fixed points *}
   441 
   449 
   637   -- {* Tarski for glb *}
   645   -- {* Tarski for glb *}
   638 (*sledgehammer;*)
   646 (*sledgehammer;*)
   639 apply (simp add: glb_dual_lub P_def A_def r_def)
   647 apply (simp add: glb_dual_lub P_def A_def r_def)
   640 apply (rule dualA_iff [THEN subst])
   648 apply (rule dualA_iff [THEN subst])
   641 apply (rule CLF.lubH_is_fixp)
   649 apply (rule CLF.lubH_is_fixp)
       
   650 apply (rule CLF.intro)
       
   651 apply (rule CL.intro)
       
   652 apply (rule PO.intro)
   642 apply (rule dualPO)
   653 apply (rule dualPO)
       
   654 apply (rule CL_axioms.intro)
   643 apply (rule CL_dualCL)
   655 apply (rule CL_dualCL)
       
   656 apply (rule CLF_axioms.intro)
   644 apply (rule CLF_dual)
   657 apply (rule CLF_dual)
   645 apply (simp add: dualr_iff dualA_iff)
   658 apply (simp add: dualr_iff dualA_iff)
   646 done
   659 done
   647   declare glb_dual_lub[simp del] PO.dualA_iff[rule del] CLF.lubH_is_fixp[rule del] 
   660   declare glb_dual_lub[simp del] PO.dualA_iff[rule del] CLF.lubH_is_fixp[rule del] 
   648           PO.dualPO[rule del] CL.CL_dualCL[rule del] PO.dualr_iff[simp del]
   661           PO.dualPO[rule del] CL.CL_dualCL[rule del] PO.dualr_iff[simp del]
   655 apply (simp add: glb_dual_lub P_def A_def r_def)
   668 apply (simp add: glb_dual_lub P_def A_def r_def)
   656 apply (rule dualA_iff [THEN subst])
   669 apply (rule dualA_iff [THEN subst])
   657 (*never proved, 2007-01-22*)
   670 (*never proved, 2007-01-22*)
   658 ML_command{*ResAtp.problem_name:="Tarski__T_thm_1_glb_simpler"*}  (*ALL THEOREMS*)
   671 ML_command{*ResAtp.problem_name:="Tarski__T_thm_1_glb_simpler"*}  (*ALL THEOREMS*)
   659 (*sledgehammer;*)
   672 (*sledgehammer;*)
   660 apply (simp add: CLF.T_thm_1_lub [of _ f, OF dualPO CL_dualCL]
   673 apply (simp add: CLF.T_thm_1_lub [of _ f, OF CLF.intro, OF CL.intro CLF_axioms.intro, OF PO.intro CL_axioms.intro,
   661                  dualPO CL_dualCL CLF_dual dualr_iff)
   674   OF dualPO CL_dualCL] dualPO CL_dualCL CLF_dual dualr_iff)
   662 done
   675 done
   663 
   676 
   664 subsection {* interval *}
   677 subsection {* interval *}
   665 
   678 
   666 
   679 
   727 ML{*ResAtp.problem_name:="Tarski__G_in_interval"*}  (*ALL THEOREMS*)
   740 ML{*ResAtp.problem_name:="Tarski__G_in_interval"*}  (*ALL THEOREMS*)
   728 lemma (in CLF) G_in_interval:
   741 lemma (in CLF) G_in_interval:
   729      "[| a \<in> A; b \<in> A; interval r a b \<noteq> {}; S \<subseteq> interval r a b; isGlb S cl G;
   742      "[| a \<in> A; b \<in> A; interval r a b \<noteq> {}; S \<subseteq> interval r a b; isGlb S cl G;
   730          S \<noteq> {} |] ==> G \<in> interval r a b"
   743          S \<noteq> {} |] ==> G \<in> interval r a b"
   731 apply (simp add: interval_dual)
   744 apply (simp add: interval_dual)
   732 apply (simp add: CLF.L_in_interval [of _ f]
   745 apply (simp add: CLF.L_in_interval [of _ f, OF CLF.intro, OF CL.intro CLF_axioms.intro, OF PO.intro CL_axioms.intro]
   733                  dualA_iff A_def dualPO CL_dualCL CLF_dual isGlb_dual_isLub)
   746                  dualA_iff A_def dualPO CL_dualCL CLF_dual isGlb_dual_isLub)
   734 done
   747 done
   735 
   748 
   736 ML{*ResAtp.problem_name:="Tarski__intervalPO"*}  (*ALL THEOREMS*)
   749 ML{*ResAtp.problem_name:="Tarski__intervalPO"*}  (*ALL THEOREMS*)
   737 lemma (in CLF) intervalPO:
   750 lemma (in CLF) intervalPO:
   849 apply (simp add: Top_dual_Bot A_def)
   862 apply (simp add: Top_dual_Bot A_def)
   850 (*first proved 2007-01-25 after relaxing relevance*)
   863 (*first proved 2007-01-25 after relaxing relevance*)
   851 ML_command{*ResAtp.problem_name:="Tarski__Top_in_lattice_simpler"*}  (*ALL THEOREMS*)
   864 ML_command{*ResAtp.problem_name:="Tarski__Top_in_lattice_simpler"*}  (*ALL THEOREMS*)
   852 (*sledgehammer*)
   865 (*sledgehammer*)
   853 apply (rule dualA_iff [THEN subst])
   866 apply (rule dualA_iff [THEN subst])
   854 apply (blast intro!: CLF.Bot_in_lattice dualPO CL_dualCL CLF_dual)
   867 apply (blast intro!: CLF.Bot_in_lattice [OF CLF.intro, OF CL.intro CLF_axioms.intro, OF PO.intro CL_axioms.intro] dualPO CL_dualCL CLF_dual)
   855 done
   868 done
   856 
   869 
   857 lemma (in CLF) Top_prop: "x \<in> A ==> (x, Top cl) \<in> r"
   870 lemma (in CLF) Top_prop: "x \<in> A ==> (x, Top cl) \<in> r"
   858 apply (simp add: Top_def greatest_def)
   871 apply (simp add: Top_def greatest_def)
   859 apply (rule_tac a="lub A cl" in someI2)
   872 apply (rule_tac a="lub A cl" in someI2)
   866 ML_command{*ResAtp.problem_name:="Tarski__Bot_prop"*}  (*ALL THEOREMS*) 
   879 ML_command{*ResAtp.problem_name:="Tarski__Bot_prop"*}  (*ALL THEOREMS*) 
   867 lemma (in CLF) Bot_prop: "x \<in> A ==> (Bot cl, x) \<in> r"
   880 lemma (in CLF) Bot_prop: "x \<in> A ==> (Bot cl, x) \<in> r"
   868 (*sledgehammer*) 
   881 (*sledgehammer*) 
   869 apply (simp add: Bot_dual_Top r_def)
   882 apply (simp add: Bot_dual_Top r_def)
   870 apply (rule dualr_iff [THEN subst])
   883 apply (rule dualr_iff [THEN subst])
   871 apply (simp add: CLF.Top_prop [of _ f]
   884 apply (simp add: CLF.Top_prop [of _ f, OF CLF.intro, OF CL.intro CLF_axioms.intro, OF PO.intro CL_axioms.intro]
   872                  dualA_iff A_def dualPO CL_dualCL CLF_dual)
   885                  dualA_iff A_def dualPO CL_dualCL CLF_dual)
   873 done
   886 done
   874 
   887 
   875 ML_command{*ResAtp.problem_name:="Tarski__Bot_in_lattice"*}  (*ALL THEOREMS*)
   888 ML_command{*ResAtp.problem_name:="Tarski__Bot_in_lattice"*}  (*ALL THEOREMS*)
   876 lemma (in CLF) Top_intv_not_empty: "x \<in> A  ==> interval r x (Top cl) \<noteq> {}" 
   889 lemma (in CLF) Top_intv_not_empty: "x \<in> A  ==> interval r x (Top cl) \<noteq> {}" 
   994 lemma (in Tarski) v_in_P: "v \<in> P"
  1007 lemma (in Tarski) v_in_P: "v \<in> P"
   995 (*sledgehammer*) 
  1008 (*sledgehammer*) 
   996 apply (unfold P_def)
  1009 apply (unfold P_def)
   997 apply (rule_tac A = "intY1" in fixf_subset)
  1010 apply (rule_tac A = "intY1" in fixf_subset)
   998 apply (rule intY1_subset)
  1011 apply (rule intY1_subset)
   999 apply (simp add: CLF.glbH_is_fixp [OF _ intY1_is_cl, simplified]
  1012 apply (simp add: CLF.glbH_is_fixp [OF CLF.intro, OF CL.intro CLF_axioms.intro, OF PO.intro CL_axioms.intro, OF _ intY1_is_cl, simplified]
  1000                  v_def CL_imp_PO intY1_is_cl CLF_def intY1_func intY1_mono)
  1013                  v_def CL_imp_PO intY1_is_cl CLF_set_def intY1_func intY1_mono)
  1001 done
  1014 done
  1002 
  1015 
  1003 ML_command{*ResAtp.problem_name:="Tarski__z_in_interval"*}  (*ALL THEOREMS*)
  1016 ML_command{*ResAtp.problem_name:="Tarski__z_in_interval"*}  (*ALL THEOREMS*)
  1004 lemma (in Tarski) z_in_interval:
  1017 lemma (in Tarski) z_in_interval:
  1005      "[| z \<in> P; \<forall>y\<in>Y. (y, z) \<in> induced P r |] ==> z \<in> intY1"
  1018      "[| z \<in> P; \<forall>y\<in>Y. (y, z) \<in> induced P r |] ==> z \<in> intY1"
  1040 apply (rule lub_upper)
  1053 apply (rule lub_upper)
  1041 apply (rule Y_subset_A, assumption)
  1054 apply (rule Y_subset_A, assumption)
  1042 apply (rule_tac b = "Top cl" in interval_imp_mem)
  1055 apply (rule_tac b = "Top cl" in interval_imp_mem)
  1043 apply (simp add: v_def)
  1056 apply (simp add: v_def)
  1044 apply (fold intY1_def)
  1057 apply (fold intY1_def)
  1045 apply (rule CL.glb_in_lattice [OF _ intY1_is_cl, simplified])
  1058 apply (rule CL.glb_in_lattice [OF CL.intro, OF PO.intro CL_axioms.intro, OF _ intY1_is_cl, simplified])
  1046  apply (simp add: CL_imp_PO intY1_is_cl, force)
  1059  apply (simp add: CL_imp_PO intY1_is_cl, force)
  1047 -- {* @{text v} is LEAST ub *}
  1060 -- {* @{text v} is LEAST ub *}
  1048 apply clarify
  1061 apply clarify
  1049 apply (rule indI)
  1062 apply (rule indI)
  1050   prefer 3 apply assumption
  1063   prefer 3 apply assumption
  1056 apply (rule indE)
  1069 apply (rule indE)
  1057 apply (rule_tac [2] intY1_subset)
  1070 apply (rule_tac [2] intY1_subset)
  1058 (*never proved, 2007-01-22*)
  1071 (*never proved, 2007-01-22*)
  1059 ML_command{*ResAtp.problem_name:="Tarski__tarski_full_lemma_simplest"*} 
  1072 ML_command{*ResAtp.problem_name:="Tarski__tarski_full_lemma_simplest"*} 
  1060 (*sledgehammer*) 
  1073 (*sledgehammer*) 
  1061 apply (rule CL.glb_lower [OF _ intY1_is_cl, simplified])
  1074 apply (rule CL.glb_lower [OF CL.intro, OF PO.intro CL_axioms.intro, OF _ intY1_is_cl, simplified])
  1062   apply (simp add: CL_imp_PO intY1_is_cl)
  1075   apply (simp add: CL_imp_PO intY1_is_cl)
  1063  apply force
  1076  apply force
  1064 apply (simp add: induced_def intY1_f_closed z_in_interval)
  1077 apply (simp add: induced_def intY1_f_closed z_in_interval)
  1065 apply (simp add: P_def fix_imp_eq [of _ f A] reflE
  1078 apply (simp add: P_def fix_imp_eq [of _ f A] reflE
  1066                  fix_subset [of f A, THEN subsetD])
  1079                  fix_subset [of f A, THEN subsetD])
  1085 apply (rule fixf_po, clarify)
  1098 apply (rule fixf_po, clarify)
  1086 (*never proved, 2007-01-22*)
  1099 (*never proved, 2007-01-22*)
  1087 ML_command{*ResAtp.problem_name:="Tarski__Tarski_full_simpler"*}
  1100 ML_command{*ResAtp.problem_name:="Tarski__Tarski_full_simpler"*}
  1088 (*sledgehammer*) 
  1101 (*sledgehammer*) 
  1089 apply (simp add: P_def A_def r_def)
  1102 apply (simp add: P_def A_def r_def)
  1090 apply (blast intro!: Tarski.tarski_full_lemma cl_po cl_co f_cl)
  1103 apply (blast intro!: Tarski.tarski_full_lemma [OF Tarski.intro, OF CLF.intro Tarski_axioms.intro,
       
  1104   OF CL.intro CLF_axioms.intro, OF PO.intro CL_axioms.intro] cl_po cl_co f_cl)
  1091 done
  1105 done
  1092   declare (in CLF) fixf_po[rule del] P_def [simp del] A_def [simp del] r_def [simp del]
  1106   declare (in CLF) fixf_po[rule del] P_def [simp del] A_def [simp del] r_def [simp del]
  1093          Tarski.tarski_full_lemma [rule del] cl_po [rule del] cl_co [rule del]
  1107          Tarski.tarski_full_lemma [rule del] cl_po [rule del] cl_co [rule del]
  1094          CompleteLatticeI_simp [rule del]
  1108          CompleteLatticeI_simp [rule del]
  1095 
  1109