我必须编写tr规则,将列表元素值的所有匹配项转换为另一个值。
tr(A,B,L,M)
如果列表M与列表L相同,除了L中每次出现的A都被B替换。例如:
?- tr(1,2,[1,4,1,5],L).
L = [2, 4, 2, 5].
到目前为止我所拥有的:
tr(_, _, [], []).
tr(O, R, [O|T], [R|T2]) :- tr(O, R, T, T2).
tr(O, R, [H|T], [H|T2]) :- H \= O, tr(O, R, T, T2).
有没有办法将tr(_, _, [], []).
替换为tr(A,B,L,M).
,以便它使用字母A,B,L,M
?
答案 0 :(得分:2)
我从@false学到的这种模式。我目前正在学习,但也许你也可以使用它来解决你的问题:
tr(_,_,[],[]).
tr(X,Y,[X|Xs],[Y|Rs]) :-
tr(X,Y,Xs,Rs).
tr(X,Y,[W|Ws],[W|Rs]) :-
dif(X,W),
tr(X,Y,Ws,Rs).
例如:
?- tr(1,2,[1,4,1,5],L).
L = [2, 4, 2, 5] ;
false.
?- tr(A,B,[1,4,1,5],[2, 4, 2, 5]).
A = 1,
B = 2 ;
false.
答案 1 :(得分:1)
maplist可以完成这项工作:
tr(A, B, L, M) :-
maplist(tr_one(A,B), L, M).
tr_one(A,B,A,B).
tr_one(A,_,B,B) :-
A \= B.
与@ guest的查询答案相同。