src/HOLCF/ex/Coind.ML
author oheimb
Sat, 15 Feb 1997 17:55:11 +0100
changeset 2638 6c6a44b5f757
parent 2570 24d7e8fb8261
permissions -rw-r--r--
reflecting my recent changes of the classical reasoner
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
2570
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
     1
(*  Title: 	FOCUS/ex/coind.ML
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
     2
    ID:         $ $
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
     3
    Author: 	Franz Regensburger
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
     4
    Copyright   1993, 1995 Technische Universitaet Muenchen
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
     5
*)
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
     6
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
     7
open Coind;
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
     8
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
     9
(* ------------------------------------------------------------------------- *)
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    10
(* expand fixed point properties                                             *)
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    11
(* ------------------------------------------------------------------------- *)
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    12
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    13
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    14
val nats_def2 = fix_prover2 Coind.thy nats_def 
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    15
	"nats = dzero&&(smap`dsucc`nats)";
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    16
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    17
val from_def2 = fix_prover2 Coind.thy from_def 
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    18
	"from = (¤n.n&&(from`(dsucc`n)))";
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    19
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    20
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    21
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    22
(* ------------------------------------------------------------------------- *)
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    23
(* recursive  properties                                                     *)
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    24
(* ------------------------------------------------------------------------- *)
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    25
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    26
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    27
val from = prove_goal Coind.thy "from`n = n&&(from`(dsucc`n))"
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    28
 (fn prems =>
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    29
	[
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    30
	(rtac trans 1),
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    31
	(rtac (from_def2 RS ssubst) 1),
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    32
	(simp_tac HOLCF_ss  1),
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    33
	(rtac refl 1)
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    34
	]);
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    35
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    36
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    37
val from1 = prove_goal Coind.thy "from`Ø = Ø"
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    38
 (fn prems =>
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    39
	[
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    40
	(rtac trans 1),
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    41
	(rtac (from RS ssubst) 1),
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    42
	(resolve_tac  stream.con_rews 1),
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    43
	(rtac refl 1)
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    44
	]);
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    45
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    46
val coind_rews = 
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    47
	[iterator1, iterator2, iterator3, smap1, smap2,from1];
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    48
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    49
(* ------------------------------------------------------------------------- *)
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    50
(* the example                                                               *)
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    51
(* prove:        nats = from`dzero                                           *)
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    52
(* ------------------------------------------------------------------------- *)
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    53
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    54
val prems = goal Coind.thy "iterator`n`(smap`dsucc)`nats =\
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    55
\		 n&&(iterator`(dsucc`n)`(smap`dsucc)`nats)";
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    56
by (res_inst_tac [("x","n")] dnat.ind 1);
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    57
by (simp_tac (HOLCF_ss addsimps (coind_rews @ stream.rews)) 1);
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    58
by (simp_tac (HOLCF_ss addsimps (coind_rews @ stream.rews)) 1);
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    59
by (rtac trans 1);
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    60
by (rtac nats_def2 1);
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    61
by (simp_tac (HOLCF_ss addsimps (coind_rews @ dnat.rews)) 1);
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    62
by (rtac trans 1);
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    63
by (etac iterator3 1);
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    64
by (rtac trans 1);
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    65
by (asm_simp_tac HOLCF_ss 1);
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    66
by (rtac trans 1);
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    67
by (etac smap2 1);
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    68
by (rtac cfun_arg_cong 1);
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    69
by (asm_simp_tac (HOLCF_ss addsimps ([iterator3 RS sym] @ dnat.rews)) 1);
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    70
val coind_lemma1 = result();
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    71
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    72
val prems = goal Coind.thy "nats = from`dzero";
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    73
by (res_inst_tac [("R","% p q.? n. p = iterator`n`(smap`dsucc)`nats & q = from`n")] stream.coind 1);
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    74
by (res_inst_tac [("x","dzero")] exI 2);
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    75
by (asm_simp_tac (HOLCF_ss addsimps coind_rews) 2);
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    76
by (rewrite_goals_tac [stream.bisim_def]);
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    77
by (strip_tac 1);
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    78
by (etac exE 1);
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    79
by (etac conjE 1);
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    80
by (case_tac "n=Ø" 1);
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    81
by (rtac disjI1 1);
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    82
by (asm_simp_tac (HOLCF_ss addsimps coind_rews) 1);
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    83
by (rtac disjI2 1);
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    84
by (hyp_subst_tac 1);
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    85
by (res_inst_tac [("x","n")] exI 1);
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    86
by (res_inst_tac [("x","iterator`(dsucc`n)`(smap`dsucc)`nats")] exI 1);
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    87
by (res_inst_tac [("x","from`(dsucc`n)")] exI 1);
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    88
by (etac conjI 1);
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    89
by (rtac conjI 1);
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    90
by (res_inst_tac [("x","dsucc`n")] exI 1);
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    91
by (fast_tac HOL_cs 1);
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    92
by (rtac conjI 1);
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    93
by (rtac coind_lemma1 1);
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    94
by (rtac from 1);
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    95
val nats_eq_from = result();
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    96
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    97
(* another proof using stream_coind_lemma2 *)
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    98
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    99
val prems = goal Coind.thy "nats = from`dzero";
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   100
by (res_inst_tac [("R","% p q.? n. p = iterator`n`(smap`dsucc)`nats & q = from`n")] stream.coind 1);
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   101
by (rtac stream_coind_lemma2 1);
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   102
by (strip_tac 1);
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   103
by (etac exE 1);
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   104
by (case_tac "n=Ø" 1);
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   105
by (asm_simp_tac (HOLCF_ss addsimps coind_rews) 1);
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   106
by (res_inst_tac [("x","Ø::dnat")] exI 1);
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   107
by (simp_tac (HOLCF_ss addsimps coind_rews addsimps stream.rews) 1);
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   108
by (etac conjE 1);
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   109
by (hyp_subst_tac 1);
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   110
by (rtac conjI 1);
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   111
by (rtac (coind_lemma1 RS ssubst) 1);
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   112
by (rtac (from RS ssubst) 1);
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   113
by (asm_simp_tac (HOLCF_ss addsimps stream.rews) 1);
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   114
by (res_inst_tac [("x","dsucc`n")] exI 1);
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   115
by (rtac conjI 1);
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   116
by (rtac trans 1);
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   117
by (rtac (coind_lemma1 RS ssubst) 1);
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   118
by (asm_simp_tac (HOLCF_ss addsimps stream.rews) 1);
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   119
by (rtac refl 1);
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   120
by (rtac trans 1);
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   121
by (rtac (from RS ssubst) 1);
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   122
by (asm_simp_tac (HOLCF_ss addsimps stream.rews) 1);
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   123
by (rtac refl 1);
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   124
by (res_inst_tac [("x","dzero")] exI 1);
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   125
by (asm_simp_tac (HOLCF_ss addsimps coind_rews) 1);
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   126
val nats_eq_from = result();