-
Notifications
You must be signed in to change notification settings - Fork 0
/
fixConstraint.mli
132 lines (109 loc) · 5.36 KB
/
fixConstraint.mli
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
(*
* Copyright © 2009 The Regents of the University of California. All rights reserved.
*
* Permission is hereby granted, without written agreement and without
* license or royalty fees, to use, copy, modify, and distribute this
* software and its documentation for any purpose, provided that the
* above copyright notice and the following two paragraphs appear in
* all copies of this software.
*
* IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY
* FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
* ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
* IF THE UNIVERSITY OF CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY
* OF SUCH DAMAGE.
*
* THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
* AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
* ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION
* TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONAst.Symbol.
*
*)
(* This module implements basic datatypes and operations on constraints *)
type t (* NEVER EVER expose! *)
type wf (* NEVER EVER expose! *)
type dep (* NEVER EVER expose! dependencies between constraints *)
type tag = int list * string (* for ordering: must have same dim, lexico-ordered *)
type id = int (* for identifying: must be unique *)
type soln = Ast.Symbol.t -> Ast.pred list
type refa = Conc of Ast.pred | Kvar of Ast.Subst.t * Ast.Symbol.t
type reft = Ast.Symbol.t * Ast.Sort.t * refa list (* { VV: t | [ra] } *)
type envt = reft Ast.Symbol.SMap.t
val fresh_kvar : unit -> Ast.Symbol.t
val kvars_of_reft : reft -> (Ast.Subst.t * Ast.Symbol.t) list
val kvars_of_t : t -> (Ast.Subst.t * Ast.Symbol.t) list
val is_conc_refa : refa -> bool
val is_conc_rhs : t -> bool
val empty_solution : soln
val meet_solution : soln -> soln -> soln
val apply_solution : soln -> reft -> reft
val wellformed_pred : envt -> Ast.pred -> bool
val preds_of_refa : soln -> refa -> Ast.pred list
val preds_of_reft : soln -> reft -> Ast.pred list
val preds_of_lhs : soln -> t -> Ast.pred list
val vars_of_t : soln -> t -> Ast.Symbol.t list
val is_tauto : t -> bool
val preds_kvars_of_reft : reft -> (Ast.pred list * (Ast.Subst.t * Ast.Symbol.t) list)
val env_of_bindings : (Ast.Symbol.t * reft) list -> envt
(* TODO: Deprecate *)
val bindings_of_env : envt -> (Ast.Symbol.t * reft) list
val kbindings_of_lhs : t -> (Ast.Symbol.t * reft) list
val is_simple : t -> bool
val map_env : (Ast.Symbol.t -> reft -> reft) -> envt -> envt
val lookup_env : envt -> Ast.Symbol.t -> reft option
(* to print a constraint "c" do:
Format.printf "%a" (print_t None) c
to print an env "env" do:
Format.printf "%a" (print_env None) c
to print a wf constraint wf do:
Format.printf "%a" (print_wf None) wf
to convert a constraint c to a string do:
to_string c
to print a list of constraints cs do:
Format.printf "%a" (Misc.pprint_many true "\n" (C.print_t None)) cs
*)
val print_env : soln option -> Format.formatter -> envt -> unit
val print_wf : soln option -> Format.formatter -> wf -> unit
val print_t : soln option -> Format.formatter -> t -> unit
val print_ras : soln option -> Format.formatter -> refa list -> unit
val print_reft : soln option -> Format.formatter -> reft -> unit
val print_reft_pred : soln option -> Format.formatter -> reft -> unit
val print_binding : soln option -> Format.formatter -> (Ast.Symbol.t * reft) -> unit
val print_tag : Format.formatter -> tag -> unit
val print_dep : Format.formatter -> dep -> unit
val to_string : t -> string
val refa_to_string : refa -> string
val reft_to_string : reft -> string
val binding_to_string: (Ast.Symbol.t * reft) -> string
val make_reft : Ast.Symbol.t -> Ast.Sort.t -> refa list -> reft
val vv_of_reft : reft -> Ast.Symbol.t
val sort_of_reft : reft -> Ast.Sort.t
val ras_of_reft : reft -> refa list
val shape_of_reft : reft -> reft
val theta : Ast.Subst.t -> reft -> reft
val add_consts_wf : (Ast.Symbol.t * Ast.Sort.t) list -> wf -> wf
val add_consts_t : (Ast.Symbol.t * Ast.Sort.t) list -> t -> t
val make_t : envt -> Ast.pred -> reft -> reft -> id option -> tag -> t
val sort_of_t : t -> Ast.Sort.t
val vv_of_t : t -> Ast.Symbol.t
val senv_of_t : t -> Ast.Sort.t Ast.Symbol.SMap.t
val env_of_t : t -> envt
val grd_of_t : t -> Ast.pred
val lhs_of_t : t -> reft
val rhs_of_t : t -> reft
val id_of_t : t -> id
val ido_of_t : t -> id option
val tag_of_t : t -> tag
val add_ids : id -> t list -> id * t list
val add_wf_ids : wf list -> wf list
val make_wf : envt -> reft -> id option -> wf
val make_filtered_wf : envt -> reft -> id option -> (Qualifier.t -> bool) -> wf
val env_of_wf : wf -> envt
val reft_of_wf : wf -> reft
val id_of_wf : wf -> id
val filter_of_wf : wf -> (Qualifier.t -> bool)
val make_dep : bool -> tag option -> tag option -> dep
val matches_deps : dep list -> tag * tag -> bool
val tags_of_dep : dep -> tag * tag
val pol_of_dep : dep -> bool