2012-03-24 9 views
1

Ich habe versucht, Prädikat divide(L,Len,Slist) zu schreiben, die wahr sein wird, wenn slist mit einer Liste der Länge Len von Liste L. zum Beispiel zugeordnet vereinigen könnenDividieren Liste in Stücke der benötigten Länge

divide([1,2,3,4,5,6,7],3,Slist). 

solche Antworten geben sollte

Slist=[1,2,3]; 
Slist=[2,3,4]; 
Slist=[3,4,5]; 
Slist=[4,5,6]; 
Slist=[5,6,7]; 

Aber ich konnte keinen besseren Weg als length(X,Len), sublist(L,X). finden, aber es funktioniert zu langsam. Wie sollte Divide Prädikat aussehen?

Antwort

1

sublist/2 nicht scheint nicht wie erwartet zu funktionieren:

?- [library(dialect/sicstus/lists)]. 
% library(dialect/sicstus/lists) compiled into sicstus_lists 0,00 sec, 14 clauses 
true. 

?- L=[1,2,3,4,5,6], length(T, 3),sublist(T,L). 
L = [1, 2, 3, 4, 5, 6], 
T = [1, 2, 3] ; 
L = [1, 2, 3, 4, 5, 6], 
T = [1, 2, 4] ; 
L = [1, 2, 3, 4, 5, 6], 
T = [1, 2, 5] ; 
.... 

könnten Sie verwenden/3 statt anhängen:

?- L=[1,2,3,4,5,6], length(T, 3), append(_, Q, L), append(T, _, Q). 
L = [1, 2, 3, 4, 5, 6], 
T = [1, 2, 3], 
Q = [1, 2, 3, 4, 5, 6] ; 
L = [1, 2, 3, 4, 5, 6], 
T = [2, 3, 4], 
Q = [2, 3, 4, 5, 6] ; 
L = [1, 2, 3, 4, 5, 6], 
T = [3, 4, 5], 
Q = [3, 4, 5, 6] ; 
L = [1, 2, 3, 4, 5, 6], 
T = Q, Q = [4, 5, 6] ; 
false. 

Ich glaube nicht, es sehr schnell ist, einfach unerlässlich. ..

+0

funktioniert es für mich 4 - Länge (X, 3), Unterliste ([1,2,3,4,5], X). X = [1, 2, 3]; X = [1, 2, 4]; X = [1, 2, 5]; ... – whd

+0

versuchen Sie es mit der Unterliste ([], []). Unterliste ([X | T], [X | TS]): - Unterliste (T, TS). Unterliste ([_ | T], X): - Unterliste (T, X). – whd

+0

und es ist so langsam? – CapelliC

2

Alternativ können Sie DCG verwenden, wie von @False in this great answer erwähnt:

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

divide(List, Length, Result) :- 
    length(Result, Length), 
    phrase((seq(_), seq(Result), seq(_)), List).