let collect_signature profile filter env =
    let closures = ref [] in
    let references = ref Logic_var.Map.empty in
    let get_refs lv refs =
      try Logic_var.Map.find lv refs
      with Not_found -> []
    in
    Lmap.iter
      (fun label mem ->
         match label with
           | LabelParam label ->
               begin
                 (* Collecting reference parameters *)
                 List.iter
                   (fun (x,lv,formal) -> if filter x then
                      let refs = 
                        (x,formal,label) :: (get_refs lv !references) in
                      references := Logic_var.Map.add lv refs !references)
                   (M.userdef_ref_signature mem) ;
                 (* Collecting memory parameters *)
                 List.iter
                   (fun (x,clos) -> if filter x then
                      closures := UF_closure(x,clos,label) :: !closures)
                   (M.userdef_mem_signature mem) ;
               end
           | _ -> ())
      env.frame.states ;
    begin
      List.rev !closures @
        List.map
        (function
           | (UF_logic _ | UF_closure _) as p -> p
           | UF_references(lv,opt_cx,_) -> 
               UF_references(lv, opt_cx, List.rev (get_refs lv !references))
        ) profile
    end