# HG changeset patch # User blanchet # Date 1272560524 -7200 # Node ID f91342f218a9c9652dbe13b0a66b5800dbea3393 # Parent 061475351a09a35dc3deb2dba45f877e10cb868a redid some Sledgehammer/Metis proofs diff -r 061475351a09 -r f91342f218a9 src/HOL/Metis_Examples/Abstraction.thy --- a/src/HOL/Metis_Examples/Abstraction.thy Thu Apr 29 18:24:52 2010 +0200 +++ b/src/HOL/Metis_Examples/Abstraction.thy Thu Apr 29 19:02:04 2010 +0200 @@ -23,13 +23,11 @@ declare [[ atp_problem_prefix = "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) +proof - + assume "a \ {x. P x}" + hence "a \ P" by (metis Collect_def) + hence "P a" by (metis mem_def) + thus "P a" by metis qed lemma Collect_triv: "a \ {x. P x} ==> P a" @@ -38,76 +36,54 @@ declare [[ atp_problem_prefix = "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 mem_Collect_eq); - --{*34 secs*} + by (metis Collect_imp_eq ComplD UnE) declare [[ atp_problem_prefix = "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) +proof - + assume A1: "(a, b) \ Sigma A B" + hence F1: "b \ B a" by (metis mem_Sigma_iff) + have F2: "a \ A" by (metis A1 mem_Sigma_iff) + have "b \ B a" by (metis F1) + thus "a \ A \ b \ B a" by (metis F2) qed lemma Sigma_triv: "(a,b) \ Sigma A B ==> a \ A & b \ B a" by (metis SigmaD1 SigmaD2) declare [[ atp_problem_prefix = "Abstraction__Sigma_Collect" ]] -lemma "(a,b) \ (SIGMA x: A. {y. x = f y}) ==> a \ A & a = f b" -(*???metis says this is satisfiable! +lemma "(a, b) \ (SIGMA x:A. {y. x = f y}) \ a \ A \ a = f b" +(* Metis says this is satisfiable! by (metis CollectD SigmaD1 SigmaD2) *) by (meson CollectD SigmaD1 SigmaD2) -(*single-step*) -lemma "(a,b) \ (SIGMA x: A. {y. x = f y}) ==> a \ A & a = f b" -by (metis SigmaD1 SigmaD2 insert_def singleton_conv2 Un_empty_right vimage_Collect_eq vimage_def vimage_singleton_eq) - +lemma "(a, b) \ (SIGMA x:A. {y. x = f y}) \ a \ A \ a = f b" +by (metis mem_Sigma_iff singleton_conv2 vimage_Collect_eq vimage_singleton_eq) -lemma "(a,b) \ (SIGMA x: A. {y. x = f y}) ==> a \ A & a = f b" -proof (neg_clausify) -assume 0: "(a\'a\type, b\'b\type) -\ Sigma (A\'a\type set) - (COMBB Collect (COMBC (COMBB COMBB op =) (f\'b\type \ 'a\type)))" -assume 1: "(a\'a\type) \ (A\'a\type set) \ a \ (f\'b\type \ 'a\type) (b\'b\type)" -have 2: "(a\'a\type) \ (A\'a\type set)" - by (metis 0 SigmaD1) -have 3: "(b\'b\type) -\ COMBB Collect (COMBC (COMBB COMBB op =) (f\'b\type \ 'a\type)) (a\'a\type)" - by (metis 0 SigmaD2) -have 4: "(b\'b\type) \ Collect (COMBB (op = (a\'a\type)) (f\'b\type \ 'a\type))" - by (metis 3) -have 5: "(f\'b\type \ 'a\type) (b\'b\type) \ (a\'a\type)" - by (metis 1 2) -have 6: "(f\'b\type \ 'a\type) (b\'b\type) = (a\'a\type)" - by (metis 4 vimage_singleton_eq insert_def singleton_conv2 Un_empty_right vimage_Collect_eq vimage_def) -show "False" - by (metis 5 6) +lemma "(a, b) \ (SIGMA x:A. {y. x = f y}) \ a \ A \ a = f b" +proof - + assume A1: "(a, b) \ (SIGMA x:A. {y. x = f y})" + have F1: "\u. {u} = op = u" by (metis singleton_conv2 Collect_def) + have F2: "\x w. (\R. w (x R)) = x -` w" by (metis vimage_Collect_eq Collect_def) + have F3: "\v w y. v \ w -` op = y \ w v = y" by (metis F1 vimage_singleton_eq) + have F4: "b \ {R. a = f R}" by (metis A1 mem_Sigma_iff) + have F5: "a \ A" by (metis A1 mem_Sigma_iff) + have "b \ f -` op = a" by (metis F2 F4 Collect_def) + hence "f b = a" by (metis F3) + thus "a \ A \ a = f b" by (metis F5) qed -(*Alternative structured proof, untyped*) -lemma "(a,b) \ (SIGMA x: A. {y. x = f y}) ==> a \ A & a = f b" -proof (neg_clausify) -assume 0: "(a, b) \ Sigma A (COMBB Collect (COMBC (COMBB COMBB op =) f))" -have 1: "b \ Collect (COMBB (op = a) f)" - by (metis 0 SigmaD2) -have 2: "f b = a" - by (metis 1 vimage_Collect_eq singleton_conv2 insert_def Un_empty_right vimage_singleton_eq vimage_def) -assume 3: "a \ A \ a \ f b" -have 4: "a \ A" - by (metis 0 SigmaD1) -have 5: "f b \ a" - by (metis 4 3) -show "False" - by (metis 5 2) +(* Alternative structured proof *) +lemma "(a, b) \ (SIGMA x:A. {y. x = f y}) \ a \ A \ a = f b" +proof - + assume A1: "(a, b) \ (SIGMA x:A. {y. x = f y})" + hence F1: "a \ A" by (metis mem_Sigma_iff) + have "b \ {R. a = f R}" by (metis A1 mem_Sigma_iff) + hence F2: "b \ (\R. a = f R)" by (metis Collect_def) + hence "a = f b" by (unfold mem_def) + thus "a \ A \ a = f b" by (metis F1) qed @@ -116,56 +92,40 @@ by (metis Collect_mem_eq SigmaD2) 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 (COMBB Collect (COMBB (COMBC op \) pset))" -assume 2: "f \ pset cl" -have 3: "\X1 X2. X2 \ COMBB Collect (COMBB (COMBC op \) pset) X1 \ (X1, X2) \ CLF" - by (metis SigmaD2 1) -have 4: "\X1 X2. X2 \ pset X1 \ (X1, X2) \ CLF" - by (metis 3 Collect_mem_eq) -have 5: "(cl, f) \ CLF" - by (metis 2 4) -show "False" - by (metis 5 0) +proof - + assume A1: "(cl, f) \ CLF" + assume A2: "CLF = (SIGMA cl:CL. {f. f \ pset cl})" + have F1: "\v. (\R. R \ v) = v" by (metis Collect_mem_eq Collect_def) + have "\v u. (u, v) \ CLF \ v \ {R. R \ pset u}" by (metis A2 mem_Sigma_iff) + hence "\v u. (u, v) \ CLF \ v \ pset u" by (metis F1 Collect_def) + hence "f \ pset cl" by (metis A1) + thus "f \ pset cl" by metis qed declare [[ atp_problem_prefix = "Abstraction__Sigma_Collect_Pi" ]] lemma "(cl,f) \ (SIGMA cl: CL. {f. f \ pset cl \ pset cl}) ==> f \ pset cl \ pset cl" -proof (neg_clausify) -assume 0: "f \ Pi (pset cl) (COMBK (pset cl))" -assume 1: "(cl, f) -\ Sigma CL - (COMBB Collect - (COMBB (COMBC op \) (COMBS (COMBB Pi pset) (COMBB COMBK pset))))" -show "False" -(* by (metis 0 Collect_mem_eq SigmaD2 1) ??doesn't terminate*) - by (insert 0 1, simp add: COMBB_def COMBS_def COMBC_def) +proof - + assume A1: "(cl, f) \ (SIGMA cl:CL. {f. f \ pset cl \ pset cl})" + have F1: "\v. (\R. R \ v) = v" by (metis Collect_mem_eq Collect_def) + have "f \ {R. R \ pset cl \ pset cl}" using A1 by simp + hence "f \ pset cl \ pset cl" by (metis F1 Collect_def) + thus "f \ pset cl \ pset cl" by metis qed - declare [[ atp_problem_prefix = "Abstraction__Sigma_Collect_Int" ]] lemma "(cl,f) \ (SIGMA cl: CL. {f. f \ pset cl \ cl}) ==> f \ pset cl \ cl" -proof (neg_clausify) -assume 0: "(cl, f) -\ Sigma CL - (COMBB Collect (COMBB (COMBC op \) (COMBS (COMBB op \ pset) COMBI)))" -assume 1: "f \ pset cl \ cl" -have 2: "f \ COMBB Collect (COMBB (COMBC op \) (COMBS (COMBB op \ pset) COMBI)) cl" - by (insert 0, simp add: COMBB_def) -(* by (metis SigmaD2 0) ??doesn't terminate*) -have 3: "f \ COMBS (COMBB op \ pset) COMBI cl" - by (metis 2 Collect_mem_eq) -have 4: "f \ cl \ pset cl" - by (metis 1 Int_commute) -have 5: "f \ cl \ pset cl" - by (metis 3 Int_commute) -show "False" - by (metis 5 4) +proof - + assume A1: "(cl, f) \ (SIGMA cl:CL. {f. f \ pset cl \ cl})" + have F1: "\v. (\R. R \ v) = v" by (metis Collect_mem_eq Collect_def) + have "f \ {R. R \ pset cl \ cl}" using A1 by simp + hence "f \ Id_on cl `` pset cl" by (metis F1 Int_commute Image_Id_on Collect_def) + hence "f \ Id_on cl `` pset cl" by metis + hence "f \ cl \ pset cl" by (metis Image_Id_on) + thus "f \ pset cl \ cl" by (metis Int_commute) qed @@ -181,19 +141,13 @@ f \ pset cl \ cl" by auto -(*??no longer terminates, with combinators -by (metis Collect_mem_eq Int_def SigmaD2 UnCI Un_absorb1) - --{*@{text Int_def} is redundant*} -*) declare [[ atp_problem_prefix = "Abstraction__CLF_eq_Collect_Int" ]] lemma "(cl,f) \ CLF ==> CLF = (SIGMA cl: CL. {f. f \ pset cl \ cl}) ==> f \ pset cl \ cl" by auto -(*??no longer terminates, with combinators -by (metis Collect_mem_eq Int_commute SigmaD2) -*) + declare [[ atp_problem_prefix = "Abstraction__CLF_subset_Collect_Pi" ]] lemma @@ -201,9 +155,7 @@ CLF \ (SIGMA cl': CL. {f. f \ pset cl' \ pset cl'}) ==> f \ pset cl \ pset cl" by fast -(*??no longer terminates, with combinators -by (metis Collect_mem_eq SigmaD2 subsetD) -*) + declare [[ atp_problem_prefix = "Abstraction__CLF_eq_Collect_Pi" ]] lemma @@ -211,9 +163,7 @@ CLF = (SIGMA cl: CL. {f. f \ pset cl \ pset cl}) ==> f \ pset cl \ pset cl" by auto -(*??no longer terminates, with combinators -by (metis Collect_mem_eq SigmaD2 contra_subsetD equalityE) -*) + declare [[ atp_problem_prefix = "Abstraction__CLF_eq_Collect_Pi_mono" ]] lemma @@ -225,37 +175,33 @@ declare [[ atp_problem_prefix = "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 + apply (metis map_is_Nil_conv zip.simps(1)) +by auto declare [[ atp_problem_prefix = "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 + apply (metis Nil_is_map_conv zip_Nil) +by auto declare [[ atp_problem_prefix = "Abstraction__image_evenA" ]] -lemma "(%x. Suc(f x)) ` {x. even x} <= A ==> (\x. even x --> Suc(f x) \ A)"; -(*sledgehammer*) -by auto +lemma "(%x. Suc(f x)) ` {x. even x} <= A ==> (\x. even x --> Suc(f x) \ A)" +by (metis Collect_def image_subset_iff mem_def) declare [[ atp_problem_prefix = "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 +by (metis Collect_def imageI image_image image_subset_iff mem_def) declare [[ atp_problem_prefix = "Abstraction__image_curry" ]] lemma "f \ (%u v. b \ u \ v) ` A ==> \u v. P (b \ u \ v) ==> P(f y)" -(*sledgehammer*) +(*sledgehammer*) by auto declare [[ atp_problem_prefix = "Abstraction__image_TimesA" ]] lemma image_TimesA: "(%(x,y). (f x, g y)) ` (A \ B) = (f`A) \ (g`B)" -(*sledgehammer*) +(*sledgehammer*) apply (rule equalityI) (***Even the two inclusions are far too difficult using [[ atp_problem_prefix = "Abstraction__image_TimesA_simpler"]] @@ -283,15 +229,15 @@ declare [[ atp_problem_prefix = "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*) + "(%(x,y,z). (f x, g y, h z)) ` (A \ B \ C) = (f`A) \ (g`B) \ (h`C)" +(*sledgehammer*) by force declare [[ atp_problem_prefix = "Abstraction__image_TimesC" ]] lemma image_TimesC: "(%(x,y). (x \ x, y \ y)) ` (A \ B) = ((%x. x \ x) ` A) \ ((%y. y \ y) ` B)" -(*sledgehammer*) +(*sledgehammer*) by auto end diff -r 061475351a09 -r f91342f218a9 src/HOL/Metis_Examples/set.thy --- a/src/HOL/Metis_Examples/set.thy Thu Apr 29 18:24:52 2010 +0200 +++ b/src/HOL/Metis_Examples/set.thy Thu Apr 29 19:02:04 2010 +0200 @@ -8,24 +8,21 @@ imports Main begin +sledgehammer_params [isar_proof, debug, overlord] + lemma "EX x X. ALL y. EX z Z. (~P(y,y) | P(x,x) | ~S(z,x)) & (S(x,y) | ~S(y,z) | Q(Z,Z)) & (Q(X,y) | ~Q(y,Z) | S(X,X))" by metis -(*??But metis can't prove the single-step version...*) - - lemma "P(n::nat) ==> ~P(0) ==> n ~= 0" by metis sledgehammer_params [shrink_factor = 1] - (*multiple versions of this example*) lemma (*equal_union: *) - "(X = Y \ Z) = - (Y \ X \ Z \ X \ (\V. Y \ V \ Z \ V \ X \ V))" + "(X = Y \ Z) = (Y \ X \ Z \ X \ (\V. Y \ V \ Z \ V \ X \ V))" proof (neg_clausify) fix x assume 0: "Y \ X \ X = Y \ Z" @@ -269,15 +266,14 @@ "P (f b) \ \s A. (\x \ A. P x) \ f s \ A" "P (f b) \ \s A. (\x \ A. P x) \ f s \ A" "\A. a \ A" - "(\C. (0, 0) \ C \ (\x y. (x, y) \ C \ (Suc x, Suc y) \ C) \ (n, m) \ C) \ Q n \ Q m" -apply (metis atMost_iff) -apply (metis emptyE) -apply (metis insert_iff singletonE) + "(\C. (0, 0) \ C \ (\x y. (x, y) \ C \ (Suc x, Suc y) \ C) \ (n, m) \ C) \ Q n \ Q m" +apply (metis all_not_in_conv)+ +apply (metis mem_def) apply (metis insertCI singletonE zless_le) apply (metis Collect_def Collect_mem_eq) apply (metis Collect_def Collect_mem_eq) apply (metis DiffE) -apply (metis pair_in_Id_conv) +apply (metis pair_in_Id_conv) done end