src/CCL/Term.ML
changeset 8 c3d2c6dcf3f0
parent 0 a5a9c433f639
child 289 78541329ff35
equal deleted inserted replaced
7:268f93ab3bc4 8:c3d2c6dcf3f0
    17 val ind_defs = ind_can_defs @ ind_ncan_defs;
    17 val ind_defs = ind_can_defs @ ind_ncan_defs;
    18 
    18 
    19 val data_defs = simp_defs @ ind_defs @ [napply_def];
    19 val data_defs = simp_defs @ ind_defs @ [napply_def];
    20 val genrec_defs = [letrec_def,letrec2_def,letrec3_def];
    20 val genrec_defs = [letrec_def,letrec2_def,letrec3_def];
    21 
    21 
    22 val term_congs = ccl_mk_congs Term.thy 
       
    23     ["inl","inr","succ","op .","split","if","when","ncase","nrec","lcase","lrec",
       
    24      "fst","snd","thd","let","letrec","letrec2","letrec3","napply"];
       
    25 
       
    26 (*** Beta Rules, including strictness ***)
    22 (*** Beta Rules, including strictness ***)
    27 
    23 
    28 goalw Term.thy [let_def] "~ t=bot--> let x be t in f(x) = f(t)";
    24 goalw Term.thy [let_def] "~ t=bot--> let x be t in f(x) = f(t)";
    29 by (res_inst_tac [("t","t")] term_case 1);
    25 by (res_inst_tac [("t","t")] term_case 1);
    30 by (ALLGOALS(SIMP_TAC(CCL_ss addrews [caseBtrue,caseBfalse,caseBpair,caseBlam])));
    26 by (ALLGOALS(simp_tac(CCL_ss addsimps [caseBtrue,caseBfalse,caseBpair,caseBlam])));
    31 val letB = result() RS mp;
    27 val letB = result() RS mp;
    32 
    28 
    33 goalw Term.thy [let_def] "let x be bot in f(x) = bot";
    29 goalw Term.thy [let_def] "let x be bot in f(x) = bot";
    34 br caseBbot 1;
    30 br caseBbot 1;
    35 val letBabot = result();
    31 val letBabot = result();
    36 
    32 
    37 goalw Term.thy [let_def] "let x be t in bot = bot";
    33 goalw Term.thy [let_def] "let x be t in bot = bot";
    38 brs ([caseBbot] RL [term_case]) 1;
    34 brs ([caseBbot] RL [term_case]) 1;
    39 by (ALLGOALS(SIMP_TAC(CCL_ss addrews [caseBtrue,caseBfalse,caseBpair,caseBlam])));
    35 by (ALLGOALS(simp_tac(CCL_ss addsimps [caseBtrue,caseBfalse,caseBpair,caseBlam])));
    40 val letBbbot = result();
    36 val letBbbot = result();
    41 
    37 
    42 goalw Term.thy [apply_def] "(lam x.b(x)) ` a = b(a)";
    38 goalw Term.thy [apply_def] "(lam x.b(x)) ` a = b(a)";
    43 by (ALLGOALS(SIMP_TAC(CCL_ss addrews [caseBtrue,caseBfalse,caseBpair,caseBlam])));
    39 by (ALLGOALS(simp_tac(CCL_ss addsimps [caseBtrue,caseBfalse,caseBpair,caseBlam])));
    44 val applyB = result();
    40 val applyB = result();
    45 
    41 
    46 goalw Term.thy [apply_def] "bot ` a = bot";
    42 goalw Term.thy [apply_def] "bot ` a = bot";
    47 br caseBbot 1;
    43 br caseBbot 1;
    48 val applyBbot = result();
    44 val applyBbot = result();
    55       "letrec g x be h(x,g) in g(a) = h(a,%y.letrec g x be h(x,g) in g(y))";
    51       "letrec g x be h(x,g) in g(a) = h(a,%y.letrec g x be h(x,g) in g(y))";
    56 by (resolve_tac [fixB RS ssubst] 1 THEN 
    52 by (resolve_tac [fixB RS ssubst] 1 THEN 
    57     resolve_tac [applyB RS ssubst] 1 THEN resolve_tac [refl] 1);
    53     resolve_tac [applyB RS ssubst] 1 THEN resolve_tac [refl] 1);
    58 val letrecB = result();
    54 val letrecB = result();
    59 
    55 
    60 val rawBs = caseBs @ [applyB,applyBbot,letrecB];
    56 val rawBs = caseBs @ [applyB,applyBbot];
    61 
    57 
    62 fun raw_mk_beta_rl defs s = prove_goalw Term.thy defs s
    58 fun raw_mk_beta_rl defs s = prove_goalw Term.thy defs s
    63            (fn _ => [SIMP_TAC (CCL_ss addrews rawBs  addcongs term_congs) 1]);
    59            (fn _ => [rtac (letrecB RS ssubst) 1,
       
    60 		     simp_tac (CCL_ss addsimps rawBs) 1]);
       
    61 fun mk_beta_rl s = raw_mk_beta_rl data_defs s;
       
    62 
       
    63 fun raw_mk_beta_rl defs s = prove_goalw Term.thy defs s
       
    64            (fn _ => [simp_tac (CCL_ss addsimps rawBs 
       
    65 			       setloop (rtac (letrecB RS ssubst))) 1]);
    64 fun mk_beta_rl s = raw_mk_beta_rl data_defs s;
    66 fun mk_beta_rl s = raw_mk_beta_rl data_defs s;
    65 
    67 
    66 val ifBtrue    = mk_beta_rl "if true then t else u = t";
    68 val ifBtrue    = mk_beta_rl "if true then t else u = t";
    67 val ifBfalse   = mk_beta_rl "if false then t else u = u";
    69 val ifBfalse   = mk_beta_rl "if false then t else u = u";
    68 val ifBbot     = mk_beta_rl "if bot then t else u = bot";
    70 val ifBbot     = mk_beta_rl "if bot then t else u = bot";
   112               napplyBzero,napplyBsucc];
   114               napplyBzero,napplyBsucc];
   113 
   115 
   114 (*** Constructors are injective ***)
   116 (*** Constructors are injective ***)
   115 
   117 
   116 val term_injs = map (mk_inj_rl Term.thy 
   118 val term_injs = map (mk_inj_rl Term.thy 
   117                              [applyB,splitB,whenBinl,whenBinr,ncaseBsucc,lcaseBcons] 
   119 		     [applyB,splitB,whenBinl,whenBinr,ncaseBsucc,lcaseBcons])
   118                              (ccl_congs @ term_congs))
       
   119                ["(inl(a) = inl(a')) <-> (a=a')",
   120                ["(inl(a) = inl(a')) <-> (a=a')",
   120                 "(inr(a) = inr(a')) <-> (a=a')",
   121                 "(inr(a) = inr(a')) <-> (a=a')",
   121                 "(succ(a) = succ(a')) <-> (a=a')",
   122                 "(succ(a) = succ(a')) <-> (a=a')",
   122                 "(a.b = a'.b') <-> (a=a' & b=b')"];
   123                 "(a.b = a'.b') <-> (a=a' & b=b')"];
   123 
   124 
   128 
   129 
   129 (*** Rules for pre-order [= ***)
   130 (*** Rules for pre-order [= ***)
   130 
   131 
   131 local
   132 local
   132   fun mk_thm s = prove_goalw Term.thy data_defs s (fn _ => 
   133   fun mk_thm s = prove_goalw Term.thy data_defs s (fn _ => 
   133                   [SIMP_TAC (ccl_ss addrews (ccl_porews)) 1]);
   134                   [simp_tac (ccl_ss addsimps (ccl_porews)) 1]);
   134 in
   135 in
   135   val term_porews = map mk_thm ["inl(a) [= inl(a') <-> a [= a'",
   136   val term_porews = map mk_thm ["inl(a) [= inl(a') <-> a [= a'",
   136                                 "inr(b) [= inr(b') <-> b [= b'",
   137                                 "inr(b) [= inr(b') <-> b [= b'",
   137                                 "succ(n) [= succ(n') <-> n [= n'",
   138                                 "succ(n) [= succ(n') <-> n [= n'",
   138                                 "x.xs [= x'.xs' <-> x [= x'  & xs [= xs'"];
   139                                 "x.xs [= x'.xs' <-> x [= x'  & xs [= xs'"];
   139 end;
   140 end;
   140 
   141 
   141 (*** Rewriting and Proving ***)
   142 (*** Rewriting and Proving ***)
   142 
   143 
   143 val term_rews = termBs @ term_injs @ term_dstncts @ ccl_porews @ term_porews;
   144 val term_rews = termBs @ term_injs @ term_dstncts @ ccl_porews @ term_porews;
   144 val term_ss = ccl_ss addrews term_rews addcongs term_congs;
   145 val term_ss = ccl_ss addsimps term_rews;
   145 
   146 
   146 val term_cs = ccl_cs addSEs (term_dstncts RL [notE]) addSDs (XH_to_Ds term_injs);
   147 val term_cs = ccl_cs addSEs (term_dstncts RL [notE]) 
       
   148                      addSDs (XH_to_Ds term_injs);