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 subs = (unif_combi unif unif_xor) true u v [sub] in*)

        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
        (*prerr_string ("^(str_subs_dbg [] subs size)^");*)
        ((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<>[]))