type variable = string val globalIdentifier : int ref module VariableMap : Map.S with type key = variable module VariableSet : Set.S with type elt = string (* -------------------------------------------------------------------------- *) (* polimporphic type checking types *) (* -------------------------------------------------------------------------- *) type id = int type level = int type type_f = IntegerTypeP | BooleanTypeP | TupleTypeP of type_f * type_f | VariableTypeP of variable_type ref | FunctionTypeP of type_f * type_f | ApplicationP of type_f * type_f and variable_type = Unbound of id * level | Link of type_f | Generic of id type env = type_f VariableMap.t module IntegerMap : Map.S with type key = int val pp_type_f : type_f -> string (* -------------------------------------------------------------------------- *) type ftype = (* type used for specification *) IntegerType | BooleanType | UnknownType | TupleType of ftype * ftype | FunctionType of ftype * ftype type t_exp = Integer of int (* x := a *) | Boolean of bool (* v *) | Variable of variable (* x *) | Tuple of t_exp * t_exp (* (a, b) *) | Function of variable * ftype * t_exp (* lambda x: t. x *) | Application of t_exp * t_exp (* x x *) | Plus of t_exp * t_exp (* x + x *) | Minus of t_exp * t_exp (* x - x *) | Times of t_exp * t_exp (* x * x *) | Division of t_exp * t_exp (* x / x *) | Modulo of t_exp * t_exp (* x % x *) | Power of t_exp * t_exp (* x ^ x *) | PowerMod of t_exp * t_exp * t_exp (* (x ^ x) % x *) | Rand of t_exp (* rand(0, x) *) | BAnd of t_exp * t_exp (* x && x *) | BOr of t_exp * t_exp (* x || x *) | BNot of t_exp (* not x *) | First of t_exp (* fst x *) | Second of t_exp (* scn x *) | Cmp of t_exp * t_exp (* x == x *) | CmpLess of t_exp * t_exp (* x < x *) | CmpLessEq of t_exp * t_exp (* x <= x *) | CmpGreater of t_exp * t_exp (* x > x *) | CmpGreaterEq of t_exp * t_exp (* x >= x *) | IfThenElse of t_exp * t_exp * t_exp (* if b then c else c *) | LetIn of variable * t_exp * t_exp (* let x = x in x *) | LetFun of variable * variable * ftype * t_exp * t_exp (* let rec x. y: t. x in x*) type permitted_values = IntegerPermitted of int | BooleanPermitted of bool | TuplePermitted of permitted_values * permitted_values | FunctionPermitted of closure and closure = { input: variable; body: t_exp; assignments: permitted_values VariableMap.t; recursiveness: variable option } type memory = { assignments: permitted_values VariableMap.t } type base_error = [ `AbsentAssignment of string | `WrongType of string ] type typechecking_error = [ | base_error | `WrongTypeSpecification of string ] type polytypechecking_error = [ | typechecking_error | `RecursionNotImplemented of string ] type error = [ | base_error | `DivisionByZero of string ]