term.mli 12.7 KB
Newer Older
Jean-Christophe Filliâtre's avatar
headers  
Jean-Christophe Filliâtre committed
1 2
(**************************************************************************)
(*                                                                        *)
3
(*  Copyright (C) 2010-2011                                               *)
MARCHE Claude's avatar
MARCHE Claude committed
4 5 6
(*    François Bobot                                                     *)
(*    Jean-Christophe Filliâtre                                          *)
(*    Claude Marché                                                      *)
Jean-Christophe Filliâtre's avatar
headers  
Jean-Christophe Filliâtre committed
7
(*    Andrei Paskevich                                                    *)
Jean-Christophe Filliâtre's avatar
headers  
Jean-Christophe Filliâtre committed
8 9 10 11 12 13 14 15 16 17 18
(*                                                                        *)
(*  This software is free software; you can redistribute it and/or        *)
(*  modify it under the terms of the GNU Library General Public           *)
(*  License version 2.1, with the special exception on linking            *)
(*  described in file LICENSE.                                            *)
(*                                                                        *)
(*  This software is distributed in the hope that it will be useful,      *)
(*  but WITHOUT ANY WARRANTY; without even the implied warranty of        *)
(*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.                  *)
(*                                                                        *)
(**************************************************************************)
19

François Bobot's avatar
François Bobot committed
20
open Stdlib
21
open Ident
22
open Ty
23

24 25
(** Terms and Formulas *)

Simon Cruanes's avatar
Simon Cruanes committed
26
(** {2 Variable symbols} *)
27 28

type vsymbol = private {
29
  vs_name : ident;
30
  vs_ty   : ty;
31 32
}

33
module Mvs : Map.S with type key = vsymbol
34
module Svs : Mvs.Set
35
module Hvs : Hashtbl.S with type key = vsymbol
36

37
val vs_equal : vsymbol -> vsymbol -> bool
Andrei Paskevich's avatar
Andrei Paskevich committed
38
val vs_hash : vsymbol -> int
39

40
val create_vsymbol : preid -> ty -> vsymbol
41

Simon Cruanes's avatar
Simon Cruanes committed
42
(** {2 Function and predicate symbols} *)
43

44 45 46
type lsymbol = private {
  ls_name   : ident;
  ls_args   : ty list;
47
  ls_value  : ty option;
48 49
}

50
module Mls : Map.S with type key = lsymbol
51
module Sls : Mls.Set
52
module Hls : Hashtbl.S with type key = lsymbol
53
module Wls : Hashweak.S with type key = lsymbol
54

55
val ls_equal : lsymbol -> lsymbol -> bool
Andrei Paskevich's avatar
Andrei Paskevich committed
56
val ls_hash : lsymbol -> int
57

58
val create_lsymbol : preid -> ty list -> ty option -> lsymbol
59 60 61
val create_fsymbol : preid -> ty list -> ty -> lsymbol
val create_psymbol : preid -> ty list -> lsymbol

62 63
val ls_ty_freevars : lsymbol -> Stv.t

Simon Cruanes's avatar
Simon Cruanes committed
64
(** {2 Exceptions} *)
65

66
exception EmptyCase
67
exception DuplicateVar of vsymbol
Andrei Paskevich's avatar
Andrei Paskevich committed
68
exception UncoveredVar of vsymbol
69
exception BadArity of lsymbol * int * int
70 71
exception FunctionSymbolExpected of lsymbol
exception PredicateSymbolExpected of lsymbol
72

Simon Cruanes's avatar
Simon Cruanes committed
73
(** {2 Patterns} *)
74 75 76

type pattern = private {
  pat_node : pattern_node;
Andrei Paskevich's avatar
Andrei Paskevich committed
77
  pat_vars : Svs.t;
78 79
  pat_ty   : ty;
  pat_tag  : int;
80 81 82 83 84
}

and pattern_node = private
  | Pwild
  | Pvar of vsymbol
85
  | Papp of lsymbol * pattern list
Andrei Paskevich's avatar
Andrei Paskevich committed
86
  | Por  of pattern * pattern
87
  | Pas  of pattern * vsymbol
88

89
val pat_equal : pattern -> pattern -> bool
Andrei Paskevich's avatar
Andrei Paskevich committed
90
val pat_hash : pattern -> int
91

MARCHE Claude's avatar
MARCHE Claude committed
92
(** Smart constructors for patterns *)
93 94 95

val pat_wild : ty -> pattern
val pat_var : vsymbol -> pattern
96
val pat_app : lsymbol -> pattern list -> ty -> pattern
Andrei Paskevich's avatar
Andrei Paskevich committed
97
val pat_or  : pattern -> pattern -> pattern
98 99
val pat_as  : pattern -> vsymbol -> pattern

