src/HOL/MicroJava/J/JBasis.ML
author kleing
Thu, 21 Sep 2000 10:42:49 +0200
changeset 10042 7164dc0d24d8
parent 9969 4753185f1dd2
child 10138 412a3ced6efd
permissions -rw-r--r--
unsymbolized
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
8011
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
     1
(*  Title:      HOL/MicroJava/J/JBasis.ML
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
     2
    ID:         $Id$
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
     3
    Author:     David von Oheimb
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
     4
    Copyright   1999 TU Muenchen
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
     5
*)
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
     6
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
     7
val strip_tac1 = SELECT_GOAL (safe_tac (HOL_cs delrules [conjI, disjE, impCE]));
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
     8
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
     9
Goalw [image_def]
10042
7164dc0d24d8 unsymbolized
kleing
parents: 9969
diff changeset
    10
	"x \\<in> f``A ==> \\<exists>y. y \\<in> A \\<and>  x = f y";
8011
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    11
by(Auto_tac);
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    12
qed "image_rev";
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    13
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    14
fun case_tac1 s i = EVERY [case_tac s i, rotate_tac ~1 i, rotate_tac ~1 (i+1)];
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    15
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    16
val select_split = prove_goalw Prod.thy [split_def] 
10042
7164dc0d24d8 unsymbolized
kleing
parents: 9969
diff changeset
    17
	"(SOME (x,y). P x y) = (SOME xy. P (fst xy) (snd xy))" (K [rtac refl 1]);
8011
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    18
	 
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    19
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    20
val split_beta = prove_goal Prod.thy "(\\<lambda>(x,y). P x y) z = P (fst z) (snd z)"
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    21
	(fn _ => [stac surjective_pairing 1, stac split 1, rtac refl 1]);
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    22
val split_beta2 = prove_goal Prod.thy "(\\<lambda>(x,y). P x y) (w,z) = P w z"
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    23
	(fn _ => [Auto_tac]);
10042
7164dc0d24d8 unsymbolized
kleing
parents: 9969
diff changeset
    24
val splitE2 = prove_goal Prod.thy "[|Q (split P z); !!x y. [|z = (x, y); Q (P x y)|] ==> R|] ==> R" (fn prems => [
8011
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    25
	REPEAT (resolve_tac (prems@[surjective_pairing]) 1),
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    26
	rtac (split_beta RS subst) 1,
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    27
	rtac (hd prems) 1]);
10042
7164dc0d24d8 unsymbolized
kleing
parents: 9969
diff changeset
    28
val splitE2' = prove_goal Prod.thy "[|((\\<lambda>(x,y). P x y) z) w; !!x y. [|z = (x, y); (P x y) w|] ==> R|] ==> R" (fn prems => [
8011
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    29
	REPEAT (resolve_tac (prems@[surjective_pairing]) 1),
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    30
	res_inst_tac [("P1","P")] (split_beta RS subst) 1,
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    31
	rtac (hd prems) 1]);
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    32
	
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    33
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    34
fun pair_tac s = res_inst_tac [("p",s)] PairE THEN' hyp_subst_tac;
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    35
10042
7164dc0d24d8 unsymbolized
kleing
parents: 9969
diff changeset
    36
val BallE = prove_goal thy "[|Ball A P; x \\<notin> A ==> Q; P x ==> Q |] ==> Q"
8011
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    37
	(fn prems => [rtac ballE 1, resolve_tac prems 1, 
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    38
			eresolve_tac prems 1, eresolve_tac prems 1]);
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    39
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    40
val set_cs2 = set_cs delrules [ballE] addSEs [BallE];
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    41
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    42
Addsimps [Let_def];
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    43
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    44
(* To HOL.ML *)
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    45
10042
7164dc0d24d8 unsymbolized
kleing
parents: 9969
diff changeset
    46
