let rec get_type_of_var_in_state (role_name : string) (state : string) (var : string) : string =
  let give var  state =
        let signature = get_role_signature role_name in
        let state_list = cdr(decompose ("x("^state^")")) in
        let rec aux l_state l_signature =
                if(l_state=[] || l_signature=[]) then ""
                else 
                if ((get_name_of_var (car l_state))=var) then (car l_signature)
                else (aux (cdr l_state)(cdr l_signature))
        in
        let res = ref (aux state_list signature) in 
        if((!res)=""
        then (let tmp=(get_role_signature var) in
              if(tmp<>[]) then res:=(car(get_role_signature var)));
        (!res)
  in
  let give_of_all_states_of_role var state =
          let rec aux l_automate =
                match l_automate with [] -> get_value_of_var role_name var
                                |((name,id,states,_)::ls) ->         if((get_name_in_session name id)=role_name)
                                                                then (
                                                                        let rec aux2 l_states =
                                                                                match l_states with [] -> aux ls
                                                                                                |((state0,_)::xs) ->         if(state0<>state)
                                                                                                                        then (        let res= give var state0
                                                                                                                                in 
                                                                                                                                if(res=""
                                                                                                                                then aux2 xs 
                                                                                                                                else res
                                                                                                                        )
                                                                                                                        else aux2 xs;
                                                                        in aux2 (!states)
                                                                )
                                                                else aux ls;
          in         let res= get_type var in
                if(res="")
                then (
                        let res2 = give var state in
                        if(res2="")
                        then aux (!automate)
                        else res2
                )
                else res;
  in
  let var_decompose = (decompose var) in
  if (var_decompose=[])
  then  (        give_of_all_states_of_role (get_name_of_var var) state )
  else 
  let rec print l = match l with [] -> ""
                            | [x] -> (get_type_of_var_in_state role_name state x)
                          | (x::xs) -> (get_type_of_var_in_state role_name state x)^","^(print xs);
  in
  (car var_decompose)^"("^(print (cdr var_decompose))^")"