MARCHE Claude's avatar
MARCHE Claude committed
100
(** Generic traversal functions *)
101

102 103
val pat_map : (pattern -> pattern) -> pattern -> pattern
val pat_fold : ('a -> pattern -> 'a) -> 'a -> pattern -> 'a
104 105
val pat_all : (pattern -> bool) -> pattern -> bool
val pat_any : (pattern -> bool) -> pattern -> bool
106

MARCHE Claude's avatar
MARCHE Claude committed
107
(** {2 Terms and Formulas} *)
Andrei Paskevich's avatar
minor  
Andrei Paskevich committed
108

109
type quant =
110 111
  | Tforall
  | Texists
112

113
type binop =
114 115 116 117
  | Tand
  | Tor
  | Timplies
  | Tiff
118

119
type real_constant =
Jean-Christophe Filliâtre's avatar
Jean-Christophe Filliâtre committed
120 121 122 123 124 125 126
  | RConstDecimal of string * string * string option (* int / frac / exp *)
  | RConstHexa of string * string * string

type constant =
  | ConstInt of string
  | ConstReal of real_constant

127
type term = private {
128
  t_node  : term_node;
129
  t_ty    : ty option;
Jean-Christophe Filliâtre's avatar
Jean-Christophe Filliâtre committed
130
  t_label : label list;
131
  t_loc   : Loc.position option;
132
  t_vars  : int Mvs.t;
133
  t_tag   : int;
134 135 136 137
}

and term_node = private
  | Tvar of vsymbol
Jean-Christophe Filliâtre's avatar
Jean-Christophe Filliâtre committed
138
  | Tconst of constant
139
  | Tapp of lsymbol * term list
140
  | Tif of term * term * term
141
  | Tlet of term * term_bound
Andrei Paskevich's avatar
Andrei Paskevich committed
142
  | Tcase of term * term_branch list
143 144 145 146 147 148 149
  | Teps of term_bound
  | Tquant of quant * term_quant
  | Tbinop of binop * term * term
  | Tnot of term
  | Ttrue
  | Tfalse

150
and term_bound
151
and term_branch
152
and term_quant
153

154
and trigger = term list list
155

Andrei Paskevich's avatar
Andrei Paskevich committed
156
module Mterm : Map.S with type key = term
157
module Sterm : Mterm.Set
Andrei Paskevich's avatar
Andrei Paskevich committed
158 159
module Hterm : Hashtbl.S with type key = term

160
val t_equal : term -> term -> bool
161
val t_hash : term -> int
162

163
(** Bindings *)
164

165 166 167 168
(** close bindings *)

val t_close_bound : vsymbol -> term -> term_bound
val t_close_branch : pattern -> term -> term_branch
169
val t_close_quant : vsymbol list -> trigger -> term -> term_quant
170 171 172 173 174

(** open bindings *)

val t_open_bound : term_bound -> vsymbol * term
val t_open_branch : term_branch -> pattern * term
175
val t_open_quant : term_quant -> vsymbol list * trigger * term
176 177 178 179 180 181 182 183 184

(** open bindings with optimized closing callbacks *)

val t_open_bound_cb :
  term_bound -> vsymbol * term * (vsymbol -> term -> term_bound)

val t_open_branch_cb :
  term_branch -> pattern * term * (pattern -> term -> term_branch)

185 186 187
val t_open_quant_cb :
  term_quant -> vsymbol list * trigger * term *
              (vsymbol list -> trigger -> term -> term_quant)
188

189
(** Type checking *)
190 191 192 193 194

exception TermExpected of term
exception FmlaExpected of term

val t_type : term -> ty
195 196
(** [t_type t] checks that [t] is value-typed and returns its type *)

197
val t_prop : term -> term
198 199 200 201 202
(** [t_prop t] checks that [t] is prop-typed and returns [t] *)

val t_ty_check : term -> ty option -> unit
(** [t_ty_check t ty] checks that the type of [t] is [ty] *)

203 204
(** Smart constructors for terms and formulas *)

205 206
val t_app  : lsymbol -> term list -> ty option -> term
val fs_app : lsymbol -> term list -> ty -> term
207
val ps_app : lsymbol -> term list -> term
208 209

val t_app_infer : lsymbol -> term list -> term
210 211
val ls_arg_inst : lsymbol -> term list -> ty Mtv.t
val ls_app_inst : lsymbol -> term list -> ty option -> ty Mtv.t
212

213
val t_var : vsymbol -> term
214
val t_const : constant -> term
215 216
val t_int_const : string -> term
val t_real_const : real_constant -> term
217
val t_if : term -> term -> term -> term
218 219
val t_let : term -> term_bound -> term
val t_case : term -> term_branch list -> term
220 221 222 223 224 225 226 227 228 229 230 231
val t_eps : term_bound -> term
val t_quant : quant -> term_quant -> term
val t_forall : term_quant -> term
val t_exists : term_quant -> term
val t_binary : binop -> term -> term -> term
val t_and : term -> term -> term
val t_or : term -> term -> term
val t_implies : term -> term -> term
val t_iff : term -> term -> term
val t_not : term -> term
val t_true : term
val t_false : term
232

