Prolog 列表的第N个元素

Prolog 列表的第N个元素,prolog,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. 有标准谓词nth1/3和nth0/3可以满足您的需要: ?- nth1(1, [1, 2, 3], X). X = 1. ?- nth0(1, [1, 2, 3], X). X = 2. 您的索

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

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

有标准谓词
nth1/3
nth0/3
可以满足您的需要:

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

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

您的索引是相对于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的索引
X
。对于一个基于0的索引,基本情况是,
element_在(X[X |),0)。
。可能是一个bug<代码>元素1(L,N,X):-element0(L,T,X),应该是
元素0(L,T,X):-element0(L,T,X),
。另一个是可疑的
element97([|L],N,X):-element1(L,T,X),