let get_id_prop_strategies ?(assigns=WithAssigns) p =
  debug "[get_id_prop_strategies] %s@."
    (WpPropId.id_prop_txt p);
    match p with
      | Property.IPCodeAnnot (kf,_,ca) ->
          let bhvs = match ca.annot_content with
            | AAssert (l, _) | AInvariant (l, _, _) | AAssigns (l, _) -> l
            | _ -> []
          in get_strategies assigns kf bhvs None (IdProp p)
      | Property.IPAssigns (kf, _, Property.Id_code_annot _, _)
      (*loop assigns: belongs to the default behavior *)
      | Property.IPDecrease (kf,_,_,_) ->
      (* any variant property is attached to the default behavior of
       * the function, NOT to a statement behavior *)

          let bhvs = [ Cil.default_behavior_name ] in
            get_strategies assigns kf bhvs None (IdProp p)
      | Property.IPPredicate (Property.PKRequires _, _kf, Kglobal, _p) ->
          get_precond_strategies p
      | Property.IPFrom id_from ->
          [ WpFroms.get_strategy_for_from id_from ]
      | _ ->
          let strategies = match Property.get_kf p with
            | None -> Wp_parameters.warning
                        "WP of property outside functions: ignore %s"
                        (WpPropId.id_prop_txt p); []
            | Some kf ->
                let ki = Some (Property.get_kinstr p) in
                let bhv = match Property.get_behavior p with
                  | None -> Cil.default_behavior_name
                  | Some fb -> fb.b_name
                in get_strategies assigns kf [bhv] ki (IdProp p)
          in strategies