我想寫一個將列表劃分爲N部分的謂詞。 這是我到目前爲止。序言 - 在N部分中劃分列表
partition(1, List, List).
partition(N, List, [X,Y|Rest]):-
chop(List, X, Y),
member(NextToChop, [X,Y]), %Choose one of the new parts to chop further.
NewN is N-1,
partition(NewN, NextToChop, Rest).
chop(List, _, _):-
length(List, Length),
Length < 2, %You can't chop something that doesn't have at least 2 elements
fail,!.
chop(List, Deel1, Deel2):-
append(Deel1, Deel2, List),
Deel1 \= [],
Deel2 \= [].
這個想法是繼續將列表的部分切成兩個其他部分,直到我有N件。 我有這種方法效果平平:
?- partition(2, [1,2,3,4], List).
List = [[1], [2, 3, 4], 1] ;
List = [[1], [2, 3, 4], 2, 3, 4] ;
List = [[1, 2], [3, 4], 1, 2] ;
List = [[1, 2], [3, 4], 3, 4] ;
List = [[1, 2, 3], [4], 1, 2, 3] ;
List = [[1, 2, 3], [4], 4] ;
false.
所以我得到了我想要的東西,但我得到它的兩倍,並有附加了一些其他的事情。 將在3個部分事情變得更糟糕:
?- partition(3, [1,2,3,4], List).
List = [[1], [2, 3, 4], [2], [3, 4], 2] ;
List = [[1], [2, 3, 4], [2], [3, 4], 3, 4] ;
List = [[1], [2, 3, 4], [2, 3], [4], 2, 3] ;
List = [[1], [2, 3, 4], [2, 3], [4], 4] ;
List = [[1, 2], [3, 4], [1], [2], 1] ;
List = [[1, 2], [3, 4], [1], [2], 2] ;
List = [[1, 2], [3, 4], [3], [4], 3] ;
List = [[1, 2], [3, 4], [3], [4], 4] ;
List = [[1, 2, 3], [4], [1], [2, 3], 1] ;
List = [[1, 2, 3], [4], [1], [2, 3], 2, 3] ;
List = [[1, 2, 3], [4], [1, 2], [3], 1, 2] ;
List = [[1, 2, 3], [4], [1, 2], [3], 3] ;
false.
另一個想法是使用前綴,但我不知道怎麼會真正發揮作用。爲了使用它,我應該能夠讓Prolog知道它需要的前綴不能太短,也不能太長,所以我不會選擇一個太長的前綴,因此下一個遞歸步驟沒有剩餘。
任何人都可以指向正確的方向嗎?
小小澄清:謂詞應該返回所有以N部分(不包括空列表)分割列表的可能性。
應該N部分有相同的長度?如果謂詞返回所有可能的方式,您可以將列表分成N部分? – 2012-01-03 13:43:43
@thanosQR:謂詞應該返回所有可能的方式,您可以將列表分爲N個部分。我會將它添加到OP中。 – Mental 2012-01-03 14:57:52