src/HOL/While.ML
author nipkow
Thu, 12 Oct 2000 18:38:23 +0200
changeset 10212 33fe2d701ddd
parent 10186 499637e8f2c6
permissions -rw-r--r--
*** empty log message ***
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
9448
755330e55e18 While functional for defining tail-recursive functions
nipkow
parents:
diff changeset
     1
(*  Title:      HOL/While
755330e55e18 While functional for defining tail-recursive functions
nipkow
parents:
diff changeset
     2
    ID:         $Id$
755330e55e18 While functional for defining tail-recursive functions
nipkow
parents:
diff changeset
     3
    Author:     Tobias Nipkow
755330e55e18 While functional for defining tail-recursive functions
nipkow
parents:
diff changeset
     4
    Copyright   2000 TU Muenchen
755330e55e18 While functional for defining tail-recursive functions
nipkow
parents:
diff changeset
     5
*)
755330e55e18 While functional for defining tail-recursive functions
nipkow
parents:
diff changeset
     6
755330e55e18 While functional for defining tail-recursive functions
nipkow
parents:
diff changeset
     7
goalw_cterm [] (cterm_of (sign_of thy)
755330e55e18 While functional for defining tail-recursive functions
nipkow
parents:
diff changeset
     8
 (HOLogic.mk_Trueprop (hd while_aux.tcs)));
755330e55e18 While functional for defining tail-recursive functions
nipkow
parents:
diff changeset
     9
br wf_same_fstI 1;
755330e55e18 While functional for defining tail-recursive functions
nipkow
parents:
diff changeset
    10
br wf_same_fstI 1;
755330e55e18 While functional for defining tail-recursive functions
nipkow
parents:
diff changeset
    11
by (asm_full_simp_tac (simpset() addsimps [wf_iff_no_infinite_down_chain]) 1);
755330e55e18 While functional for defining tail-recursive functions
nipkow
parents:
diff changeset
    12
by(Blast_tac 1);
755330e55e18 While functional for defining tail-recursive functions
nipkow
parents:
diff changeset
    13
val while_aux_tc = result();
755330e55e18 While functional for defining tail-recursive functions
nipkow
parents:
diff changeset
    14
755330e55e18 While functional for defining tail-recursive functions
nipkow
parents:
diff changeset
    15
Goal
755330e55e18 While functional for defining tail-recursive functions
nipkow
parents:
diff changeset
    16
 "while_aux(b,c,s) = (if ? f. f 0 = s & (!i. b(f i) & c(f i) = f(i+1)) \
755330e55e18 While functional for defining tail-recursive functions
nipkow
parents:
diff changeset
    17
\                     then arbitrary \
755330e55e18 While functional for defining tail-recursive functions
nipkow
parents:
diff changeset
    18
\                     else (if b s then while_aux(b,c,c s) else s))";
755330e55e18 While functional for defining tail-recursive functions
nipkow
parents:
diff changeset
    19
by(rtac (while_aux_tc RS (hd while_aux.simps) RS trans) 1);
755330e55e18 While functional for defining tail-recursive functions
nipkow
parents:
diff changeset
    20
 by(simp_tac (simpset() addsimps [same_fst_def]) 1);
755330e55e18 While functional for defining tail-recursive functions
nipkow
parents:
diff changeset
    21
br refl 1;
755330e55e18 While functional for defining tail-recursive functions
nipkow
parents:
diff changeset
    22
qed "while_aux_unfold";
755330e55e18 While functional for defining tail-recursive functions
nipkow
parents:
diff changeset
    23
755330e55e18 While functional for defining tail-recursive functions
nipkow
parents:
diff changeset
    24
(*** The recursion equation for while: directly executable! ***)
755330e55e18 While functional for defining tail-recursive functions
nipkow
parents:
diff changeset
    25
755330e55e18 While functional for defining tail-recursive functions
nipkow
parents:
diff changeset
    26
Goalw [while_def] "while b c s = (if b s then while b c (c s) else s)";
755330e55e18 While functional for defining tail-recursive functions
nipkow
parents:
diff changeset
    27
by(rtac (while_aux_unfold RS trans) 1);
755330e55e18 While functional for defining tail-recursive functions
nipkow
parents:
diff changeset
    28
by (Auto_tac);
755330e55e18 While functional for defining tail-recursive functions
nipkow
parents:
diff changeset
    29
by(stac while_aux_unfold 1);
755330e55e18 While functional for defining tail-recursive functions
nipkow
parents:
diff changeset
    30
by(Asm_full_simp_tac 1);
755330e55e18 While functional for defining tail-recursive functions
nipkow
parents:
diff changeset
    31
