src/HOLCF/ex/Stream.ML
author oheimb
Mon, 21 Sep 1998 23:04:51 +0200
changeset 5519 54e313ed22ba
parent 5291 5706f0ef1d43
child 9169 85a47aa21f74
permissions -rw-r--r--
re-added mem and list_all improved indentation improved addbefore and addSbefore improved mechanism for unsafe wrappers
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
2570
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
     1
(*  Title: 	FOCUS/Stream.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, David von Oheimb
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
Theorems for Stream.thy
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
     7
*)
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
     8
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
     9
open Stream;
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    10
4044
fdfef2d484ca domain package:
oheimb
parents: 3842
diff changeset
    11
fun stream_case_tac s i = res_inst_tac [("x",s)] stream.casedist i
2570
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    12
			  THEN hyp_subst_tac i THEN hyp_subst_tac (i+1);
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    13
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    14
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    15
(* ----------------------------------------------------------------------- *)
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    16
(* theorems about scons                                                    *)
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    17
(* ----------------------------------------------------------------------- *)
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    18
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    19
section "scons";
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    20
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    21
qed_goal "scons_eq_UU" thy "a && s = UU = (a = UU)" (fn _ => [
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    22
	safe_tac HOL_cs,
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    23
	etac contrapos2 1,
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    24
	safe_tac (HOL_cs addSIs stream.con_rews)]);
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    25
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    26
qed_goal "scons_not_empty" thy "[| a && x = UU; a ~= UU |] ==> R" (fn prems => [
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    27
	cut_facts_tac prems 1,
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    28
	dresolve_tac stream.con_rews 1,
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    29
	contr_tac 1]);
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    30
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    31
qed_goal "stream_exhaust_eq" thy "x ~= UU = (? a y. a ~= UU &  x = a && y)" (fn _ =>[
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    32
	cut_facts_tac [stream.exhaust] 1,
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    33
	safe_tac HOL_cs,
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    34
	   contr_tac 1,
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    35
	  fast_tac (HOL_cs addDs (tl stream.con_rews)) 1,
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    36
	 fast_tac HOL_cs 1,
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    37
	fast_tac (HOL_cs addDs (tl stream.con_rews)) 1]);
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    38
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    39
qed_goal "stream_prefix" thy 
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    40
"[| a && s << t; a ~= UU  |] ==> ? b tt. t = b && tt &  b ~= UU &  s << tt" (fn prems => [
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    41
	cut_facts_tac prems 1,
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    42
	stream_case_tac "t" 1,
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    43
	 fast_tac (HOL_cs addDs [eq_UU_iff RS iffD2,hd (tl stream.con_rews)]) 1,
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    44
	fast_tac (HOL_cs addDs stream.inverts) 1]);
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    45
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    46
qed_goal "stream_flat_prefix" thy 
3324
6b26b886ff69 Eliminated the prediates flat,chfin
slotosch
parents: 2570
diff changeset
    47
"[| x && xs << y && ys; (x::'a::flat) ~= UU|] ==> x = y & xs << ys"
6b26b886ff69 Eliminated the prediates flat,chfin
slotosch
parents: 2570
diff changeset
    48
(fn prems=>[
2570
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    49
	cut_facts_tac prems 1,
3324
6b26b886ff69 Eliminated the prediates flat,chfin
slotosch
parents: 2570
diff changeset
    50
	(cut_facts_tac [read_instantiate[("x1","x::'a::flat"),("x","y::'a::flat")]
6b26b886ff69 Eliminated the prediates flat,chfin
slotosch
parents: 2570
diff changeset
    51
		(ax_flat RS spec RS spec)] 1),
2570
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    52
	(forward_tac stream.inverts 1),
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    53
	(safe_tac HOL_cs),
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    54
	(dtac (hd stream.con_rews RS subst) 1),
3324
6b26b886ff69 Eliminated the prediates flat,chfin
slotosch
parents: 2570
diff changeset
    55
	(fast_tac (HOL_cs addDs ((eq_UU_iff RS iffD2)::stream.con_rews)) 1)]);
