PROLOG - 更改列表中的元素

时间:2016-10-21 19:06:37

标签: list prolog

我需要更改列表中的元素,我有以下代码:

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]).

输入:change(2,5,[1,[2,[3,2],1]],R)

打印:R = [1, [5, 3, 5, 1]]

但我需要像这样打印R:R = [1,[5,[3,5],1]]

请问你能帮帮我吗?

1 个答案:

答案 0 :(得分:1)

上面的代码中存在一些问题,例如在定义change(X,Y,[X1|Y1],[X2,Y2]):-中我不认为输出列表应该总是由两个元素组成。除此之外,change_aux谓词需要一些工作,因为它现在只是遍历列表而不是构建嵌套输出列表。您可以尝试以递归方式构建列表的嵌套级别,例如:

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).

请注意,在上面的谓词中,不需要使用flatten/2谓词,因为我们利用输入列表的嵌套级别来构建输出列表。

示例:

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