src/CCL/Term.ML
changeset 289 78541329ff35
parent 8 c3d2c6dcf3f0
child 642 0db578095e6a
equal deleted inserted replaced
288:b00ce6a1fe27 289:78541329ff35
    88 val nrecBzero  = mk_beta_rl "nrec(zero,t,u) = t";
    88 val nrecBzero  = mk_beta_rl "nrec(zero,t,u) = t";
    89 val nrecBsucc  = mk_beta_rl "nrec(succ(n),t,u) = u(n,nrec(n,t,u))";
    89 val nrecBsucc  = mk_beta_rl "nrec(succ(n),t,u) = u(n,nrec(n,t,u))";
    90 val nrecBbot   = mk_beta_rl "nrec(bot,t,u) = bot";
    90 val nrecBbot   = mk_beta_rl "nrec(bot,t,u) = bot";
    91 
    91 
    92 val lcaseBnil  = mk_beta_rl "lcase([],t,u) = t";
    92 val lcaseBnil  = mk_beta_rl "lcase([],t,u) = t";
    93 val lcaseBcons = mk_beta_rl "lcase(x.xs,t,u) = u(x,xs)";
    93 val lcaseBcons = mk_beta_rl "lcase(x$xs,t,u) = u(x,xs)";
    94 val lcaseBbot  = mk_beta_rl "lcase(bot,t,u) = bot";
    94 val lcaseBbot  = mk_beta_rl "lcase(bot,t,u) = bot";
    95 val lrecBnil   = mk_beta_rl "lrec([],t,u) = t";
    95 val lrecBnil   = mk_beta_rl "lrec([],t,u) = t";
    96 val lrecBcons  = mk_beta_rl "lrec(x.xs,t,u) = u(x,xs,lrec(xs,t,u))";
    96 val lrecBcons  = mk_beta_rl "lrec(x$xs,t,u) = u(x,xs,lrec(xs,t,u))";
    97 val lrecBbot   = mk_beta_rl "lrec(bot,t,u) = bot";
    97 val lrecBbot   = mk_beta_rl "lrec(bot,t,u) = bot";
    98 
    98 
    99 val letrec2B = raw_mk_beta_rl (data_defs @ [letrec2_def])
    99 val letrec2B = raw_mk_beta_rl (data_defs @ [letrec2_def])
   100        "letrec g x y be h(x,y,g) in g(p,q) = \
   100        "letrec g x y be h(x,y,g) in g(p,q) = \
   101 \                     h(p,q,%u v.letrec g x y be h(x,y,g) in g(u,v))";
   101 \                     h(p,q,%u v.letrec g x y be h(x,y,g) in g(u,v))";
   118 val term_injs = map (mk_inj_rl Term.thy 
   118 val term_injs = map (mk_inj_rl Term.thy 
   119 		     [applyB,splitB,whenBinl,whenBinr,ncaseBsucc,lcaseBcons])
   119 		     [applyB,splitB,whenBinl,whenBinr,ncaseBsucc,lcaseBcons])
   120                ["(inl(a) = inl(a')) <-> (a=a')",
   120                ["(inl(a) = inl(a')) <-> (a=a')",
   121                 "(inr(a) = inr(a')) <-> (a=a')",
   121                 "(inr(a) = inr(a')) <-> (a=a')",
   122                 "(succ(a) = succ(a')) <-> (a=a')",
   122                 "(succ(a) = succ(a')) <-> (a=a')",
   123                 "(a.b = a'.b') <-> (a=a' & b=b')"];
   123                 "(a$b = a'$b') <-> (a=a' & b=b')"];
   124 
   124 
   125 (*** Constructors are distinct ***)
   125 (*** Constructors are distinct ***)
   126 
   126 
   127 val term_dstncts = mkall_dstnct_thms Term.thy data_defs (ccl_injs @ term_injs)
   127 val term_dstncts = mkall_dstnct_thms Term.thy data_defs (ccl_injs @ term_injs)
   128                     [["bot","inl","inr"],["bot","zero","succ"],["bot","nil","op ."]];
   128                     [["bot","inl","inr"],["bot","zero","succ"],["bot","nil","op $"]];
   129 
   129 
   130 (*** Rules for pre-order [= ***)
   130 (*** Rules for pre-order [= ***)
   131 
   131 
   132 local
   132 local
   133   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 _ => 
   134                   [simp_tac (ccl_ss addsimps (ccl_porews)) 1]);
   134                   [simp_tac (ccl_ss addsimps (ccl_porews)) 1]);
   135 in
   135 in
   136   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'",
   137                                 "inr(b) [= inr(b') <-> b [= b'",
   137                                 "inr(b) [= inr(b') <-> b [= b'",
   138                                 "succ(n) [= succ(n') <-> n [= n'",
   138                                 "succ(n) [= succ(n') <-> n [= n'",
   139                                 "x.xs [= x'.xs' <-> x [= x'  & xs [= xs'"];
   139                                 "x$xs [= x'$xs' <-> x [= x'  & xs [= xs'"];
   140 end;
   140 end;
   141 
   141 
   142 (*** Rewriting and Proving ***)
   142 (*** Rewriting and Proving ***)
   143 
   143 
   144 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;