let transcript_receiver_for_intruder (name : string) (mess : string) : string =
        let add mess1 mess2 =
                if(not(Hashtbl.mem transcript_table_for_intruder (name,mess2)) && (mess=mess1 || not(Hashtbl.mem transcript_table_for_intruder (name,mess1))))
                then(
                Hashtbl.add transcript_table_for_intruder (name,mess1) mess2;
                if(mess1<>mess2) then Hashtbl.add transcript_table_for_intruder (name,mess2) mess1;
                );
                (mess1,mess2)
        in
        let rec aux mess =
                if(Hashtbl.mem transcript_table_for_intruder (name,mess)) 
                then (

                  let res1 = Hashtbl.find transcript_table_for_intruder (name,mess) in
                  let res2 = Hashtbl.find transcript_table_for_intruder (name,res1) in
                  (res2,res1)
                )
                else(
                        let l_mess = decompose mess in
                                if(l_mess=[]) then (
                                if(is_a_test_var mess) then (
                                        let value = get_value_of_var name mess in
                                        add value value
                                        )
                                else if(is_a_var mess) then  add mess ((get_name_of_var mess)^"'")
                                else add mess mess
                                )
                                else if((car l_mess)="pair"then
                                  let tm = List.map aux (cdr l_mess) in
                                  add ((car l_mess)^"("^(list2string "," (List.map fst tm))^")") (list2string "." (List.map snd tm))
                                  (*let (m1, t1) = aux (cadr l_mess) in
                                  let (m2, t2) = aux (caddr l_mess) in
                                    add ((car l_mess)^"^m1^"^m2^")  (t1^"^t2) *)

                                )
                                else if((car l_mess)="scrypt" || (car l_mess)="crypt"then (
                                                let tmp=decompose (cadr l_mess) in
                                                if(tmp<>[] && (car tmp)="pair")
                                                then (
                                                  let (m1, t1) = aux (cadr l_mess) in
                                                  let (m2, t2) = aux (caddr l_mess) in
                                                  add ((car l_mess)^"("^m1^","^m2^")") ("{"^t2^"}_{"^t1^"}")
                                                )
                                                else (
                                                  let (m1, t1) = aux (cadr l_mess) in
                                                  let (m2, t2) = aux (caddr l_mess) in
                                                  add ((car l_mess)^"("^m1^","^m2^")") ("{"^t2^"}_"^t1)
                                        )
                                )
                                else if((car l_mess)="apply"then (
                                  let tm = List.map aux (cdr l_mess) in
                                  add ((fst (car tm))^"("^(list2string "," (List.map fst (cdr tm)))^")") ((snd (car tm))^"("^(list2string "," (List.map snd (cdr tm)))^")")
                                )
                                else if((car l_mess)="exp"then (
                                  let tm = List.map aux (cdr l_mess) in
                                  add ((car l_mess)^"("^(list2string "," (List.map fst tm))^")") ((car l_mess)^"("^(list2string "," (List.map snd tm))^")")
                                )
                                else if((car l_mess)="xor"then (
                                  let tm = List.map aux (cdr l_mess) in
                                  add ((car l_mess)^"("^(list2string "," (List.map fst tm))^")") ((car l_mess)^"("^(list2string "," (List.map snd tm))^")")
                                )
                                else if((car l_mess)="inv"then ( 
                                  let (m1, t1) = aux (cadr l_mess) in
                                    add ((car l_mess)^"("^m1^")")  ((car l_mess)^"("^t1^")"
                                )
                                else         (
                                  let tm = List.map aux l_mess in
                                  add ((fst (car tm))^"("^(list2string "," (List.map fst (cdr tm)))^")") ((snd (car tm))^"("^(list2string "," (List.map snd (cdr tm)))^")")
                                )
                );
        in
        (snd (aux mess))