2012-04-06 11 views
4

Mein Problem ist, dass ich eine Regel für das Aufteilen einer Liste auf mehrere Listen, die nur 3 Elemente aus dem Original enthalten, in der Reihenfolge machen möchte.Wie kann ich eine Liste in Prolog in mehrere Listen mit 3 Elementen aufteilen?

Zum Beispiel:

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

?-Split(Fruits). 

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

Gibt es eine Möglichkeit, dies zu tun? : S

+0

Was sollte das Ergebnis sein, wenn die Länge der Liste weniger als 3 ist? Welche Version von Prolog hast du? –

+0

Es sollte falsch/Nein sein. Ich habe SWI 5.10.5 –

Antwort

3

Prolog eignet sich hervorragend für diese Aufgabe. dass anhängen beobachten Just/3 kann in verschiedenen Richtungen verwendet werden:

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

Jetzt einfach definieren Split/2 wie folgt. Es finden _1 und _2 so dass L = _1 ++ S ++ _2, wo ++ die Liste Verkettung ist:

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

Und hier Sie mit Ihrem Problem gehen:

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

Bye

Mit freundlichen Grüßen

3

Sie können sich beziehen auf this excellent answer @ false bereitgestellt einige Male her.

schnell seine Lösung anzupassen, könnten Sie schreiben:

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

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

Beachten Sie, dass die gleiche Sache mit append/2 erreichen konnte (oder append/3 mit einem weiteren Anruf):

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

Aber append/2 ist nicht wirklich für solche Manipulationen gedacht. DCG verwendet Differenzlisten, die effizienter sind.

+0

ooh toll, vielen Dank, funktioniert perfekt: D –

+1

Wenn Sie in Prolog interessiert sind, nehmen Sie sich die Zeit zu verstehen, was los ist in der Antwort, die ich verlinkt ist Zeit gut ausgegeben BTW! – m09

Verwandte Themen