2016-10-23 34 views
5

Từ là bất kỳ ký tự biểu tượng nào được phân tách bằng dấu cách trắng hoặc bởi các điểm bắt đầu/kết thúc của chuỗi. Ví dụ: [w,o,r,d,1,' ',w,o,r,d,2].Phát hiện tất cả các từ có độ dài k của chuỗi trong prolog

Tôi cần phải tìm tất cả các từ có độ dài k của chuỗi đã cho và thêm chúng vào chuỗi kết quả (được phân cách bằng dấu cách trắng). Đây là những gì tôi đang mong đợi ví dụ trong trường hợp 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]. 

Trả lời

3

Bạn có thể viết:

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 = ' '. 

đâu kthWords/3 cuộc gọi find_word/2 mà thấy dòng chữ và cuối cùng kthWords trả về đầu ra nhưng cuối cùng, nó sẽ thêm ' '. Điều duy nhất mà final_kthWords(L,K,Outlist)/3 làm là loại bỏ các phụ ' ' vào cuối danh sách và trả về danh sách bên phải:

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

Điều này có vẻ khá tốt đối với tôi. thx :) –

+0

rất vui được trợ giúp !!! – coder

1

Hy vọng rằng ai đó có thể đề xuất một giải pháp đơn giản ... sau dường như làm việc

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

Vâng, giải pháp thú vị :) 1 –

0

Giải pháp mà không ngược lại.

% 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). 
Các vấn đề liên quan