src/HOL/Isar_examples/Cantor.thy
author berghofe
Mon, 19 Nov 2001 17:42:00 +0100
changeset 12239 ee360f910ec8
parent 10007 64bf7da1994a
child 12388 c845fec1ac94
permissions -rw-r--r--
Now handles different theorems with same name more gracefully.

(*  Title:      HOL/Isar_examples/Cantor.thy
    ID:         $Id$
    Author:     Markus Wenzel, TU Muenchen
*)

header {* Cantor's Theorem *}

theory Cantor = Main:

text_raw {*
 \footnote{This is an Isar version of the final example of the
 Isabelle/HOL manual \cite{isabelle-HOL}.}
*}

text {*
 Cantor's Theorem states that every set has more subsets than it has
 elements.  It has become a favorite basic example in pure
 higher-order logic since it is so easily expressed: \[\all{f::\alpha
 \To \alpha \To \idt{bool}} \ex{S::\alpha \To \idt{bool}}
 \all{x::\alpha} f \ap x \not= S\]
  
 Viewing types as sets, $\alpha \To \idt{bool}$ represents the
 powerset of $\alpha$.  This version of the theorem states that for
 every function from $\alpha$ to its powerset, some subset is outside
 its range.  The Isabelle/Isar proofs below uses HOL's set theory,
 with the type $\alpha \ap \idt{set}$ and the operator
 $\idt{range}::(\alpha \To \beta) \To \beta \ap \idt{set}$.
  
 \bigskip We first consider a slightly awkward version of the proof,
 with the innermost reasoning expressed quite naively.
*}

theorem "EX S. S ~: range (f :: 'a => 'a set)"
proof
  let ?S = "{x. x ~: f x}"
  show "?S ~: range f"
  proof
    assume "?S : range f"
    thus False
    proof
      fix y 
      assume "?S = f y"
      thus ?thesis
      proof (rule equalityCE)
        assume in_S: "y : ?S"
        assume in_fy: "y : f y"
        from in_S have notin_fy: "y ~: f y" ..
        from notin_fy in_fy show ?thesis by contradiction
      next
        assume notin_S: "y ~: ?S"
        assume notin_fy: "y ~: f y"
        from notin_S have in_fy: "y : f y" ..
        from notin_fy in_fy show ?thesis by contradiction
      qed
    qed
  qed
qed

text {*
 The following version of the proof essentially does the same
 reasoning, only that it is expressed more neatly.  In particular, we
 change the order of assumptions introduced in the two cases of rule
 \name{equalityCE}, streamlining the flow of intermediate facts and
 avoiding explicit naming.\footnote{In general, neither the order of
 assumptions as introduced by \isacommand{assume}, nor the order of
 goals as solved by \isacommand{show} is of any significance.  The
 basic logical structure has to be left intact, though.  In
 particular, assumptions ``belonging'' to some goal have to be
 introduced \emph{before} its corresponding \isacommand{show}.}
*}

theorem "EX S. S ~: range (f :: 'a => 'a set)"
proof
  let ?S = "{x. x ~: f x}"
  show "?S ~: range f"
  proof
    assume "?S : range f"
    thus False
    proof
      fix y 
      assume "?S = f y"
      thus ?thesis
      proof (rule equalityCE)
        assume "y : f y"
        assume "y : ?S" hence "y ~: f y" ..
        thus ?thesis by contradiction
      next
        assume "y ~: f y"
        assume "y ~: ?S" hence "y : f y" ..
        thus ?thesis by contradiction
      qed
    qed
  qed
qed

text {*
 How much creativity is required?  As it happens, Isabelle can prove
 this theorem automatically using best-first search.  Depth-first
 search would diverge, but best-first search successfully navigates
 through the large search space.  The context of Isabelle's classical
 prover contains rules for the relevant constructs of HOL's set
 theory.
*}

theorem "EX S. S ~: range (f :: 'a => 'a set)"
  by best

text {*
 While this establishes the same theorem internally, we do not get any
 idea of how the proof actually works.  There is currently no way to
 transform internal system-level representations of Isabelle proofs
 back into Isar text.  Writing intelligible proof documents
 really is a creative process, after all.
*}

end