let fold_join_predicate fold f s =
  try
    match
     fold 
       (fun acc e ->
         match f e with
         | Unknown -> raise Stop
         | v -> match acc with
           | None -> Some v
           | Some acc -> Some (join_predicate acc v)
       )
       None
       s
    with
      | None -> True
      | Some v -> v
  with Stop -> Unknown