233
val t_let_close : vsymbol -> term -> term -> term
234 235 236 237
val t_eps_close : vsymbol -> term -> term
val t_quant_close : quant -> vsymbol list -> trigger -> term -> term
val t_forall_close : vsymbol list -> trigger -> term -> term
val t_exists_close : vsymbol list -> trigger -> term -> term
238

239 240 241
val t_label : ?loc:Loc.position -> label list -> term -> term
val t_label_add : label -> term -> term
val t_label_copy : term -> term -> term
242

MARCHE Claude's avatar
MARCHE Claude committed
243
(** Constructors with propositional simplification *)
244

245
val t_if_simp : term -> term -> term -> term
246
val t_let_simp : term -> term_bound -> term
247 248 249 250 251 252 253 254 255 256 257
val t_quant_simp : quant -> term_quant -> term
val t_forall_simp : term_quant -> term
val t_exists_simp : term_quant -> term
val t_binary_simp : binop -> term -> term -> term
val t_and_simp : term -> term -> term
val t_and_simp_l : term list -> term
val t_or_simp : term -> term -> term
val t_or_simp_l : term list -> term
val t_implies_simp : term -> term -> term
val t_iff_simp : term -> term -> term
val t_not_simp : term -> term
258

259
val t_let_close_simp : vsymbol -> term -> term -> term
260 261 262
val t_quant_close_simp : quant -> vsymbol list -> trigger -> term -> term
val t_forall_close_simp : vsymbol list -> trigger -> term -> term
val t_exists_close_simp : vsymbol list -> trigger -> term -> term
263

264
val t_forall_close_merge : vsymbol list -> term -> term
265 266 267
(** [forall_close_merge vs f] puts a universal quantifier over [f];
    merges variable lists if [f] is already universally quantified;
    reuses triggers of [f], if any, otherwise puts no triggers. *)
268

269
(** Built-in symbols *)
270

271
val ps_equ : lsymbol  (* equality predicate *)
272

273 274
val t_equ : term -> term -> term
val t_neq : term -> term -> term
275

276 277
val t_equ_simp : term -> term -> term
val t_neq_simp : term -> term -> term
278

279 280
val fs_tuple : int -> lsymbol   (* n-tuple *)
val t_tuple : term list -> term
Andrei Paskevich's avatar
Andrei Paskevich committed
281

282
val is_fs_tuple : lsymbol -> bool
Andrei Paskevich's avatar
Andrei Paskevich committed
283

284 285
val fs_func_app : lsymbol  (* value-typed higher-order application *)
val ps_pred_app : lsymbol  (* prop-typed higher-order application *)
286

287
val t_func_app : term -> term -> term
288
val t_pred_app : term -> term -> term
289

290
val t_func_app_l : term -> term list -> term
291
val t_pred_app_l : term -> term list -> term
292

293
(** {2 Term library} *)
294

295
(** One-level (non-recursive) term traversal *)
296

297 298 299
val t_map : (term -> term) -> term -> term
val t_fold : ('a -> term -> 'a) -> 'a -> term -> 'a
val t_map_fold : ('a -> term -> 'a * term) -> 'a -> term -> 'a * term
300

301 302
val t_all : (term -> bool) -> term -> bool
val t_any : (term -> bool) -> term -> bool
303

304
(** Special maps *)
305

306 307
val t_map_simp : (term -> term) -> term -> term
(** [t_map_simp] reconstructs the term using simplification constructors *)
308

309 310
val t_map_sign : (bool -> term -> term) -> bool -> term -> term
(** [t_map_sign] passes a polarity parameter, unfolds if-then-else and iff *)
311