2570
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    56
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    57
qed_goal "stream_prefix'" thy "b ~= UU ==> x << b && z = \
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    58
\(x = UU |  (? a y. x = a && y &  a ~= UU &  a << b &  y << z))" (fn prems => [
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    59
	cut_facts_tac prems 1,
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    60
	safe_tac HOL_cs,
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    61
	  stream_case_tac "x" 1,
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    62
	   safe_tac (HOL_cs addSDs stream.inverts 
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    63
			    addSIs [minimal, monofun_cfun, monofun_cfun_arg]),
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    64
	fast_tac HOL_cs 1]);
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    65
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    66
qed_goal "stream_inject_eq" thy
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    67
 "[| a ~= UU; b ~= UU |] ==> (a && s = b && t) = (a = b &  s = t)" (fn prems => [
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    68
	cut_facts_tac prems 1,
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    69
	safe_tac (HOL_cs addSEs stream.injects)]);	
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    70
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    71
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    72
(* ----------------------------------------------------------------------- *)
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    73
(* theorems about stream_when                                              *)
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    74
(* ----------------------------------------------------------------------- *)
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    75
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    76
section "stream_when";
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    77
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    78
qed_goal "stream_when_strictf" thy "stream_when`UU`s=UU" (fn _ => [
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    79
	stream_case_tac "s" 1,
5291
5706f0ef1d43 eliminated fabs,fapp.
slotosch
parents: 4721
diff changeset
    80
	ALLGOALS(asm_simp_tac (HOL_ss addsimps strict_Rep_CFun1::stream.when_rews))
2570
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    81
	]);
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    82
	
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    83
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    84
(* ----------------------------------------------------------------------- *)
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    85
(* theorems about ft and rt                                                *)
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    86
(* ----------------------------------------------------------------------- *)
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    87
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    88
section "ft & rt";
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    89
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    90
(*
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    91
qed_goal "stream_ft_lemma1" thy "ft`s=UU --> s=UU" (fn prems => [
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    92
	stream_case_tac "s" 1,
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    93
	REPEAT (asm_simp_tac (HOLCF_ss addsimps stream.rews) 1)]);
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    94
*)
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    95
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    96
qed_goal "ft_defin" thy "s~=UU ==> ft`s~=UU" (fn prems => [
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    97
	cut_facts_tac prems 1,
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    98
	stream_case_tac "s" 1,
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
    99
	fast_tac HOL_cs 1,
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   100
	asm_simp_tac (HOLCF_ss addsimps stream.rews) 1]);
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   101
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   102
qed_goal "rt_strict_rev" thy "rt`s~=UU ==> s~=UU" (fn prems => [
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   103
	cut_facts_tac prems 1,
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   104
	etac contrapos 1,
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   105
	asm_simp_tac (HOLCF_ss addsimps stream.sel_rews) 1]);
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   106
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   107
qed_goal "surjectiv_scons" thy "(ft`s)&&(rt`s)=s"
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   108
 (fn prems =>
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   109
	[
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   110
	stream_case_tac "s" 1,
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   111
	REPEAT (asm_simp_tac (HOLCF_ss addsimps stream.rews) 1)
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   112
	]);
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   113
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   114
qed_goal_spec_mp "monofun_rt_mult" thy 
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   115
"!x s. x << s --> iterate i rt x << iterate i rt s" (fn _ => [
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   116
	nat_ind_tac "i" 1,
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   117
	simp_tac (HOLCF_ss addsimps stream.take_rews) 1,
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   118
	strip_tac 1,
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   119
	stream_case_tac "x" 1,
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   120
	rtac (minimal RS (monofun_iterate2 RS monofunE RS spec RS spec RS mp))1,
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   121
	dtac stream_prefix 1,
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   122
	 safe_tac HOL_cs,
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   123
	asm_simp_tac (HOL_ss addsimps iterate_Suc2::stream.rews) 1]);
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   124
			
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   125
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   126
(* ----------------------------------------------------------------------- *)
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   127
(* theorems about stream_take                                              *)
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   128
(* ----------------------------------------------------------------------- *)
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   129
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   130
section "stream_take";
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   131
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   132
qed_goal "stream_reach2" thy  "(LUB i. stream_take i`s) = s"
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   133
 (fn prems =>
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   134
	[
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   135
	(res_inst_tac [("t","s")] (stream.reach RS subst) 1),
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   136
	(stac fix_def2 1),
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   137
	(rewrite_goals_tac [stream.take_def]),
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   138
	(stac contlub_cfun_fun 1),
4721
c8a8482a8124 renamed is_chain to chain, is_tord to tord, replaced chain_finite by chfin
oheimb
parents: 4098
diff changeset
   139
	(rtac chain_iterate 1),
2570
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   140
	(rtac refl 1)
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   141
	]);
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   142
4721
c8a8482a8124 renamed is_chain to chain, is_tord to tord, replaced chain_finite by chfin
oheimb
parents: 4098
diff changeset
   143
