@@ -64,7 +64,6 @@ module SparseVec = SparseVector (Rat)
6464module VarSet = Set. Make (String )
6565
6666let string_of_constraints (constraints : Invariant.t ) =
67- " CONSTRAINTS: " ^
6867 match constraints with
6968 | `Top -> " Top"
7069 | `Bot -> " Bot"
@@ -74,7 +73,7 @@ let exp_list_of_constraints (constraints : Invariant.t) =
7473 match constraints with
7574 | `Top -> []
7675 | `Bot -> failwith " Constraints are Bot"
77- | `Lifted constraints ->
76+ | `Lifted cs ->
7877 (* Split Eq into two Le's and mirror Ge into Le *)
7978 let to_leq acc = function
8079 | BinOp (Le, _ , _ , _ ) as e -> e :: acc
@@ -83,9 +82,11 @@ let exp_list_of_constraints (constraints : Invariant.t) =
8382 | BinOp (Ne, _ , _ , _ ) -> acc
8483 | _ -> failwith " Found something else, help me" in
8584 let cs =
86- constraints |> Invariant.Exp. process |> List. map Invariant.Exp. to_cil |> List. fold_left to_leq []
85+ cs |> Invariant.Exp. process |> List. map Invariant.Exp. to_cil |> List. fold_left to_leq []
8786 in
88- Printf. printf " Number of constraints after conversion to Leq list: %i\n " (List. length cs);
87+ if M. tracing then
88+ (M. trace " termination" " Constraints: %s" (string_of_constraints constraints);
89+ M. trace " termination" " Number of constraints after conversion to Leq list: %i" (List. length cs));
8990 cs
9091
9192let coeff_in_exp vname e =
@@ -137,7 +138,7 @@ let const_in_exp e =
137138 | None , Some c -> c)
138139 | _ -> failwith " This shouldn't happen"
139140
140- let rec transposed_matrices_of_exp_list (cs : exp list ) =
141+ let transposed_matrices_of_exp_list (cs : exp list ) =
141142 let rec vars_from_exp acc = function
142143 | BinOp (_ , e1 , e2 , _ ) -> VarSet. union (vars_from_exp acc e1) (vars_from_exp acc e2)
143144 | UnOp (_ , e , _ ) -> vars_from_exp acc e
@@ -168,9 +169,10 @@ let termination_provable a_transposed a'_transposed b =
168169 let l1_ri = Matrix. get_row a'_transposed i
169170 |> SparseVec. to_sparse_list
170171 |> List. map (fun (idx , v ) -> " x" ^ string_of_int idx, v)
171-
172172 in
173- l1_ri |> List. map (fun (var , value ) -> (Printf. sprintf " (%s * %s)" (Rat. to_string value) var)) |> String. concat " + " |> Printf. printf " l1_r%i: %s\n " i;
173+ if M. tracing then
174+ M. trace " termination" " l1_r%i = %s" i
175+ (l1_ri |> List. map (fun (var , value ) -> (Printf. sprintf " (%s * %s)" (Rat. to_string value) var)) |> String. concat " + " );
174176
175177 let sim = fst @@
176178 match l1_ri with
@@ -186,7 +188,7 @@ let termination_provable a_transposed a'_transposed b =
186188 in aux (i + 1 ) sim
187189 in aux 0 sim
188190 in
189- let rec ass_l1_minus_l2_atr_eq_zero sim =
191+ let ass_l1_minus_l2_atr_eq_zero sim =
190192 let rec aux i sim =
191193 if i > = Matrix. num_rows a_transposed then sim else
192194 let l1_m_l2_ri = Matrix. get_row a_transposed i
@@ -195,7 +197,9 @@ let termination_provable a_transposed a'_transposed b =
195197 map doesn't work here because we double the number of list elements *)
196198 |> List. fold_left (fun l (idx , v ) -> (" x" ^ string_of_int idx, v) :: (" y" ^ string_of_int idx, Rat. mul Rat. m_one v) :: l) []
197199 in
198- l1_m_l2_ri |> List. map (fun (var , value ) -> (Printf. sprintf " (%s * %s)" (Rat. to_string value) var)) |> String. concat " + " |> Printf. printf " l1_m_l2_r%i: %s\n " i;
200+ if M. tracing then
201+ M. trace " termination" " l1_m_l2_r%i = %s" i
202+ (l1_m_l2_ri |> List. map (fun (var , value ) -> (Printf. sprintf " (%s * %s)" (Rat. to_string value) var)) |> String. concat " + " );
199203
200204 let sim = fst @@
201205 match l1_m_l2_ri with
@@ -208,15 +212,17 @@ let termination_provable a_transposed a'_transposed b =
208212 in aux (i + 1 ) sim
209213 in aux 0 sim
210214 in
211- let rec ass_l2_atr_plus_a'tr_eq_zero sim =
215+ let ass_l2_atr_plus_a'tr_eq_zero sim =
212216 let m = Matrix. add a_transposed a'_transposed in
213217 let rec aux i sim =
214218 if i > = Matrix. num_rows m then sim else
215219 let l2_ri = Matrix. get_row m i
216220 |> SparseVec. to_sparse_list
217221 |> List. map (fun (idx , v ) -> " y" ^ string_of_int idx, v)
218222 in
219- l2_ri |> List. map (fun (var , value ) -> (Printf. sprintf " (%s * %s)" (Rat. to_string value) var)) |> String. concat " + " |> Printf. printf " l2_r%i: %s\n " i;
223+ if M. tracing then
224+ M. trace " termination" " l2_r%i = %s" i
225+ (l2_ri |> List. map (fun (var , value ) -> (Printf. sprintf " (%s * %s)" (Rat. to_string value) var)) |> String. concat " + " );
220226
221227 let sim = fst @@
222228 match l2_ri with
@@ -236,7 +242,9 @@ let termination_provable a_transposed a'_transposed b =
236242 |> SparseVec. to_sparse_list
237243 |> List. map (fun (i , v ) -> " y" ^ string_of_int i, v)
238244 in
239- l2_b |> List. map (fun (var , value ) -> (Printf. sprintf " (%s * %s)" (Rat. to_string value) var)) |> String. concat " + " |> Printf. printf " l2_b: %s\n " ;
245+ if M. tracing then
246+ M. trace " termination" " l2_b = %s"
247+ (l2_b |> List. map (fun (var , value ) -> (Printf. sprintf " (%s * %s)" (Rat. to_string value) var)) |> String. concat " + " );
240248
241249 fst @@
242250 match l2_b with
@@ -370,12 +378,11 @@ struct
370378 end
371379 | None ->
372380 (* failwith "Encountered a call to __goblint_bounded with an unknown loop counter variable."*)
373- Printf. printf " %s\n " (string_of_constraints (man.ask (Queries. Invariant Invariant. default_context)));
374381 let atr, a'tr, b = man.ask (Queries. Invariant Invariant. default_context) |> exp_list_of_constraints |> transposed_matrices_of_exp_list in
375- if Matrix. is_empty atr then Printf. printf " nothing to see here " else
376- let term_provable = termination_provable atr a'tr b in
377- Printf. printf " \n %s \n %s \n %s \n Termination%s provable \n " ( Matrix. show atr) ( Matrix. show a'tr) ( SparseVec. show b) ( if term_provable then " " else " not " );
378-
382+ let term_provable = termination_provable atr a'tr b in
383+ if term_provable then ( M. success ~category: Termination " Loop terminates " )
384+ else ( M. warn ~category: Termination " The program might not terminate! (Loop analysis) " )
385+
379386 end
380387 | "__goblint_bounded" , _ ->
381388 failwith " __goblint_bounded call unexpected arguments"
0 commit comments