diff -r 020381339d87 -r dd874e6a3282 src/HOL/MetisExamples/Abstraction.thy --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/HOL/MetisExamples/Abstraction.thy Thu Jun 21 13:23:33 2007 +0200 @@ -0,0 +1,248 @@ +(* Title: HOL/MetisExamples/Abstraction.thy + ID: $Id$ + Author: Lawrence C Paulson, Cambridge University Computer Laboratory + +Testing the metis method +*) + +theory Abstraction imports FuncSet +begin + +(*For Christoph Benzmueller*) +lemma "x<1 & ((op=) = (op=)) ==> ((op=) = (op=)) & (x<(2::nat))"; + by (metis One_nat_def less_Suc0 not_less0 not_less_eq numeral_2_eq_2) + +(*this is a theorem, but we can't prove it unless ext is applied explicitly +lemma "(op=) = (%x y. y=x)" +*) + +consts + monotone :: "['a => 'a, 'a set, ('a *'a)set] => bool" + pset :: "'a set => 'a set" + order :: "'a set => ('a * 'a) set" + +ML{*ResAtp.problem_name := "Abstraction__Collect_triv"*} +lemma (*Collect_triv:*) "a \ {x. P x} ==> P a" +proof (neg_clausify) +assume 0: "(a\'a\type) \ Collect (P\'a\type \ bool)" +assume 1: "\ (P\'a\type \ bool) (a\'a\type)" +have 2: "(P\'a\type \ bool) (a\'a\type)" + by (metis CollectD 0) +show "False" + by (metis 2 1) +qed + +lemma Collect_triv: "a \ {x. P x} ==> P a" +by (metis member_Collect_eq member_def) + + +ML{*ResAtp.problem_name := "Abstraction__Collect_mp"*} +lemma "a \ {x. P x --> Q x} ==> a \ {x. P x} ==> a \ {x. Q x}" + by (metis CollectI Collect_imp_eq ComplD UnE memberI member_Collect_eq); + --{*34 secs*} + +ML{*ResAtp.problem_name := "Abstraction__Sigma_triv"*} +lemma "(a,b) \ Sigma A B ==> a \ A & b \ B a" +proof (neg_clausify) +assume 0: "(a\'a\type, b\'b\type) \ Sigma (A\'a\type set) (B\'a\type \ 'b\type set)" +assume 1: "(a\'a\type) \ (A\'a\type set) \ (b\'b\type) \ (B\'a\type \ 'b\type set) a" +have 2: "(a\'a\type) \ (A\'a\type set)" + by (metis SigmaD1 0) +have 3: "(b\'b\type) \ (B\'a\type \ 'b\type set) (a\'a\type)" + by (metis SigmaD2 0) +have 4: "(b\'b\type) \ (B\'a\type \ 'b\type set) (a\'a\type)" + by (metis 1 2) +show "False" + by (metis 3 4) +qed + +lemma Sigma_triv: "(a,b) \ Sigma A B ==> a \ A & b \ B a" +by (metis SigmaD1 SigmaD2) + +ML{*ResAtp.problem_name := "Abstraction__Sigma_Collect"*} +lemma "(a,b) \ (SIGMA x: A. {y. x = f y}) ==> a \ A & a = f b" +(*???metis cannot prove this +by (metis CollectD SigmaD1 SigmaD2 UN_eq) +Also, UN_eq is unnecessary*) +by (meson CollectD SigmaD1 SigmaD2) + + + +(*single-step*) +lemma "(a,b) \ (SIGMA x: A. {y. x = f y}) ==> a \ A & a = f b" +proof (neg_clausify) +assume 0: "(a, b) \ Sigma A (llabs_subgoal_1 f)" +assume 1: "\f x. llabs_subgoal_1 f x = Collect (COMBB (op = x) f)" +assume 2: "a \ A \ a \ f b" +have 3: "a \ A" + by (metis SigmaD1 0) +have 4: "b \ llabs_subgoal_1 f a" + by (metis SigmaD2 0) +have 5: "\X1 X2. X2 -` {X1} = llabs_subgoal_1 X2 X1" + by (metis 1 vimage_Collect_eq singleton_conv2) +have 6: "\X1 X2 X3. X1 X2 = X3 \ X2 \ llabs_subgoal_1 X1 X3" + by (metis vimage_singleton_eq 5) +have 7: "f b \ a" + by (metis 2 3) +have 8: "f b = a" + by (metis 6 4) +show "False" + by (metis 8 7) +qed finish_clausify + + +ML{*ResAtp.problem_name := "Abstraction__CLF_eq_in_pp"*} +lemma "(cl,f) \ CLF ==> CLF = (SIGMA cl: CL.{f. f \ pset cl}) ==> f \ pset cl" +apply (metis Collect_mem_eq SigmaD2); +done + +lemma "(cl,f) \ CLF ==> CLF = (SIGMA cl: CL.{f. f \ pset cl}) ==> f \ pset cl"proof (neg_clausify) +assume 0: "(cl, f) \ CLF" +assume 1: "CLF = Sigma CL llabs_subgoal_1" +assume 2: "\cl. llabs_subgoal_1 cl = + Collect (llabs_Predicate_XRangeP_def_2_ op \ (pset cl))" +assume 3: "f \ pset cl" +show "False" + by (metis 0 1 SigmaD2 3 2 Collect_mem_eq) +qed finish_clausify (*ugly hack: combinators??*) + +ML{*ResAtp.problem_name := "Abstraction__Sigma_Collect_Pi"*} +lemma + "(cl,f) \ (SIGMA cl: CL. {f. f \ pset cl \ pset cl}) ==> + f \ pset cl \ pset cl" +apply (metis Collect_mem_eq SigmaD2); +done + +lemma + "(cl,f) \ (SIGMA cl::'a set : CL. {f. f \ pset cl \ pset cl}) ==> + f \ pset cl \ pset cl" +proof (neg_clausify) +assume 0: "(cl, f) \ Sigma CL llabs_subgoal_1" +assume 1: "\cl. llabs_subgoal_1 cl = + Collect + (llabs_Predicate_XRangeP_def_2_ op \ (Pi (pset cl) (COMBK (pset cl))))" +assume 2: "f \ Pi (pset cl) (COMBK (pset cl))" +show "False" + by (metis Collect_mem_eq 1 2 SigmaD2 0 member2_def) +qed finish_clausify + (*Hack to prevent the "Additional hypotheses" error*) + +ML{*ResAtp.problem_name := "Abstraction__Sigma_Collect_Int"*} +lemma + "(cl,f) \ (SIGMA cl: CL. {f. f \ pset cl \ cl}) ==> + f \ pset cl \ cl" +by (metis Collect_mem_eq SigmaD2) + +ML{*ResAtp.problem_name := "Abstraction__Sigma_Collect_Pi_mono"*} +lemma + "(cl,f) \ (SIGMA cl: CL. {f. f \ pset cl \ pset cl & monotone f (pset cl) (order cl)}) ==> + (f \ pset cl \ pset cl) & (monotone f (pset cl) (order cl))" +by auto + +ML{*ResAtp.problem_name := "Abstraction__CLF_subset_Collect_Int"*} +lemma "(cl,f) \ CLF ==> + CLF \ (SIGMA cl: CL. {f. f \ pset cl \ cl}) ==> + f \ pset cl \ cl" +by (metis Collect_mem_eq Int_def SigmaD2 UnCI Un_absorb1) + --{*@{text Int_def} is redundant} + +ML{*ResAtp.problem_name := "Abstraction__CLF_eq_Collect_Int"*} +lemma "(cl,f) \ CLF ==> + CLF = (SIGMA cl: CL. {f. f \ pset cl \ cl}) ==> + f \ pset cl \ cl" +by (metis Collect_mem_eq Int_commute SigmaD2) + +ML{*ResAtp.problem_name := "Abstraction__CLF_subset_Collect_Pi"*} +lemma + "(cl,f) \ CLF ==> + CLF \ (SIGMA cl': CL. {f. f \ pset cl' \ pset cl'}) ==> + f \ pset cl \ pset cl" +by (metis Collect_mem_eq SigmaD2 subsetD) + +ML{*ResAtp.problem_name := "Abstraction__CLF_eq_Collect_Pi"*} +lemma + "(cl,f) \ CLF ==> + CLF = (SIGMA cl: CL. {f. f \ pset cl \ pset cl}) ==> + f \ pset cl \ pset cl" +by (metis Collect_mem_eq SigmaD2 contra_subsetD equalityE) + +ML{*ResAtp.problem_name := "Abstraction__CLF_eq_Collect_Pi_mono"*} +lemma + "(cl,f) \ CLF ==> + CLF = (SIGMA cl: CL. {f. f \ pset cl \ pset cl & monotone f (pset cl) (order cl)}) ==> + (f \ pset cl \ pset cl) & (monotone f (pset cl) (order cl))" +by auto + +ML{*ResAtp.problem_name := "Abstraction__map_eq_zipA"*} +lemma "map (%x. (f x, g x)) xs = zip (map f xs) (map g xs)" +apply (induct xs) +(*sledgehammer*) +apply auto +done + +ML{*ResAtp.problem_name := "Abstraction__map_eq_zipB"*} +lemma "map (%w. (w -> w, w \ w)) xs = + zip (map (%w. w -> w) xs) (map (%w. w \ w) xs)" +apply (induct xs) +(*sledgehammer*) +apply auto +done + +ML{*ResAtp.problem_name := "Abstraction__image_evenA"*} +lemma "(%x. Suc(f x)) ` {x. even x} <= A ==> (\x. even x --> Suc(f x) \ A)"; +(*sledgehammer*) +by auto + +ML{*ResAtp.problem_name := "Abstraction__image_evenB"*} +lemma "(%x. f (f x)) ` ((%x. Suc(f x)) ` {x. even x}) <= A + ==> (\x. even x --> f (f (Suc(f x))) \ A)"; +(*sledgehammer*) +by auto + +ML{*ResAtp.problem_name := "Abstraction__image_curry"*} +lemma "f \ (%u v. b \ u \ v) ` A ==> \u v. P (b \ u \ v) ==> P(f y)" +(*sledgehammer*) +by auto + +ML{*ResAtp.problem_name := "Abstraction__image_TimesA"*} +lemma image_TimesA: "(%(x,y). (f x, g y)) ` (A \ B) = (f`A) \ (g`B)" +(*sledgehammer*) +apply (rule equalityI) +(***Even the two inclusions are far too difficult +ML{*ResAtp.problem_name := "Abstraction__image_TimesA_simpler"*} +***) +apply (rule subsetI) +apply (erule imageE) +(*V manages from here with help: Abstraction__image_TimesA_simpler_1_b.p*) +apply (erule ssubst) +apply (erule SigmaE) +(*V manages from here: Abstraction__image_TimesA_simpler_1_a.p*) +apply (erule ssubst) +apply (subst split_conv) +apply (rule SigmaI) +apply (erule imageI) + +txt{*subgoal 2*} +apply (clarify ); +apply (simp add: ); +apply (rule rev_image_eqI) +apply (blast intro: elim:); +apply (simp add: ); +done + +(*Given the difficulty of the previous problem, these two are probably +impossible*) + +ML{*ResAtp.problem_name := "Abstraction__image_TimesB"*} +lemma image_TimesB: + "(%(x,y,z). (f x, g y, h z)) ` (A \ B \ C) = (f`A) \ (g`B) \ (h`C)" +(*sledgehammer*) +by force + +ML{*ResAtp.problem_name := "Abstraction__image_TimesC"*} +lemma image_TimesC: + "(%(x,y). (x \ x, y \ y)) ` (A \ B) = + ((%x. x \ x) ` A) \ ((%y. y \ y) ` B)" +(*sledgehammer*) +by auto + +end