qed_goal "chain_stream_take" thy "chain (%i. stream_take i`s)" (fn _ => [
c8a8482a8124 renamed is_chain to chain, is_tord to tord, replaced chain_finite by chfin
oheimb
parents: 4098
diff changeset
   144
	rtac chainI 1,
2570
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   145
	subgoal_tac "!i s. stream_take i`s << stream_take (Suc i)`s" 1,
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   146
	fast_tac HOL_cs 1,
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   147
	rtac allI 1,
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   148
	nat_ind_tac "i" 1,
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   149
	 simp_tac (HOLCF_ss addsimps stream.take_rews) 1,
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   150
	rtac allI 1,
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   151
	stream_case_tac "s" 1,
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   152
	 simp_tac (HOLCF_ss addsimps stream.take_rews) 1,
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   153
	asm_simp_tac (HOLCF_ss addsimps monofun_cfun_arg::stream.take_rews) 1]);
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   154
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   155
qed_goalw "stream_take_more" thy [stream.take_def] 
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   156
	"stream_take n`x = x ==> stream_take (Suc n)`x = x" (fn prems => [
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   157
		cut_facts_tac prems 1,
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   158
		rtac antisym_less 1,
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   159
		rtac (stream.reach RS subst) 1, (* 1*back(); *)
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   160
		rtac monofun_cfun_fun 1,
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   161
		stac fix_def2 1,
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   162
		rtac is_ub_thelub 1,
4721
c8a8482a8124 renamed is_chain to chain, is_tord to tord, replaced chain_finite by chfin
oheimb
parents: 4098
diff changeset
   163
		rtac chain_iterate 1,
2570
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   164
		etac subst 1, (* 2*back(); *)
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   165
		rtac monofun_cfun_fun 1,
4721
c8a8482a8124 renamed is_chain to chain, is_tord to tord, replaced chain_finite by chfin
oheimb
parents: 4098
diff changeset
   166
		rtac (rewrite_rule [chain] chain_iterate RS spec) 1]);
