let rec get_value_of_var_at_step (name : string) (var : string) (step : int) : string =
   let var_aux = if (is_a_test_var var) then (get_name_of_test_var var) else var in
   let variable = (name,var_aux) in
   let all_value_of_variable = Hashtbl.find_all var_value variable in
   let rec give_number_of_occur n l res =
     match l with [] -> res
       |(x::ls) ->        if(n=x)
         then give_number_of_occur n ls (res+1)
         else give_number_of_occur n ls res
   in
     if(all_value_of_variable=[]) then var_aux
     else (
       let all_variables_story = (!variable_current_change)::(!variable_story) in
       let rec aux l step pos_res =
         match l with [] -> pos_res
           |(x::ls) ->
              if (step<=0)
              then pos_res
              else(
                if(List.mem variable x)
                then aux ls (step-1) (pos_res+(give_number_of_occur variable x 0))
                else aux ls (step-1) pos_res;
              );
       in 
       let pos = ((min (List.length all_value_of_variable) (aux (List.rev all_variables_story) step 0))-1)  in
       let res = List.nth (List.rev all_value_of_variable) (max 0 pos)
       in 
         if(pos<0) then res
         else if(is_an_aggregation res)
         then (res^"->"^(get_value_of_var_at_step "x" res step))
         else res;
     )