%{^
#include "ats_counter.cats" /* only needed for [ATS/Geizella] */
%}
staload Lst = "ats_list.sats"
staload Stamp = "ats_stamp.sats"
macdef print_stamp = $Stamp.print_stamp
staload "ats_staexp2.sats"
typedef s2cst_struct = @{
s2cst_sym= sym_t , s2cst_loc= loc_t , s2cst_srt= s2rt , s2cst_isabs= Option (s2expopt) , s2cst_iscon= bool , s2cst_isrec= bool , s2cst_isasp= bool , s2cst_iscpy= s2cstopt , s2cst_islst= Option @(d2con_t , d2con_t )
, s2cst_arilst= List int , s2cst_argvar= Option (List @(symopt_t, s2rt, int))
, s2cst_conlst= Option (d2conlst)
, s2cst_def= s2expopt , s2cst_sup= s2cstlst , s2cst_supcls= s2explst , s2cst_sVarset= s2Varset_t , s2cst_stamp= stamp_t , s2cst_tag= int }
fun s2rt_arity_list (s2t: s2rt): List int = case+ s2t of
| S2RTfun (s2ts, s2t) => begin
list_cons ($Lst.list_length s2ts, s2rt_arity_list s2t)
end | _ => list_nil ()
local
assume s2cst_t = [l:addr] (vbox (s2cst_struct @ l) | ptr l)
in
implement s2cst_make (
id, loc, s2t, isabs, iscon, isrec, isasp, islst, argvar, def
) = let
val stamp = $Stamp.s2cst_stamp_make ()
val (pf_gc, pf | p) = ptr_alloc_tsz {s2cst_struct} (sizeof<s2cst_struct>)
prval () = free_gc_elim {s2cst_struct} (pf_gc)
val () = begin
p->s2cst_sym := id;
p->s2cst_loc := loc;
p->s2cst_srt := s2t;
p->s2cst_isabs := isabs;
p->s2cst_iscon := iscon;
p->s2cst_isrec := isrec;
p->s2cst_isasp := isasp;
p->s2cst_iscpy := S2CSTOPTnone ();
p->s2cst_islst := islst;
p->s2cst_arilst := s2rt_arity_list s2t;
p->s2cst_argvar := argvar;
p->s2cst_conlst := None ();
p->s2cst_def := def;
p->s2cst_sup := S2CSTLSTnil ();
p->s2cst_supcls := list_nil ();
p->s2cst_sVarset := s2Varset_nil;
p->s2cst_stamp := stamp;
p->s2cst_tag := (~1);
end
val (pfbox | ()) = vbox_make_view_ptr (pf | p)
in
(pfbox | p)
end
implement s2cst_sym_get (s2c) =
let val (vbox pf | p) = s2c in p->s2cst_sym end
implement s2cst_loc_get (s2c) =
let val (vbox pf | p) = s2c in p->s2cst_loc end
implement s2cst_srt_get (s2c) =
let val (vbox pf | p) = s2c in p->s2cst_srt end
implement s2cst_isabs_get (s2c) =
let val (vbox pf | p) = s2c in p->s2cst_isabs end
implement s2cst_iscon_get (s2c) =
let val (vbox pf | p) = s2c in p->s2cst_iscon end
implement s2cst_isrec_get (s2c) =
let val (vbox pf | p) = s2c in p->s2cst_isrec end
implement s2cst_isasp_get (s2c) =
let val (vbox pf | p) = s2c in p->s2cst_isasp end
implement s2cst_isasp_set (s2c, isasp) =
let val (vbox pf | p) = s2c in p->s2cst_isasp := isasp end
implement s2cst_iscpy_get (s2c) =
let val (vbox pf | p) = s2c in p->s2cst_iscpy end
implement s2cst_iscpy_set (s2c, iscpy) =
let val (vbox pf | p) = s2c in p->s2cst_iscpy := iscpy end
implement s2cst_islst_get (s2c) =
let val (vbox pf | p) = s2c in p->s2cst_islst end
implement s2cst_islst_set (s2c, islst) =
let val (vbox pf | p) = s2c in p->s2cst_islst := islst end
implement s2cst_arilst_get (s2c) =
let val (vbox pf | p) = s2c in p->s2cst_arilst end
implement s2cst_argvar_get (s2c) =
let val (vbox pf | p) = s2c in p->s2cst_argvar end
implement s2cst_conlst_get (s2c) =
let val (vbox pf | p) = s2c in p->s2cst_conlst end
implement s2cst_conlst_set (s2c, od2cs) =
let val (vbox pf | p) = s2c in p->s2cst_conlst := od2cs end
implement s2cst_def_get (s2c) =
let val (vbox pf | p) = s2c in p->s2cst_def end
implement s2cst_def_set (s2c, def) =
let val (vbox pf | p) = s2c in p->s2cst_def := def end
implement s2cst_sup_get (s2c) =
let val (vbox pf | p) = s2c in p->s2cst_sup end
implement s2cst_sup_add (s2c, sup) = let
val (vbox pf | p) = s2c; val sups = p->s2cst_sup
in
p->s2cst_sup := S2CSTLSTcons (sup, sups)
end
implement s2cst_supcls_get (s2c) =
let val (vbox pf | p) = s2c in p->s2cst_supcls end
implement
s2cst_supcls_add (s2c, sup) = let
val (vbox pf | p) = s2c; val sups = p->s2cst_supcls
in
p->s2cst_supcls := list_cons (sup, sups)
end
implement s2cst_sVarset_get (s2c) =
let val (vbox pf | p) = s2c in p->s2cst_sVarset end
implement s2cst_sVarset_set (s2c, sVs) =
let val (vbox pf | p) = s2c in p->s2cst_sVarset := sVs end
implement s2cst_stamp_get (s2c) =
let val (vbox pf | p) = s2c in p->s2cst_stamp end
implement s2cst_stamp_set (s2c, stamp) =
let val (vbox pf | p) = s2c in p->s2cst_stamp := stamp end
implement s2cst_tag_get (s2c) =
let val (vbox pf | p) = s2c in p->s2cst_tag end
implement s2cst_tag_set (s2c, tag) =
let val (vbox pf | p) = s2c in p->s2cst_tag := tag end
fn _lt_s2cst_s2cst
(s2c1: s2cst_t, s2c2: s2cst_t): bool = let
val stamp1 =
let val (vbox pf1 | p1) = s2c1 in p1->s2cst_stamp end
val stamp2 =
let val (vbox pf2 | p2) = s2c2 in p2->s2cst_stamp end
in
$Stamp.lt_stamp_stamp (stamp1, stamp2)
end
implement lt_s2cst_s2cst (s2c1, s2c2) =
$effmask_all ( _lt_s2cst_s2cst (s2c1, s2c2) )
fn _lte_s2cst_s2cst
(s2c1: s2cst_t, s2c2: s2cst_t): bool = let
val stamp1 =
let val (vbox pf1 | p1) = s2c1 in p1->s2cst_stamp end
val stamp2 =
let val (vbox pf2 | p2) = s2c2 in p2->s2cst_stamp end
in
$Stamp.lte_stamp_stamp (stamp1, stamp2)
end
implement lte_s2cst_s2cst (s2c1, s2c2) =
$effmask_all ( _lte_s2cst_s2cst (s2c1, s2c2) )
fn _eq_s2cst_s2cst
(s2c1: s2cst_t, s2c2: s2cst_t): bool = let
val stamp1 =
let val (vbox pf1 | p1) = s2c1 in p1->s2cst_stamp end
val stamp2 =
let val (vbox pf2 | p2) = s2c2 in p2->s2cst_stamp end
in
$Stamp.eq_stamp_stamp (stamp1, stamp2)
end
implement eq_s2cst_s2cst (s2c1, s2c2) =
$effmask_all ( _eq_s2cst_s2cst (s2c1, s2c2) )
fn _neq_s2cst_s2cst
(s2c1: s2cst_t, s2c2: s2cst_t): bool = let
val stamp1 =
let val (vbox pf1 | p1) = s2c1 in p1->s2cst_stamp end
val stamp2 =
let val (vbox pf2 | p2) = s2c2 in p2->s2cst_stamp end
in
$Stamp.neq_stamp_stamp (stamp1, stamp2)
end
implement
neq_s2cst_s2cst (s2c1, s2c2) =
$effmask_all ( _neq_s2cst_s2cst (s2c1, s2c2) )
fn _compare_s2cst_s2cst
(s2c1: s2cst_t, s2c2: s2cst_t): Sgn = let
val stamp1 =
let val (vbox pf1 | p1) = s2c1 in p1->s2cst_stamp end
val stamp2 =
let val (vbox pf2 | p2) = s2c2 in p2->s2cst_stamp end
in
$Stamp.compare_stamp_stamp (stamp1, stamp2)
end
implement compare_s2cst_s2cst (s2c1, s2c2) =
$effmask_all ( _compare_s2cst_s2cst (s2c1, s2c2) )
implement s2cst_is_abstract (s2c) = let
val (vbox pf | p) = s2c in
case+ p->s2cst_isabs of Some _ => true | None _ => false
end
implement s2cst_is_data (s2c) = let
val (vbox pf | p) = s2c in
case+ p->s2cst_isabs of Some _ => false | None _ => p->s2cst_iscon
end
implement s2cst_is_eqsup (s2c1, s2c2) = let
fun aux (s2c1: s2cst_t, stamp2: stamp_t): bool = let
val stamp1 = begin
let val (vbox pf1 | p1) = s2c1 in p1->s2cst_stamp end
end in
if $Stamp.eq_stamp_stamp (stamp1, stamp2) then true
else let
val sup = let val (vbox pf1 | p1) = s2c1 in p1->s2cst_sup end
in
case+ sup of
| S2CSTLSTcons (s2c1, _) => aux (s2c1, stamp2) | S2CSTLSTnil () => false
end end
val stamp2 = begin
let val (vbox pf2 | p2) = s2c2 in p2->s2cst_stamp end
end
in
aux (s2c1, stamp2)
end
implement s2cst_is_listlike (s2c) = let
val islst = let val (vbox pf | p) = s2c in p->s2cst_islst end
in
case+ islst of Some _ => true | None () => false
end
implement s2cst_is_singular (s2c) = let
val od2cs = let val (vbox pf | p) = s2c in p->s2cst_conlst end
in
case+ od2cs of
| Some d2cs => begin case+ d2cs of
| D2CONLSTcons (_, D2CONLSTnil ()) => true | _ => false
end | None () => false end
end
implement s2cst_make_dat
(id, loc, os2ts_arg, s2t_res, argvar) = let
val s2t = (case+ os2ts_arg of
| Some s2ts_arg => s2rt_fun (s2ts_arg, s2t_res)
| None () => s2t_res
) : s2rt
in
s2cst_make (
id , loc , s2t , None () , true , false , false , None () , argvar , None () ) end
implement s2cst_make_cls
(id, loc, s2vss) = let
val s2t = aux (s2vss, s2rt_cls) where {
fun aux (
s2vss: s2varlstlst, res: s2rt
) : s2rt = begin case+ s2vss of
| list_cons (s2vs, s2vss) => let
val res = aux (s2vss, res)
val s2ts_arg = $Lst.list_map_fun (s2vs, s2var_srt_get)
in
s2rt_fun (s2ts_arg, res)
end | list_nil () => res
end } in
s2cst_make (
id , loc , s2t , None () , true , false , false , None () , None () , None () ) end
implement fprint_s2cst (pf_out | out, s2c) =
$Sym.fprint_symbol (pf_out | out, s2cst_sym_get s2c)
implement fprint_s2cstlst {m} (pf | out, s2cs) = let
fun aux (out: &FILE m, i: int, s2cs: s2cstlst): void =
case+ s2cs of
| S2CSTLSTcons (s2c, s2cs) => begin
if i > 0 then fprint1_string (pf | out, ", ");
fprint_s2cst (pf | out, s2c); aux (out, i+1, s2cs)
end | S2CSTLSTnil () => () in
aux (out, 0, s2cs)
end
implement print_s2cst (s2c) = print_mac (fprint_s2cst, s2c)
implement prerr_s2cst (s2c) = prerr_mac (fprint_s2cst, s2c)
implement print_s2cstlst (s2cs) = print_mac (fprint_s2cstlst, s2cs)
implement prerr_s2cstlst (s2cs) = prerr_mac (fprint_s2cstlst, s2cs)