prolog用单个字符替换列表中的元素列表

时间:2015-05-27 23:15:57

标签: prolog

我正在处理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).

3 个答案:

答案 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