列表的第N个元素

时间:2014-05-28 18:29:50

标签: prolog

我是Prolog的新手。当列表从1(索引)开始时,如何获取列表的第n个元素?我如何转换它,得到第n个元素,但列表从0索引开始。

   element_at(X,[X|_],1).
   element_at(X,[_|L],K) :- element_at(X,L,K1), K is K1 + 1.

2 个答案:

答案 0 :(得分:1)

您的索引是否相对于0,1或其他数字是无关紧要的。它是相同的代码 - 唯一的区别是你的任意起始值。

这会产生相对于零的指数:

element0( [X|_] , 0 , X ) .
element0( [_|L] , N , X ) :- element0(L,T,X) , N is T+1 .

更改第一个子句生成相对于一个的索引:

element1( [X|_] , 1 , X ) .
element1( [_|L] , N , X ) :- element1(L,T,X) , N is T+1 .

这产生相对于-97的指数:

element97( [X|_] , -97 , X ) .
element97( [_|L] , N   , X ) :- element97(L,T,X) , N is T+1 .

有了这些,你可以运行它们并获得

?- element0( [a,b,c] , N , X ).
N = 0 , X = a ;
N = 1 , X = b ;
N = 2 , X = c ;
false.

?- element1( [a,b,c] , N , X ).
N = 1 , X = a ;
N = 2 , X = b ;
N = 3 , X = c ;
false.

?- element97([a,b,c],N,X).
N = -97 , X = a ;
N = -96 , X = b ;
N = -95 , X = c ;
false.

但是,应该注意,这也会产生生成效果:

?- element0(L,N,a).

将产生一组接近无穷大的结果(至少在你的堆栈溢出之前),L和N绑定到各个位置的原子a的列表:

N = 0 , L = [ a                                              | _G3045 ] ;
N = 1 , L = [ _G3044 , a                                     | _G3048 ] ;
N = 2 , L = [ _G3044 , _G3047 , a                            | _G3051 ] ;
N = 3 , L = [ _G3044 , _G3047 , _G3050 , a                   | _G3054 ] ;
N = 4 , L = [ _G3044 , _G3047 , _G3050 , _G3053 , a          | _G3057 ] ;
N = 5 , L = [ _G3044 , _G3047 , _G3050 , _G3053 , _G3056 , a | _G3060 ] ;
...

这就是prolog的工作方式。

答案 1 :(得分:0)

标准谓词nth1/3nth0/3可以执行您想要的操作:

?- nth1(1, [1, 2, 3], X).
X = 1.

?- nth0(1, [1, 2, 3], X).
X = 2.