let lvar m lv x= 
    let r = Lvar lv in 
    match Variables_analysis.dispatch_lvar lv with 
      | Variables_analysis.Fvar ->
          oracle 
            "%a is a funvar @." !Ast_printer.d_logic_var lv ;
          Path (mk_path r m.mem)
      | Variables_analysis.Cvar when Crit.isHoare -> 
          oracle 
            "%a is a funvar @." !Ast_printer.d_logic_var lv ;
          Path (mk_path r m.mem)
      | Variables_analysis.Cvar -> 
          oracle 
          "%a is a memvar @." !Ast_printer.d_logic_var lv ;
          Mloc (M.lvar m.mem lv x)
      | Variables_analysis.ARarg ->
          oracle
            "%a is a array refvar @." !Ast_printer.d_logic_var lv;
          ARef (mk_path r m.mem)
      | Variables_analysis.PRarg -> 
          oracle
            "%a is a ptr refvar @." !Ast_printer.d_logic_var lv ;
          PRef (mk_path r m.mem)
      | Variables_analysis.PRpar n ->
          oracle
            "%a is a ptr ref param of arity %d @." 
            !Ast_printer.d_logic_var lv n;
          PRpar (mk_pref r m.mem n (Some x), n)
      | Variables_analysis.ARpar n ->
          oracle
            "%a is a array ref param of arity %d @."
            !Ast_printer.d_logic_var lv n;
          let (n0,_) = brackets_and_stars_lv_typ lv.lv_type in 
          ARpar (mk_aref r m.mem n (Some x), n0)