by(Clarify_tac 1);
755330e55e18 While functional for defining tail-recursive functions
nipkow
parents:
diff changeset
    32
by(eres_inst_tac [("x","%i. f(Suc i)")] allE 1);
755330e55e18 While functional for defining tail-recursive functions
nipkow
parents:
diff changeset
    33
by(Blast_tac 1);
755330e55e18 While functional for defining tail-recursive functions
nipkow
parents:
diff changeset
    34
qed "while_unfold";
755330e55e18 While functional for defining tail-recursive functions
nipkow
parents:
diff changeset
    35
755330e55e18 While functional for defining tail-recursive functions
nipkow
parents:
diff changeset
    36
(*** The proof rule for while; P is the invariant ***)
755330e55e18 While functional for defining tail-recursive functions
nipkow
parents:
diff changeset
    37
755330e55e18 While functional for defining tail-recursive functions
nipkow
parents:
diff changeset
    38
val [prem1,prem2,prem3] = Goal
755330e55e18 While functional for defining tail-recursive functions
nipkow
parents:
diff changeset
    39
"[| !!s. [| P s; b s |] ==> P(c s); \
755330e55e18 While functional for defining tail-recursive functions
nipkow
parents:
diff changeset
    40
\   !!s. [| P s; ~b s |] ==> Q s; \
755330e55e18 While functional for defining tail-recursive functions
nipkow
parents:
diff changeset
    41
\   wf{(t,s). P s & b s & t = c s} |] \
755330e55e18 While functional for defining tail-recursive functions
nipkow
parents:
diff changeset
    42
\ ==> P s --> Q(while b c s)";
9747
043098ba5098 introduced induct_thm_tac
nipkow
parents: 9448
diff changeset
    43
by(induct_thm_tac (prem3 RS wf_induct) "s" 1);
9448
755330e55e18 While functional for defining tail-recursive functions
nipkow
parents:
diff changeset
    44
by(Asm_full_simp_tac 1);
755330e55e18 While functional for defining tail-recursive functions
nipkow
parents:
diff changeset
    45
by(Clarify_tac 1);
755330e55e18 While functional for defining tail-recursive functions
nipkow
parents:
diff changeset
    46
by(stac while_unfold 1);
755330e55e18 While functional for defining tail-recursive functions
nipkow
parents:
diff changeset
    47
by(asm_full_simp_tac (simpset() addsimps [prem1,prem2]) 1);
755330e55e18 While functional for defining tail-recursive functions
nipkow
parents:
diff changeset
    48
qed_spec_mp "while_rule";
755330e55e18 While functional for defining tail-recursive functions
nipkow
parents:
diff changeset
    49
755330e55e18 While functional for defining tail-recursive functions
nipkow
parents:
diff changeset
    50
(*** An application: computation of the lfp on finite sets via iteration ***)
755330e55e18 While functional for defining tail-recursive functions
nipkow
parents:
diff changeset
    51
755330e55e18 While functional for defining tail-recursive functions
nipkow
parents:
diff changeset
    52
Goal
755330e55e18 While functional for defining tail-recursive functions
nipkow
parents:
diff changeset
    53
 "[| mono f; finite U; f U = U |] \
755330e55e18 While functional for defining tail-recursive functions
nipkow
parents:
diff changeset
    54
\ ==> lfp f = fst(while (%(A,fA). A~=fA) (%(A,fA). (fA, f fA)) ({},f{}))";
755330e55e18 While functional for defining tail-recursive functions
nipkow
parents:
diff changeset
    55
by(res_inst_tac [("P","%(A,B).(A <= U & B = f A & A <= B & B <= lfp f)")]
755330e55e18 While functional for defining tail-recursive functions
nipkow
parents:
diff changeset
    56
     while_rule 1);
10186
499637e8f2c6 *** empty log message ***
nipkow
parents: 9747
diff changeset
    57
   by(stac lfp_unfold 1);
9448
755330e55e18 While functional for defining tail-recursive functions
nipkow
parents:
diff changeset
    58
    ba 1;
755330e55e18 While functional for defining tail-recursive functions
nipkow
parents:
diff changeset
    59
   by(Clarsimp_tac 1);
755330e55e18 While functional for defining tail-recursive functions
nipkow
parents:
diff changeset
    60
   by(blast_tac (claset() addDs [monoD]) 1);
755330e55e18 While functional for defining tail-recursive functions
nipkow
parents:
diff changeset
    61
  by(fast_tac (claset() addSIs [lfp_lowerbound] addss simpset()) 1);
