Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List PROLOG-更改列表中的元素_List_Prolog - Fatal编程技术网

List PROLOG-更改列表中的元素

List PROLOG-更改列表中的元素,list,prolog,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),

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

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]).
输入:
更改(2,5,1,2,3,2,1]],R)

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

但是我需要像这样打印R:
R=[1,5,3,5,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).
注意,在上面的谓词中,不需要使用
flant/2
谓词,因为我们利用了输入列表的嵌套级别来构建输出列表

例如:

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

完美的我现在明白了。。。非常感谢。很高兴这有帮助!!