Prolog:使用事实替换列表项

时间:2013-12-05 19:51:55

标签: prolog

我试图创建一个遍历列表的函数,并在元素与事实匹配时替换该元素。

我能够实现一个替换列表中每个元素的简单替换。

replace([X|T], Y, [Y|T2]) :- replace(T,Y,T2).
replace([],X,[X]).

所以这只是用Y替换X中的每个列表项。

现在我想用这样的事实替换X中的每个列表项:

replace([1,2,3], [ rule(1, [one]), rule(2, [two]) ], Result)

因此,如果列表为[1,2,3],则结果为[one, two, 3]

我该怎么做?

3 个答案:

答案 0 :(得分:2)

我更喜欢使用更高阶的库支持

replace(In, Replacements, Out) :-
  maplist(replace_one(Replacements), In, Out).

replace_one(RepList, Rep, Val) :-
  memberchk(rule(Rep, [Val]), RepList) -> true ; Rep = Val.

答案 1 :(得分:1)

我认为可以简单地说:

replace([], _, []).
replace([H|T], Rules, [R|TR]) :-
        (   memberchk(rule(H, [R]), Rules)
        ->  true
        ;   H = R
        ),
        replace(T, Rules, TR).

答案 2 :(得分:0)

您可以通过添加第二条规则来完成替换列表,然后选择匹配的第一条规则,或保持项目不变,如下所示:

replace([],_,[]).
replace([H|T], L, [RH|RT]) :- replace(T,L,RT), replace_one(H, L, RH).

replace_one(H, [], H).
replace_one(H, [rule(H,B)|_], B).
replace_one(H, [rule(A,_)|T], R) :- H \= A, replace_one(H, T, R).

Demo on ideone.