src/HOLCF/Tools/Domain/domain_axioms.ML
changeset 35446 b719dad322fa
parent 35444 73f645fdd4ff
child 35460 8cb42aa19358
equal deleted inserted replaced
35445:593c184977a4 35446:b719dad322fa
    76       in
    76       in
    77         ("copy_def", %%:(dname^"_copy") == /\ "f"
    77         ("copy_def", %%:(dname^"_copy") == /\ "f"
    78           (dc_abs oo (copy_of_dtyp map_tab r (dtyp_of_eq eqn)) oo dc_rep))
    78           (dc_abs oo (copy_of_dtyp map_tab r (dtyp_of_eq eqn)) oo dc_rep))
    79       end;
    79       end;
    80 
    80 
    81 (* -- definitions concerning the discriminators and selectors - *)
    81 (* -- definitions concerning the discriminators - *)
    82 
    82 
    83     val dis_defs = let
    83     val dis_defs = let
    84       fun ddef (con,_,_) = (dis_name con ^"_def",%%:(dis_name con) == 
    84       fun ddef (con,_,_) = (dis_name con ^"_def",%%:(dis_name con) == 
    85                                               list_ccomb(%%:(dname^"_when"),map 
    85                                               list_ccomb(%%:(dname^"_when"),map 
    86                                                                               (fn (con',_,args) => (List.foldr /\#
    86                                                                               (fn (con',_,args) => (List.foldr /\#
   113           in (pat_name con ^"_def", list_comb (%%:(pat_name con), ps) == 
   113           in (pat_name con ^"_def", list_comb (%%:(pat_name con), ps) == 
   114                                               list_ccomb(%%:(dname^"_when"), map one_con cons))
   114                                               list_ccomb(%%:(dname^"_when"), map one_con cons))
   115           end
   115           end
   116       in map pdef cons end;
   116       in map pdef cons end;
   117 
   117 
   118     val sel_defs = let
       
   119       fun sdef con n arg = Option.map (fn sel => (sel^"_def",%%:sel == 
       
   120                                                             list_ccomb(%%:(dname^"_when"),map 
       
   121                                                                                             (fn (con', _, args) => if con'<>con then UU else
       
   122                                                                                                                List.foldr /\# (Bound (length args - n)) args) cons))) (sel_of arg);
       
   123     in map_filter I (maps (fn (con, _, args) => mapn (sdef con) 1 args) cons) end;
       
   124 
       
   125 
   118 
   126 (* ----- axiom and definitions concerning induction ------------------------- *)
   119 (* ----- axiom and definitions concerning induction ------------------------- *)
   127 
   120 
   128     val reach_ax = ("reach", mk_trp(proj (mk_fix (%%:(comp_dname^"_copy"))) eqs n
   121     val reach_ax = ("reach", mk_trp(proj (mk_fix (%%:(comp_dname^"_copy"))) eqs n
   129                                          `%x_name === %:x_name));
   122                                          `%x_name === %:x_name));
   139                    mk_ex("n",(%%:(dname^"_take") $ Bound 0)`Bound 1 === Bound 1)));
   132                    mk_ex("n",(%%:(dname^"_take") $ Bound 0)`Bound 1 === Bound 1)));
   140 
   133 
   141   in (dnam,
   134   in (dnam,
   142       (if definitional then [] else [abs_iso_ax, rep_iso_ax, reach_ax]),
   135       (if definitional then [] else [abs_iso_ax, rep_iso_ax, reach_ax]),
   143       (if definitional then [when_def] else [when_def, copy_def]) @
   136       (if definitional then [when_def] else [when_def, copy_def]) @
   144       dis_defs @ mat_defs @ pat_defs @ sel_defs @
   137       dis_defs @ mat_defs @ pat_defs @
   145       [take_def, finite_def])
   138       [take_def, finite_def])
   146   end; (* let (calc_axioms) *)
   139   end; (* let (calc_axioms) *)
   147 
   140 
   148 
   141 
   149 (* legacy type inference *)
   142 (* legacy type inference *)