我正在处理prolog
问题,就像这样,
使用CharsList中的相应字符替换List中所有出现的WordList,以生成NewList。
e.g。 newList([s,e,e,y,o,u,a,t,e],[c,u,8],[s,e,e,’’,y,o,u,'',l,a,t,e,r,'',k,a,t,e], X)
将X
绑定到[c,'',u,'',l,8,r,'',k,8]
。
我设法做到的就是这个
word(_, _, [], []).
word(M, S, [M|T], [S|T1]) :- word(M, S, T, T1).
word(M, S, [H|T], [H|T1]) :- H \= M, word(M, S, T, T1).
执行此操作
| ?- word(see, c, [see,you,later,kate], X).
X = [c,you,later,kate]
我有点坚持下一步的清单。任何人都可以指出我应该采取的方向吗?
如果我使用上面的替换,那么可以使用子列表吗?
subst(_,[],_,[]).
subst(X,[X|L],A,[A|M]):-!,subst(X,L,A,M).
subst(X,[Y|L],A,[Y|M]):-subst(X,L,A,M).
sublist([X|L], [X|M]):- prefix(L,M),!.
sublist(L,[_|M]):- sublist(L,M).
prefix([],_).
prefix([X|L],[X|M]):-prefix(L,M).
答案 0 :(得分:0)
好吧,我可能会这样做:
replace( [] , _ , [] ) .
replace( [Word|Words] , Map , [Replacement|Replacements] ) :-
transform( Word , Map , Replacement ) ,
replace( Words , Map , Replacements )
.
transform( X , M , Y ) :- ( member( X:Y , M ) -> true ; X=Y ) .
那应该让你说像
replace( [see,you,later,kate] , [see:c,you:u,later:l8r,kate:k8], X ) .
然后回来
X = [c,u,l8r,k8] .
答案 1 :(得分:0)
append / 2这是一个简单的库谓词,可以从SWI-Prolog lists library获得,方便在列表上工作......
newList(Ws, Cs, L, L2) :-
correspond(Ws, Cs, W, C),
append([Skip, W, Rest], L),
append([Skip, [C], Rest], L1),
!, newList(Ws, Cs, L1, L2).
newList(_, _, L, L).
correspond([X,Y,Z|_], [C|_], [X,Y,Z], C).
correspond([_,_,_|Ws], [_|Cs], W, C) :-
correspond(Ws, Cs, W, C).
此代码段任意假定与WordList匹配3个字符。我会让你按要求概括......
答案 2 :(得分:0)
newList(Ws, Cs, L, L2) :- correspond(Ws, Cs, W, C),
append([Skip, W, Rest], L),
append([Skip, [C], Rest], L1),!,
newList(Ws, Cs, L1, L2).
newList(_, _, L, L).
correspond([X,Y,Z|_], [C|_], [X,Y,Z], C).
correspond([_,_,_|Ws], [_|Cs], W, C):- correspond(Ws, Cs, W, C).
append([], []).
append([L|Ls], As) :- join(L, Ws, As),
append(Ls, Ws).
join([],X,X).
join([X|L1],L2,[X|L3]):- join(L1,L2,L3).
就像在ISO中一样。 代码来自CapelliC