src/HOL/Isar_examples/Puzzle.thy
author wenzelm
Wed, 16 Nov 2005 19:34:19 +0100
changeset 18193 54419506df9e
parent 18191 ef29685acef0
child 18204 c3caf13f621d
permissions -rw-r--r--
tuned document;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
8020
2823ce1753a5 added Isar_examples/Puzzle.thy;
wenzelm
parents:
diff changeset
     1
10007
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9941
diff changeset
     2
header {* An old chestnut *}
8020
2823ce1753a5 added Isar_examples/Puzzle.thy;
wenzelm
parents:
diff changeset
     3
16417
9bc16273c2d4 migrated theory headers to new format
haftmann
parents: 12997
diff changeset
     4
theory Puzzle imports Main begin
8020
2823ce1753a5 added Isar_examples/Puzzle.thy;
wenzelm
parents:
diff changeset
     5
2823ce1753a5 added Isar_examples/Puzzle.thy;
wenzelm
parents:
diff changeset
     6
text_raw {*
18193
54419506df9e tuned document;
wenzelm
parents: 18191
diff changeset
     7
  \footnote{A question from ``Bundeswettbewerb Mathematik''.  Original
54419506df9e tuned document;
wenzelm
parents: 18191
diff changeset
     8
  pen-and-paper proof due to Herbert Ehler; Isabelle tactic script by
54419506df9e tuned document;
wenzelm
parents: 18191
diff changeset
     9
  Tobias Nipkow.}
54419506df9e tuned document;
wenzelm
parents: 18191
diff changeset
    10
*}
8020
2823ce1753a5 added Isar_examples/Puzzle.thy;
wenzelm
parents:
diff changeset
    11
18193
54419506df9e tuned document;
wenzelm
parents: 18191
diff changeset
    12
text {*
54419506df9e tuned document;
wenzelm
parents: 18191
diff changeset
    13
  \textbf{Problem.}  Given some function $f\colon \Nat \to \Nat$ such
54419506df9e tuned document;
wenzelm
parents: 18191
diff changeset
    14
  that $f \ap (f \ap n) < f \ap (\idt{Suc} \ap n)$ for all $n$.
54419506df9e tuned document;
wenzelm
parents: 18191
diff changeset
    15
  Demonstrate that $f$ is the identity.
10007
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9941
diff changeset
    16
*}
8020
2823ce1753a5 added Isar_examples/Puzzle.thy;
wenzelm
parents:
diff changeset
    17
18191
ef29685acef0 improved induction proof: local defs/fixes;
wenzelm
parents: 16417
diff changeset
    18
theorem
ef29685acef0 improved induction proof: local defs/fixes;
wenzelm
parents: 16417
diff changeset
    19
  fixes n :: nat
ef29685acef0 improved induction proof: local defs/fixes;
wenzelm
parents: 16417
diff changeset
    20
  assumes f_ax: "\<And>n. f (f n) < f (Suc n)"
ef29685acef0 improved induction proof: local defs/fixes;
wenzelm
parents: 16417
diff changeset
    21
  shows "f n = n"
10436
98c421dd5972 simplified induction;
wenzelm
parents: 10007
diff changeset
    22
proof (rule order_antisym)
18191
ef29685acef0 improved induction proof: local defs/fixes;
wenzelm
parents: 16417
diff changeset
    23
  {
ef29685acef0 improved induction proof: local defs/fixes;
wenzelm
parents: 16417
diff changeset
    24
    fix n show "n \<le> f n"
ef29685acef0 improved induction proof: local defs/fixes;
wenzelm
parents: 16417
diff changeset
    25
    proof (induct k \<equiv> "f n" rule: less_induct fixing: n)
ef29685acef0 improved induction proof: local defs/fixes;
wenzelm
parents: 16417
diff changeset
    26
      case (less k n)
ef29685acef0 improved induction proof: local defs/fixes;
wenzelm
parents: 16417
diff changeset
    27
      then have hyp: "\<And>m. f m < f n \<Longrightarrow> m \<le> f m" by (simp only:)
ef29685acef0 improved induction proof: local defs/fixes;
wenzelm
parents: 16417
diff changeset
    28
      show "n \<le> f n"
10436
98c421dd5972 simplified induction;
wenzelm
parents: 10007
diff changeset
    29
      proof (cases n)
18191
ef29685acef0 improved induction proof: local defs/fixes;
wenzelm
parents: 16417
diff changeset
    30
	case (Suc m)
ef29685acef0 improved induction proof: local defs/fixes;
wenzelm
parents: 16417
diff changeset
    31
	from f_ax have "f (f m) < f n" by (simp only: Suc)
ef29685acef0 improved induction proof: local defs/fixes;
wenzelm
parents: 16417
diff changeset
    32
	with hyp have "f m \<le> f (f m)" .
ef29685acef0 improved induction proof: local defs/fixes;
wenzelm
parents: 16417
diff changeset
    33
	also from f_ax have "\<dots> < f n" by (simp only: Suc)
ef29685acef0 improved induction proof: local defs/fixes;
wenzelm
parents: 16417
diff changeset
    34
	finally have "f m < f n" .
ef29685acef0 improved induction proof: local defs/fixes;
wenzelm
parents: 16417
diff changeset
    35
	with hyp have "m \<le> f m" .
ef29685acef0 improved induction proof: local defs/fixes;
wenzelm
parents: 16417
diff changeset
    36
	also note `\<dots> < f n`
ef29685acef0 improved induction proof: local defs/fixes;
wenzelm
parents: 16417
diff changeset
    37
	finally have "m < f n" .
ef29685acef0 improved induction proof: local defs/fixes;
wenzelm
parents: 16417
diff changeset
    38
	then have "n \<le> f n" by (simp only: Suc)
ef29685acef0 improved induction proof: local defs/fixes;
wenzelm
parents: 16417
diff changeset
    39
	then show ?thesis .
10007
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9941
diff changeset
    40
      next
18191
ef29685acef0 improved induction proof: local defs/fixes;
wenzelm
parents: 16417
diff changeset
    41
	case 0
ef29685acef0 improved induction proof: local defs/fixes;
wenzelm
parents: 16417
diff changeset
    42
	then show ?thesis by simp
10007
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9941
diff changeset
    43
      qed
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9941
diff changeset
    44
    qed
18191
ef29685acef0 improved induction proof: local defs/fixes;
wenzelm
parents: 16417
diff changeset
    45
  } note ge = this
