package dolmen

  1. Overview
  2. Docs
Legend:
Page
Library
Module
Module type
Parameter
Class
Class type
Source

Source file ty.ml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437

(* This file is free software, part of dolmen. See file "LICENSE" for more information *)

(** Interfaces for Types
    This module defines Interfaces that implementation of types must
    respect in order to be used to instantiate functors. *)


(** {2 Signature for Typecheked types} *)

(** Signature required by types for typing first-order
    polymorphic terms. *)
module type Tff = sig

  type t
  (** The type of types. *)

  type def
  (** The type of type definitions *)

  type path
  (** The type of paths to constants. *)

  type 'a tag
  (** A type for tags to attach to arbitrary types. *)

  val print : Format.formatter -> t -> unit
  (** Printing function. *)

  exception Prenex_polymorphism of t
  (** Raised when the type provided is polymorphic, but occurred in a
      place where polymorphic types are forbidden by prenex/rank-1
      polymorphism. *)

  (** A module for variables that occur in types. *)
  module Var : sig

    type t
    (** The type of variables the can occur in types *)

    val compare : t -> t -> int
    (** Comparison function on variables. *)

    val print : Format.formatter -> t -> unit
    (** Printing function. *)

    val mk : string -> t
    (** Create a new type variable with the given name. *)

    val wildcard : unit -> t
    (** Create a fresh type wildcard. *)

    val is_wildcard : t -> bool
    (** Is the variable a type wildcard ? *)

    val set_tag : t -> 'a tag -> 'a -> unit
    (** Set the value bound to a tag. *)

    val get_tag : t -> 'a tag -> 'a option
    (** Return the value bound to a tag (if any). *)

    val add_tag : t -> 'a list tag -> 'a -> unit
    (** Add a value to the list of values bound to a tag. *)

    val get_tag_list : t -> 'a list tag -> 'a list
    (** Returns all the values tagged on a variable. *)

    val unset_tag : t -> _ tag -> unit
    (** Remove the binding to a tag. *)

  end

  (** A module for constant symbols the occur in types. *)
  module Const : sig

    type t
    (** The type of constant symbols the can occur in types *)

    val compare : t -> t -> int
    (** Comparison function on type constants. *)

    val print : Format.formatter -> t -> unit
    (** Printing function. *)

    val arity : t -> int
    (** Return the arity of the given symbol. *)

    val mk : path -> int -> t
    (** Create a type constant with the given arity. *)

    val set_tag : t -> 'a tag -> 'a -> unit
    (** Set the value bound to a tag. *)

    val add_tag : t -> 'a list tag -> 'a -> unit
    (** Add a value to the list of values bound to a tag. *)

  end

  val equal : t -> t -> bool
  (** Test equality of types. *)

  val prop : t
  (** The type of propositions *)

  val of_var : Var.t -> t
  (** Create a type from a variable. *)

  val apply : Const.t -> t list -> t
  (** Application for types. *)

  val arrow : t list -> t -> t
  (** Create an arrow type. *)

  val pi : Var.t list -> t -> t
  (** Create a polymorphic type. *)

  val fv : t -> Var.t list
  (** Returns the list of free_variables in the type. *)

  val set_wildcard : Var.t -> t -> unit
  (** Set a wildcard. *)

  val add_wildcard_hook : hook:(Var.t -> t -> unit) -> Var.t -> unit
  (** Add a hook to a wildcard, the hook will be run *)

  val set_tag : t -> 'a tag -> 'a -> unit
  (** Annotate the given type with the given tag and value. *)

  val add_tag : t -> 'a list tag -> 'a -> unit
  (** Add a value to the list of values bound to a tag. *)

  type view = private [>
    | `Wildcard of Var.t
    | `Arrow of t list * t
    | `Pi of Var.t list * t
  ]
  (** Partial views for types. *)

  val view : t -> view
  (** Partial view of a type. *)

  val freshen : t -> t
  (** Replaces all bound variables in a type, ensuring that the returned type
      contains only fresh bound type variables. *)

  val instance_of : t -> t -> t list option
  (** [instance_of poly t] decides whether [t] is an instance of [poly],
      that is whether there are some types [l] such that a term of
      type [poly] applied to type arguments [l] gives a term of type
      [t]. *)

end

module type Thf = sig

  include Tff

  val arrow : t list -> t -> t
  (** Create a function type. *)

  val pi : Var.t list -> t -> t
  (** Create a rank-1/prenex polymorphc type. *)

end

(** Signature required by types for typing ae *)
module type Ae_Base = sig

  type t
  (** The type of types. *)

  val bool : t
  (** The type of booleans *)

  val unit : t
  (** Unit type *)

  val int : t
  (** The type of integers *)

  val real : t
  (** The type of reals *)

end

(** Signature required by types for typing ae's arithmetic *)
module type Ae_Arith = sig

  type t
  (** The type of types *)

  val int : t
  (** The type of integers *)

  val real : t
  (** The type of reals *)

  type view = private [>
    | `Int
    | `Real
  ]
  (** Partial view for types. *)

  val view : t -> view
  (** Partial view of a type. *)

end

(** Signature required by types for typing ae arrays *)
module type Ae_Array = sig

  type t
  (** The type of types *)

  val int : t
  (** The type of integers, used as a default type of indexes
      when no type is provided *)

  val array : t -> t -> t
  (** The type of functionnal arrays from one type to another. *)

end

(** Signature required by types for typing ae's bitvectors *)
module type Ae_Bitv = sig

  type t
  (** The type of types *)

  val bitv : int -> t
  (** Create a fixed size bitvector type. *)

end

(** Signature required by types for typing tptp *)
module type Tptp_Base = sig

    type t
    (** The type of types *)

    val prop : t
    (** The type of propositions. *)

    val base : t
    (** An arbitrary base type. *)

end

(** Signature required by types for typing tptp *)
module type Tptp_Arith = sig

    type t
    (** The type of types *)

    val int : t
    (** The type of integers *)

    val rat : t
    (** The type of rationals *)

    val real : t
    (** The type of reals *)

    val equal : t -> t -> bool
    (** Equality on types. *)

end



(** Signature required by types for typing smtlib core theory *)
module type Smtlib_Base = sig

  type t
  (** The type of type constants (i.e. type constructors) *)

  val prop : t
  (** The type constructor of propositions. *)

end

(** Signature required by types for typing smtlib integer arithmetic *)
module type Smtlib_Int = sig

  type t
  (** The type of types *)

  val int : t
  (** The type for integer expressions. *)

end

(** Signature required by types for typing smtlib real arithmetic *)
module type Smtlib_Real = sig

  type t
  (** The type of types *)

  val real : t
  (** The type for integer expressions. *)

end

(** Signature required by types for typing smtlib real_int arithmetic. *)
module type Smtlib_Real_Int = sig

  include Smtlib_Int
  include Smtlib_Real with type t := t

  type view = private [>
    | `Int
    | `Real
  ]
  (** Partial view for types. These are used by the Reals_Ints theory
      to perform type-based dispatch, and automatic conversion of Ints
      to Reals when specified by the specification. *)

  val view : t -> view
  (** Partial view of a type. *)

end

(** Signature required by types for typing smtlib arrays *)
module type Smtlib_Array = sig

  type t
  (** The type of types *)

  val array : t -> t -> t
  (** The type of functionnal arrays from one type to another. *)

  type view = private [>
    | `Int
    | `Real
    | `Bitv of int
    | `Array of t * t
  ]
  (** Partial views for types. These are used in the Array theory
      to enforce some restrictions logics impose on the types of
      arrays that cna occur. *)

  val view : t -> view
  (** Partial view of a type. *)

end

(** Signature required by types for typing smtlib bitvectors *)
module type Smtlib_Bitv = sig

  type t
  (** The type of types *)

  val bitv : int -> t
  (** Create a fixed size bitvector type. *)

  type view =  private [>
    | `Bitv of int
  ]
