1

我在 Prolog 中有一个问题,我有一个包含 81 个项目的列表,我每次只需要在不同的位置从中获取 9 个项目,例如,如果我的列表是:

L=[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18],
 split(L1,2,L) the result will be L1=[10,11,12,13,14,15,16,17,18].

我的程序是

split([X,X1,X2,X3,X4,X5,X6,X7,X8], 0, [X,X1,X2,X3,X4,X5,X6,X7,X8], []).
split([X,X1,X2,X3,X4,X5,X6,X7,X8|Y], 1, [X,X1,X2,X3,X4,X5,X6,X7,X8], Y).
split([X,X1,X2,X3,X4,X5,X6,X7,X8|Y], N, [X,X1,X2,X3,X4,X5,X6,X7,X8|T], Z) :-
   N > 0,
   N1 is N-1,
   split(Y, N1, T, Z).

但它不起作用。

4

2 回答 2

3

您可以使用length/2创建列表和append/3拆分列表的功能。基本上:

extract(List, N, Len, E)E是 List 中位置N(基于 0 的索引)的长度为Len的列表时为真

extract(List, N, Len, E) :-
    length(E, Len),
    length(Before, N),
    append(Before, Rest, List),
    append(E, _, Rest).

当然,还有很多其他方法可以做到这一点,但这在概念上很容易(至少对我来说)。

对于您的确切问题,您可以写:

extract_list(List, Len, Nth, E) :-
    length(E, Len),
    LenBefore is Len*(Nth-1),
    length(Before, LenBefore),
    append(Before, Rest, List),
    append(E, _, Rest).

我已经切换了参数的位置,因为约定是首先输入参数,最后输出。

于 2013-06-06T08:36:20.830 回答
1

您的代码的最小编辑修复是

split([X,X1,X2,X3,X4,X5,X6,X7,X8], 1, [X,X1,X2,X3,X4,X5,X6,X7,X8|_]).
split(Y, N, [_X,_X1,_X2,_X3,_X4,_X5,_X6,_X7,_X8|Z]):-
   N>1, N1 is N-1, split(Y, N1, Z).

9*N如果原始列表的长度小于, 对于 call ,这将不起作用split(Y,N,....)

于 2013-06-06T12:07:39.757 回答