755330e55e18 While functional for defining tail-recursive functions
nipkow
parents:
diff changeset
    62
 by(res_inst_tac [("r","((Pow U <*> UNIV) <*> (Pow U <*> UNIV)) Int \
755330e55e18 While functional for defining tail-recursive functions
nipkow
parents:
diff changeset
    63
 \                      inv_image finite_psubset (op - U o fst)")]
755330e55e18 While functional for defining tail-recursive functions
nipkow
parents:
diff changeset
    64
                 wf_subset 1);
755330e55e18 While functional for defining tail-recursive functions
nipkow
parents:
diff changeset
    65
  by(blast_tac (claset() addIs
755330e55e18 While functional for defining tail-recursive functions
nipkow
parents:
diff changeset
    66
      [wf_finite_psubset,Int_lower2 RSN (2,wf_subset)]) 1);
755330e55e18 While functional for defining tail-recursive functions
nipkow
parents:
diff changeset
    67
 by(clarsimp_tac (claset(),simpset() addsimps
755330e55e18 While functional for defining tail-recursive functions
nipkow
parents:
diff changeset
    68
      [inv_image_def,finite_psubset_def,order_less_le]) 1);
755330e55e18 While functional for defining tail-recursive functions
nipkow
parents:
diff changeset
    69
 by(blast_tac (claset() addSIs [finite_Diff] addDs [monoD]) 1);
10186
499637e8f2c6 *** empty log message ***
nipkow
parents: 9747
diff changeset
    70
by(stac lfp_unfold 1);
9448
755330e55e18 While functional for defining tail-recursive functions
nipkow
parents:
diff changeset
    71
 ba 1;
755330e55e18 While functional for defining tail-recursive functions
nipkow
parents:
diff changeset
    72
by(asm_simp_tac (simpset() addsimps [monoD]) 1);
755330e55e18 While functional for defining tail-recursive functions
nipkow
parents:
diff changeset
    73
qed "lfp_conv_while";
755330e55e18 While functional for defining tail-recursive functions
nipkow
parents:
diff changeset
    74
755330e55e18 While functional for defining tail-recursive functions
nipkow
parents:
diff changeset
    75
(*** An example; requires integers
755330e55e18 While functional for defining tail-recursive functions
nipkow
parents:
diff changeset
    76
755330e55e18 While functional for defining tail-recursive functions
nipkow
parents:
diff changeset
    77
Goal "{f n|n. A n | B n} = {f n|n. A n} Un {f n|n. B n}";
755330e55e18 While functional for defining tail-recursive functions
nipkow
parents:
diff changeset
    78
by(Blast_tac 1);
755330e55e18 While functional for defining tail-recursive functions
nipkow
parents:
diff changeset
    79
qed "lemma";
755330e55e18 While functional for defining tail-recursive functions
nipkow
parents:
diff changeset
    80
755330e55e18 While functional for defining tail-recursive functions
nipkow
parents:
diff changeset
    81
Goal "P(lfp (%N::int set. {#0} Un {(n + #2) mod #6 |n. n:N})) = P{#0,#4,#2}";
755330e55e18 While functional for defining tail-recursive functions
nipkow
parents:
diff changeset
    82
by(stac (read_instantiate [("U","{#0,#1,#2,#3,#4,#5}")] lfp_conv_while) 1);
755330e55e18 While functional for defining tail-recursive functions
nipkow
parents:
diff changeset
    83
   br monoI 1;
755330e55e18 While functional for defining tail-recursive functions
nipkow
parents:
diff changeset
    84
   by(Blast_tac 1);
755330e55e18 While functional for defining tail-recursive functions
nipkow
parents:
diff changeset
    85
  by(Simp_tac 1);
755330e55e18 While functional for defining tail-recursive functions
nipkow
parents:
diff changeset
    86
 by(simp_tac (simpset() addsimps [lemma,set_eq_subset]) 1);
755330e55e18 While functional for defining tail-recursive functions
nipkow
parents:
diff changeset
    87
(* The fixpoint computation is performed purely by rewriting: *)
755330e55e18 While functional for defining tail-recursive functions
nipkow
parents:
diff changeset
    88
by(simp_tac (simpset() addsimps [while_unfold,lemma,set_eq_subset]
755330e55e18 While functional for defining tail-recursive functions
nipkow
parents:
diff changeset
    89
     delsimps [subset_empty]) 1);
755330e55e18 While functional for defining tail-recursive functions
nipkow
parents:
diff changeset
    90
result();
755330e55e18 While functional for defining tail-recursive functions
nipkow
parents:
diff changeset
    91
755330e55e18 While functional for defining tail-recursive functions
nipkow
parents:
diff changeset
    92
***)