Prolog - 从列表列表中获取第一个列表

时间:2010-10-30 22:50:51

标签: prolog

我的列表中包含较小的列表,每个列表包含2个项目:

[[a,1],[b,2],[c,3]]  

我正在使用一个名为take(1,L,R)的函数来获取列表L中的第一项并返回项目R. take函数的代码在这里:

take(0,X,X).
take(N,[H|T],[H|R]):- 
    N>0, M is N-1,
    take(M,T,R).  

目前,运行可能如下所示:

1 ?- take(1,[[a],[b],[c]],Taken).
Taken = [[a], [b], [c]]

与输入相同!对于“常规”1级深度列表,这是相同的:

2 ?- take(1,[a,b,c],Taken).
Taken = [a, b, c]

问题:
你的问题是如何让结果看起来像:

1 ?- take(1,[[a],[b],[c]],Taken).
Taken = [a]

我想返回我发送的列表中的前N项。

1 个答案:

答案 0 :(得分:0)

你的基本情况take(0, X, X).完全正如它所说 - 给定任何值X,结果是X.我认为你想说的是take(1, [H|T], H).(它产生的第一个元素是列表)。

我认为你实际上是take(0, _, [ ]).,当从任何列表中“取”0项时会产生一个空列表。这适用于您现有的递归案例。

你说你想得到“列表的前N项” - 这样的结果必须存储在N个项目的列表中。因此,take(1, [a, b, c], Taken)会产生Taken = [a],而不是Taken = a。同样,take(1, [[a], [b], [c]], Taken).会产生Taken = [[a]].。对于特殊情况,take(1,...)表单仅返回第一个项目(不包含在列表中)会破坏您的递归。