GNH_22
GNH_22

Reputation: 35

PROLOG - Change elements in a list

I need to change elements in a list, I have the following code:

change_aux(_,_,[],[]).
change_aux(X,Y,[X|T],[Y|S]):-!,change_aux(X,Y,T,S).
change_aux(X,Y,[Z|T],[Z|S]):-change_aux(X,Y,T,S).

flatten2([], []) :- !.
flatten2([L|Ls], FlatL) :-
    !,
    flatten2(L, NewL),
    flatten2(Ls, NewLs),
    append(NewL, NewLs, FlatL).
flatten2(L, [L]).

change(X,Y,[X1|Y1],[X2,Y2]):-
    flatten([X1|Y1],L),
    change_aux(X,Y,L,[X2|Y2]).

Input: change(2,5,[1,[2,[3,2],1]],R).

Print: R = [1, [5, 3, 5, 1]] .

But I need R to be printed like this: R = [1,[5,[3,5],1]]

Could you help me, please?

Upvotes: 1

Views: 860

Answers (1)

coder
coder

Reputation: 12972

There are some problems in the code above like in definition change(X,Y,[X1|Y1],[X2,Y2]):- I don't think that the output list should always consists of two elements. Besides that the change_aux predicate needs some work since now it's just traversing the list and not building the nested output list. You could try something that would build recursively the nested levels of the list like:

change(_,_,[],[]).
change(X,Y,[H|T],[H|T1]):- \+is_list(H),dif(H,X),change(X,Y,T,T1).
change(X,Y,[X|T],[Y|T1]):- change(X,Y,T,T1).
change(X,Y,[H|T],[L|T1]):- is_list(H),change(X,Y,H,L),change(X,Y,T,T1).

Note that in the above predicate there is no need to use flatten/2 predicate since we take advantage of the nested levels of input list to build output list.

Example:

?- change(2,5,[1,[2,[3,2],1]],R).
R = [1, [5, [3, 5], 1]] ;
false.

Upvotes: 2

Related Questions