raw_replace2([],_,_,[],_) :- !.
raw_replace2([E|Rest],Replaces,IntroducedIds,[N|NRest],DefName) :- !,
raw_replace2(E,Replaces,IntroducedIds,N,DefName),
raw_replace2(Rest,Replaces,IntroducedIds,NRest,DefName).
raw_replace2(rewrite_protected(X),_Replaces,_,rewrite_protected(Y),_) :- !,X=Y.
raw_replace2(becomes_such(Pos,Vars,Cond),Replaces,IntroducedIds,becomes_such(Pos,NVars,NCond),DefName) :- !,
raw_replace2(Cond,Replaces,IntroducedIds,NCond,DefName),
raw_replace_id_list(Vars,Replaces,IntroducedIds,NVars).
raw_replace2(becomes_element_of(Pos,Vars,Cond),Replaces,IntroducedIds,becomes_element_of(Pos,NVars,NCond),DefName) :- !,
raw_replace2(Cond,Replaces,IntroducedIds,NCond,DefName),
raw_replace_id_list(Vars,Replaces,IntroducedIds,NVars).
raw_replace2(identifier(Pos,Old),Replaces,_,New,_) :- !,
(memberchk(replace(Old,New),Replaces) -> true ; New=identifier(Pos,Old)).
raw_replace2(record_field(RPos,Record,Field),Replaces,IntroducedIds,record_field(RPos,NRecord,NField),DefName) :- !,
raw_replace2(Record,Replaces,IntroducedIds,NRecord,DefName),
(Field=identifier(_,FieldName),
raw_replace2(Field,Replaces,IntroducedIds,NField,DefName)
-> (NField=identifier(_,NewFieldName)
-> (NewFieldName=FieldName -> true
; ajoin(['Rewriting field name ',FieldName,' during definition expansion to: '],Msg),
add_message(definition_rewrite,Msg,NewFieldName,RPos)
)
; translate_raw_bexpr_with_limit(NField,50,FS),
ajoin(['Rewriting field name ',FieldName,' to an illegal expression: '],Msg),
(try_get_raw_position_info(NField,NFPos) -> true ; NFPos=RPos),
add_warning(definition_rewrite,Msg,FS,NFPos)
)
; NField=Field).
raw_replace2(multiline_template(Pos,TS),Replaces,Ids,New,DefName) :- !,
% rewrite template, it may contain expressions with ids
transform_string_template(TS,Pos,RawExpr),
raw_replace2(RawExpr,Replaces,Ids,New,DefName).
raw_replace2(Expr,_,IntroducedIds,_,DefName) :-
quantifier_capture_warning(Expr,IntroducedIds,DefName),
fail.
raw_replace2(X,_Replaces,_,Res,_) :- simple_expr(X), !,Res=X.
raw_replace2(Expr,Replaces,IntroducedIds,New,DefName) :-
safe_functor(raw_replace2_expr,Expr,Functor,Arity),
safe_functor(raw_replace2_new,New,Functor,Arity),
raw_replace3(Arity,Expr,Replaces,IntroducedIds,New,DefName).