let int_list_to_string s l = List.fold_left (fun s -> (fun v -> s ^ " " ^ (string_of_int v))) s l;; (* Given two paths, this function returns the longest common prefix and the two suffixes. *) let rec decompose_path : (int list * int list) -> (int list * int list * int list) = function (a::l,b::m) when a = b -> let (c,p1,p2) = decompose_path (l,m) in (a::c,p1,p2) | p1,p2 -> [], p1, p2;; let rec is_prefix p1 p2 = match p1,p2 with [], _ -> true | a::tl1, b::tl2 when a = b -> is_prefix tl1 tl2 | _ -> false;; let rec lex_smaller p1 p2 = match p1,p2 with [], _ -> true | a::tl1, b::tl2 when a < b -> true | a::tl1, b::tl2 when a = b -> lex_smaller tl1 tl2 | _ -> false;;