summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--language/Makefile4
-rw-r--r--language/l2.ott276
-rw-r--r--src/ast.lem744
-rw-r--r--src/ast.ml87
4 files changed, 902 insertions, 209 deletions
diff --git a/language/Makefile b/language/Makefile
index 4ec85aa1..6611f48f 100644
--- a/language/Makefile
+++ b/language/Makefile
@@ -11,9 +11,9 @@ l2_parse.pdf: l2_parse.tex
l2Theory.uo: l2Script.sml
Holmake --qof -I $(OTTLIB) l2Theory.uo
-l2.tex ../src/ast.ml l2Script.sml: l2.ott
+l2.tex ../src/ast.ml ../src/ast.lem l2Script.sml: l2.ott
ott -sort false -generate_aux_rules false -o l2.tex -picky_multiple_parses true l2.ott
- ott -sort false -generate_aux_rules true -o ../src/ast.ml -o l2Script.sml -picky_multiple_parses true l2.ott
+ ott -sort false -generate_aux_rules true -o ../src/ast.ml -o ../src/ast.lem -o l2Script.sml -picky_multiple_parses true l2.ott
l2_parse.tex parse_ast.ml ../src/parse_ast.ml: l2_parse.ott
ott -sort false -generate_aux_rules false -o l2_parse.tex -picky_multiple_parses true l2_parse.ott
diff --git a/language/l2.ott b/language/l2.ott
index 0fdade39..d65a3984 100644
--- a/language/l2.ott
+++ b/language/l2.ott
@@ -10,14 +10,6 @@ metavar num , zero ::=
{{ lem num }}
{{ com Numeric literals }}
-% metavar nat ::=
-% {{ phantom }}
-% {{ lex numeric }}
-% {{ ocaml int }}
-% {{ hol num }}
-% {{ lem num }}
-% {{ com Internal literal numbers }}
-
metavar hex ::=
{{ phantom }}
{{ lex numeric }}
@@ -137,49 +129,17 @@ id :: '' ::=
% on type variables (or variables of other kinds)
% We don't enforce a lexical convention on infix operators, as some of the
% targets use alphabetical infix operators.
- | bool :: S :: bool {{ com Built in type identifiers }} {{ icho bool_id }}
- | bit :: S :: bit {{ icho bit_id }}
- | unit :: S :: unit {{ icho unit_id }}
- | nat :: S :: nat {{ icho nat_id }}
- | vector :: S :: vector {{ icho vector_id }}
- | list :: S :: list {{ icho list_id }}
+ | bool :: M :: bool {{ com Built in type identifiers }} {{ ichlo bool_id }}
+ | bit :: M :: bit {{ ichlo bit_id }}
+ | unit :: M :: unit {{ ichlo unit_id }}
+ | nat :: M :: nat {{ ichlo nat_id }}
+ | string :: M :: string {{ ichlo string_id }}
+ | enum :: M :: enum {{ ichlo enum_id }}
+ | vector :: M :: vector {{ ichlo vector_id }}
+ | list :: M :: list {{ ichlo list_id }}
+ | set :: M :: set {{ ichlo set_id }}
+ | reg :: M :: reg {{ ichlo reg_id }}
-%%
-%% x_l {{ tex \ottnt{x}^{l} }} , y_l {{ tex \ottnt{y}^{l} }} , z_l {{ tex \ottnt{z}^{l} }} , name :: '' ::=
-%% {{ com Location-annotated names }}
-%% | x l :: :: X_l
-%% | ( ix ) l :: :: PreX_l
-%% {{ com Remove infix status }}
-%%
-%% ix_l {{ tex \ottnt{ix}^{l} }} :: '' ::=
-%% {{ com Location-annotated infix names }}
-%% | ix l :: :: SymX_l
-%% | ` x ` l :: :: InX_l
-%% {{ com Add infix status }}
-%%
-%% embed
-%% {{ ocaml
-%% let xl_to_l = function
-%% | X_l(_,l) -> l
-%% | PreX_l(_,_,_,l) -> l
-%%
-%% let ixl_to_l = function
-%% | SymX_l(_,l) -> l
-%% | InX_l(_,_,_,l) -> l
-%% }}
-%% {{ lem
-%%
-%% (*let xl_to_l = function
-%% | X_l(_,l) -> l
-%% | PreX_l(_,_,l) -> l
-%% end
-%%
-%% let ixl_to_l = function
-%% | SymX_l(_,l) -> l
-%% | InX_l(_,_,_,l) -> l
-%% end*)
-%%
-%% }}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Kinds and Types %
@@ -280,7 +240,7 @@ nexp :: 'Nexp_' ::=
%{{ com must be linear after normalisation... except for the type of *, ahem }}
| nexp1 + nexp2 :: :: sum {{ com sum }}
| 2 ** nexp :: :: exp {{ com exponential }}
- | ( nexp ) :: S :: paren {{ icho [[nexp]] }}
+ | ( nexp ) :: S :: paren {{ ichlo [[nexp]] }}
order :: 'Ord_' ::=
{{ com vector order specifications, of kind $[[Order]]$}}
@@ -288,7 +248,7 @@ order :: 'Ord_' ::=
| id :: :: id {{ com identifier }}
| inc :: :: inc {{ com increasing (little-endian) }}
| dec :: :: dec {{ com decreasing (big-endian) }}
- | ( order ) :: S :: paren {{ icho [[order]] }}
+ | ( order ) :: S :: paren {{ ichlo [[order]] }}
efct :: 'Effect_' ::=
{{ com effect }}
@@ -307,7 +267,7 @@ effects :: 'Effects_' ::=
{{ aux _ l }}
| effect id :: :: var
| effect { efct1 , .. , efctn } :: :: set {{ com effect set }}
- | pure :: M :: pure {{ com sugar for empty effect set }} {{ icho [] }}
+ | pure :: M :: pure {{ com sugar for empty effect set }} {{ ichlo [] }}
% TODO: are we going to need any effect polymorphism? Conceivably for built-in maps and folds. Yes. But we think we don't need any interesting effect-set expressions, eg effectset-variable union {rreg}.
@@ -327,7 +287,7 @@ typ :: 'Typ_' ::=
% TODO union in the other kind grammars? or make a syntax of argument? or glom together the grammars and leave o the typechecker
| id typ_arg1 .. typ_argn :: :: app
{{ com type constructor application }}
- | ( typ ) :: S :: paren {{ icho [[typ]] }}
+ | ( typ ) :: S :: paren {{ ichlo [[typ]] }}
typ_arg :: 'Typ_arg_' ::=
{{ com Type constructor arguments of all kinds }}
@@ -638,12 +598,12 @@ exp :: 'E_' ::=
| if exp1 then exp2 else exp3 :: :: if
{{ com conditional }}
- | if exp1 then exp2 :: S :: ifnoelse {{ icho [[ if exp1 then exp2 else unit ]] }}
+ | if exp1 then exp2 :: S :: ifnoelse {{ ichlo [[ if exp1 then exp2 else ( ) ]] }}
| foreach id from exp1 to exp2 by exp3 exp4 :: :: for {{ com loop }}
- | foreach id from exp1 to exp2 exp3 :: S :: forbyone {{ icho [[ foreach id from exp1 to exp2 by 1 exp4 ]] }}
- | foreach id from exp1 downto exp2 by exp3 exp4 :: S :: fordown {{ icho [[ foreach id from exp1 to exp2 by ( - exp3 ) exp4 ]] }}
- | foreach id from exp1 downto exp2 exp3 :: S :: fordownbyone {{ icho [[ foreach id from exp1 downto exp2 by 1 exp4 ]] }}
+ | foreach id from exp1 to exp2 exp3 :: S :: forbyone {{ ichlo [[ foreach id from exp1 to exp2 by 1 exp4 ]] }}
+ | foreach id from exp1 downto exp2 by exp3 exp4 :: S :: fordown {{ ichlo [[ foreach id from exp1 to exp2 by ( - exp3 ) exp4 ]] }}
+ | foreach id from exp1 downto exp2 exp3 :: S :: fordownbyone {{ ichlo [[ foreach id from exp1 downto exp2 by 1 exp4 ]] }}
% vectors
| [ exp1 , ... , expn ] :: :: vector {{ com vector (indexed from 0) }}
@@ -1285,9 +1245,9 @@ terminals :: '' ::=
{{ tex \ensuremath{\vdash_t} }}
| |-n :: :: vdashN
{{ tex \ensuremath{\vdash_n} }}
- | |-t :: :: vdashE
+ | |-e :: :: vdashE
{{ tex \ensuremath{\vdash_e} }}
- | |-t :: :: vdashO
+ | |-o :: :: vdashO
{{ tex \ensuremath{\vdash_o} }}
| ' :: :: quote
{{ tex \mbox{'} }}
@@ -1340,11 +1300,11 @@ formula :: formula_ ::=
{{ hol (DISJOINT (FDOM [[E_f1]]) (FDOM [[E_f2]])) }}
{{ lem disjoint (Pmap.domain [[E_f1]]) (Pmap.domain [[E_f2]]) }}
-%% %% | disjoint doms ( E_x1 , .... , E_xn ) :: :: E_x_disjoint_many
-%% %% {{ hol (FOLDR (\E b. case b of NONE => NONE | SOME s => if DISJOINT (FDOM
-%% %% E) s then SOME (FDOM E UNION s) else NONE) (SOME {}) [[E_x1....E_xn]] <> NONE) }}
-%% %% {{ lem disjoint_all (List.map Pmap.domain [[E_x1 .... E_xn]]) }}
-%% %% {{ com Pairwise disjoint domains }}
+ | disjoint doms ( E_t1 , .... , E_tn ) :: :: E_x_disjoint_many
+ {{ hol (FOLDR (\E b. case b of NONE => NONE | SOME s => if DISJOINT (FDOM
+ E) s then SOME (FDOM E UNION s) else NONE) (SOME {}) [[E_t1....E_tn]] <> NONE) }}
+ {{ lem disjoint_all (List.map Pmap.domain [[E_t1 .... E_tn]]) }}
+ {{ com Pairwise disjoint domains }}
%% %%
%% %% | compatible overlap ( x1 |-> t1 , .. , xn |-> tn ) :: :: E_l_compat
%% %% {{ hol (!__n __m. MEM __m [[x1 t1 .. xn tn]] /\ MEM __n [[x1 t1..xn tn]] /\ (FST __m = FST __n) ==> (SND __m = SND __n)) }}
@@ -1363,9 +1323,9 @@ formula :: formula_ ::=
{{ hol ([[id]] NOTIN FDOM [[E_k]]) }}
{{ lem Pervasives.not (Pmap.mem [[id]] [[E_k]]) }}
-%% %% | x NOTIN dom ( E_f ) :: :: notin_dom_f
-%% %% {{ hol ([[x]] NOTIN FDOM [[E_f]]) }}
-%% %% {{ lem Pervasives.not (Pmap.mem [[x]] [[E_f]]) }}
+ | id NOTIN dom ( E_t ) :: :: notin_dom_t
+ {{ hol ([[id]] NOTIN FDOM [[E_t]]) }}
+ {{ lem Pervasives.not (Pmap.mem [[id]] [[E_t]]) }}
%% %%
%% %%
%% %% | FV ( t ) SUBSET tnvs :: :: FV_t
@@ -1603,52 +1563,44 @@ E_k, K_Ord |- order ok
%% % TD |- ne = ne'
%% %
%% %
-%% % defns
-%% % convert_typ :: '' ::=
-%% %
-%% % defn
-%% % TD , E |- typ ~> t :: :: convert_typ :: convert_typ_
-%% % {{ com Convert source types to internal types }}
-%% % by
-%% %
-%% % % TODO : Can't allow things like type t = _, but it's useful to have things
-%% % % like f (x : (_, int)) = snd x
-%% % %TD |- t ok
-%% % %------------------------------------------------------------ :: wild
-%% % %TD,E |- _ l ~> t
-%% %
-%% % ------------------------------------------------------------ :: var
-%% % TD,E |- a l' l ~> a
-%% %
-%% % TD,E |- typ1 ~> t1
-%% % TD,E |- typ2 ~> t2
-%% % ------------------------------------------------------------ :: fn
-%% % TD,E |- typ1->typ2 l ~> t1->t2
-%% %
-%% % TD,E |- typ1 ~> t1 .... TD,E |- typn ~> tn
-%% % ------------------------------------------------------------ :: tup
-%% % TD,E |- typ1 * .... * typn l ~> t1 * .... * tn
-%% %
-%% % TD,E |- typ1 ~> t1 .. TD,E |- typn ~> tn
-%% % E(id) gives p
-%% % TD(p) gives a1..an tc_abbrev
-%% % ------------------------------------------------------------ :: app
-%% % TD,E |- id typ1 .. typn l ~> p t1 .. tn
-%% %
-%% % |- nexp ~> ne
-%% % ------------------------------------------------------------ :: nexp
-%% % TD,E |- nexp ~> ne
-%% %
-%% % TD,E |- typ ~> t
-%% % ------------------------------------------------------------ :: paren
-%% % TD,E |- (typ) l ~> t
-%% %
-%% %
-%% % TD,E |- typ ~> t1
-%% % TD |- t1 = t2
-%% % ------------------------------------------------------------ :: eq
-%% % TD,E |- typ ~> t2
-%% %
+
+defns
+convert_typ :: '' ::=
+
+defn
+E_k |- typ ~> t :: :: convert_typ :: convert_typ_
+{{ com Convert source types to internal types }}
+by
+
+E_k(id) gives K_Typ
+------------------------------------------------------------ :: var
+E_k |- :Typ_var: id ~> id
+
+E_k |- typ1 ~> t1
+E_k |- typ2 ~> t2
+E_k |-e effects ok
+------------------------------------------------------------ :: fn
+E_k |- typ1->typ2 effects ~> t1->t2 effects
+
+E_k |- typ1 ~> t1 .... E_k |- typn ~> tn
+------------------------------------------------------------ :: tup
+E_k |- typ1 * .... * typn ~> t1 * .... * tn
+
+E_k(id) gives K_Lam (k1..kn -> K_Typ)
+E_k,k1 |- typ_arg1 ~> t_arg1 .. E_k,kn |- typ_argn ~> t_argn
+------------------------------------------------------------ :: app
+E_k |- id typ_arg1 .. typ_argn ~> id t_arg1 .. t_argn
+
+E_k |- typ ~> t1
+%E_k |- t1 = t2
+------------------------------------------------------------ :: eq
+E_k |- typ ~> t2
+
+defn
+E_k , k |- typ_arg ~> t_arg :: :: convert_targ :: convert_targ_
+{{ com Convert source type arguments to internals }}
+by
+
%% % defn
%% % |- nexp ~> ne :: :: convert_nexp :: convert_nexp_
%% % {{ com Convert and normalize numeric expressions }}
@@ -1697,13 +1649,16 @@ by
------------------------------------------------------------ :: num
|- num : nat
+ ------------------------------------------------------------- :: string
+ |- string : string
+
num = bitlength(hex)
------------------------------------------------------------ :: hex
- |- hex : vector zero num inc bit
+ |- hex : vector zero num inc :T_var: bit
num = bitlength(bin)
------------------------------------------------------------ :: bin
- |- bin : vector zero num inc bit
+ |- bin : vector zero num inc :T_var: bit
------------------------------------------------------------ :: unit
|- () : unit
@@ -1794,48 +1749,39 @@ by
%% % E_l |- x_l1. .. x_ln.y_l.z_l l not shadowed
%% %
%% %
-%% % defns
-%% % check_pat :: '' ::=
-%% %
-%% % defn
-%% % TD , E , E_l1 |- pat : t gives E_l2 :: :: check_pat :: check_pat_
-%% % {{ com Typing patterns, building their binding environment }}
-%% % by
-%% %
-%% % :check_pat_aux: TD,E,E_l1 |- pat_aux : t gives E_l2
-%% % ------------------------------------------------------------ :: all
-%% % TD,E,E_l1 |- pat_aux l : t gives E_l2
-%% %
-%% % defn
-%% % TD , E , E_l1 |- pat_aux : t gives E_l2 :: :: check_pat_aux :: check_pat_aux_
-%% % {{ com Typing patterns, building their binding environment }}
-%% % by
-%% %
-%% % TD |- t ok
-%% % ------------------------------------------------------------ :: wild
-%% % TD,E,E_l |- _ : t gives {}
-%% %
-%% % TD,E,E_l1 |- pat : t gives E_l2
-%% % x NOTIN dom(E_l2)
-%% % ------------------------------------------------------------ :: as
-%% % TD,E,E_l1 |- (pat as x l) : t gives E_l2 u+ {x|->t}
-%% %
-%% % TD,E,E_l1 |- pat : t gives E_l2
-%% % TD,E |- typ ~> t
-%% % ------------------------------------------------------------ :: typ
-%% % TD,E,E_l1 |- (pat : typ) : t gives E_l2
-%% %
+defns
+check_pat :: '' ::=
+
+defn
+E |- pat : t gives E_t :: :: check_pat :: check_pat_
+{{ com Typing patterns, building their binding environment }}
+by
+
+E_k |-t t ok
+------------------------------------------------------------ :: wild
+<E_t,E_k> |- _ : t gives {}
+% This case should perhaps indicate the generation of a type variable, with kind Typ
+
+<E_t,E_k> |- pat : t gives E_t1
+id NOTIN dom(E_t1)
+------------------------------------------------------------ :: as
+<E_t,E_k> |- (pat as id) : t gives E_t1 u+ {id|->t}
+
+E_k |- typ ~> t
+<E_t,E_k> |- pat : t gives E_t1
+------------------------------------------------------------ :: typ
+<E_t,E_k> |- (<typ> pat) : t gives E_t1
+
%% % TD,E |- ctor id : (t1*..*tn) -> p t_args gives (x of names)
-%% % E_l |- id not shadowed
-%% % TD,E,E_l |- pat1 : t1 gives E_l1 .. TD,E,E_l |- patn : tn gives E_ln
+<E_t,E_k> |- pat1 : t1 gives E_t1 .. <E_t,E_k> |- patn : tn gives E_tn
%% % disjoint doms(E_l1,..,E_ln)
-%% % ------------------------------------------------------------ :: ident_constr
-%% % TD,E,E_l |- id pat1 .. patn : p t_args gives E_l1 u+ .. u+ E_ln
-%% %
-%% % TD |- t ok
-%% % E,E_l |- x not ctor
-%% % ------------------------------------------------------------ :: var
-%% % TD,E,E_l |- x l1 l2 : t gives {x|->t}
+------------------------------------------------------------ :: ident_constr
+<E_t,E_k> |- id pat1 .. patn : id t_args gives E_t1 u+ .. u+ E_tn
+
+E_k |-t t ok
+ ------------------------------------------------------------ :: var
+<E_t,E_k> |- :P_id: id : t gives E_t u+ {id|->t}
+
%% %
%% % </TD,E |- field idi : p t_args -> ti gives (xi of names) // i />
%% % </TD,E,E_l |- pati : ti gives E_li//i/>
@@ -1856,12 +1802,12 @@ by
%% % ----------------------------------------------------------- :: vectorConcat
%% % TD,E,E_l |- [| pat1 ... patn |] : __vector ne' t gives E_l1 u+ ... u+ E_ln
%% %
-%% %
-%% % TD,E,E_l |- pat1 : t1 gives E_l1 .... TD,E,E_l |- patn : tn gives E_ln
-%% % disjoint doms(E_l1,....,E_ln)
-%% % ------------------------------------------------------------ :: tup
-%% % TD,E,E_l |- (pat1, ...., patn) : t1 * .... * tn gives E_l1 u+ .... u+ E_ln
-%% %
+
+<E_t,E_k> |- pat1 : t1 gives E_t1 .... <E_t,E_k> |- patn : tn gives E_tn
+disjoint doms(E_t1,....,E_tn)
+------------------------------------------------------------ :: tup
+<E_t,E_k> |- (pat1, ...., patn) : t1 * .... * tn gives E_t1 u+ .... u+ E_tn
+
%% % TD |- t ok
%% % TD,E,E_l |- pat1 : t gives E_l1 .. TD,E,E_l |- patn : t gives E_ln
%% % disjoint doms(E_l1,..,E_ln)
@@ -1925,9 +1871,9 @@ by
%% % ------------------------------------------------------------ :: cons
%% % <E_m,E_p,E_f,E_x> |- x l1.</y_li.//i/> z_l l2 value
%% %
-%% % defns
-%% % check_exp :: '' ::=
-%% %
+defns
+check_exp :: '' ::=
+
%% % defn
%% % TD , E , E_l |- exp : t gives S_c , S_N :: :: check_exp :: check_exp_
%% % {{ com Typing expressions, collecting typeclass and index constraints }}
diff --git a/src/ast.lem b/src/ast.lem
new file mode 100644
index 00000000..feeafd9e
--- /dev/null
+++ b/src/ast.lem
@@ -0,0 +1,744 @@
+(* generated by Ott 0.22 from: l2.ott *)
+
+open Pmap
+open Pervasives
+
+type l =
+ | Unknown
+ | Trans of string * option l
+ | Range of num * num
+
+val disjoint : forall 'a . set 'a -> set 'a -> bool
+let disjoint s1 s2 =
+ let diff = s1 inter s2 in
+ diff = Pervasives.empty
+
+val disjoint_all : forall 'a. list (set 'a) -> bool
+let rec disjoint_all ls = match ls with
+ | [] -> true
+ | [a] -> true
+ | a::b::rs -> (disjoint a b) && (disjoint_all (b::rs))
+end
+
+val duplicates : forall 'a. list 'a -> list 'a
+
+val union_map : forall 'a 'b. map 'a 'b -> map 'a 'b -> map 'a 'b
+
+val set_from_list : forall 'a. list 'a -> set 'a
+
+val subst : forall 'a. list 'a -> list 'a -> bool
+
+
+type x = string (* identifier *)
+type ix = string (* infix identifier *)
+
+type base_kind_aux = (* base kind *)
+ | BK_type (* kind of types *)
+ | BK_nat (* kind of natural number size expressions *)
+ | BK_order (* kind of vector order specifications *)
+ | BK_effects (* kind of effect sets *)
+
+
+type id_aux = (* Identifier *)
+ | Id of x
+ | DeIid of x (* remove infix status *)
+
+
+type base_kind =
+ | BK_aux of base_kind_aux * l
+
+
+type id =
+ | Id_aux of id_aux * l
+
+
+type kind_aux = (* kinds *)
+ | K_kind of list base_kind
+
+
+type nexp_aux = (* expression of kind $Nat$, for vector sizes and origins *)
+ | Nexp_id of id (* identifier *)
+ | Nexp_constant of num (* constant *)
+ | Nexp_times of nexp * nexp (* product *)
+ | Nexp_sum of nexp * nexp (* sum *)
+ | Nexp_exp of nexp (* exponential *)
+
+and nexp =
+ | Nexp_aux of nexp_aux * l
+
+
+type kind =
+ | K_aux of kind_aux * l
+
+
+type nexp_constraint_aux = (* constraint over kind $Nat$ *)
+ | NC_fixed of nexp * nexp
+ | NC_bounded_ge of nexp * nexp
+ | NC_bounded_le of nexp * nexp
+ | NC_nat_set_bounded of id * list num
+
+
+type kinded_id_aux = (* optionally kind-annotated identifier *)
+ | KOpt_none of id (* identifier *)
+ | KOpt_kind of kind * id (* kind-annotated variable *)
+
+
+type nexp_constraint =
+ | NC_aux of nexp_constraint_aux * l
+
+
+type kinded_id =
+ | KOpt_aux of kinded_id_aux * l
+
+
+type efct_aux = (* effect *)
+ | Effect_rreg (* read register *)
+ | Effect_wreg (* write register *)
+ | Effect_rmem (* read memory *)
+ | Effect_wmem (* write memory *)
+ | Effect_undef (* undefined-instruction exception *)
+ | Effect_unspec (* unspecified values *)
+ | Effect_nondet (* nondeterminism from intra-instruction parallelism *)
+
+
+type quant_item_aux = (* Either a kinded identifier or a nexp constraint for a typquant *)
+ | QI_id of kinded_id (* An optionally kinded identifier *)
+ | QI_const of nexp_constraint (* A constraint for this type *)
+
+
+type efct =
+ | Effect_aux of efct_aux * l
+
+
+type quant_item =
+ | QI_aux of quant_item_aux * l
+
+
+type effects_aux = (* effect set, of kind $Effects$ *)
+ | Effects_var of id
+ | Effects_set of list efct (* effect set *)
+
+
+type order_aux = (* vector order specifications, of kind $Order$ *)
+ | Ord_id of id (* identifier *)
+ | Ord_inc (* increasing (little-endian) *)
+ | Ord_dec (* decreasing (big-endian) *)
+
+
+type typquant_aux = (* type quantifiers and constraints *)
+ | TypQ_tq of list quant_item
+ | TypQ_no_forall (* sugar, omitting quantifier and constraints *)
+
+
+type effects =
+ | Effects_aux of effects_aux * l
+
+
+type order =
+ | Ord_aux of order_aux * l
+
+
+type lit_aux = (* Literal constant *)
+ | L_unit (* $() : unit$ *)
+ | L_zero (* $bitzero : bit$ *)
+ | L_one (* $bitone : bit$ *)
+ | L_true (* $true : bool$ *)
+ | L_false (* $false : bool$ *)
+ | L_num of num (* natural number constant *)
+ | L_hex of string (* bit vector constant, C-style *)
+ | L_bin of string (* bit vector constant, C-style *)
+ | L_string of string (* string constant *)
+
+
+type typquant =
+ | TypQ_aux of typquant_aux * l
+
+
+type typ_aux = (* Type expressions, of kind $Type$ *)
+ | Typ_wild (* Unspecified type *)
+ | Typ_var of id (* Type variable *)
+ | Typ_fn of typ * typ * effects (* Function type (first-order only in user code) *)
+ | Typ_tup of list typ (* Tuple type *)
+ | Typ_app of id * list typ_arg (* type constructor application *)
+
+and typ =
+ | Typ_aux of typ_aux * l
+
+and typ_arg_aux = (* Type constructor arguments of all kinds *)
+ | Typ_arg_nexp of nexp
+ | Typ_arg_typ of typ
+ | Typ_arg_order of order
+ | Typ_arg_effects of effects
+
+and typ_arg =
+ | Typ_arg_aux of typ_arg_aux * l
+
+
+type lit =
+ | L_aux of lit_aux * l
+
+
+type typschm_aux = (* type scheme *)
+ | TypSchm_ts of typquant * typ
+
+
+type pat_aux = (* Pattern *)
+ | P_lit of lit (* literal constant pattern *)
+ | P_wild (* wildcard *)
+ | P_as of pat * id (* named pattern *)
+ | P_typ of typ * pat (* typed pattern *)
+ | P_id of id (* identifier *)
+ | P_app of id * list pat (* union constructor pattern *)
+ | P_record of list fpat * bool (* struct pattern *)
+ | P_vector of list pat (* vector pattern *)
+ | P_vector_indexed of list (num * pat) (* vector pattern (with explicit indices) *)
+ | P_vector_concat of list pat (* concatenated vector pattern *)
+ | P_tup of list pat (* tuple pattern *)
+ | P_list of list pat (* list pattern *)
+
+and pat =
+ | P_aux of pat_aux * annot
+
+and fpat_aux = (* Field pattern *)
+ | FP_Fpat of id * pat
+
+and fpat =
+ | FP_aux of fpat_aux * annot
+
+
+type typschm =
+ | TypSchm_aux of typschm_aux * l
+
+
+type exp_aux = (* Expression *)
+ | E_block of list exp (* block (parsing conflict with structs?) *)
+ | E_id of id (* identifier *)
+ | E_lit of lit (* literal constant *)
+ | E_cast of typ * exp (* cast *)
+ | E_app of exp * list exp (* function application *)
+ | E_app_infix of exp * id * exp (* infix function application *)
+ | E_tuple of list exp (* tuple *)
+ | E_if of exp * exp * exp (* conditional *)
+ | E_for of id * exp * exp * exp * exp (* loop *)
+ | E_vector of list exp (* vector (indexed from 0) *)
+ | E_vector_indexed of list (num * exp) (* vector (indexed consecutively) *)
+ | E_vector_access of exp * exp (* vector access *)
+ | E_vector_subrange of exp * exp * exp (* subvector extraction *)
+ | E_vector_update of exp * exp * exp (* vector functional update *)
+ | E_vector_update_subrange of exp * exp * exp * exp (* vector subrange update (with vector) *)
+ | E_list of list exp (* list *)
+ | E_cons of exp * exp (* cons *)
+ | E_record of fexps (* struct *)
+ | E_record_update of exp * fexps (* functional update of struct *)
+ | E_field of exp * id (* field projection from struct *)
+ | E_case of exp * list pexp (* pattern matching *)
+ | E_let of letbind * exp (* let expression *)
+ | E_assign of lexp * exp (* imperative assignment *)
+
+and exp =
+ | E_aux of exp_aux * annot
+
+and lexp_aux = (* lvalue expression *)
+ | LEXP_id of id (* identifier *)
+ | LEXP_vector of lexp * exp (* vector element *)
+ | LEXP_vector_range of lexp * exp * exp (* subvector *)
+ | LEXP_field of lexp * id (* struct field *)
+
+and lexp =
+ | LEXP_aux of lexp_aux * annot
+
+and fexp_aux = (* Field-expression *)
+ | FE_Fexp of id * exp
+
+and fexp =
+ | FE_aux of fexp_aux * annot
+
+and fexps_aux = (* Field-expression list *)
+ | FES_Fexps of list fexp * bool
+
+and fexps =
+ | FES_aux of fexps_aux * annot
+
+and pexp_aux = (* Pattern match *)
+ | Pat_exp of pat * exp
+
+and pexp =
+ | Pat_aux of pexp_aux * annot
+
+and letbind_aux = (* Let binding *)
+ | LB_val_explicit of typschm * pat * exp (* value binding, explicit type (pat must be total) *)
+ | LB_val_implicit of pat * exp (* value binding, implicit type (pat must be total) *)
+
+and letbind =
+ | LB_aux of letbind_aux * annot
+
+
+type ne = (* internal numeric expressions *)
+ | Ne_var of id
+ | Ne_const of num
+ | Ne_mult of ne * ne
+ | Ne_add of ne * ne
+ | Ne_exp of ne
+ | Ne_unary of ne
+
+
+type naming_scheme_opt_aux = (* Optional variable-naming-scheme specification for variables of defined type *)
+ | Name_sect_none
+ | Name_sect_some of string
+
+
+type tannot_opt_aux = (* Optional type annotation for functions *)
+ | Typ_annot_opt_some of typquant * typ
+
+
+type funcl_aux = (* Function clause *)
+ | FCL_Funcl of id * pat * exp
+
+
+type effects_opt_aux = (* Optional effect annotation for functions *)
+ | Effects_opt_pure (* sugar for empty effect set *)
+ | Effects_opt_effects of effects
+
+
+type rec_opt_aux = (* Optional recursive annotation for functions *)
+ | Rec_nonrec (* non-recursive *)
+ | Rec_rec (* recursive *)
+
+
+type k = (* Internal kinds *)
+ | Ki_typ
+ | Ki_nat
+ | Ki_ord
+ | Ki_efct
+ | Ki_val (* Representing values, for use in identifier checks *)
+ | Ki_ctor of list k * k
+ | Ki_infer (* Representing an unknown kind, inferred by context *)
+
+
+type t_arg = (* Argument to type constructors *)
+ | Typ of t
+ | Nexp of ne
+ | Effect of effects
+ | Order of order
+
+and t_args = (* Arguments to type constructors *)
+ | T_args of list t_arg
+
+
+type naming_scheme_opt =
+ | Name_sect_aux of naming_scheme_opt_aux * l
+
+
+type index_range_aux = (* index specification, for bitfields in register types *)
+ | BF_single of num (* single index *)
+ | BF_range of num * num (* index range *)
+ | BF_concat of index_range * index_range (* concatenation of index ranges *)
+
+and index_range =
+ | BF_aux of index_range_aux * l
+
+
+type tannot_opt =
+ | Typ_annot_opt_aux of tannot_opt_aux * annot
+
+
+type funcl =
+ | FCL_aux of funcl_aux * annot
+
+
+type effects_opt =
+ | Effects_opt_aux of effects_opt_aux * annot
+
+
+type rec_opt =
+ | Rec_aux of rec_opt_aux * l
+
+
+type type_def_aux = (* Type definition body *)
+ | TD_abbrev of id * naming_scheme_opt * typschm (* type abbreviation *)
+ | TD_record of id * naming_scheme_opt * typquant * list (typ * id) * bool (* struct type definition *)
+ | TD_variant of id * naming_scheme_opt * typquant * list (typ * id) * bool (* union type definition *)
+ | TD_enum of id * naming_scheme_opt * list id * bool (* enumeration type definition *)
+ | TD_register of id * nexp * nexp * list (index_range * id) (* register mutable bitfield type definition *)
+
+
+type default_typing_spec_aux = (* Default kinding or typing assumption *)
+ | DT_kind of base_kind * id
+ | DT_typ of typschm * id
+
+
+type fundef_aux = (* Function definition *)
+ | FD_function of rec_opt * tannot_opt * effects_opt * list funcl
+
+
+type val_spec_aux = (* Value type specification *)
+ | VS_val_spec of typschm * id
+
+
+type type_def =
+ | TD_aux of type_def_aux * annot
+
+
+type default_typing_spec =
+ | DT_aux of default_typing_spec_aux * annot
+
+
+type fundef =
+ | FD_aux of fundef_aux * annot
+
+
+type val_spec =
+ | VS_aux of val_spec_aux * annot
+
+
+type def_aux = (* Top-level definition *)
+ | DEF_type of type_def (* type definition *)
+ | DEF_fundef of fundef (* function definition *)
+ | DEF_val of letbind (* value definition *)
+ | DEF_spec of val_spec (* top-level type constraint *)
+ | DEF_default of default_typing_spec (* default kind and type assumptions *)
+ | DEF_reg_dec of typ * id (* register declaration *)
+ | DEF_scattered_function of rec_opt * tannot_opt * effects_opt * id (* scattered function definition header *)
+ | DEF_scattered_funcl of funcl (* scattered function definition clause *)
+ | DEF_scattered_variant of id * naming_scheme_opt * typquant (* scattered union definition header *)
+ | DEF_scattered_unioncl of id * typ * id (* scattered union definition member *)
+ | DEF_scattered_end of id (* scattered definition end *)
+
+
+type typ_lib_aux = (* library types and syntactic sugar for them *)
+ | Typ_lib_unit (* unit type with value $()$ *)
+ | Typ_lib_bool (* booleans $true$ and $false$ *)
+ | Typ_lib_bit (* pure bit values (not mutable bits) *)
+ | Typ_lib_nat (* natural numbers 0,1,2,... *)
+ | Typ_lib_string of string (* UTF8 strings *)
+ | Typ_lib_enum of nexp * nexp * order (* natural numbers nexp .. nexp+nexp-1, ordered by order *)
+ | Typ_lib_enum1 of nexp (* sugar for \texttt{enum nexp 0 inc} *)
+ | Typ_lib_enum2 of nexp * nexp (* sugar for \texttt{enum (nexp'-nexp+1) nexp inc} or \texttt{enum (nexp-nexp'+1) nexp' dec} *)
+ | Typ_lib_vector of nexp * nexp * order * typ (* vector of typ, indexed by natural range *)
+ | Typ_lib_vector2 of typ * nexp (* sugar for vector indexed by [ nexp ] *)
+ | Typ_lib_vector3 of typ * nexp * nexp (* sugar for vector indexed by [ nexp..nexp ] *)
+ | Typ_lib_list of typ (* list of typ *)
+ | Typ_lib_set of typ (* finite set of typ *)
+ | Typ_lib_reg of typ (* mutable register components holding typ *)
+
+
+type ctor_def_aux = (* Datatype constructor definition clause *)
+ | CT_ct of id * typschm
+
+
+type def =
+ | DEF_aux of def_aux * annot
+
+
+type typ_lib =
+ | Typ_lib_aux of typ_lib_aux * l
+
+
+type ctor_def =
+ | CT_aux of ctor_def_aux * annot
+
+
+type defs = (* Definition sequence *)
+ | Defs of list def
+
+(** definitions *)
+ (* defns translate_ast *)
+indreln
+
+(** definitions *)
+ (* defns check_t *)
+indreln
+(* defn check_t *)
+
+check_t_var: forall E_k id .
+( Pmap.find id E_k = Ki_typ )
+ ==>
+check_t E_k (T_var id)
+
+and
+check_t_varInfer: forall E_k id .
+( Pmap.find id E_k = Ki_infer ) &&
+((Formula_update_k E_k id Ki_typ))
+ ==>
+check_t E_k (T_var id)
+
+and
+check_t_fn: forall E_k t1 t2 effects .
+(check_t E_k t1) &&
+(check_t E_k t2) &&
+(check_ef E_k effects)
+ ==>
+check_t E_k (T_fn t1 t2 effects)
+
+and
+check_t_tup: forall t_list E_k .
+((List.for_all (fun b -> b) ((List.map (fun t_ -> check_t E_k t_) t_list))))
+ ==>
+check_t E_k (T_tup (t_list))
+
+and
+check_t_app: forall t_arg_k_list E_k id .
+( Pmap.find id E_k = (Ki_ctor ((List.map (fun (t_arg_,k_) -> k_) t_arg_k_list)) Ki_typ) ) &&
+((List.for_all (fun b -> b) ((List.map (fun (t_arg_,k_) -> check_targs E_k k_ t_arg_) t_arg_k_list))))
+ ==>
+check_t E_k (T_app id (T_args ((List.map (fun (t_arg_,k_) -> t_arg_) t_arg_k_list))))
+
+
+and
+(* defn check_ef *)
+
+check_ef_var: forall E_k id .
+( Pmap.find id E_k = Ki_efct )
+ ==>
+check_ef E_k (Effects_aux (Effects_var id) Unknown )
+
+and
+check_ef_varInfer: forall E_k id .
+( Pmap.find id E_k = Ki_infer ) &&
+((Formula_update_k E_k id Ki_efct))
+ ==>
+check_ef E_k (Effects_aux (Effects_var id) Unknown )
+
+and
+check_ef_set: forall efct_list E_k .
+true
+ ==>
+check_ef E_k (Effects_aux (Effects_set (efct_list)) Unknown )
+
+
+and
+(* defn check_n *)
+
+check_n_var: forall E_k id .
+( Pmap.find id E_k = Ki_nat )
+ ==>
+check_n E_k (Ne_var id)
+
+and
+check_n_varInfer: forall E_k id .
+( Pmap.find id E_k = Ki_infer ) &&
+((Formula_update_k E_k id Ki_nat))
+ ==>
+check_n E_k (Ne_var id)
+
+and
+check_n_num: forall E_k num .
+true
+ ==>
+check_n E_k (Ne_const num)
+
+and
+check_n_sum: forall E_k ne1 ne2 .
+(check_n E_k ne1) &&
+(check_n E_k ne2)
+ ==>
+check_n E_k (Ne_add ne1 ne2)
+
+and
+check_n_mult: forall E_k ne1 ne2 .
+(check_n E_k ne1) &&
+(check_n E_k ne2)
+ ==>
+check_n E_k (Ne_mult ne1 ne2)
+
+and
+check_n_exp: forall E_k ne .
+(check_n E_k ne)
+ ==>
+check_n E_k (Ne_exp ne)
+
+
+and
+(* defn check_ord *)
+
+check_ord_var: forall E_k id .
+( Pmap.find id E_k = Ki_ord )
+ ==>
+check_ord E_k (Ord_aux (Ord_id id) Unknown )
+
+and
+check_ord_varInfer: forall E_k id .
+( Pmap.find id E_k = Ki_infer ) &&
+((Formula_update_k E_k id Ki_ord))
+ ==>
+check_ord E_k (Ord_aux (Ord_id id) Unknown )
+
+
+and
+(* defn check_targs *)
+
+check_targs_typ: forall E_k t .
+(check_t E_k t)
+ ==>
+check_targs E_k Ki_typ (Typ t)
+
+and
+check_targs_eff: forall E_k effects .
+(check_ef E_k effects)
+ ==>
+check_targs E_k Ki_efct (Effect effects)
+
+and
+check_targs_nat: forall E_k ne .
+(check_n E_k ne)
+ ==>
+check_targs E_k Ki_nat (Nexp ne)
+
+and
+check_targs_ord: forall E_k order .
+(check_ord E_k order)
+ ==>
+check_targs E_k Ki_ord (Order order)
+
+
+(** definitions *)
+ (* defns convert_typ *)
+indreln
+(* defn convert_typ *)
+
+convert_typ_var: forall E_k id .
+( Pmap.find id E_k = Ki_typ )
+ ==>
+convert_typ E_k (Typ_aux (Typ_var id) Unknown ) (T_var id)
+
+and
+convert_typ_fn: forall E_k typ1 typ2 effects t1 t2 .
+(convert_typ E_k typ1 t1) &&
+(convert_typ E_k typ2 t2) &&
+(check_ef E_k effects)
+ ==>
+convert_typ E_k (Typ_aux (Typ_fn typ1 typ2 effects) Unknown ) (T_fn t1 t2 effects)
+
+and
+convert_typ_tup: forall typ_t_list E_k .
+((List.for_all (fun b -> b) ((List.map (fun (typ_,t_) -> convert_typ E_k typ_ t_) typ_t_list))))
+ ==>
+convert_typ E_k (Typ_aux (Typ_tup ((List.map (fun (typ_,t_) -> typ_) typ_t_list))) Unknown ) (T_tup ((List.map (fun (typ_,t_) -> t_) typ_t_list)))
+
+and
+convert_typ_app: forall typ_arg_t_arg_k_list E_k id .
+( Pmap.find id E_k = (Ki_ctor ((List.map (fun (typ_arg_,t_arg_,k_) -> k_) typ_arg_t_arg_k_list)) Ki_typ) ) &&
+((List.for_all (fun b -> b) ((List.map (fun (typ_arg_,t_arg_,k_) -> convert_targ E_k k_ typ_arg_ t_arg_) typ_arg_t_arg_k_list))))
+ ==>
+convert_typ E_k (Typ_aux (Typ_app id ((List.map (fun (typ_arg_,t_arg_,k_) -> typ_arg_) typ_arg_t_arg_k_list))) Unknown ) (T_app id (T_args ((List.map (fun (typ_arg_,t_arg_,k_) -> t_arg_) typ_arg_t_arg_k_list))))
+
+and
+convert_typ_eq: forall E_k typ t2 t1 .
+(convert_typ E_k typ t1)
+ ==>
+convert_typ E_k typ t2
+
+
+and
+(* defn convert_targ *)
+
+
+(** definitions *)
+ (* defns check_lit *)
+indreln
+(* defn check_lit *)
+
+check_lit_true: forall .
+true
+ ==>
+check_lit (L_aux L_true Unknown ) (T_var (Id_aux bool_id Unknown ))
+
+and
+check_lit_false: forall .
+true
+ ==>
+check_lit (L_aux L_false Unknown ) (T_var (Id_aux bool_id Unknown ))
+
+and
+check_lit_num: forall num .
+true
+ ==>
+check_lit (L_aux (L_num num) Unknown ) (T_var (Id_aux nat_id Unknown ))
+
+and
+check_lit_string: forall string .
+true
+ ==>
+check_lit (L_aux (L_string string) Unknown ) (T_var (Id_aux string_id Unknown ))
+
+and
+check_lit_hex: forall hex zero num .
+( ( (Ne_const num) = (hlength hex ) ) )
+ ==>
+check_lit (L_aux (L_hex hex) Unknown ) (T_app (Id_aux vector_id Unknown ) (T_args ([((Nexp (Ne_const zero)))] @ [((Nexp (Ne_const num)))] @ [((Order (Ord_aux Ord_inc Unknown )))] @ [((Typ (T_var (Id_aux bit_id Unknown ))))])))
+
+and
+check_lit_bin: forall bin zero num .
+( ( (Ne_const num) = (blength bin ) ) )
+ ==>
+check_lit (L_aux (L_bin bin) Unknown ) (T_app (Id_aux vector_id Unknown ) (T_args ([((Nexp (Ne_const zero)))] @ [((Nexp (Ne_const num)))] @ [((Order (Ord_aux Ord_inc Unknown )))] @ [((Typ (T_var (Id_aux bit_id Unknown ))))])))
+
+and
+check_lit_unit: forall .
+true
+ ==>
+check_lit (L_aux L_unit Unknown ) (T_var (Id_aux unit_id Unknown ))
+
+and
+check_lit_bitzero: forall .
+true
+ ==>
+check_lit (L_aux L_zero Unknown ) (T_var (Id_aux bit_id Unknown ))
+
+and
+check_lit_bitone: forall .
+true
+ ==>
+check_lit (L_aux L_one Unknown ) (T_var (Id_aux bit_id Unknown ))
+
+
+(** definitions *)
+ (* defns check_pat *)
+indreln
+(* defn check_pat *)
+
+check_pat_wild: forall E_k t .
+(check_t E_k t)
+ ==>
+(PARSE_ERROR "line 1762 - 1763" "no parses (char 16): <E_t,E_k> |- _ :*** t gives {} ")
+
+and
+check_pat_as: forall E_t E_k pat t E_t1 id .
+(check_pat (Env E_k E_t ) pat t E_t1) &&
+( Pervasives.not (Pmap.mem id E_t1 ) )
+ ==>
+(PARSE_ERROR "line 1768 - 1769" "no parses (char 26): <E_t,E_k> |- (pat as id) :*** t gives E_t1 u+ {id|->t} ")
+
+and
+check_pat_typ: forall E_k typ t E_t pat E_t1 .
+(convert_typ E_k typ t) &&
+(check_pat (Env E_k E_t ) pat t E_t1)
+ ==>
+(PARSE_ERROR "line 1773 - 1774" "no parses (char 26): <E_t,E_k> |- (<typ> pat) :*** t gives E_t1 ")
+
+and
+check_pat_ident_constr: forall pat_t_E_t_list E_t E_k .
+((List.for_all (fun b -> b) ((List.map (fun (pat_,t_,E_t_) -> check_pat (Env E_k E_t ) pat_ t_ E_t_) pat_t_E_t_list))))
+ ==>
+(PARSE_ERROR "line 1779 - 1780" "no parses (char 36): <E_t,E_k> |- id pat1 .. patn : id t_***args gives E_t1 u+ .. u+ E_tn ")
+
+and
+check_pat_var: forall E_k t .
+(check_t E_k t)
+ ==>
+(PARSE_ERROR "line 1783 - 1784" "no parses (char 24): <E_t,E_k> |- :P_id: id :*** t gives E_t u+ {id|->t} ")
+
+and
+check_pat_tup: forall pat_t_E_t_list E_t E_k .
+((List.for_all (fun b -> b) ((List.map (fun (pat_,t_,E_t_) -> check_pat (Env E_k E_t ) pat_ t_ E_t_) pat_t_E_t_list)))) &&
+( disjoint_all (List.map Pmap.domain ((List.map (fun (pat_,t_,E_t_) -> E_t_) pat_t_E_t_list)) ) )
+ ==>
+(PARSE_ERROR "line 1809 - 1810" "no parses (char 33): <E_t,E_k> |- (pat1, ...., patn) :*** t1 * .... * tn gives E_t1 u+ .... u+ E_tn ")
+
+
+(** definitions *)
+ (* defns check_exp *)
+indreln
+
+
+
diff --git a/src/ast.ml b/src/ast.ml
index 79c7ea4f..fe990be3 100644
--- a/src/ast.ml
+++ b/src/ast.ml
@@ -109,12 +109,6 @@ quant_item =
type
-effects_aux = (* effect set, of kind $_$ *)
- Effects_var of id
- | Effects_set of (efct) list (* effect set *)
-
-
-type
order_aux = (* vector order specifications, of kind $_$ *)
Ord_id of id (* identifier *)
| Ord_inc (* increasing (little-endian) *)
@@ -122,19 +116,25 @@ order_aux = (* vector order specifications, of kind $_$ *)
type
+effects_aux = (* effect set, of kind $_$ *)
+ Effects_var of id
+ | Effects_set of (efct) list (* effect set *)
+
+
+type
typquant_aux = (* type quantifiers and constraints *)
TypQ_tq of (quant_item) list
| TypQ_no_forall (* sugar, omitting quantifier and constraints *)
type
-effects =
- Effects_aux of effects_aux * l
+order =
+ Ord_aux of order_aux * l
type
-order =
- Ord_aux of order_aux * l
+effects =
+ Effects_aux of effects_aux * l
type
@@ -281,6 +281,16 @@ and 'a letbind =
type
+ne = (* internal numeric expressions *)
+ Ne_var of id
+ | Ne_const of int
+ | Ne_mult of ne * ne
+ | Ne_add of ne * ne
+ | Ne_exp of ne
+ | Ne_unary of ne
+
+
+type
naming_scheme_opt_aux = (* Optional variable-naming-scheme specification for variables of defined type *)
Name_sect_none
| Name_sect_some of string
@@ -309,6 +319,28 @@ rec_opt_aux = (* Optional recursive annotation for functions *)
type
+k = (* Internal kinds *)
+ Ki_typ
+ | Ki_nat
+ | Ki_ord
+ | Ki_efct
+ | Ki_val (* Representing values, for use in identifier checks *)
+ | Ki_ctor of (k) list * k
+ | Ki_infer (* Representing an unknown kind, inferred by context *)
+
+
+type
+t_arg = (* Argument to type constructors *)
+ Typ of t
+ | Nexp of ne
+ | Effect of effects
+ | Order of order
+
+and t_args = (* Arguments to type constructors *)
+ T_args of (t_arg) list
+
+
+type
naming_scheme_opt =
Name_sect_aux of naming_scheme_opt_aux * l
@@ -344,27 +376,6 @@ rec_opt =
type
-ne = (* internal numeric expressions *)
- Ne_var of id
- | Ne_const of int
- | Ne_mult of ne * ne
- | Ne_add of ne * ne
- | Ne_exp of ne
- | Ne_unary of ne
-
-
-type
-k = (* Internal kinds *)
- Ki_typ
- | Ki_nat
- | Ki_ord
- | Ki_efct
- | Ki_val (* Representing values, for use in identifier checks *)
- | Ki_ctor of (k) list * k
- | Ki_infer (* Representing an unknown kind, inferred by context *)
-
-
-type
'a type_def_aux = (* Type definition body *)
TD_abbrev of id * naming_scheme_opt * typschm (* type abbreviation *)
| TD_record of id * naming_scheme_opt * typquant * ((typ * id)) list * bool (* struct type definition *)
@@ -390,17 +401,6 @@ type
type
-t_arg = (* Argument to type constructors *)
- Typ of t
- | Nexp of ne
- | Effect of effects
- | Order of order
-
-and t_args = (* Arguments to type constructors *)
- T_args of (t_arg) list
-
-
-type
'a type_def =
TD_aux of 'a type_def_aux * 'a annot
@@ -480,5 +480,8 @@ type
(** definitions *)
(** definitions *)
(** definitions *)
+(** definitions *)
+(** definitions *)
+(** definitions *)