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