@@ -50,8 +50,13 @@ end = struct
50
50
compare v1.v_extra v2.v_extra
51
51
52
52
let to_string (v : version ) =
53
- Printf. sprintf " %d.%d.%d.%s"
54
- v.v_major v.v_minor v.v_subminor v.v_extra
53
+ let parts = [v.v_major; v.v_minor; v.v_subminor] in
54
+ let parts = List. map string_of_int parts in
55
+ let parts =
56
+ let extra = if String. is_empty v.v_extra then None else Some v.v_extra in
57
+ ofold (fun extra parts -> parts @ [extra]) parts extra in
58
+
59
+ String. concat " ." parts
55
60
end
56
61
57
62
module VP = Version
@@ -108,6 +113,7 @@ let evictions : prover_eviction_test list = [
108
113
type prover = {
109
114
pr_name : string ;
110
115
pr_version : Version .version ;
116
+ pr_alt : string ;
111
117
pr_evicted : (prover_eviction * bool ) option ;
112
118
}
113
119
@@ -156,6 +162,7 @@ end = struct
156
162
{ pr_prover =
157
163
{ pr_name = name;
158
164
pr_version = Version. parse version;
165
+ pr_alt = p.Whyconf. prover_altern;
159
166
pr_evicted = None ; };
160
167
pr_config = config;
161
168
pr_driver = driver; }
@@ -166,6 +173,15 @@ end = struct
166
173
(fun p c acc -> load_prover p c :: acc)
167
174
(Whyconf. get_provers config) [] in
168
175
176
+ let provers =
177
+ let key_of_prover (p : why3prover ) =
178
+ let p = p.pr_prover in
179
+ (p.pr_name, p.pr_version, p.pr_alt) in
180
+
181
+ List. sort
182
+ (fun p1 p2 -> compare (key_of_prover p1) (key_of_prover p2))
183
+ provers in
184
+
169
185
let provers =
170
186
List. map (fun prover ->
171
187
let prinfo = prover.pr_prover in
@@ -212,6 +228,7 @@ exception UnknownProver of string
212
228
213
229
type parsed_pname = {
214
230
prn_name : string ;
231
+ prn_alt : string ;
215
232
prn_version : Version .version option ;
216
233
prn_ovrevict : bool ;
217
234
}
@@ -228,19 +245,32 @@ let parse_prover_name name =
228
245
229
246
let version = omap Version. parse version in
230
247
231
- if name <> " " && name.[0 ] = '!'
232
- then { prn_name = String. sub name 1 (String. length name - 1 );
233
- prn_version = version;
234
- prn_ovrevict = true ; }
235
- else { prn_name = name;
236
- prn_version = version;
237
- prn_ovrevict = false ; }
248
+ let ovrevict, name =
249
+ if name <> " " && name.[0 ] = '!' then
250
+ true , String. sub name 1 (String. length name - 1 )
251
+ else false , name in
252
+
253
+ let name, alt =
254
+ let re = EcRegexp. regexp " ^(.*)\\ [(.*)\\ ]$" in
255
+ match EcRegexp. exec (`C re) name with
256
+ | None ->
257
+ name, " "
258
+ | Some m ->
259
+ let name = oget (EcRegexp.Match. group m 1 ) in
260
+ let alt = oget (EcRegexp.Match. group m 2 ) in
261
+ name, alt in
262
+
263
+ { prn_name = name;
264
+ prn_version = version;
265
+ prn_alt = alt;
266
+ prn_ovrevict = ovrevict; }
238
267
239
268
let get_prover (rawname : string ) =
240
269
let name = parse_prover_name rawname in
241
270
242
271
let test p =
243
272
p.pr_prover.pr_name = name.prn_name
273
+ && p.pr_prover.pr_alt = name.prn_alt
244
274
&& (name.prn_ovrevict || not (is_evicted p.pr_prover)) in
245
275
246
276
let provers = List. filter test (Config. provers () ) in
@@ -399,6 +429,7 @@ let run_prover
399
429
EcUtils. try_finally (fun () ->
400
430
try
401
431
let { pr_config = pr; pr_driver = dr; } = get_prover prover in
432
+
402
433
let pc =
403
434
let command = pr.Whyconf. command in
404
435
0 commit comments