ex/puzzle.ML
author lcp
Thu, 06 Apr 1995 11:49:42 +0200
changeset 246 0f9230a24164
parent 0 7949f97df77a
permissions -rw-r--r--
Deleted extra space in clos_mk.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
7949f97df77a Initial revision
clasohm
parents:
diff changeset
     1
(*  Title: 	HOL/ex/puzzle.ML
7949f97df77a Initial revision
clasohm
parents:
diff changeset
     2
    ID:         $Id$
7949f97df77a Initial revision
clasohm
parents:
diff changeset
     3
    Author: 	Tobias Nipkow
7949f97df77a Initial revision
clasohm
parents:
diff changeset
     4
    Copyright   1993 TU Muenchen
7949f97df77a Initial revision
clasohm
parents:
diff changeset
     5
7949f97df77a Initial revision
clasohm
parents:
diff changeset
     6
For puzzle.thy.  A question from "Bundeswettbewerb Mathematik"
7949f97df77a Initial revision
clasohm
parents:
diff changeset
     7
7949f97df77a Initial revision
clasohm
parents:
diff changeset
     8
Proof due to Herbert Ehler
7949f97df77a Initial revision
clasohm
parents:
diff changeset
     9
*)
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    10
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    11
(*specialized form of induction needed below*)
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    12
val prems = goal Nat.thy "[| P(0); !!n. P(Suc(n)) |] ==> !n.P(n)";
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    13
by (EVERY1 [rtac (nat_induct RS allI), resolve_tac prems, resolve_tac prems]);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    14
val nat_exh = result();
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    15
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    16
goal Puzzle.thy "! n. k=f(n) --> n <= f(n)";
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    17
by (res_inst_tac [("n","k")] less_induct 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    18
by (rtac nat_exh 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    19
by (simp_tac nat_ss 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    20
by (rtac impI 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    21
by (rtac classical 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    22
by (dtac not_leE 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    23
by (subgoal_tac "f(na) <= f(f(na))" 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    24
by (best_tac (HOL_cs addIs [lessD,Puzzle.f_ax,le_less_trans,le_trans]) 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    25
by (fast_tac (HOL_cs addIs [Puzzle.f_ax]) 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    26
val lemma = result() RS spec RS mp;
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    27
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    28
goal Puzzle.thy "n <= f(n)";
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    29
by (fast_tac (HOL_cs addIs [lemma]) 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    30
val lemma1 = result();
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    31
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    32
goal Puzzle.thy "f(n) < f(Suc(n))";
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    33
by (fast_tac (HOL_cs addIs [Puzzle.f_ax,le_less_trans,lemma1]) 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    34
val lemma2 = result();
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    35
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    36
val prems = goal Puzzle.thy "(!!n.f(n) <= f(Suc(n))) ==> m<n --> f(m) <= f(n)";
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    37
by (res_inst_tac[("n","n")]nat_induct 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    38
by (simp_tac nat_ss 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    39
by (simp_tac nat_ss 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    40
by (fast_tac (HOL_cs addIs (le_trans::prems)) 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    41
val mono_lemma1 = result() RS mp;
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    42
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    43
val [p1,p2] = goal Puzzle.thy
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    44
    "[| !! n. f(n)<=f(Suc(n));  m<=n |] ==> f(m) <= f(n)";
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    45
by (rtac (p2 RS le_imp_less_or_eq RS disjE) 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    46
by (etac (p1 RS mono_lemma1) 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    47
by (fast_tac (HOL_cs addIs [le_refl]) 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    48
val mono_lemma = result();
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    49
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    50
val prems = goal Puzzle.thy "m <= n ==> f(m) <= f(n)";
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    51
by (fast_tac (HOL_cs addIs ([mono_lemma,less_imp_le,lemma2]@prems)) 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    52
val f_mono = result();
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    53
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    54
goal Puzzle.thy "f(n) = n";
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    55
by (rtac le_anti_sym 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    56
by (rtac lemma1 2);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    57
by (fast_tac (HOL_cs addIs [Puzzle.f_ax,leI] addDs [leD,f_mono,lessD]) 1);
7949f97df77a Initial revision
clasohm
parents:
diff changeset
    58
result();