Prolog 将列表划分为所需长度的部分

Prolog 将列表划分为所需长度的部分,prolog,dcg,Prolog,Dcg,我试图编写谓词divide(L,Len,Slist),当Slist可以与从列表L分配的长度Len的列表统一时,这将是真的 divide([1,2,3,4,5,6,7],3,Slist). 我们应该给出这样的答案 Slist=[1,2,3]; Slist=[2,3,4]; Slist=[3,4,5]; Slist=[4,5,6]; Slist=[5,6,7]; 但是我找不到比长度(X,Len)和子列表(L,X)更好的方法。但是它确实工作得太慢了。 除法谓词的外观如何?子列表/2似乎无法按预期工

我试图编写谓词
divide(L,Len,Slist)
,当Slist可以与从列表L分配的长度Len的列表统一时,这将是真的

divide([1,2,3,4,5,6,7],3,Slist).
我们应该给出这样的答案

Slist=[1,2,3];
Slist=[2,3,4];
Slist=[3,4,5];
Slist=[4,5,6];
Slist=[5,6,7];
但是我找不到比
长度(X,Len)和子列表(L,X)更好的方法。
但是它确实工作得太慢了。
除法谓词的外观如何?

子列表/2似乎无法按预期工作:

?- [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] ;
....
您可以改用append/3:

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

我认为这不是很快,只是必要的…

或者您可以使用@false in提到的DCG:


它确实适用于我4?长度(X,3),子列表([1,2,3,4,5],X)。X=[1,2,3];X=[1,2,4];X=[1,2,5];。。。尝试使用子列表([],[])。子列表([X|T],[X|TS]):-子列表(T,TS)。子列表([|T],X):-子列表(T,X)。是的,这是因为我在处理长列表,我对所有的子列表不感兴趣,只对从列表中分配的所有4个长度的列表感兴趣
seq([])     --> [].
seq([E|Es]) --> [E], seq(Es).

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