8020
2823ce1753a5 added Isar_examples/Puzzle.thy;
wenzelm
parents:
diff changeset
    46
10436
98c421dd5972 simplified induction;
wenzelm
parents: 10007
diff changeset
    47
  {
18191
ef29685acef0 improved induction proof: local defs/fixes;
wenzelm
parents: 16417
diff changeset
    48
    fix m n :: nat
ef29685acef0 improved induction proof: local defs/fixes;
wenzelm
parents: 16417
diff changeset
    49
    assume "m \<le> n"
ef29685acef0 improved induction proof: local defs/fixes;
wenzelm
parents: 16417
diff changeset
    50
    then have "f m \<le> f n"
10007
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9941
diff changeset
    51
    proof (induct n)
18191
ef29685acef0 improved induction proof: local defs/fixes;
wenzelm
parents: 16417
diff changeset
    52
      case 0
ef29685acef0 improved induction proof: local defs/fixes;
wenzelm
parents: 16417
diff changeset
    53
      then have "m = 0" by simp
ef29685acef0 improved induction proof: local defs/fixes;
wenzelm
parents: 16417
diff changeset
    54
      then show ?case by simp
10436
98c421dd5972 simplified induction;
wenzelm
parents: 10007
diff changeset
    55
    next
18191
ef29685acef0 improved induction proof: local defs/fixes;
wenzelm
parents: 16417
diff changeset
    56
      case (Suc n)
ef29685acef0 improved induction proof: local defs/fixes;
wenzelm
parents: 16417
diff changeset
    57
      from Suc.prems show "f m \<le> f (Suc n)"
10436
98c421dd5972 simplified induction;
wenzelm
parents: 10007
diff changeset
    58
      proof (rule le_SucE)
18191
ef29685acef0 improved induction proof: local defs/fixes;
wenzelm
parents: 16417
diff changeset
    59
        assume "m \<le> n"
ef29685acef0 improved induction proof: local defs/fixes;
wenzelm
parents: 16417
diff changeset
    60
        with Suc.hyps have "f m \<le> f n" .
ef29685acef0 improved induction proof: local defs/fixes;
wenzelm
parents: 16417
diff changeset
    61
        also from ge f_ax have "\<dots> < f (Suc n)"
10436
98c421dd5972 simplified induction;
wenzelm
parents: 10007
diff changeset
    62
          by (rule le_less_trans)
98c421dd5972 simplified induction;
wenzelm
parents: 10007
diff changeset
    63
        finally show ?thesis by simp
98c421dd5972 simplified induction;
wenzelm
parents: 10007
diff changeset
    64
      next
98c421dd5972 simplified induction;
wenzelm
parents: 10007
diff changeset
    65
        assume "m = Suc n"
18191
ef29685acef0 improved induction proof: local defs/fixes;
wenzelm
parents: 16417
diff changeset
    66
        then show ?thesis by simp
10007
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9941
diff changeset
    67
      qed
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9941
diff changeset
    68
    qed
10436
98c421dd5972 simplified induction;
wenzelm
parents: 10007
diff changeset
    69
  } note mono = this
8020
2823ce1753a5 added Isar_examples/Puzzle.thy;
wenzelm
parents:
diff changeset
    70
18191
ef29685acef0 improved induction proof: local defs/fixes;
wenzelm
parents: 16417
diff changeset
    71
  show "f n \<le> n"
10436
98c421dd5972 simplified induction;
wenzelm
parents: 10007
diff changeset
    72
  proof -
18191
ef29685acef0 improved induction proof: local defs/fixes;
wenzelm
parents: 16417
diff changeset
    73
    have "\<not> n < f n"
10007
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9941
diff changeset
    74
    proof
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9941
diff changeset
    75
      assume "n < f n"
18191
ef29685acef0 improved induction proof: local defs/fixes;
wenzelm
parents: 16417
diff changeset
    76
      then have "Suc n \<le> f n" by simp
ef29685acef0 improved induction proof: local defs/fixes;
wenzelm
parents: 16417
diff changeset
    77
      then have "f (Suc n) \<le> f (f n)" by (rule mono)
ef29685acef0 improved induction proof: local defs/fixes;
wenzelm
parents: 16417
diff changeset
    78
      also have "\<dots> < f (Suc n)" by (rule f_ax)
ef29685acef0 improved induction proof: local defs/fixes;
wenzelm
parents: 16417
diff changeset
    79
      finally have "\<dots> < \<dots>" . then show False ..
10007
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9941
diff changeset
    80
    qed
18191
ef29685acef0 improved induction proof: local defs/fixes;
wenzelm
parents: 16417
diff changeset
    81
    then show ?thesis by simp
10007
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9941
diff changeset
    82
  qed
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9941
diff changeset
    83
qed
8020
2823ce1753a5 added Isar_examples/Puzzle.thy;
wenzelm
parents:
diff changeset
    84
10007
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9941
diff changeset
    85
end