let all_separated iter1 iter2 r1 r2 =
    try
      let w = ref F.p_true in
      iter1 
        (fun p r -> 
           iter2 
             (fun q r' ->
                let s = F.p_implies 
                  (A.equal p q)
                  (range_disjoint r r')
                in
                if F.is_false s then raise Trivial ;
                w := F.p_and !w s
             ) r2
        ) r1 ; !w
    with Trivial ->
      F.p_false