let by_array_reference_pattern_term t =
  let s = "[by_array_reference_pattern_term]" in
  match t with 
  | TStartOf (TVar lvar,off) 
  | Tat ({term_node = TStartOf (TVar lvar,off) },_)-> 
      debug "%s %a " s!Ast_printer.d_logic_var lvar; 
      Ok(lvar,true,brackets_lv_typ (Cil.typeOfTermLval (TVar lvar,off)))
     
  |TCastE(ty,{term_node = ( TStartOf (TVar lvar,off) 
              | Tat ({term_node = TStartOf (TVar lvar,off) },_))}) when 
      Cil.isPointerType ty ->
     debug "%s %a " s!Ast_printer.d_logic_var lvar; 
        Ok (lvar,true,brackets_lv_typ(Cil.typeOfTermLval (TVar lvar,off)))

  | TAddrOf (TMem t, _) 
  | Tat ({term_node = TAddrOf (TMem t, _) },_) -> 
      (match delta_ptr_term t.term_node with 
         | None -> Any
         | Some (x,n) -> 
             debug "%s %a in delta_ptr term" s !Ast_printer.d_logic_var x;
             Ok (x,true,n)) 
  | Tat({term_node = t},_)-> help_array_reference_pattern_term s t
  | TCastE(ty,{term_node = t}) when (Cil.isPointerType ty)->
      help_array_reference_pattern_term s t
  | t ->help_array_reference_pattern_term s t