val ex1_some_eq_trivial = prove_goal HOL.thy "[| \\<exists>!x. P x; P y |] ==> Eps P = y" 
8011
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    47
	(fn prems => [
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    48
	cut_facts_tac prems 1,
9969
4753185f1dd2 renamed (most of...) the select rules
paulson
parents: 9345
diff changeset
    49
	rtac some_equality 1,
8011
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    50
	 atac 1,
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    51
	etac ex1E 1,
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    52
	etac all_dupE 1,
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    53
	fast_tac HOL_cs 1]);
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    54
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    55
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    56
val ball_insert = prove_goalw equalities.thy [Ball_def]
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    57
	"Ball (insert x A) P = (P x \\<and> Ball A P)" (fn _ => [
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    58
	fast_tac set_cs 1]);
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    59
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    60
fun option_case_tac i = EVERY [
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    61
	etac option_caseE i,
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    62
	 rotate_tac ~2 (i+1), asm_full_simp_tac HOL_basic_ss (i+1), 
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    63
	 rotate_tac ~2  i   , asm_full_simp_tac HOL_basic_ss i];
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    64
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    65
val not_None_tac = EVERY' [dtac (not_None_eq RS iffD1),rotate_tac ~1,etac exE,
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    66
		rotate_tac ~1,asm_full_simp_tac 
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    67
	(simpset() delsimps [split_paired_All,split_paired_Ex])];
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    68
8116
759f712f8f06 int:nat->int is pushed inwards.
nipkow
parents: 8083
diff changeset
    69
Goal "{y. x = Some y} \\<subseteq> {the x}";
759f712f8f06 int:nat->int is pushed inwards.
nipkow
parents: 8083
diff changeset
    70
by Auto_tac;
759f712f8f06 int:nat->int is pushed inwards.
nipkow
parents: 8083
diff changeset
    71
qed "some_subset_the";
759f712f8f06 int:nat->int is pushed inwards.
nipkow
parents: 8083
diff changeset
    72
8011
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    73
fun ex_ftac thm = EVERY' [forward_tac [thm], REPEAT o (etac exE), rotate_tac ~1,
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    74
  asm_full_simp_tac (simpset() delsimps [split_paired_All,split_paired_Ex])];
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    75
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    76
val optionE = prove_goal thy 
10042
7164dc0d24d8 unsymbolized
kleing
parents: 9969
diff changeset
    77
       "[| opt = None ==> P;  !!x. opt = Some x ==> P |] ==> P" 
8011
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    78
   (fn prems => [
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    79
	case_tac "opt = None" 1,
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    80
	 eresolve_tac prems 1,
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    81
	not_None_tac 1,
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    82
	eresolve_tac prems 1]);
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    83
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    84
fun option_case_tac2 s i = EVERY [
8442
96023903c2df case_tac now subsumes both boolean and datatype cases;
wenzelm
parents: 8423
diff changeset
    85
	 case_tac s i,
8011
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    86
	 rotate_tac ~1 (i+1), asm_full_simp_tac HOL_basic_ss (i+1), 
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    87
	 rotate_tac ~1  i   , asm_full_simp_tac HOL_basic_ss i];
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    88
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    89
val option_map_SomeD = prove_goalw thy [option_map_def]
10042
7164dc0d24d8 unsymbolized
kleing
parents: 9969
diff changeset
    90
	"!!x. option_map f x = Some y ==> \\<exists>z. x = Some z \\<and> f z = y" (K [
8011
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    91
	option_case_tac2 "x" 1,
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    92
	 Auto_tac]);
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    93
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    94
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    95
section "unique";
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    96
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    97
Goal "(x, y) : set l --> x : fst `` set l";
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    98
by (induct_tac "l" 1);
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
    99
