src/CCL/Term.ML
changeset 0 a5a9c433f639
child 8 c3d2c6dcf3f0
equal deleted inserted replaced
-1:000000000000 0:a5a9c433f639
       
     1 (*  Title: 	CCL/terms
       
     2     ID:         $Id$
       
     3     Author: 	Martin Coen, Cambridge University Computer Laboratory
       
     4     Copyright   1993  University of Cambridge
       
     5 
       
     6 For terms.thy.
       
     7 *)
       
     8 
       
     9 open Term;
       
    10 
       
    11 val simp_can_defs = [one_def,inl_def,inr_def];
       
    12 val simp_ncan_defs = [if_def,when_def,split_def,fst_def,snd_def,thd_def];
       
    13 val simp_defs = simp_can_defs @ simp_ncan_defs;
       
    14 
       
    15 val ind_can_defs = [zero_def,succ_def,nil_def,cons_def];
       
    16 val ind_ncan_defs = [ncase_def,nrec_def,lcase_def,lrec_def];
       
    17 val ind_defs = ind_can_defs @ ind_ncan_defs;
       
    18 
       
    19 val data_defs = simp_defs @ ind_defs @ [napply_def];
       
    20 val genrec_defs = [letrec_def,letrec2_def,letrec3_def];
       
    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 ***)
       
    27 
       
    28 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);
       
    30 by (ALLGOALS(SIMP_TAC(CCL_ss addrews [caseBtrue,caseBfalse,caseBpair,caseBlam])));
       
    31 val letB = result() RS mp;
       
    32 
       
    33 goalw Term.thy [let_def] "let x be bot in f(x) = bot";
       
    34 br caseBbot 1;
       
    35 val letBabot = result();
       
    36 
       
    37 goalw Term.thy [let_def] "let x be t in bot = bot";
       
    38 brs ([caseBbot] RL [term_case]) 1;
       
    39 by (ALLGOALS(SIMP_TAC(CCL_ss addrews [caseBtrue,caseBfalse,caseBpair,caseBlam])));
       
    40 val letBbbot = result();
       
    41 
       
    42 goalw Term.thy [apply_def] "(lam x.b(x)) ` a = b(a)";
       
    43 by (ALLGOALS(SIMP_TAC(CCL_ss addrews [caseBtrue,caseBfalse,caseBpair,caseBlam])));
       
    44 val applyB = result();
       
    45 
       
    46 goalw Term.thy [apply_def] "bot ` a = bot";
       
    47 br caseBbot 1;
       
    48 val applyBbot = result();
       
    49 
       
    50 goalw Term.thy [fix_def] "fix(f) = f(fix(f))";
       
    51 by (resolve_tac [applyB RS ssubst] 1 THEN resolve_tac [refl] 1);
       
    52 val fixB = result();
       
    53 
       
    54 goalw Term.thy [letrec_def]
       
    55       "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 
       
    57     resolve_tac [applyB RS ssubst] 1 THEN resolve_tac [refl] 1);
       
    58 val letrecB = result();
       
    59 
       
    60 val rawBs = caseBs @ [applyB,applyBbot,letrecB];
       
    61 
       
    62 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]);
       
    64 fun mk_beta_rl s = raw_mk_beta_rl data_defs s;
       
    65 
       
    66 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";
       
    68 val ifBbot     = mk_beta_rl "if bot then t else u = bot";
       
    69 
       
    70 val whenBinl   = mk_beta_rl "when(inl(a),t,u) = t(a)";
       
    71 val whenBinr   = mk_beta_rl "when(inr(a),t,u) = u(a)";
       
    72 val whenBbot   = mk_beta_rl "when(bot,t,u) = bot";
       
    73 
       
    74 val splitB     = mk_beta_rl "split(<a,b>,h) = h(a,b)";
       
    75 val splitBbot  = mk_beta_rl "split(bot,h) = bot";
       
    76 val fstB       = mk_beta_rl "fst(<a,b>) = a";
       
    77 val fstBbot    = mk_beta_rl "fst(bot) = bot";
       
    78 val sndB       = mk_beta_rl "snd(<a,b>) = b";
       
    79 val sndBbot    = mk_beta_rl "snd(bot) = bot";
       
    80 val thdB       = mk_beta_rl "thd(<a,<b,c>>) = c";
       
    81 val thdBbot    = mk_beta_rl "thd(bot) = bot";
       
    82 
       
    83 val ncaseBzero = mk_beta_rl "ncase(zero,t,u) = t";
       
    84 val ncaseBsucc = mk_beta_rl "ncase(succ(n),t,u) = u(n)";
       
    85 val ncaseBbot  = mk_beta_rl "ncase(bot,t,u) = bot";
       
    86 val nrecBzero  = mk_beta_rl "nrec(zero,t,u) = t";
       
    87 val nrecBsucc  = mk_beta_rl "nrec(succ(n),t,u) = u(n,nrec(n,t,u))";
       
    88 val nrecBbot   = mk_beta_rl "nrec(bot,t,u) = bot";
       
    89 
       
    90 val lcaseBnil  = mk_beta_rl "lcase([],t,u) = t";
       
    91 val lcaseBcons = mk_beta_rl "lcase(x.xs,t,u) = u(x,xs)";
       
    92 val lcaseBbot  = mk_beta_rl "lcase(bot,t,u) = bot";
       
    93 val lrecBnil   = mk_beta_rl "lrec([],t,u) = t";
       
    94 val lrecBcons  = mk_beta_rl "lrec(x.xs,t,u) = u(x,xs,lrec(xs,t,u))";
       
    95 val lrecBbot   = mk_beta_rl "lrec(bot,t,u) = bot";
       
    96 
       
    97 val letrec2B = raw_mk_beta_rl (data_defs @ [letrec2_def])
       
    98        "letrec g x y be h(x,y,g) in g(p,q) = \
       
    99 \                     h(p,q,%u v.letrec g x y be h(x,y,g) in g(u,v))";
       
   100 val letrec3B = raw_mk_beta_rl (data_defs @ [letrec3_def])
       
   101        "letrec g x y z be h(x,y,z,g) in g(p,q,r) = \
       
   102 \                     h(p,q,r,%u v w.letrec g x y z be h(x,y,z,g) in g(u,v,w))";
       
   103 
       
   104 val napplyBzero   = mk_beta_rl "f^zero`a = a";
       
   105 val napplyBsucc   = mk_beta_rl "f^succ(n)`a = f(f^n`a)";
       
   106 
       
   107 val termBs = [letB,applyB,applyBbot,splitB,splitBbot,
       
   108               fstB,fstBbot,sndB,sndBbot,thdB,thdBbot,
       
   109               ifBtrue,ifBfalse,ifBbot,whenBinl,whenBinr,whenBbot,
       
   110               ncaseBzero,ncaseBsucc,ncaseBbot,nrecBzero,nrecBsucc,nrecBbot,
       
   111               lcaseBnil,lcaseBcons,lcaseBbot,lrecBnil,lrecBcons,lrecBbot,
       
   112               napplyBzero,napplyBsucc];
       
   113 
       
   114 (*** Constructors are injective ***)
       
   115 
       
   116 val term_injs = map (mk_inj_rl Term.thy 
       
   117                              [applyB,splitB,whenBinl,whenBinr,ncaseBsucc,lcaseBcons] 
       
   118                              (ccl_congs @ term_congs))
       
   119                ["(inl(a) = inl(a')) <-> (a=a')",
       
   120                 "(inr(a) = inr(a')) <-> (a=a')",
       
   121                 "(succ(a) = succ(a')) <-> (a=a')",
       
   122                 "(a.b = a'.b') <-> (a=a' & b=b')"];
       
   123 
       
   124 (*** Constructors are distinct ***)
       
   125 
       
   126 val term_dstncts = mkall_dstnct_thms Term.thy data_defs (ccl_injs @ term_injs)
       
   127                     [["bot","inl","inr"],["bot","zero","succ"],["bot","nil","op ."]];
       
   128 
       
   129 (*** Rules for pre-order [= ***)
       
   130 
       
   131 local
       
   132   fun mk_thm s = prove_goalw Term.thy data_defs s (fn _ => 
       
   133                   [SIMP_TAC (ccl_ss addrews (ccl_porews)) 1]);
       
   134 in
       
   135   val term_porews = map mk_thm ["inl(a) [= inl(a') <-> a [= a'",
       
   136                                 "inr(b) [= inr(b') <-> b [= b'",
       
   137                                 "succ(n) [= succ(n') <-> n [= n'",
       
   138                                 "x.xs [= x'.xs' <-> x [= x'  & xs [= xs'"];
       
   139 end;
       
   140 
       
   141 (*** Rewriting and Proving ***)
       
   142 
       
   143 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 
       
   146 val term_cs = ccl_cs addSEs (term_dstncts RL [notE]) addSDs (XH_to_Ds term_injs);