Files
lci/lib/miniFun/Types.mli

107 lines
3.5 KiB
OCaml
Raw Permalink Normal View History

type variable = string
2024-11-06 17:21:14 +01:00
val globalIdentifier : int ref
module VariableMap : Map.S with type key = variable
2024-10-27 15:37:10 +01:00
module VariableSet : Set.S with type elt = string
2024-10-26 20:22:13 +02:00
(* -------------------------------------------------------------------------- *)
(* 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
2025-02-02 20:46:55 +01:00
| 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
2025-02-02 20:46:55 +01:00
]
type polytypechecking_error = [
| typechecking_error
| `RecursionNotImplemented of string
]
type error = [
| base_error
| `DivisionByZero of string
]