types.mli 4.78 KB
Newer Older
1
2
open Ident

3
4
5
type const = | Integer of Intervals.v
	     | Atom of Atoms.v 
	     | Char of Chars.v
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

(** Algebra **)

type node
type descr

val make: unit -> node
val define: node -> descr -> unit

val cons: descr -> node
val internalize: node -> node

val id: node -> int
val descr: node -> descr

21
22
23
val equal_descr: descr -> descr -> bool
val hash_descr: descr -> int

24
module DescrHash: Hashtbl.S with type key = descr
25
26
27
28
module DescrMap: Map.S with type key = descr

(* Note: it seems that even for non-functional data, DescrMap
is more efficient than DescrHash ... *)
29

30
31
32
33
34
35
36
37
38
(** Boolean connectives **)

val cup    : descr -> descr -> descr
val cap    : descr -> descr -> descr
val diff   : descr -> descr -> descr
val neg    : descr -> descr
val empty  : descr
val any    : descr

39
40
val any_node : node

41
42
(** Constructors **)

43
44
type pair_kind = [ `Normal | `XML ]

45
val interval : Intervals.t -> descr
46
val atom     : Atoms.t -> descr
47
val times    : node -> node -> descr
48
val xml      : node -> node -> descr
49
val arrow    : node -> node -> descr
50
val record   : label -> node -> descr
51
val record'  : bool * node label_map -> descr
52
val char     : Chars.t -> descr
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
val constant : const -> descr

(** Positive systems and least solutions **)

module Positive :
sig
  type v
  val forward: unit -> v
  val define: v -> v -> unit
  val ty: descr -> v
  val cup: v list -> v
  val times: v -> v -> v

  val solve: v -> node
end

(** Normalization **)

module Product : sig
  val any : descr
73
74
75
  val any_xml : descr
  val other : ?kind:pair_kind -> descr -> descr
  val is_product : ?kind:pair_kind -> descr -> bool
76
77
78

  (* List of non-empty rectangles *)
  type t = (descr * descr) list
79
  val is_empty: t -> bool
80
  val get: ?kind:pair_kind -> descr -> t
81
82
  val pi1: t -> descr
  val pi2: t -> descr
83
  val pi2_restricted: descr -> t -> descr
84
85
86
87
88
89
90
    
  (* Intersection with (pi1,Any) *)
  val restrict_1: t -> descr -> t

  (* List of non-empty rectangles whose first projection
     are pair-wise disjunct *)
  type normal = t
91
  val normal: ?kind:pair_kind -> descr -> normal
92
93
94

  val need_second: t -> bool
    (* Is there more than a single rectangle ? *)
95
96
97
end

module Record : sig
98
99
100
101
102
103
104
105
106
107
108
109
110
  val any : descr
  val or_absent: descr -> descr
  val any_or_absent: descr

  val has_absent: descr -> bool
  val has_record: descr -> bool

  val split : descr -> label -> Product.t
  val split_normal : descr -> label -> Product.normal

  val project : descr -> label -> descr
    (* Raise Not_found if label is not necessarily present *)

111
112
113
114
115
116
  val condition : descr -> label -> descr -> descr
    (* condition t1 l t2 : What must follow if field l hash type t2 *)
  val project_opt : descr -> label -> descr
  val has_empty_record: descr -> bool


117
118
119
120
  val first_label: descr -> label

  val empty_cases: descr -> bool * bool

121
122
  val merge: descr -> descr -> descr
  val remove_field: descr -> label -> descr
123
124
end

125
126
module Arrow : sig
  val any : descr
127

128
129
130
131
132
133
134
135
  val check_strenghten: descr -> descr -> descr
    (* [check_strenghten t s]
       Assume that [t] is an intersection of arrow types
       representing the interface of an abstraction;
       check that this abstraction has type [s] (otherwise raise Not_found)
       and returns a refined type for this abstraction.
    *)

136
137
  val check_iface: (descr * descr) list -> descr -> bool

138
  type t
139
  val is_empty: t -> bool
140
141
  val get: descr -> t
    (* Always succeed; no check <= Arrow.any *)
142

143
144
145
  val domain: t -> descr
  val apply: t -> descr -> descr
    (* Always succeed; no check on the domain *)
146
147
148
149
150
151

  val need_arg : t -> bool
    (* True if the type of the argument is needed to obtain
       the type of the result (must use [apply]; otherwise,
       [apply_noarg] is enough *)
  val apply_noarg : t -> descr
152
153
154
end


155
module Int : sig
156
  val has_int : descr -> Intervals.v -> bool
157

158
159
160
161
162
163
164
  val any : descr

  val is_int : descr -> bool
  val get: descr -> Intervals.t
  val put: Intervals.t -> descr
end

165
module Atom : sig
166
  val has_atom : descr -> Atoms.v -> bool
167
168
end

169
module Char : sig
170
  val has_char : descr -> Chars.v -> bool
171
  val any : descr
172
173
end

174
val normalize : descr -> descr
175
176
177
178
179
180
181
182
183
184

(** Subtyping and sample values **)

val is_empty : descr -> bool
val non_empty: descr -> bool
val subtype  : descr -> descr -> bool

module Sample :
sig
  type t =
185
186
187
    | Int of Intervals.v
    | Atom of Atoms.v
    | Char of Chars.v
188
189
    | Pair of (t * t)
    | Xml of (t * t)
190
191
    | Record of (label * t) list
    | Fun of (node * node) list
192
    | Other
193
194
195
196
197
198

  val get : descr -> t
	(** 
	  Extract a sample value from a non empty type;
	  raise Not_found for an empty type
	**)
199
200

  val print : Format.formatter -> t -> unit
201
202
203
204
end

module Print :
sig
205
  val register_global : string -> descr -> unit
206
  val print_const : Format.formatter -> const -> unit
207
208
209
210
211
  val print : Format.formatter -> node -> unit
  val print_descr: Format.formatter -> descr -> unit
end

val check: descr -> unit
212
val print_stat: Format.formatter -> unit