src/HOL/Isar_Examples/Puzzle.thy
author traytel
Mon, 24 Oct 2016 16:53:32 +0200
changeset 64378 e9eb0b99a44c
parent 63583 a39baba12732
permissions -rw-r--r--
apply transfer_prover after folding relator_eq
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
58882
6e2010ab8bd9 modernized header;
wenzelm
parents: 58614
diff changeset
     1
section \<open>An old chestnut\<close>
8020
2823ce1753a5 added Isar_examples/Puzzle.thy;
wenzelm
parents:
diff changeset
     2
31758
3edd5f813f01 observe standard theory naming conventions;
wenzelm
parents: 20503
diff changeset
     3
theory Puzzle
63583
wenzelm
parents: 61932
diff changeset
     4
  imports Main
31758
3edd5f813f01 observe standard theory naming conventions;
wenzelm
parents: 20503
diff changeset
     5
begin
8020
2823ce1753a5 added Isar_examples/Puzzle.thy;
wenzelm
parents:
diff changeset
     6
61932
2e48182cc82c misc tuning and modernization;
wenzelm
parents: 61541
diff changeset
     7
text_raw \<open>\<^footnote>\<open>A question from ``Bundeswettbewerb Mathematik''. Original
2e48182cc82c misc tuning and modernization;
wenzelm
parents: 61541
diff changeset
     8
  pen-and-paper proof due to Herbert Ehler; Isabelle tactic script by Tobias
2e48182cc82c misc tuning and modernization;
wenzelm
parents: 61541
diff changeset
     9
  Nipkow.\<close>\<close>
8020
2823ce1753a5 added Isar_examples/Puzzle.thy;
wenzelm
parents:
diff changeset
    10
61932
2e48182cc82c misc tuning and modernization;
wenzelm
parents: 61541
diff changeset
    11
text \<open>
2e48182cc82c misc tuning and modernization;
wenzelm
parents: 61541
diff changeset
    12
  \<^bold>\<open>Problem.\<close> Given some function \<open>f: \<nat> \<rightarrow> \<nat>\<close> such that \<open>f (f n) < f (Suc n)\<close>
2e48182cc82c misc tuning and modernization;
wenzelm
parents: 61541
diff changeset
    13
  for all \<open>n\<close>. Demonstrate that \<open>f\<close> is the identity.
2e48182cc82c misc tuning and modernization;
wenzelm
parents: 61541
diff changeset
    14
\<close>
8020
2823ce1753a5 added Isar_examples/Puzzle.thy;
wenzelm
parents:
diff changeset
    15
18191
ef29685acef0 improved induction proof: local defs/fixes;
wenzelm
parents: 16417
diff changeset
    16
theorem
ef29685acef0 improved induction proof: local defs/fixes;
wenzelm
parents: 16417
diff changeset
    17
  assumes f_ax: "\<And>n. f (f n) < f (Suc n)"
ef29685acef0 improved induction proof: local defs/fixes;
wenzelm
parents: 16417
diff changeset
    18
  shows "f n = n"
10436
98c421dd5972 simplified induction;
wenzelm
parents: 10007
diff changeset
    19
proof (rule order_antisym)
60410
a197387e1854 tuned proofs;
wenzelm
parents: 58882
diff changeset
    20
  show ge: "n \<le> f n" for n
a197387e1854 tuned proofs;
wenzelm
parents: 58882
diff changeset
    21
  proof (induct "f n" arbitrary: n rule: less_induct)
a197387e1854 tuned proofs;
wenzelm
parents: 58882
diff changeset
    22
    case less
a197387e1854 tuned proofs;
wenzelm
parents: 58882
diff changeset
    23
    show "n \<le> f n"
a197387e1854 tuned proofs;
wenzelm
parents: 58882
diff changeset
    24
    proof (cases n)
a197387e1854 tuned proofs;
wenzelm
parents: 58882
diff changeset
    25
      case (Suc m)
a197387e1854 tuned proofs;
wenzelm
parents: 58882
diff changeset
    26
      from f_ax have "f (f m) < f n" by (simp only: Suc)
a197387e1854 tuned proofs;
wenzelm
parents: 58882
diff changeset
    27
      with less have "f m \<le> f (f m)" .
a197387e1854 tuned proofs;
wenzelm
parents: 58882
diff changeset
    28
      also from f_ax have "\<dots> < f n" by (simp only: Suc)
a197387e1854 tuned proofs;
wenzelm
parents: 58882
diff changeset
    29
      finally have "f m < f n" .
a197387e1854 tuned proofs;
wenzelm
parents: 58882
diff changeset
    30
      with less have "m \<le> f m" .
a197387e1854 tuned proofs;
wenzelm
parents: 58882
diff changeset
    31
      also note \<open>\<dots> < f n\<close>
a197387e1854 tuned proofs;
wenzelm
parents: 58882
diff changeset
    32
      finally have "m < f n" .
a197387e1854 tuned proofs;
wenzelm
parents: 58882
diff changeset
    33
      then have "n \<le> f n" by (simp only: Suc)
