let unification (u : Types_unify.term) (v : Types_unify.term)
(n1 : string) (n2 : string) (sub : Types_unify.t_subst) : (string * string * string * string) list * bool =
let rec sub_max l res =
match l with [] -> res
|(x::ls) -> if((List.length x)<=(List.length res)) then sub_max ls x
else sub_max ls res
in
let subs = unif true v u [sub] in
let size = string_of_int (List.length subs) in
let l_subs = lst_subs_dbg subs size in
((if(l_subs<>[])
then(
let f t =
let res = ref ("","") in
Hashtbl.iter
(fun a (v,term_atse) ->
if( (!res)=("","") && term_atse<>t && (unif true t term_atse [sub])<>[] )
then res:=a
)
automtat_to_unify_format;
!res
in
remove ("","","","") (
List.map
(fun (var,value) ->
let hvar = Hashtbl.find_all unify_format_to_automat (str_term_dbg [] var) in
let(name01,var_automat1) = if(hvar<>[]) then (car hvar) else (f var) in
let hvalue = Hashtbl.find_all unify_format_to_automat (str_term_dbg [] value) in
let(name02,var_automat2) = if(hvalue<>[]) then (car hvalue) else (f value) in
if((n2=name01 ) && not(is_a_test_var var_automat1) && (is_a_var var_automat1)) then(
let name2 = if (name02="_") then name01 else name02 in
let value_automat = if((is_a_var var_automat2) && not(is_a_refresh_var var_automat2)) then (get_value_of_var name01 var_automat2) else var_automat2 in
(name2,value_automat,name01,var_automat1)
)
else if((n2=name02) && not(is_a_test_var var_automat2) && (is_a_var var_automat2)) then(
let name1 = if (name01="_") then name02 else name01 in
let value_automat = if((is_a_var var_automat1) && not(is_a_refresh_var var_automat1)) then (get_value_of_var name02 var_automat1) else var_automat1 in
(name1,value_automat,name02,var_automat2)
)
else ("","","","")
)
(if (l_subs<>[]) then (sub_max (cdr l_subs) (car l_subs)) else [])
)
)
else []),(subs<>[]))