by  Auto_tac;
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   100
qed_spec_mp "fst_in_set_lemma";
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   101
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   102
Goalw [unique_def] "unique []";
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   103
by (Simp_tac 1);
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   104
qed "unique_Nil";
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   105
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   106
Goalw [unique_def] "unique ((x,y)#l) = (unique l \\<and> (!y. (x,y) ~: set l))";
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   107
by  (auto_tac (claset() addDs [fst_in_set_lemma],simpset()));
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   108
qed "unique_Cons";
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   109
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   110
Addsimps [unique_Nil,unique_Cons];
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   111
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   112
Goal "unique l' ==> unique l --> \
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   113
\ (!(x,y):set l. !(x',y'):set l'. x' ~= x) --> unique (l @ l')";
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   114
by (induct_tac "l" 1);
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   115
by  (auto_tac (claset() addDs [fst_in_set_lemma],simpset()));
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   116
qed_spec_mp "unique_append";
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   117
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   118
Goal "unique l --> inj f --> unique (map (%(k,x). (f k, g k x)) l)";
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   119
by (induct_tac "l" 1);
8082
381716a86fcb removed inj_eq from the default simpset again
oheimb
parents: 8011
diff changeset
   120
by  (auto_tac (claset() addDs [fst_in_set_lemma],simpset()addsimps[inj_eq]));
8011
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   121
qed_spec_mp "unique_map_inj";
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   122
10042
7164dc0d24d8 unsymbolized
kleing
parents: 9969
diff changeset
   123
Goal "!!l. unique l ==> unique (map (split (\\<lambda>k. Pair (k, C))) l)";
8011
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   124
by(etac unique_map_inj 1);
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   125
by(rtac injI 1);
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   126
by Auto_tac;
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   127
qed "unique_map_Pair";
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   128
10042
7164dc0d24d8 unsymbolized
kleing
parents: 9969
diff changeset
   129
Goal "[|M = N; !!x. x\\<in>N ==> f x = g x|] ==> f``M = g``N";
8011
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   130
by(rtac set_ext 1);
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   131
by(simp_tac (simpset() addsimps image_def::premises()) 1);
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   132
qed "image_cong";
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   133
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   134
val split_Pair_eq = prove_goal Prod.thy 
10042
7164dc0d24d8 unsymbolized
kleing
parents: 9969
diff changeset
   135
"!!X. ((x, y), z) \\<in> split (\\<lambda>x. Pair (x, Y)) `` A ==> y = Y" (K [
8011
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   136
	etac imageE 1,
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   137
	split_all_tac 1,
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   138
	auto_tac(claset_of Prod.thy,simpset_of Prod.thy)]);
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   139
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   140
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   141
(* More about Maps *)
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   142
10042
7164dc0d24d8 unsymbolized
kleing
parents: 9969
diff changeset
   143
val override_SomeD = prove_goalw thy [override_def] "(s \\<oplus> t) k = Some x ==> \
8011
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   144
\ t k = Some x |  t k = None \\<and>  s k = Some x" (fn prems => [
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   145
	cut_facts_tac prems 1,
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   146
	case_tac "\\<exists>x. t k = Some x" 1,
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   147
	 etac exE 1,
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   148
	 rotate_tac ~1 1,
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   149
	 Asm_full_simp_tac 1,
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   150
	asm_full_simp_tac (HOL_ss addsimps [not_None_eq RS sym]) 1,
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   151
	 rotate_tac ~1 1,
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   152
	 Asm_full_simp_tac 1]);
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   153
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   154
Addsimps [fun_upd_same, fun_upd_other];
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   155
10042
7164dc0d24d8 unsymbolized
kleing
parents: 9969
diff changeset
   156
Goal "unique xys --> (map_of xys x = Some y) = ((x,y) \\<in> set xys)";
8011
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   157
by(induct_tac "xys" 1);
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   158
 by(Simp_tac 1);
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   159
by(force_tac (claset(), simpset() addsimps [unique_Cons]) 1);
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   160
qed_spec_mp "unique_map_of_Some_conv";
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   161
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   162
val in_set_get = unique_map_of_Some_conv RS iffD2;
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   163
val get_in_set = unique_map_of_Some_conv RS iffD1;
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   164
10042
7164dc0d24d8 unsymbolized
kleing
parents: 9969
diff changeset
   165
