Theory set

Up to index of Isabelle/HOL/MetisExamples

theory set
imports Main
begin

(*  Title:      HOL/MetisExamples/set.thy
    ID:         $Id: set.thy,v 1.5 2007/10/09 16:14:00 paulson 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

ML{*ResReconstruct.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


ML{*ResReconstruct.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

ML{*ResReconstruct.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*)

ML{*ResReconstruct.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_def)

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 = YZ) = (Y  XZ  X ∧ (∀V. Y  VZ  V --> X  V))

lemma

  (X = YZ) = (Y  XZ  X ∧ (∀V. Y  VZ  V --> X  V))

lemma

  (X = YZ) = (Y  XZ  X ∧ (∀V. Y  VZ  V --> X  V))

lemma

  (X = YZ) = (Y  XZ  X ∧ (∀V. Y  VZ  V --> X  V))

lemma

  (X = YZ) = (Y  XZ  X ∧ (∀V. Y  VZ  V --> X  V))

lemma

  (X = YZ) = (X  YX  Z ∧ (∀V. V  YV  Z --> V  X))

lemma fixedpoint:

  ∃!x. f (g x) = x ==> ∃!y. g (f y) = y

lemma fixedpoint:

  ∃!x. f (g x) = x ==> ∃!y. g (f y) = y

lemma

  xS. Union S  x ==> ∃z. S  {z}

lemma

  xS. Union S  x ==> ∃z. S  {z}

lemma singleton_example_2:

  xS. Union S  x ==> ∃z. S  {z}

lemma

  B. ∀xB. x  0
  DF ==> ∃G. ∀AG. ∃BF. A  B
  P a ==> ∃A. (∀xA. P x) ∧ (∃y. yA)
  a < bb < c ==> ∃B. a  BbBc  B
  P (f b) ==> ∃s A. (∀xA. P x) ∧ f sA
  P (f b) ==> ∃s A. (∀xA. P x) ∧ f sA
  A. a  A
  (∀C. (0, 0) ∈ C ∧ (∀x y. (x, y) ∈ C --> (Suc x, Suc y) ∈ C) --> (n, m) ∈ C) ∧
  Q n -->
  Q m