let doesnt_contain_0 {ints=l} = try let max = List.fold_left (fun old_u (l, u) -> if neg_borne l && pos_borne u then raise (Found Sig.No); if neg_borne_strict old_u && pos_borne_strict l then raise (Found (Sig.Yes (Ex.union (explain_borne old_u) (explain_borne l)))); u) Minfty l in if neg_borne_strict max then Sig.Yes (explain_borne max) else Sig.No with Found ans -> ans