2017-04-19 9 views
0

「文字列」のすべての「部分文字列」をリストすることができるPrologプログラムを作成するタスクを受け取りました。 2文字。例えば末尾に 'a'文字を含むすべての部分文字列

:[|テールヘッド]と再帰的に呼び出す

?- avegu("baka", R). 
R = "ba"; 
R = "baka"; 
R = "aka"; 
R = "ka"; 
false. 

私の考えは、私は与えられた文字リスト(文字列)を分割しなければならないということです。 Headが 'a'のとき、反復処理した部分文字列を返し、リストの最後までこれを続けます。私はこのアイデアをどのように実装するのか分かりません。

+0

SOはコード作成サービスではないため、この質問を議論の対象外としています。 –

+0

SWI Prologの文字列処理の述語ライブラリを簡単に読んでください。具体的には、それを文字のリストに分解する述語があります。始める方法をあなたに知らせるために何かを見つけるべきでしょう。また、頭が「a」のときに終了するのではなく、リストの最後の文字が「a」のときに終了することをお勧めします。 – lurker

+1

「avegu」とは何ですか? – false

答えて

1

原子を使用して文字列を使用しない場合は、atom_length/2sub_atom/5を使用できますが、SWIを使用する場合は「文字列」と同じものがあります。

babakaakaka(X, Sub) :- 
    atom_length(X, Len), 
    sub_atom(X, _, Sub_len, _, Sub), 
    between(2, Len, Sub_len), 
    sub_atom(Sub, _, 1, 0, a). 

、その後、私が書く:

?- babakaakaka(baka, X). 
X = ba ; 
X = baka ; 
X = aka ; 
X = ka ; 
false. 
2

あなたがここにいくつかの問題に触れています。

まず、文字列が文字のリストで表されるようにします。これを取得する最も簡単な方法は、ディレクティブを使用することです。

:- set_prolog_flag(double_quotes, chars). 

1文字で余分な引用符を使用する必要はありません。したがって

?- "abc" = [A|BC]. 
A = a, 
BC = [b,c]. 

はその後、それがを使用して、すべての簡単です、

avegu(String, SubstringA) :- 
    Substring = [_|_], 
    phrase((..., seq(Substring), "a", ...), String), 
    phrase((  seq(Substring), "a"  ), SubstringA). 

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

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

?- avegu("baka", R). 
R = [b, a] ; 
R = [b, a, k, a] ; 
R = [a, k, a] ; 
R = [k, a] ; 
false. 

も、答えを二重引用符を使用する方法についてはthis answerを参照してください。

+0

これははるかに優れています答え:私は疑問を誤解していると思うが、実際には "文字列"が何を意味するのか分からず、Prologで "文字列"と言ったときに人々が何を意味するのかを簡単に知る方法がないか分からない –

+0

@ User9213: OPは "文字リスト(文字列)"について語りました。文字列の多くの要求は、実際に文字や文字コードのリストを意味します。 – false

関連する問題