Prod.ML
changeset 2 befa4e9f7c90
parent 0 7949f97df77a
child 26 5e3aa998e94e
equal deleted inserted replaced
1:142f1eb707b4 2:befa4e9f7c90
    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);