2570
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   167
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   168
(*
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   169
val stream_take_lemma2 = prove_goal thy 
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   170
 "! s2. stream_take n`s2 = s2 --> stream_take (Suc n)`s2=s2" (fn prems => [
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   171
	(nat_ind_tac "n" 1),
4098
71e05eb27fb6 isatool fixclasimp;
wenzelm
parents: 4044
diff changeset
   172
	(simp_tac (simpset() addsimps stream_rews) 1),
2570
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   173
	(strip_tac 1),
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   174
	(hyp_subst_tac  1),
4098
71e05eb27fb6 isatool fixclasimp;
wenzelm
parents: 4044
diff changeset
   175
	(simp_tac (simpset() addsimps stream_rews) 1),
2570
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   176
	(rtac allI 1),
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   177
	(res_inst_tac [("s","s2")] streamE 1),
4098
71e05eb27fb6 isatool fixclasimp;
wenzelm
parents: 4044
diff changeset
   178
	(asm_simp_tac (simpset() addsimps stream_rews) 1),
71e05eb27fb6 isatool fixclasimp;
wenzelm
parents: 4044
diff changeset
   179
	(asm_simp_tac (simpset() addsimps stream_rews) 1),
2570
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   180
	(strip_tac 1 ),
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   181
	(subgoal_tac "stream_take n1`xs = xs" 1),
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   182
	(rtac ((hd stream_inject) RS conjunct2) 2),
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   183
	(atac 4),
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   184
	(atac 2),
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   185
	(atac 2),
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   186
	(rtac cfun_arg_cong 1),
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   187
	(fast_tac HOL_cs 1)
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   188
	]);
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   189
*)
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   190
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   191
val stream_take_lemma3 = prove_goal thy 
3842
b55686a7b22c fixed dots;
wenzelm
parents: 3461
diff changeset
   192
 "!x xs. x~=UU --> stream_take n`(x && xs) = x && xs --> stream_take n`xs=xs"
