Prolog 列表的第N个元素
我不熟悉Prolog。当列表从1(索引)开始时,如何获取列表的第n个元素?我如何转换它,它获取第n个元素,但列表从0索引开始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. 您的索
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),