src/HOL/ex/Puzzle.ML
author paulson
Mon, 26 May 1997 12:33:38 +0200
changeset 3336 29ddef80bd49
parent 2609 4370e5f0fa3f
child 3842 b55686a7b22c
permissions -rw-r--r--
Renamed lessD to Suc_leI
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1465
5d7a7e439cec expanded tabs
clasohm
parents: 1266
diff changeset
     1
(*  Title:      HOL/ex/puzzle.ML
969
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
     2
    ID:         $Id$
1465
5d7a7e439cec expanded tabs
clasohm
parents: 1266
diff changeset
     3
    Author:     Tobias Nipkow
969
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
     4
    Copyright   1993 TU Muenchen
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
     5
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
     6
For puzzle.thy.  A question from "Bundeswettbewerb Mathematik"
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
     7
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
     8
Proof due to Herbert Ehler
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
     9
*)
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
    10
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
    11
(*specialized form of induction needed below*)
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
    12
val prems = goal Nat.thy "[| P(0); !!n. P(Suc(n)) |] ==> !n.P(n)";
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
    13
by (EVERY1 [rtac (nat_induct RS allI), resolve_tac prems, resolve_tac prems]);
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
    14
qed "nat_exh";
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
    15
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
    16
goal Puzzle.thy "! n. k=f(n) --> n <= f(n)";
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
    17
by (res_inst_tac [("n","k")] less_induct 1);
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
    18
by (rtac nat_exh 1);
1266
3ae9fe3c0f68 added local simpsets
clasohm
parents: 969
diff changeset
    19
by (Simp_tac 1);
969
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
    20
by (rtac impI 1);
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
    21
by (rtac classical 1);
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
    22
by (dtac not_leE 1);
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
    23
by (subgoal_tac "f(na) <= f(f(na))" 1);
2017
dd3e2a91aeca Proofs made more robust to work in presence of le_refl
paulson
parents: 1820
diff changeset
    24
by (fast_tac (!claset addIs [Puzzle.f_ax]) 2);
3336
29ddef80bd49 Renamed lessD to Suc_leI
paulson
parents: 2609
diff changeset
    25
by (rtac Suc_leI 1);
2609
4370e5f0fa3f New class "order" and accompanying changes.
nipkow
parents: 2031
diff changeset
    26
by (fast_tac (!claset delrules [order_refl] 
2017
dd3e2a91aeca Proofs made more robust to work in presence of le_refl
paulson
parents: 1820
diff changeset
    27
                      addIs [Puzzle.f_ax, le_less_trans]) 1);
1266
3ae9fe3c0f68 added local simpsets
clasohm
parents: 969
diff changeset
    28
val lemma = result() RS spec RS mp;
969
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
    29
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
    30
goal Puzzle.thy "n <= f(n)";
1820
e381e1c51689 Classical tactics now use default claset.
berghofe
parents: 1673
diff changeset
    31
by (fast_tac (!claset addIs [lemma]) 1);
969
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
    32
qed "lemma1";
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
    33
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
    34
goal Puzzle.thy "f(n) < f(Suc(n))";
2017
dd3e2a91aeca Proofs made more robust to work in presence of le_refl
paulson
parents: 1820
diff changeset
    35
by (deepen_tac (!claset addIs [Puzzle.f_ax, le_less_trans, lemma1]) 0 1);
969
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
    36
qed "lemma2";
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
    37
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
    38
val prems = goal Puzzle.thy "(!!n.f(n) <= f(Suc(n))) ==> m<n --> f(m) <= f(n)";
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
    39
by (res_inst_tac[("n","n")]nat_induct 1);
1266
3ae9fe3c0f68 added local simpsets
clasohm
parents: 969
diff changeset
    40
by (Simp_tac 1);
1673
d22110ddd0af repaired critical proofs depending on the order inside non-confluent SimpSets
oheimb
parents: 1465
diff changeset
    41
by (simp_tac (!simpset addsimps [less_Suc_eq]) 1);
2017
dd3e2a91aeca Proofs made more robust to work in presence of le_refl
paulson
parents: 1820
diff changeset
    42
by (best_tac (!claset addIs (le_trans::prems)) 1);
dd3e2a91aeca Proofs made more robust to work in presence of le_refl
paulson
parents: 1820
diff changeset
    43
qed_spec_mp "mono_lemma1";
969
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
    44
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
    45
val [p1,p2] = goal Puzzle.thy
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
    46
    "[| !! n. f(n)<=f(Suc(n));  m<=n |] ==> f(m) <= f(n)";
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
    47
by (rtac (p2 RS le_imp_less_or_eq RS disjE) 1);
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
    48
by (etac (p1 RS mono_lemma1) 1);
2017
dd3e2a91aeca Proofs made more robust to work in presence of le_refl
paulson
parents: 1820
diff changeset
    49
by (Fast_tac 1);
969
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
    50
qed "mono_lemma";
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
    51
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
    52
val prems = goal Puzzle.thy "m <= n ==> f(m) <= f(n)";
1820
e381e1c51689 Classical tactics now use default claset.
berghofe
parents: 1673
diff changeset
    53
by (fast_tac (!claset addIs ([mono_lemma,less_imp_le,lemma2]@prems)) 1);
969
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
    54
qed "f_mono";
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
    55
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
    56
goal Puzzle.thy "f(n) = n";
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
    57
by (rtac le_anti_sym 1);
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
    58
by (rtac lemma1 2);
3336
29ddef80bd49 Renamed lessD to Suc_leI
paulson
parents: 2609
diff changeset
    59
by (fast_tac (!claset addIs [Puzzle.f_ax,leI] addDs [leD,f_mono,Suc_leI]) 1);
969
b051e2fc2e34 converted ex with curried function application
clasohm
parents:
diff changeset
    60
result();