我想解决一个简单的Prolog问题,但我无法解决它。从一个列表中,我需要根据给定的索引I创建子列表,然后从I开始获取N个元素。如果索引大于列表长度,则会得到空的子列表。如果N(元素数量)大于列表中剩余的元素,则会获取从I到结尾的所有元素。
在这里,我已经完成了任务的一部分,可以从索引I获取下一个元素N。现在我要问的是任务中的另一部分:
1)当
我已经有的代码是下面这个,它可以正常工作:
在这里,我已经完成了任务的一部分,可以从索引I获取下一个元素N。现在我要问的是任务中的另一部分:
1)当
I
(索引)大于列表长度时,我必须在子列表中获取一个空列表。?- sublist([a,b,c,d],5,2,L)
L=[]
2) 当N
(下一个元素)的数量大于我们所剩余的元素数量时,我需要获取从该位置到末尾的所有元素。
?- sublist([a,b,c,d],4,4,L)
L=[d]
我已经有的代码是下面这个,它可以正常工作:
sublist([X|_],1,1,[X]).
sublist([],_,_,[]).% I use this one for the case bases
sublist([X|Xs],1,K,[X|Ys]):-
K>1,
K1 is K-1,
sublist(Xs,1,K1,Ys).
sublist([_|Xs],I,K,Ys):-
I > 1,
I1 is I-1,
sublist(Xs,I1,K,Ys).
K
,你需要问问自己在这种情况下为什么要这样做,以及(如果你真的认为应该这样做)在什么条件下。此外,考虑到你想要一个“截断”的答案,如果N
太大,你可能需要另一个(或不同的)基本情况子句来处理输入列表为空的情况。 - lurkersublist([], _, _, []).
否则你可能会得到一个未实例化的结果。例如,使用你展示的代码,如果查询sublist([a,b,c,d], 4, 2, L).
你将得到[d|_]
而不是[d]
。但是如果你使用sublist([], _, _, []).
你将得到正确的结果[d]
,因为这个子句的意思是,“如果我从一个空列表中选择一个子列表,那么我将得到一个空列表”。 - lurker