2017-04-15 59 views
4

我必須解決功課,但我對Prolog的知識非常有限。任務如下:
編寫一個Prolog程序,它可以列出一個字符串的所有子字符串,其長度至少爲兩個字符,第一個和最後一個字符相同。所有具有相同開頭和結尾的子字符串

例如:

?- sameend("teletubbies", R). 
R = "telet"; 
R = "ele"; 
R = "eletubbie"; 
R = "etubbie"; 
R = "bb"; 
false. 

我這個問題的方法是,我應該遍歷頭/尾的字符串,並尋找下一個字母的指數,這是與當前(它滿足最小2長度要求)並用sub_string謂詞剪切子字符串。

+0

你能告訴你目前的做法? –

+0

這只是一個想法,但在代碼中,它可能是這樣的: sameend([H | T],R): - sameend([T],R),%,並且應該再次遞歸調用以檢查其中相同的字符是然後sub_string()從H的郵件到它的下一個發生。 –

回答

3

這取決於你究竟是什麼意思的字符串。傳統上在Prolog中,一個字符串是一個字符列表。爲了確保你真的得到這些,請使用下面的指令。有關更多信息,請參閱this answer

:- set_prolog_flag(double_quotes, chars). 

sameend(Xs, Ys) :- 
    phrase((..., [C], seq(Zs), [C], ...), Xs), 
    phrase(([C], seq(Zs), [C]), Ys). 

... --> [] | [_], ... . 

seq([]) --> 
    []. 
seq([E|Es]) --> 
    [E], 
    seq(Es). 
0

如果你的Prolog有追加/ 2和最後一個/ 2庫(lists),它很容易爲

sameend(S,[F|T]) :- 
    append([_,[F|T],_],S),last(T,F). 
相關問題