312 313
val t_map_cont : ((term -> 'a) -> term -> 'a) -> (term -> 'a) -> term -> 'a
(** [t_map_cont] is [t_map] in continuation-passing style *)
314

315
val list_map_cont: (('a -> 'b) -> 'c -> 'b) -> ('a list -> 'b) -> 'c list -> 'b
316

317
(** Trigger traversal *)
318

319 320 321 322
val tr_equal : trigger -> trigger -> bool
val tr_map : (term -> term) -> trigger -> trigger
val tr_fold : ('a -> term -> 'a) -> 'a -> trigger -> 'a
val tr_map_fold : ('a -> term -> 'a * term) -> 'a -> trigger -> 'a * trigger
323

324
(** Traversal with separate functions for value-typed and prop-typed terms *)
325

326
module TermTF : sig
327

328 329 330 331 332 333 334
  val t_select : (term -> 'a) -> (term -> 'a) -> term -> 'a
  (** [t_select fnT fnF t] is [fnT t] if [t] is a value, [fnF t] otherwise *)

  val t_selecti : ('a -> term -> 'b) -> ('a -> term -> 'b) -> 'a -> term -> 'b
  (** [t_selecti fnT fnF acc t] is [t_select (fnT acc) (fnF acc) t] *)

  val t_map : (term -> term) -> (term -> term) -> term -> term
335
  (** [t_map fnT fnF = t_map (t_select fnT fnF)] *)
336 337

  val t_fold : ('a -> term -> 'a) -> ('a -> term -> 'a) -> 'a -> term -> 'a
338
  (** [t_fold fnT fnF = t_fold (t_selecti fnT fnF)] *)
Jean-Christophe Filliâtre's avatar
Jean-Christophe Filliâtre committed
339 340

  val t_map_fold : ('a -> term -> 'a * term) ->
341 342 343 344 345 346 347
    ('a -> term -> 'a * term) -> 'a -> term -> 'a * term

  val t_all : (term -> bool) -> (term -> bool) -> term -> bool
  val t_any : (term -> bool) -> (term -> bool) -> term -> bool

  val t_map_simp : (term -> term) -> (term -> term) -> term -> term

Jean-Christophe Filliâtre's avatar
Jean-Christophe Filliâtre committed
348
  val t_map_sign : (bool -> term -> term) ->
349 350
    (bool -> term -> term) -> bool -> term -> term

Jean-Christophe Filliâtre's avatar
Jean-Christophe Filliâtre committed
351
  val t_map_cont : ((term -> 'a) -> term -> 'a) ->
352 353 354 355 356
    ((term -> 'a) -> term -> 'a) -> (term -> 'a) -> term -> 'a

  val tr_map : (term -> term) -> (term -> term) -> trigger -> trigger

  val tr_fold : ('a -> term -> 'a) -> ('a -> term -> 'a) -> 'a -> trigger -> 'a
Jean-Christophe Filliâtre's avatar
Jean-Christophe Filliâtre committed
357 358

  val tr_map_fold : ('a -> term -> 'a * term) ->
359
    ('a -> term -> 'a * term) -> 'a -> trigger -> 'a * trigger
360
end
361

362
(** Map/fold over free variables *)
363 364 365 366 367 368

val t_v_map : (vsymbol -> term) -> term -> term
val t_v_fold : ('a -> vsymbol -> 'a) -> 'a -> term -> 'a
val t_v_all : (vsymbol -> bool) -> term -> bool
val t_v_any : (vsymbol -> bool) -> term -> bool

369
(** Variable substitution *)
370 371 372 373

val t_subst : term Mvs.t -> term -> term
val t_subst_single : vsymbol -> term -> term -> term

374 375
val t_ty_subst : ty Mtv.t -> term Mvs.t -> term -> term

376
(** Find free variables and type variables *)
377

378
val t_freevars    : int Mvs.t -> term -> int Mvs.t
379
val t_ty_freevars : Stv.t -> term -> Stv.t
380

381
(** Map/fold over types and logical symbols in terms and patterns *)
382

383 384 385 386 387 388
val t_s_map : (ty -> ty) -> (lsymbol -> lsymbol) -> term -> term
val t_s_fold : ('a -> ty -> 'a) -> ('a -> lsymbol -> 'a) -> 'a -> term -> 'a

val t_s_all : (ty -> bool) -> (lsymbol -> bool) -> term -> bool
val t_s_any : (ty -> bool) -> (lsymbol -> bool) -> term -> bool

389
val t_ty_map : (ty -> ty) -> term -> term
390 391
val t_ty_fold : ('a -> ty -> 'a) -> 'a -> term -> 'a

392 393 394 395
(* Map/fold over applications in terms (but not in patterns!) *)

val t_app_map :
  (lsymbol -> ty list -> ty option -> lsymbol) -> term -> term
396

397 398 399 400
val t_app_fold :
  ('a -> lsymbol -> ty list -> ty option -> 'a) -> 'a -> term -> 'a

(** Equality modulo alpha *)
401 402

val t_equal_alpha : term -> term -> bool
Andrei Paskevich's avatar
minor  
Andrei Paskevich committed
403

404
module Hterm_alpha : Hashtbl.S with type key = term
405

406
(** Subterm occurrence check and replacement *)
407

408 409
val t_occurs : term -> term -> bool
val t_occurs_alpha : term -> term -> bool
410

411 412
val t_replace : term -> term -> term -> term
val t_replace_alpha : term -> term -> term -> term
413

414
(** Binder-free term matching *)
415

416 417 418
exception NoMatch

val t_match : term Mvs.t -> term -> term -> term Mvs.t
419