Goal "(\\<forall>(x,y)\\<in>set l. P x y) --> (\\<forall>x. \\<forall>y. map_of l x = Some y --> P x y)";
8011
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   166
by(induct_tac "l" 1);
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   167
by(ALLGOALS Simp_tac);
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   168
by Safe_tac;
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   169
by Auto_tac;
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   170
bind_thm("Ball_set_table",result() RS mp);
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   171
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   172
val table_mono = prove_goal thy 
10042
7164dc0d24d8 unsymbolized
kleing
parents: 9969
diff changeset
   173
"unique l' --> (\\<forall>xy. (xy)\\<in>set l --> (xy)\\<in>set l') -->\
7164dc0d24d8 unsymbolized
kleing
parents: 9969
diff changeset
   174
\ (\\<forall>k y. map_of l k = Some y --> map_of l' k = Some y)" (fn _ => [
8011
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   175
	induct_tac "l" 1,
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   176
	 Auto_tac,
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   177
 	 fast_tac (HOL_cs addSIs [in_set_get]) 1])
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   178
 RS mp RS mp RS spec RS spec RS mp;
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   179
10042
7164dc0d24d8 unsymbolized
kleing
parents: 9969
diff changeset
   180
val table_map_Some' = prove_goal thy "map_of t k = Some (k', x) --> \
8011
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   181
\ map_of (map (\\<lambda>u. ((fst u, fst (snd u)), snd (snd u))) t) (k, k') = Some x" (K [
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   182
	induct_tac "t" 1,	
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   183
	 ALLGOALS Simp_tac,
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   184
	case_tac1 "k = fst a" 1,
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   185
	 Auto_tac]) RS mp;
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   186
val table_map_Some = prove_goal thy 
10042
7164dc0d24d8 unsymbolized
kleing
parents: 9969
diff changeset
   187
"map_of (map (\\<lambda>((k,k'),x). (k,(k',x))) t) k = Some (k',x) --> \
8011
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   188
\map_of t (k, k') = Some x" (K [
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   189
	induct_tac "t" 1,	
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   190
	Auto_tac]) RS mp;
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   191
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   192
10042
7164dc0d24d8 unsymbolized
kleing
parents: 9969
diff changeset
   193
val table_mapf_Some = prove_goal thy "!!f. \\<forall>x y. f x = f y --> x = y ==> \
7164dc0d24d8 unsymbolized
kleing
parents: 9969
diff changeset
   194
\ map_of (map (\\<lambda>(k,x). (k,f x)) t) k = Some (f x) --> map_of t k = Some x" (K [
8011
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   195
	induct_tac "t" 1,	
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   196
	Auto_tac]) RS mp;
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   197
val table_mapf_SomeD = prove_goal thy 
10042
7164dc0d24d8 unsymbolized
kleing
parents: 9969
diff changeset
   198
"map_of (map (\\<lambda>(k,x). (k, f x)) t) k = Some z --> (\\<exists>y. (k,y)\\<in>set t \\<and>  z = f y)"(K [
8011
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   199
	induct_tac "t" 1,	
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   200
	Auto_tac]) RS mp;
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   201
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   202
val table_mapf_Some2 = prove_goal thy 
10042
7164dc0d24d8 unsymbolized
kleing
parents: 9969
diff changeset
   203
"!!k. map_of (map (\\<lambda>(k,x). (k,C,x)) t) k = Some (D,x) ==> C = D \\<and> map_of t k = Some x" (K [
8011
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   204
	forward_tac [table_mapf_SomeD] 1,
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   205
	Auto_tac,
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   206
	rtac table_mapf_Some 1,
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   207
	 atac 2,
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   208
	Fast_tac 1]);
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   209
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   210
val finite_map_of = rewrite_rule [dom_def] finite_dom_map_of;
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   211
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   212
Goal
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   213
"map_of (map (\\<lambda>(a,b). (a,f b)) xs) x = option_map f (map_of xs x)";
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   214
by (induct_tac "xs" 1);
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   215
auto();
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   216
qed "map_of_map";
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   217
d14c4e9e9c8e *** empty log message ***
nipkow
parents:
diff changeset
   218