2570
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   193
 (fn prems => [
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   194
	(nat_ind_tac "n" 1),
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   195
	(asm_simp_tac (HOL_ss addsimps stream.take_rews) 1),
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   196
	(strip_tac 1),
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   197
	(res_inst_tac [("P","x && xs=UU")] notE 1),
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   198
	(eresolve_tac stream.con_rews 1),
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   199
	(etac sym 1),
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   200
	(strip_tac 1),
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   201
	(rtac stream_take_more 1),
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   202
	(res_inst_tac [("a1","x")] ((hd stream.injects) RS conjunct2) 1),
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   203
	(etac (hd(tl(tl(stream.take_rews))) RS subst) 1),
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   204
	(atac 1),
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   205
	(atac 1)]) RS spec RS spec RS mp RS mp;
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   206
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   207
val stream_take_lemma4 = prove_goal thy 
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   208
 "!x xs. stream_take n`xs=xs --> stream_take (Suc n)`(x && xs) = x && xs"
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   209
 (fn _ => [
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   210
	(nat_ind_tac "n" 1),
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   211
	(simp_tac (HOL_ss addsimps stream.take_rews) 1),
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   212
	(simp_tac (HOL_ss addsimps stream.take_rews) 1)
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   213
	]) RS spec RS spec RS mp;
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   214
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   215
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   216
(* ------------------------------------------------------------------------- *)
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   217
(* special induction rules                                                   *)
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   218
(* ------------------------------------------------------------------------- *)
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   219
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   220
section "induction";
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   221
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   222
qed_goalw "stream_finite_ind" thy [stream.finite_def] 
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   223
 "[| stream_finite x; P UU; !!a s. [| a ~= UU; P s |] ==> P (a && s) |] ==> P x" 
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   224
 (fn prems => [
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   225
	(cut_facts_tac prems 1),
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   226
	(etac exE 1),
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   227
	(etac subst 1),
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   228
	(rtac stream.finite_ind 1),
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   229
	(atac 1),
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   230
	(eresolve_tac prems 1),
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   231
	(atac 1)]);
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   232
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   233
qed_goal "stream_finite_ind2" thy
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   234
"[| P UU;\
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   235
\   !! x    .    x ~= UU                  ==> P (x      && UU); \
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   236
\   !! y z s. [| y ~= UU; z ~= UU; P s |] ==> P (y && z && s )  \
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   237
\   |] ==> !s. P (stream_take n`s)" (fn prems => [
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   238
	res_inst_tac [("n","n")] nat_induct2 1,
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   239
	  asm_simp_tac (HOL_ss addsimps (hd prems)::stream.take_rews) 1,
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   240
	 rtac allI 1,
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   241
	 stream_case_tac "s" 1,
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   242
	  asm_simp_tac (HOL_ss addsimps (hd prems)::stream.take_rews) 1,
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   243
	 asm_simp_tac (HOL_ss addsimps stream.take_rews addsimps prems) 1,
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   244
	rtac allI 1,
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   245
	stream_case_tac "s" 1,
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   246
	 asm_simp_tac (HOL_ss addsimps (hd prems)::stream.take_rews) 1,
4044
fdfef2d484ca domain package:
oheimb
parents: 3842
diff changeset
   247
	res_inst_tac [("x","sa")] stream.casedist 1,
2570
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   248
	 asm_simp_tac (HOL_ss addsimps stream.take_rews addsimps prems) 1,
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   249
	asm_simp_tac (HOL_ss addsimps stream.take_rews addsimps prems) 1]);
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   250
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   251
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   252
qed_goal "stream_ind2" thy
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   253
"[| adm P; P UU; !!a. a ~= UU ==> P (a && UU); \
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   254
\   !!a b s. [| a ~= UU; b ~= UU; P s |] ==> P (a && b && s)\
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   255
\ |] ==> P x" (fn prems => [
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   256
	rtac (stream.reach RS subst) 1,
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   257
	rtac (adm_impl_admw RS wfix_ind) 1,
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   258
	rtac adm_subst 1,
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   259
	cont_tacR 1,
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   260
	resolve_tac prems 1,
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   261
	rtac allI 1,
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   262
	rtac (rewrite_rule [stream.take_def] stream_finite_ind2 RS spec) 1,
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   263
	resolve_tac prems 1,
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   264
	eresolve_tac prems 1,
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   265
	eresolve_tac prems 1, atac 1, atac 1]);
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   266
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   267
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   268
(* ----------------------------------------------------------------------- *)
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   269
(* simplify use of coinduction                                             *)
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   270
(* ----------------------------------------------------------------------- *)
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   271
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   272
section "coinduction";
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   273
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   274
qed_goalw "stream_coind_lemma2" thy [stream.bisim_def]
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   275
"!s1 s2. R s1 s2 --> ft`s1 = ft`s2 &  R (rt`s1) (rt`s2) ==> stream_bisim R"
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   276
 (fn prems =>
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   277
	[
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   278
	(cut_facts_tac prems 1),
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   279
	(strip_tac 1),
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   280
	(etac allE 1),
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   281
	(etac allE 1),
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   282
	(dtac mp 1),
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   283
	(atac 1),
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   284
	(etac conjE 1),
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   285
	(case_tac "x = UU & x' = UU" 1),
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   286
	(rtac disjI1 1),
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   287
	(fast_tac HOL_cs 1),
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   288
	(rtac disjI2 1),
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   289
	(rtac disjE 1),
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   290
	(etac (de_Morgan_conj RS subst) 1),
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   291
	(res_inst_tac [("x","ft`x")] exI 1),
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   292
	(res_inst_tac [("x","rt`x")] exI 1),
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   293
	(res_inst_tac [("x","rt`x'")] exI 1),
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   294
	(rtac conjI 1),
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   295
	(etac ft_defin 1),
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   296
	(asm_simp_tac (HOLCF_ss addsimps stream.rews addsimps [surjectiv_scons]) 1),
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   297
	(eres_inst_tac [("s","ft`x"),("t","ft`x'")] subst 1),
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   298
	(simp_tac (HOLCF_ss addsimps stream.rews addsimps [surjectiv_scons]) 1),
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   299
	(res_inst_tac [("x","ft`x'")] exI 1),
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   300
	(res_inst_tac [("x","rt`x")] exI 1),
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   301
	(res_inst_tac [("x","rt`x'")] exI 1),
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   302
	(rtac conjI 1),
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   303
	(etac ft_defin 1),
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   304
	(asm_simp_tac (HOLCF_ss addsimps stream.rews addsimps [surjectiv_scons]) 1),
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   305
	(res_inst_tac [("s","ft`x"),("t","ft`x'")] ssubst 1),
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   306
	(etac sym 1),
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   307
	(simp_tac (HOLCF_ss addsimps stream.rews addsimps [surjectiv_scons]) 1)
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   308
	]);
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   309
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   310
(* ----------------------------------------------------------------------- *)
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   311
(* theorems about stream_finite                                            *)
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   312
(* ----------------------------------------------------------------------- *)
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   313
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   314
section "stream_finite";
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   315
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   316
qed_goalw "stream_finite_UU" thy [stream.finite_def] "stream_finite UU" 
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   317
	(fn prems => [
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   318
	(rtac exI 1),
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   319
	(simp_tac (HOLCF_ss addsimps stream.rews) 1)]);
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   320
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   321
qed_goal "stream_finite_UU_rev" thy  "~  stream_finite s ==> s ~= UU"  (fn prems =>
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   322
	[
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   323
	(cut_facts_tac prems 1),
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   324
	(etac contrapos 1),
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   325
	(hyp_subst_tac  1),
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   326
	(rtac stream_finite_UU 1)
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   327
	]);
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   328
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   329
qed_goalw "stream_finite_lemma1" thy [stream.finite_def]
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   330
 "stream_finite xs ==> stream_finite (x && xs)" (fn prems => [
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   331
	(cut_facts_tac prems 1),
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   332
	(etac exE 1),
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   333
	(rtac exI 1),
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   334
	(etac stream_take_lemma4 1)
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   335
	]);
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   336
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   337
qed_goalw "stream_finite_lemma2" thy [stream.finite_def]
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   338
 "[| x ~= UU; stream_finite (x && xs) |] ==> stream_finite xs" (fn prems =>
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   339
	[
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   340
	(cut_facts_tac prems 1),
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   341
	(etac exE 1),
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   342
	(rtac exI 1),
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   343
	(etac stream_take_lemma3 1),
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   344
	(atac 1)
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   345
	]);
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   346
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   347
qed_goal "stream_finite_rt_eq" thy "stream_finite (rt`s) = stream_finite s"
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   348
	(fn _ => [
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   349
	stream_case_tac "s" 1,
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   350
	 simp_tac (HOL_ss addsimps stream_finite_UU::stream.sel_rews) 1,
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   351
	asm_simp_tac (HOL_ss addsimps stream.sel_rews) 1,
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   352
	fast_tac (HOL_cs addIs [stream_finite_lemma1] 
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   353
			 addDs [stream_finite_lemma2]) 1]);
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   354
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   355
qed_goal_spec_mp "stream_finite_less" thy 
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   356
 "stream_finite s ==> !t. t<<s --> stream_finite t" (fn prems => [
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   357
	cut_facts_tac prems 1,
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   358
	eres_inst_tac [("x","s")] stream_finite_ind 1,
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   359
	 strip_tac 1, dtac UU_I 1,
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   360
	 asm_simp_tac (HOLCF_ss addsimps [stream_finite_UU]) 1,
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   361
	strip_tac 1,
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   362
	asm_full_simp_tac (HOL_ss addsimps [stream_prefix']) 1,
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   363
	fast_tac (HOL_cs addSIs [stream_finite_UU, stream_finite_lemma1]) 1]);
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   364
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   365
qed_goal "adm_not_stream_finite" thy "adm (%x. ~  stream_finite x)" (fn _ => [
3461
7bf1e7c40a0c amdI -> admI2
nipkow
parents: 3324
diff changeset
   366
	rtac admI2 1,
2570
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   367
	dtac spec 1,
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   368
	etac contrapos 1,
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   369
	dtac stream_finite_less 1,
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   370
	 etac is_ub_thelub 1,
24d7e8fb8261 added Classlib.* and Witness.*,
oheimb
parents:
diff changeset
   371
	atac 1]);