2017-04-15 14 views
4

私は宿題を解決する必要がありますが、私はPrologについて非常に限られた知識しか持っていません。タスクは次のとおりです。
長さが少なくとも2文字で、最初と最後の文字が同じである文字列の部分文字列をすべて一覧表示できる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)、%そして再帰呼び出しを再度チェックする必要がありますここでは同じ文字があり、次にHのポストディションから次の出現までsub_string()します。 –

答えて

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

あなたのプロローグは、ライブラリ内(listsを)/ 2と最後の/ 2を追加している場合、それは

sameend(S,[F|T]) :- 
    append([_,[F|T],_],S),last(T,F). 
関連する問題