我试图创建一个遍历列表的函数,并在元素与事实匹配时替换该元素。
我能够实现一个替换列表中每个元素的简单替换。
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]
我该怎么做?
答案 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).