package alt-ergo-lib
Source file util.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(******************************************************************************) (* *) (* Alt-Ergo: The SMT Solver For Software Verification *) (* Copyright (C) 2013-2018 --- OCamlPro SAS *) (* *) (* This file is distributed under the terms of the license indicated *) (* in the file 'License.OCamlPro'. If 'License.OCamlPro' is not *) (* present, please contact us to clarify licensing. *) (* *) (******************************************************************************) exception Timeout exception Unsolvable exception Cmp of int module MI = Map.Make(struct type t = int let compare (x: int) y = Stdlib.compare x y end) module SI = Set.Make(struct type t = int let compare (x: int) y = Stdlib.compare x y end) module SS = Set.Make(String) (** Different values for -case-split-policy option: -after-theory-assume (default value): after assuming facts in theory by the SAT -before-matching: just before performing a matching round -after-matching: just after performing a matching round **) type case_split_policy = | AfterTheoryAssume (* default *) | BeforeMatching | AfterMatching type inst_kind = Normal | Forward | Backward type sat_solver = | Tableaux | Tableaux_CDCL | CDCL | CDCL_Tableaux type theories_extensions = | Sum | Adt | Arrays | Records | Bitv | LIA | LRA | NRA | NIA | FPA type axiom_kind = Default | Propagator let th_ext_of_string ext = match ext with | "Sum" -> Some Sum | "Adt" -> Some Adt | "Arrays" -> Some Arrays | "Records" -> Some Records | "Bitv" -> Some Bitv | "LIA" -> Some LIA | "LRA" -> Some LRA | "NRA" -> Some NRA | "NIA" -> Some NIA | "FPA" -> Some FPA | _ -> None let string_of_th_ext ext = match ext with | Sum -> "Sum" | Adt -> "Adt" | Arrays -> "Arrays" | Records -> "Records" | Bitv -> "Bitv" | LIA -> "LIA" | LRA -> "LRA" | NRA -> "NRA" | NIA -> "NIA" | FPA -> "FPA" let [@inline always] compare_algebraic s1 s2 f_same_constrs_with_args = let r1 = Obj.repr s1 in let r2 = Obj.repr s2 in match Obj.is_int r1, Obj.is_int r2 with | true, true -> Stdlib.compare s1 s2 (* both constructors without args *) | true, false -> -1 | false, true -> 1 | false, false -> let = Obj.tag r1 - Obj.tag r2 in if cmp_tags <> 0 then cmp_tags else f_same_constrs_with_args (s1, s2) let [@inline always] cmp_lists l1 l2 cmp_elts = try List.iter2 (fun a b -> let c = cmp_elts a b in if c <> 0 then raise (Cmp c) )l1 l2; 0 with | Cmp n -> n | Invalid_argument _ -> List.length l1 - List.length l2 type matching_env = { nb_triggers : int; triggers_var : bool; no_ematching: bool; greedy : bool; use_cs : bool; backward : inst_kind } let loop ~(f : int -> 'a -> 'b -> 'b) ~(max : int) ~(elt : 'a) ~(init : 'b) : 'b = let rec loop_aux cpt acc = if cpt >= max then acc else loop_aux (cpt+1) (f cpt elt acc) in loop_aux 0 init let print_list ~sep ~pp fmt l = match l with [] -> () | e :: l -> Format.fprintf fmt "%a" pp e; List.iter (fun e -> Format.fprintf fmt "%s %a" sep pp e) l let rec print_list_pp ~sep ~pp fmt = function | [] -> () | [x] -> pp fmt x | x :: l -> Format.fprintf fmt "%a %a" pp x sep (); print_list_pp ~sep ~pp fmt l