单词是由空格或字符串的起点/终点分隔的任何符号字符。对于前者[w,o,r,d,1,' ',w,o,r,d,2]
。
我需要查找给定字符串的所有k长度单词并将它们附加到结果字符串中(用空格分隔)。 这就是我期待的例子,例如在k = 5的情况下:
?- kthWords([w,o,r,d,1,'',w,r,d,'',w,o,r,d,2], 5, X).
X = [w,o,r,d,1,'',w,o,r,d,2].
答案 0 :(得分:3)
你可以写:
final_kthWords(L,K,Outlist):-
kthWords(L,K,L1),
reverse(L1,[_|T]),
reverse(T,Outlist).
kthWords([],_,[]):-!.
kthWords(L,K,L1):-
find_word(L,Word,L2),
length(Word,N),
(N=:=K-> append(Word,[' '|T],L1),kthWords(L2,K,T);
kthWords(L2,K,L1)).
find_word([],[],[]).
find_word([H|T],[H|T1],L):-dif(H,' '),find_word(T,T1,L).
find_word([H|T],[],T):- H = ' '.
kthWords/3
调用找到单词的find_word/2
,最后kthWords
返回输出列表,但最后会添加' '
。 final_kthWords(L,K,Outlist)/3
唯一能做的就是删除列表末尾的额外' '
并返回正确的列表:
?- final_kthWords([w,o,r,d,1,' ',w,r,d,' ',w,o,r,d,2], 5, X).
X = [w, o, r, d, 1, ' ', w, o, r, d, 2] ;
false.
答案 1 :(得分:1)
希望其他人可以提出更简单的解决方案...以下似乎有效
kthWordsH([], 0, _, R0, R0).
kthWordsH([], N, _, _, []) :-
N \= 0.
kthWordsH([' ' | Tl], 0, Len, W, Revult) :-
kthWordsH(Tl, Len, Len, [], Res0),
append(Res0, [' ' | W], Revult).
kthWordsH([' ' | Tl], N, Len, _, Revult) :-
N \= 0,
kthWordsH(Tl, Len, Len, [], Revult).
kthWordsH([H | Tl], 0, Len, _, Revult) :-
H \= ' ',
kthWordsH(Tl, Len, Len, [], Revult).
kthWordsH([H | Tl], N, Len, Tw, Revult) :-
H \= ' ',
N \= 0,
Nm1 is N-1,
kthWordsH(Tl, Nm1, Len, [H | Tw], Revult).
kthWords(List, Len, Result) :-
kthWordsH(List, Len, Len, [], Revult),
reverse(Revult, Result).
答案 2 :(得分:0)
没有逆转的解决方案。
% return a word of k length, or return [] otherwise
kword(K,L,W):-
length(L,K) -> append(L,[' '],W); W=[].
% if no more chars, then check final word in L and
% append to word list Ls to return Lw
kwords(K,[],L,Ls,Lw):-
kword(K,L,W),
append(Ls,W,Lw).
% if char is space, then append to Ls if word of length K
% if not space, append char to "in progress" work list L
kwords(K,[C|Cs],L,Ls,Lw):-
( C=' ' ->
( kword(K,L,W),
append(Ls,W,Ls0),
L2 = []
);
( append(L,[C],L2),
Ls0 = Ls
)
),
kwords(K,Cs,L2,Ls0,Lw).
% intialise predicate call with empty word and empty result
kthWords(Cs,K,L):- kwords(K,Cs,[],[],L).