2012-04-06 10 views
4

私の問題は、リストを複数のリストに分割し、元のものから順に3つのアイテムだけを含むルールを作りたいということです。例えばPrologでリストを3つのアイテムを含む複数のリストに分割するにはどうすればよいですか?

/*original list:*/ 
Fruits=[apple,banana,orange,pear, lemon, melon] 

?-Split(Fruits). 

/*results:*/ 
[apple,banana,orange]; 
[banana,orange,pear]; 
[orange,pear,lemon]; 
[pear,lemon,melon]. 

はこれを行う方法はありますか? :S

+0

リストの長さが3未満の場合はどうなりますか? Prologのどのバージョンがありますか? –

+0

False/Noでなければなりません。 私はSWIを持っています5.10.5 –

答えて

3

このタスクではPrologが優れています。ちょうどその追加/ 3様々な方向に を使用することができます観察し、次のよう

% append(+List,+List,-List) 
% append(-List,-List,+List) 
append([], X, X). 
append([X|Y], Z, [X|T]) :- 
    append(Y, Z, T). 

を今すぐ簡単にスプリット/ 2を定義します。これは_1見つけると_2ようなリストの連結が++でLは= _1 ++ S ++ _2、そのう:

% split(+List,-Sublist) 
split(L, S) :- 
    append(_, H, L), 
    append(S, _, H). 

そして、ここでは、あなたの問題に行く:

?- Fruits=[apple,banana,orange,pear,lemon,melon], Split=[_,_,_], split(Fruits,Split). 
Fruits = [apple,banana,orange,pear,lemon,melon], 
Split = [apple,banana,orange] ; 
Fruits = [apple,banana,orange,pear,lemon,melon], 
Split = [banana,orange,pear] ; 
Fruits = [apple,banana,orange,pear,lemon,melon], 
Split = [orange,pear,lemon] ; 
Fruits = [apple,banana,orange,pear,lemon,melon], 
Split = [pear,lemon,melon] ; 
No 

さようなら

よろしくお願いします。

3

何度か前にthis excellent answer @falseを参照することができます。

すぐに彼のソリューションを適応させる、あなたが書くことができます:あなたはappend/2(または1つ以上のコールとappend/3)と同じことを達成できる

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

split_3(List, Result) :- 
    length(Result, 3), 
    phrase((seq(_),seq(Result),seq(_)),List). 

注:

split_3(List, Result) :- 
    length(Result, 3), 
    append([_, Result, _], List). 

しかしappend/2ではありません本当にそのような操作を意図していました。 DCGはより効率的な違いリストを使用します。

+0

大変ありがとう、ありがとう、完璧に動作します:D –

+1

Prologに興味があるなら、私がリンクしている答えで何が起こっているのかを正しく理解する時間をとってください。 – m09

関連する問題