56 goalw Prod.thy [split_def] "split(<a,b>, c) = c(a,b)"; |
56 goalw Prod.thy [split_def] "split(<a,b>, c) = c(a,b)"; |
57 by (sstac [fst_conv, snd_conv] 1); |
57 by (sstac [fst_conv, snd_conv] 1); |
58 by (rtac refl 1); |
58 by (rtac refl 1); |
59 val split = result(); |
59 val split = result(); |
60 |
60 |
61 (*FIXME: split's congruence rule should only simplifies the pair*) |
|
62 val pair_ss = set_ss addsimps [fst_conv, snd_conv, split]; |
61 val pair_ss = set_ss addsimps [fst_conv, snd_conv, split]; |
|
62 |
|
63 (*Prevents simplification of c: much faster*) |
|
64 val split_weak_cong = prove_goal Prod.thy |
|
65 "p=q ==> split(p,c) = split(q,c)" |
|
66 (fn [prem] => [rtac (prem RS arg_cong) 1]); |
63 |
67 |
64 goal Prod.thy "p = <fst(p),snd(p)>"; |
68 goal Prod.thy "p = <fst(p),snd(p)>"; |
65 by (res_inst_tac [("p","p")] PairE 1); |
69 by (res_inst_tac [("p","p")] PairE 1); |
66 by(asm_simp_tac pair_ss 1); |
70 by (asm_simp_tac pair_ss 1); |
67 val surjective_pairing = result(); |
71 val surjective_pairing = result(); |
68 |
72 |
69 goal Prod.thy "p = split(p, %x y.<x,y>)"; |
73 goal Prod.thy "p = split(p, %x y.<x,y>)"; |
70 by (res_inst_tac [("p","p")] PairE 1); |
74 by (res_inst_tac [("p","p")] PairE 1); |
71 by(asm_simp_tac pair_ss 1); |
75 by (asm_simp_tac pair_ss 1); |
72 val surjective_pairing2 = result(); |
76 val surjective_pairing2 = result(); |
73 |
77 |
74 (** split used as a logical connective, with result type bool **) |
78 (** split used as a logical connective, with result type bool **) |
75 |
79 |
76 val prems = goal Prod.thy "c(a,b) ==> split(<a,b>, c)"; |
80 val prems = goal Prod.thy "c(a,b) ==> split(<a,b>, c)"; |
97 |
101 |
98 goal Prod.thy |
102 goal Prod.thy |
99 "prod_fun(f1 o f2, g1 o g2) = (prod_fun(f1,g1) o prod_fun(f2,g2))"; |
103 "prod_fun(f1 o f2, g1 o g2) = (prod_fun(f1,g1) o prod_fun(f2,g2))"; |
100 by (rtac ext 1); |
104 by (rtac ext 1); |
101 by (res_inst_tac [("p","x")] PairE 1); |
105 by (res_inst_tac [("p","x")] PairE 1); |
102 by(asm_simp_tac (pair_ss addsimps [prod_fun,o_def]) 1); |
106 by (asm_simp_tac (pair_ss addsimps [prod_fun,o_def]) 1); |
103 val prod_fun_compose = result(); |
107 val prod_fun_compose = result(); |
104 |
108 |
105 goal Prod.thy "prod_fun(%x.x, %y.y) = (%z.z)"; |
109 goal Prod.thy "prod_fun(%x.x, %y.y) = (%z.z)"; |
106 by (rtac ext 1); |
110 by (rtac ext 1); |
107 by (res_inst_tac [("p","z")] PairE 1); |
111 by (res_inst_tac [("p","z")] PairE 1); |
108 by(asm_simp_tac (pair_ss addsimps [prod_fun]) 1); |
112 by (asm_simp_tac (pair_ss addsimps [prod_fun]) 1); |
109 val prod_fun_ident = result(); |
113 val prod_fun_ident = result(); |
110 |
114 |
111 val prems = goal Prod.thy "<a,b>:r ==> <f(a),g(b)> : prod_fun(f,g)``r"; |
115 val prems = goal Prod.thy "<a,b>:r ==> <f(a),g(b)> : prod_fun(f,g)``r"; |
112 by (rtac image_eqI 1); |
116 by (rtac image_eqI 1); |
113 by (rtac (prod_fun RS sym) 1); |
117 by (rtac (prod_fun RS sym) 1); |