2016-10-23 64 views
5

Kelimeler beyaz boşluklarla veya dize başlangıç ​​/ bitiş noktalarıyla ayrılmış herhangi bir sembol karakteridir. Örn. [w,o,r,d,1,' ',w,o,r,d,2].Tüm k uzunluk sözcüklerini prologda algıla.

Verilen dizenin tüm k uzunluk sözcüklerini bulmalı ve bunları sonuç dizesine eklemeliyim (beyaz boşluklarla ayrılmış). Bu benim k = 5 durumunda örneğin bekliyorum budur: bir başkası daha basit bir çözüm teklif edebilir umarak

?- 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]. 

cevap

3

You iş gibi görünüyor yazabiliriz:

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 aramalar kelimeleri bulur find_word/2 ve son olarak kthWords çıkışı verir nerede liste ama sonunda bir ' ' ekler. final_kthWords(L,K,Outlist)/3 listenin sonuna ilave ' ' kaldırıyor yapar ve sağ listesini döndürür tek şey: ters olmadan

?- 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. 
+0

Bu benim için oldukça iyi görünüyor. thx :) –

+0

yardım etmekten memnunum !!! – coder

1

... Aşağıdaki

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). 
+0

Eh, ilginç bir çözüm :) +1 –

0

Çözüm.

% 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).