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))^")"