(** Partial views for types. These are used in the bitv theory
    to check invariant on indexes of bitv operations (e.g.
    check that the indexes of an extract do not go out of bounds). *)

  val view : t -> view
  (** Partial view of a type. *)

end

(** Signature required by types for typing smtlib bitvectors *)
module type Smtlib_Float = sig

  type t
  (** The type of types *)

  val bitv : int -> t
  (** Create a fixed size bitvector type. *)

  val float : int -> int -> t
  (** Create a float type with fixed exponent size in bits and fixed significand,
      including the hidden bit. *)

  val roundingMode: t
  (** Type of the rounding modes *)

  type view = private [>
    | `Real
    | `Bitv of int
    | `Float of int * int
  ]
  (** Partial views for types. These are used in the Float theory to
      perform type-base dispatch for some conversion functions. *)

  val view : t -> view
  (** Partial view of a type. *)

end

(* Signature required by types for typing the smtlib string theory *)
module type Smtlib_String = sig

  type t
  (** The type of types *)

  val int : t
  (** The type of ints *)

  val string : t
  (** The type of strings *)

  val string_reg_lang : t
  (** The type of regular languages over strings *)

end

(** Signature required by types for typing tptp *)
module type Zf_Base = sig

    type t
    (** The type of types *)

    val prop : t
    (** The type of propositions. *)

end

(** Signature required by types for typing tptp *)
module type Zf_Arith = sig

    type t
    (** The type of types *)

    val int : t
    (** The type of integers *)

end



OCaml

Innovation. Community. Security.