prolog用另一个元素替换列表中的元素,使用set函数头?

时间:2015-06-03 14:22:37

标签: list replace prolog

我必须编写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

2 个答案:

答案 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的查询答案相同。