a197387e1854 tuned proofs;
wenzelm
parents: 58882
diff changeset
    34
      then show ?thesis .
a197387e1854 tuned proofs;
wenzelm
parents: 58882
diff changeset
    35
    next
a197387e1854 tuned proofs;
wenzelm
parents: 58882
diff changeset
    36
      case 0
a197387e1854 tuned proofs;
wenzelm
parents: 58882
diff changeset
    37
      then show ?thesis by simp
10007
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9941
diff changeset
    38
    qed
60410
a197387e1854 tuned proofs;
wenzelm
parents: 58882
diff changeset
    39
  qed
8020
2823ce1753a5 added Isar_examples/Puzzle.thy;
wenzelm
parents:
diff changeset
    40
60410
a197387e1854 tuned proofs;
wenzelm
parents: 58882
diff changeset
    41
  have mono: "m \<le> n \<Longrightarrow> f m \<le> f n" for m n :: nat
a197387e1854 tuned proofs;
wenzelm
parents: 58882
diff changeset
    42
  proof (induct n)
a197387e1854 tuned proofs;
wenzelm
parents: 58882
diff changeset
    43
    case 0
a197387e1854 tuned proofs;
wenzelm
parents: 58882
diff changeset
    44
    then have "m = 0" by simp
a197387e1854 tuned proofs;
wenzelm
parents: 58882
diff changeset
    45
    then show ?case by simp
a197387e1854 tuned proofs;
wenzelm
parents: 58882
diff changeset
    46
  next
a197387e1854 tuned proofs;
wenzelm
parents: 58882
diff changeset
    47
    case (Suc n)
a197387e1854 tuned proofs;
wenzelm
parents: 58882
diff changeset
    48
    from Suc.prems show "f m \<le> f (Suc n)"
a197387e1854 tuned proofs;
wenzelm
parents: 58882
diff changeset
    49
    proof (rule le_SucE)
a197387e1854 tuned proofs;
wenzelm
parents: 58882
diff changeset
    50
      assume "m \<le> n"
a197387e1854 tuned proofs;
wenzelm
parents: 58882
diff changeset
    51
      with Suc.hyps have "f m \<le> f n" .
a197387e1854 tuned proofs;
wenzelm
parents: 58882
diff changeset
    52
      also from ge f_ax have "\<dots> < f (Suc n)"
a197387e1854 tuned proofs;
wenzelm
parents: 58882
diff changeset
    53
        by (rule le_less_trans)
a197387e1854 tuned proofs;
wenzelm
parents: 58882
diff changeset
    54
      finally show ?thesis by simp
10436
98c421dd5972 simplified induction;
wenzelm
parents: 10007
diff changeset
    55
    next
60410
a197387e1854 tuned proofs;
wenzelm
parents: 58882
diff changeset
    56
      assume "m = Suc n"
a197387e1854 tuned proofs;
wenzelm
parents: 58882
diff changeset
    57
      then show ?thesis by simp
10007
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9941
diff changeset
    58
    qed
60410
a197387e1854 tuned proofs;
wenzelm
parents: 58882
diff changeset
    59
  qed
8020
2823ce1753a5 added Isar_examples/Puzzle.thy;
wenzelm
parents:
diff changeset
    60
18191
ef29685acef0 improved induction proof: local defs/fixes;
wenzelm
parents: 16417
diff changeset
    61
  show "f n \<le> n"
10436
98c421dd5972 simplified induction;
wenzelm
parents: 10007
diff changeset
    62
  proof -
18191
ef29685acef0 improved induction proof: local defs/fixes;
wenzelm
parents: 16417
diff changeset
    63
    have "\<not> n < f n"
10007
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9941
diff changeset
    64
    proof
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9941
diff changeset
    65
      assume "n < f n"
18191
ef29685acef0 improved induction proof: local defs/fixes;
wenzelm
parents: 16417
diff changeset
    66
      then have "Suc n \<le> f n" by simp
ef29685acef0 improved induction proof: local defs/fixes;
wenzelm
parents: 16417
diff changeset
    67
      then have "f (Suc n) \<le> f (f n)" by (rule mono)
ef29685acef0 improved induction proof: local defs/fixes;
wenzelm
parents: 16417
diff changeset
    68
      also have "\<dots> < f (Suc n)" by (rule f_ax)
ef29685acef0 improved induction proof: local defs/fixes;
wenzelm
parents: 16417
diff changeset
    69
      finally have "\<dots> < \<dots>" . then show False ..
10007
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9941
diff changeset
    70
    qed
18191
ef29685acef0 improved induction proof: local defs/fixes;
wenzelm
parents: 16417
diff changeset
    71
    then show ?thesis by simp
10007
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9941
diff changeset
    72
  qed
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9941
diff changeset
    73
qed
8020
2823ce1753a5 added Isar_examples/Puzzle.thy;
wenzelm
parents:
diff changeset
    74
10007
64bf7da1994a isar-strip-terminators;
wenzelm
parents: 9941
diff changeset
    75
end