let id_prop_txt p = match p with
    | Property.IPPredicate (pk,_,ki,idp) ->
        Pretty_utils.sfprintf "%s_%d%a"
         (predicate_kind_txt pk ki)  idp.ip_id pp_names idp.ip_name
    | Property.IPCodeAnnot (_,_, ca) ->
        let name = match ca.annot_content with
          | AAssert _ -> "assert"
          | AInvariant _ -> "loop_inv"
          | APragma _ -> "code_annot"
          | _ -> assert false
        in Pretty_utils.sfprintf "%s_%d%a" name ca.annot_id
          pp_names (code_annot_names ca)
    | Property.IPComplete (_, _, lb) ->
        Pretty_utils.sfprintf  "complete_behaviors%a" pp_names lb
    | Property.IPDisjoint (_, _, lb) ->
        Pretty_utils.sfprintf  "disjoint_behaviors%a" pp_names lb
    | Property.IPDecrease (_,_,None,_) -> "decreases"
    | Property.IPDecrease _ -> "loop_variant"
    | Property.IPAxiom name -> "axiom_" ^ name
    | Property.IPAxiomatic(name, _) -> "axiomatic_" ^ name
    | Property.IPLemma name -> "lemma_" ^ name
    | Property.IPAssigns (_kf, ki, _bhv, _) ->
        let name = match ki with
          | Kglobal -> "function_assigns"
          | Kstmt s ->
              match s.skind with
                | Loop _ -> "loop_assigns_" ^ string_of_int s.sid
                | _ -> "stmt_assigns_" ^ string_of_int s.sid
        in name
    | Property.IPFrom (_, _, _, (out,_)) -> 
        "from_id_"^(string_of_int (out.it_id))
    | Property.IPUnreachable _ -> "unreachable stmt"
    | Property.IPBehavior(_, _, b) -> b.b_name
    | Property.IPOther(s,_,_) -> s