let add_effect_assigns env pid label kind assigned wp =
    let from = Clabels.c_label label in
    let goal = ref NoAssigns in
    on_context env "add_assigns" wp Keep_opened (Goal_assigns goal)
      (fun env _noassigns _prop ->
        try
          let asgns = assigned_for_assigns_goal kind from env assigned in
          let ze = D.fresh "ze" (Formula.Model WpModel.tau_of_dzone) in
          let zx = D.fresh "zx" (Formula.Model WpModel.tau_of_dzone) in
          let mem = L.mem_at env from in
          let zs = List.fold_left
            (fun zs a ->
              let zx = WpModel.dzone_assigned mem a in
              WpModel.dzone_union zs zx)
            (F.var zx) asgns
          in
          goal := EffectAssigns {
            a_pid = pid ;
            a_label = from ;
            a_effect = ze ;
            a_locals = zx ;
          } ;
          WpModel.dzone_subset (F.var ze) zs
        with e -> (* [VP 2011-02-03] Argl! *)
          let (source,reason) = Wp_error.protect e in
          Datalib.Collector.add_warning
            ~severe:true ~source ~reason
            "Goal for %a can not be translated"
            WpPropId.pretty pid ;
          F.p_false)