src/LCF/ex.ML
author wenzelm
Thu, 09 Jun 1994 11:11:03 +0200
changeset 420 1e0f1973536d
parent 203 4a213aaca3d9
permissions -rw-r--r--
replaced extend_theory;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
420
1e0f1973536d replaced extend_theory;
wenzelm
parents: 203
diff changeset
     1
(*  Title:      LCF/ex.ML
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     2
    ID:         $Id$
420
1e0f1973536d replaced extend_theory;
wenzelm
parents: 203
diff changeset
     3
    Author:     Tobias Nipkow
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     4
    Copyright   1991  University of Cambridge
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     5
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     6
Some examples from Lawrence Paulson's book Logic and Computation.
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     7
*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     8
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     9
420
1e0f1973536d replaced extend_theory;
wenzelm
parents: 203
diff changeset
    10
LCF_build_completed;    (*Cause examples to fail if LCF did*)
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    11
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    12
proof_timing := true;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    13
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    14
(***  Section 10.4  ***)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    15
420
1e0f1973536d replaced extend_theory;
wenzelm
parents: 203
diff changeset
    16
val ex_thy =
1e0f1973536d replaced extend_theory;
wenzelm
parents: 203
diff changeset
    17
  thy
1e0f1973536d replaced extend_theory;
wenzelm
parents: 203
diff changeset
    18
  |> add_consts
1e0f1973536d replaced extend_theory;
wenzelm
parents: 203
diff changeset
    19
   [("P", "'a => tr", NoSyn),
1e0f1973536d replaced extend_theory;
wenzelm
parents: 203
diff changeset
    20
    ("G", "'a => 'a", NoSyn),
1e0f1973536d replaced extend_theory;
wenzelm
parents: 203
diff changeset
    21
    ("H", "'a => 'a", NoSyn),
1e0f1973536d replaced extend_theory;
wenzelm
parents: 203
diff changeset
    22
    ("K", "('a => 'a) => ('a => 'a)", NoSyn)]
1e0f1973536d replaced extend_theory;
wenzelm
parents: 203
diff changeset
    23
  |> add_axioms
1e0f1973536d replaced extend_theory;
wenzelm
parents: 203
diff changeset
    24
   [("P_strict", "P(UU) = UU"),
1e0f1973536d replaced extend_theory;
wenzelm
parents: 203
diff changeset
    25
    ("K", "K = (%h x. P(x) => x | h(h(G(x))))"),
1e0f1973536d replaced extend_theory;
wenzelm
parents: 203
diff changeset
    26
    ("H", "H = FIX(K)")]
1e0f1973536d replaced extend_theory;
wenzelm
parents: 203
diff changeset
    27
  |> add_thyname "Ex 10.4";
1e0f1973536d replaced extend_theory;
wenzelm
parents: 203
diff changeset
    28
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    29
val ax = get_axiom ex_thy;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    30
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    31
val P_strict = ax"P_strict";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    32
val K = ax"K";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    33
val H = ax"H";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    34
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    35
val ex_ss = LCF_ss addsimps [P_strict,K];
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    36
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    37
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    38
val H_unfold = prove_goal ex_thy "H = K(H)"
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    39
 (fn _ => [stac H 1, rtac (FIX_eq RS sym) 1]);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    40
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    41
val H_strict = prove_goal ex_thy "H(UU)=UU"
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    42
 (fn _ => [stac H_unfold 1, simp_tac ex_ss 1]);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    43
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    44
val ex_ss = ex_ss addsimps [H_strict];
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    45
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    46
goal ex_thy "ALL x. H(FIX(K,x)) = FIX(K,x)";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    47
by(induct_tac "K" 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    48
by(simp_tac ex_ss 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    49
by(simp_tac (ex_ss setloop (split_tac [COND_cases_iff])) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    50
by(strip_tac 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    51
by(stac H_unfold 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    52
by(asm_simp_tac ex_ss 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    53
val H_idemp_lemma = topthm();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    54
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    55
val H_idemp = rewrite_rule [mk_meta_eq (H RS sym)] H_idemp_lemma;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    56
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    57
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    58
(***  Example 3.8  ***)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    59
420
1e0f1973536d replaced extend_theory;
wenzelm
parents: 203
diff changeset
    60
val ex_thy =
1e0f1973536d replaced extend_theory;
wenzelm
parents: 203
diff changeset
    61
  thy
1e0f1973536d replaced extend_theory;
wenzelm
parents: 203
diff changeset
    62
  |> add_consts
1e0f1973536d replaced extend_theory;
wenzelm
parents: 203
diff changeset
    63
   [("P", "'a => tr", NoSyn),
1e0f1973536d replaced extend_theory;
wenzelm
parents: 203
diff changeset
    64
    ("F", "'a => 'a", NoSyn),
1e0f1973536d replaced extend_theory;
wenzelm
parents: 203
diff changeset
    65
    ("G", "'a => 'a", NoSyn),
1e0f1973536d replaced extend_theory;
wenzelm
parents: 203
diff changeset
    66
    ("H", "'a => 'b => 'b", NoSyn),
1e0f1973536d replaced extend_theory;
wenzelm
parents: 203
diff changeset
    67
    ("K", "('a => 'b => 'b) => ('a => 'b => 'b)", NoSyn)]
1e0f1973536d replaced extend_theory;
wenzelm
parents: 203
diff changeset
    68
  |> add_axioms
1e0f1973536d replaced extend_theory;
wenzelm
parents: 203
diff changeset
    69
   [("F_strict", "F(UU) = UU"),
1e0f1973536d replaced extend_theory;
wenzelm
parents: 203
diff changeset
    70
    ("K", "K = (%h x y. P(x) => y | F(h(G(x),y)))"),
1e0f1973536d replaced extend_theory;
wenzelm
parents: 203
diff changeset
    71
    ("H", "H = FIX(K)")]
1e0f1973536d replaced extend_theory;
wenzelm
parents: 203
diff changeset
    72
  |> add_thyname "Ex 3.8";
1e0f1973536d replaced extend_theory;
wenzelm
parents: 203
diff changeset
    73
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    74
val ax = get_axiom ex_thy;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    75
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    76
val F_strict = ax"F_strict";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    77
val K = ax"K";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    78
val H = ax"H";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    79
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    80
val ex_ss = LCF_ss addsimps [F_strict,K];
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    81
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    82
goal ex_thy "ALL x. F(H(x::'a,y::'b)) = H(x,F(y))";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    83
by(stac H 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    84
by(induct_tac "K::('a=>'b=>'b)=>('a=>'b=>'b)" 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    85
by(simp_tac ex_ss 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    86
by(asm_simp_tac (ex_ss setloop (split_tac [COND_cases_iff])) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    87
result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    88
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    89
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    90
(*** Addition with fixpoint of successor ***)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    91
420
1e0f1973536d replaced extend_theory;
wenzelm
parents: 203
diff changeset
    92
val ex_thy =
1e0f1973536d replaced extend_theory;
wenzelm
parents: 203
diff changeset
    93
  thy
1e0f1973536d replaced extend_theory;
wenzelm
parents: 203
diff changeset
    94
  |> add_consts
1e0f1973536d replaced extend_theory;
wenzelm
parents: 203
diff changeset
    95
   [("s", "'a => 'a", NoSyn),
1e0f1973536d replaced extend_theory;
wenzelm
parents: 203
diff changeset
    96
    ("p", "'a => 'a => 'a", NoSyn)]
1e0f1973536d replaced extend_theory;
wenzelm
parents: 203
diff changeset
    97
  |> add_axioms
1e0f1973536d replaced extend_theory;
wenzelm
parents: 203
diff changeset
    98
   [("p_strict", "p(UU) = UU"),
1e0f1973536d replaced extend_theory;
wenzelm
parents: 203
diff changeset
    99
    ("p_s", "p(s(x),y) = s(p(x,y))")]
1e0f1973536d replaced extend_theory;
wenzelm
parents: 203
diff changeset
   100
  |> add_thyname "fix ex";
1e0f1973536d replaced extend_theory;
wenzelm
parents: 203
diff changeset
   101
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   102
val ax = get_axiom ex_thy;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   103
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   104
val p_strict = ax"p_strict";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   105
val p_s = ax"p_s";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   106
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   107
val ex_ss = LCF_ss addsimps [p_strict,p_s];
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   108
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   109
goal ex_thy "p(FIX(s),y) = FIX(s)";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   110
by(induct_tac "s" 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   111
by(simp_tac ex_ss 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   112
by(simp_tac ex_ss 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   113
result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   114
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   115
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   116
(*** Prefixpoints ***)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   117
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   118
val asms = goal thy "[| f(p) << p; !!q. f(q) << q ==> p << q |] ==> FIX(f)=p";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   119
by(rewtac eq_def);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   120
by (rtac conjI 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   121
by(induct_tac "f" 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   122
by (rtac minimal 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   123
by(strip_tac 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   124
by (rtac less_trans 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   125
by (resolve_tac asms 2);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   126
by (etac less_ap_term 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   127
by (resolve_tac asms 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   128
by (rtac (FIX_eq RS eq_imp_less1) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   129
result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   130
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   131
maketest"END: file for LCF examples";