(* Title: HOL/MetisExamples/set.thy ID: $Id: set.thy,v 1.9 2008/05/07 08:58:04 berghofe Exp $ Author: Lawrence C Paulson, Cambridge University Computer Laboratory Testing the metis method *) theory set imports Main begin 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 declare [[sledgehammer_full = true]] declare [[sledgehammer_modulus = 1]] (*multiple versions of this example*) lemma (*equal_union: *) "(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" assume 1: "Z ⊆ X ∨ X = Y ∪ Z" assume 2: "(¬ Y ⊆ X ∨ ¬ Z ⊆ X ∨ Y ⊆ x) ∨ X ≠ Y ∪ Z" assume 3: "(¬ Y ⊆ X ∨ ¬ Z ⊆ X ∨ Z ⊆ x) ∨ X ≠ Y ∪ Z" assume 4: "(¬ Y ⊆ X ∨ ¬ Z ⊆ X ∨ ¬ X ⊆ x) ∨ X ≠ Y ∪ Z" assume 5: "!!V. ((¬ Y ⊆ V ∨ ¬ Z ⊆ V) ∨ X ⊆ V) ∨ X = Y ∪ Z" have 6: "sup Y Z = X ∨ Y ⊆ X" by (metis 0 sup_set_eq) have 7: "sup Y Z = X ∨ Z ⊆ X" by (metis 1 sup_set_eq) have 8: "!!X3. sup Y Z = X ∨ X ⊆ X3 ∨ ¬ Y ⊆ X3 ∨ ¬ Z ⊆ X3" by (metis 5 sup_set_eq) have 9: "Y ⊆ x ∨ sup Y Z ≠ X ∨ ¬ Y ⊆ X ∨ ¬ Z ⊆ X" by (metis 2 sup_set_eq) have 10: "Z ⊆ x ∨ sup Y Z ≠ X ∨ ¬ Y ⊆ X ∨ ¬ Z ⊆ X" by (metis 3 sup_set_eq) have 11: "sup Y Z ≠ X ∨ ¬ X ⊆ x ∨ ¬ Y ⊆ X ∨ ¬ Z ⊆ X" by (metis 4 sup_set_eq) have 12: "Z ⊆ X" by (metis Un_upper2 sup_set_eq 7) have 13: "!!X3. sup Y Z = X ∨ X ⊆ sup X3 Z ∨ ¬ Y ⊆ sup X3 Z" by (metis 8 Un_upper2 sup_set_eq) have 14: "Y ⊆ X" by (metis Un_upper1 sup_set_eq 6) have 15: "Z ⊆ x ∨ sup Y Z ≠ X ∨ ¬ Y ⊆ X" by (metis 10 12) have 16: "Y ⊆ x ∨ sup Y Z ≠ X ∨ ¬ Y ⊆ X" by (metis 9 12) have 17: "sup Y Z ≠ X ∨ ¬ X ⊆ x ∨ ¬ Y ⊆ X" by (metis 11 12) have 18: "sup Y Z ≠ X ∨ ¬ X ⊆ x" by (metis 17 14) have 19: "Z ⊆ x ∨ sup Y Z ≠ X" by (metis 15 14) have 20: "Y ⊆ x ∨ sup Y Z ≠ X" by (metis 16 14) have 21: "sup Y Z = X ∨ X ⊆ sup Y Z" by (metis 13 Un_upper1 sup_set_eq) have 22: "sup Y Z = X ∨ ¬ sup Y Z ⊆ X" by (metis equalityI 21) have 23: "sup Y Z = X ∨ ¬ Z ⊆ X ∨ ¬ Y ⊆ X" by (metis 22 Un_least sup_set_eq) have 24: "sup Y Z = X ∨ ¬ Y ⊆ X" by (metis 23 12) have 25: "sup Y Z = X" by (metis 24 14) have 26: "!!X3. X ⊆ X3 ∨ ¬ Z ⊆ X3 ∨ ¬ Y ⊆ X3" by (metis Un_least sup_set_eq 25) have 27: "Y ⊆ x" by (metis 20 25) have 28: "Z ⊆ x" by (metis 19 25) have 29: "¬ X ⊆ x" by (metis 18 25) have 30: "X ⊆ x ∨ ¬ Y ⊆ x" by (metis 26 28) have 31: "X ⊆ x" by (metis 30 27) show "False" by (metis 31 29) qed declare [[sledgehammer_modulus = 2]] lemma (*equal_union: *) "(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" assume 1: "Z ⊆ X ∨ X = Y ∪ Z" assume 2: "(¬ Y ⊆ X ∨ ¬ Z ⊆ X ∨ Y ⊆ x) ∨ X ≠ Y ∪ Z" assume 3: "(¬ Y ⊆ X ∨ ¬ Z ⊆ X ∨ Z ⊆ x) ∨ X ≠ Y ∪ Z" assume 4: "(¬ Y ⊆ X ∨ ¬ Z ⊆ X ∨ ¬ X ⊆ x) ∨ X ≠ Y ∪ Z" assume 5: "!!V. ((¬ Y ⊆ V ∨ ¬ Z ⊆ V) ∨ X ⊆ V) ∨ X = Y ∪ Z" have 6: "sup Y Z = X ∨ Y ⊆ X" by (metis 0 sup_set_eq) have 7: "Y ⊆ x ∨ sup Y Z ≠ X ∨ ¬ Y ⊆ X ∨ ¬ Z ⊆ X" by (metis 2 sup_set_eq) have 8: "sup Y Z ≠ X ∨ ¬ X ⊆ x ∨ ¬ Y ⊆ X ∨ ¬ Z ⊆ X" by (metis 4 sup_set_eq) have 9: "!!X3. sup Y Z = X ∨ X ⊆ sup X3 Z ∨ ¬ Y ⊆ sup X3 Z" by (metis 5 sup_set_eq Un_upper2 sup_set_eq) have 10: "Z ⊆ x ∨ sup Y Z ≠ X ∨ ¬ Y ⊆ X" by (metis 3 sup_set_eq Un_upper2 sup_set_eq sup_set_eq) have 11: "sup Y Z ≠ X ∨ ¬ X ⊆ x ∨ ¬ Y ⊆ X" by (metis 8 Un_upper2 sup_set_eq sup_set_eq) have 12: "Z ⊆ x ∨ sup Y Z ≠ X" by (metis 10 Un_upper1 sup_set_eq) have 13: "sup Y Z = X ∨ X ⊆ sup Y Z" by (metis 9 Un_upper1 sup_set_eq) have 14: "sup Y Z = X ∨ ¬ Z ⊆ X ∨ ¬ Y ⊆ X" by (metis equalityI 13 Un_least sup_set_eq) have 15: "sup Y Z = X" by (metis 14 sup_set_eq 1 sup_set_eq sup_set_eq 6) have 16: "Y ⊆ x" by (metis 7 Un_upper2 sup_set_eq sup_set_eq Un_upper1 sup_set_eq 15) have 17: "¬ X ⊆ x" by (metis 11 Un_upper1 sup_set_eq 15) have 18: "X ⊆ x" by (metis Un_least sup_set_eq 15 12 15 16) show "False" by (metis 18 17) qed declare [[sledgehammer_modulus = 3]] lemma (*equal_union: *) "(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" assume 1: "Z ⊆ X ∨ X = Y ∪ Z" assume 2: "(¬ Y ⊆ X ∨ ¬ Z ⊆ X ∨ Y ⊆ x) ∨ X ≠ Y ∪ Z" assume 3: "(¬ Y ⊆ X ∨ ¬ Z ⊆ X ∨ Z ⊆ x) ∨ X ≠ Y ∪ Z" assume 4: "(¬ Y ⊆ X ∨ ¬ Z ⊆ X ∨ ¬ X ⊆ x) ∨ X ≠ Y ∪ Z" assume 5: "!!V. ((¬ Y ⊆ V ∨ ¬ Z ⊆ V) ∨ X ⊆ V) ∨ X = Y ∪ Z" have 6: "Z ⊆ x ∨ sup Y Z ≠ X ∨ ¬ Y ⊆ X ∨ ¬ Z ⊆ X" by (metis 3 sup_set_eq) have 7: "!!X3. sup Y Z = X ∨ X ⊆ sup X3 Z ∨ ¬ Y ⊆ sup X3 Z" by (metis 5 sup_set_eq Un_upper2 sup_set_eq) have 8: "Y ⊆ x ∨ sup Y Z ≠ X ∨ ¬ Y ⊆ X" by (metis 2 sup_set_eq Un_upper2 sup_set_eq sup_set_eq) have 9: "Z ⊆ x ∨ sup Y Z ≠ X" by (metis 6 Un_upper2 sup_set_eq sup_set_eq Un_upper1 sup_set_eq sup_set_eq) have 10: "sup Y Z = X ∨ ¬ sup Y Z ⊆ X" by (metis equalityI 7 Un_upper1 sup_set_eq) have 11: "sup Y Z = X" by (metis 10 Un_least sup_set_eq sup_set_eq 1 sup_set_eq sup_set_eq 0 sup_set_eq) have 12: "Z ⊆ x" by (metis 9 11) have 13: "X ⊆ x" by (metis Un_least sup_set_eq 11 12 8 Un_upper1 sup_set_eq sup_set_eq 11) show "False" by (metis 13 4 sup_set_eq Un_upper2 sup_set_eq sup_set_eq Un_upper1 sup_set_eq sup_set_eq 11) qed (*Example included in TPHOLs paper*) declare [[sledgehammer_modulus = 4]] lemma (*equal_union: *) "(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" assume 1: "Z ⊆ X ∨ X = Y ∪ Z" assume 2: "(¬ Y ⊆ X ∨ ¬ Z ⊆ X ∨ Y ⊆ x) ∨ X ≠ Y ∪ Z" assume 3: "(¬ Y ⊆ X ∨ ¬ Z ⊆ X ∨ Z ⊆ x) ∨ X ≠ Y ∪ Z" assume 4: "(¬ Y ⊆ X ∨ ¬ Z ⊆ X ∨ ¬ X ⊆ x) ∨ X ≠ Y ∪ Z" assume 5: "!!V. ((¬ Y ⊆ V ∨ ¬ Z ⊆ V) ∨ X ⊆ V) ∨ X = Y ∪ Z" have 6: "sup Y Z ≠ X ∨ ¬ X ⊆ x ∨ ¬ Y ⊆ X ∨ ¬ Z ⊆ X" by (metis 4 sup_set_eq) have 7: "Z ⊆ x ∨ sup Y Z ≠ X ∨ ¬ Y ⊆ X" by (metis 3 sup_set_eq Un_upper2 sup_set_eq sup_set_eq) have 8: "Z ⊆ x ∨ sup Y Z ≠ X" by (metis 7 Un_upper1 sup_set_eq sup_set_eq) have 9: "sup Y Z = X ∨ ¬ Z ⊆ X ∨ ¬ Y ⊆ X" by (metis equalityI 5 sup_set_eq Un_upper2 sup_set_eq Un_upper1 sup_set_eq Un_least sup_set_eq) have 10: "Y ⊆ x" by (metis 2 sup_set_eq Un_upper2 sup_set_eq 1 sup_set_eq Un_upper1 sup_set_eq 0 sup_set_eq 9 Un_upper2 sup_set_eq 1 sup_set_eq Un_upper1 sup_set_eq 0 sup_set_eq) have 11: "X ⊆ x" by (metis Un_least sup_set_eq 9 Un_upper2 sup_set_eq 1 sup_set_eq Un_upper1 sup_set_eq 0 sup_set_eq 8 9 Un_upper2 sup_set_eq 1 sup_set_eq Un_upper1 sup_set_eq 0 sup_set_eq 10) show "False" by (metis 11 6 Un_upper2 sup_set_eq 1 sup_set_eq Un_upper1 sup_set_eq 0 sup_set_eq 9 Un_upper2 sup_set_eq 1 sup_set_eq Un_upper1 sup_set_eq 0 sup_set_eq) qed ML {*ResAtp.problem_name := "set__equal_union"*} lemma (*equal_union: *) "(X = Y ∪ Z) = (Y ⊆ X ∧ Z ⊆ X ∧ (∀V. Y ⊆ V ∧ Z ⊆ V --> X ⊆ V))" (*One shot proof: hand-reduced. Metis can't do the full proof any more.*) by (metis Un_least Un_upper1 Un_upper2 set_eq_subset) ML {*ResAtp.problem_name := "set__equal_inter"*} lemma "(X = Y ∩ Z) = (X ⊆ Y ∧ X ⊆ Z ∧ (∀V. V ⊆ Y ∧ V ⊆ Z --> V ⊆ X))" by (metis Int_greatest Int_lower1 Int_lower2 set_eq_subset) ML {*ResAtp.problem_name := "set__fixedpoint"*} lemma fixedpoint: "∃!x. f (g x) = x ==> ∃!y. g (f y) = y" by metis lemma (*fixedpoint:*) "∃!x. f (g x) = x ==> ∃!y. g (f y) = y" proof (neg_clausify) fix x xa assume 0: "f (g x) = x" assume 1: "!!y. y = x ∨ f (g y) ≠ y" assume 2: "!!x. g (f (xa x)) = xa x ∨ g (f x) ≠ x" assume 3: "!!x. g (f x) ≠ x ∨ xa x ≠ x" have 4: "!!X1. g (f X1) ≠ X1 ∨ g x ≠ X1" by (metis 3 1 2) show "False" by (metis 4 0) qed ML {*ResAtp.problem_name := "set__singleton_example"*} lemma (*singleton_example_2:*) "∀x ∈ S. \<Union>S ⊆ x ==> ∃z. S ⊆ {z}" by (metis Set.subsetI Union_upper insertCI set_eq_subset) --{*found by SPASS*} lemma (*singleton_example_2:*) "∀x ∈ S. \<Union>S ⊆ x ==> ∃z. S ⊆ {z}" by (metis Un_absorb2 Union_insert insertI1 insert_Diff insert_Diff_single subset_eq) lemma singleton_example_2: "∀x ∈ S. \<Union>S ⊆ x ==> ∃z. S ⊆ {z}" proof (neg_clausify) assume 0: "!!x. ¬ S ⊆ {x}" assume 1: "!!x. x ∉ S ∨ \<Union>S ⊆ x" have 2: "!!X3. X3 = \<Union>S ∨ ¬ X3 ⊆ \<Union>S ∨ X3 ∉ S" by (metis set_eq_subset 1) have 3: "!!X3. S ⊆ insert (\<Union>S) X3" by (metis insert_iff Set.subsetI Union_upper 2 Set.subsetI) show "False" by (metis 3 0) qed text {* From W. W. Bledsoe and Guohui Feng, SET-VAR. JAR 11 (3), 1993, pages 293-314. *} ML {*ResAtp.problem_name := "set__Bledsoe_Fung"*} (*Notes: 1, the numbering doesn't completely agree with the paper. 2, we must rename set variables to avoid type clashes.*) lemma "∃B. (∀x ∈ B. x ≤ (0::int))" "D ∈ F ==> ∃G. ∀A ∈ G. ∃B ∈ F. A ⊆ B" "P a ==> ∃A. (∀x ∈ A. P x) ∧ (∃y. y ∈ A)" "a < b ∧ b < (c::int) ==> ∃B. a ∉ B ∧ b ∈ B ∧ c ∉ B" "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) apply (metis insertCI singletonE zless_le) apply (metis insert_iff singletonE) apply (metis insert_iff singletonE) apply (metis DiffE) apply (metis pair_in_Id_conv) done end
lemma
∃x X. ∀y. ∃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))
lemma
[| P n; ¬ P 0 |] ==> n ≠ 0
lemma
(X = Y ∪ Z) = (Y ⊆ X ∧ Z ⊆ X ∧ (∀V. Y ⊆ V ∧ Z ⊆ V --> X ⊆ V))
lemma
(X = Y ∪ Z) = (Y ⊆ X ∧ Z ⊆ X ∧ (∀V. Y ⊆ V ∧ Z ⊆ V --> X ⊆ V))
lemma
(X = Y ∪ Z) = (Y ⊆ X ∧ Z ⊆ X ∧ (∀V. Y ⊆ V ∧ Z ⊆ V --> X ⊆ V))
lemma
(X = Y ∪ Z) = (Y ⊆ X ∧ Z ⊆ X ∧ (∀V. Y ⊆ V ∧ Z ⊆ V --> X ⊆ V))
lemma
(X = Y ∪ Z) = (Y ⊆ X ∧ Z ⊆ X ∧ (∀V. Y ⊆ V ∧ Z ⊆ V --> X ⊆ V))
lemma
(X = Y ∩ Z) = (X ⊆ Y ∧ X ⊆ Z ∧ (∀V. V ⊆ Y ∧ V ⊆ Z --> V ⊆ X))
lemma fixedpoint:
∃!x. f (g x) = x ==> ∃!y. g (f y) = y
lemma
∃!x. f (g x) = x ==> ∃!y. g (f y) = y
lemma
∀x∈S. Union S ⊆ x ==> ∃z. S ⊆ {z}
lemma
∀x∈S. Union S ⊆ x ==> ∃z. S ⊆ {z}
lemma singleton_example_2:
∀x∈S. Union S ⊆ x ==> ∃z. S ⊆ {z}
lemma
∃B. ∀x∈B. x ≤ 0
D ∈ F ==> ∃G. ∀A∈G. ∃B∈F. A ⊆ B
P a ==> ∃A. (∀x∈A. P x) ∧ (∃y. y ∈ A)
a < b ∧ b < c ==> ∃B. a ∉ B ∧ b ∈ B ∧ c ∉ B
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