我是Prolog的新手。当列表从1(索引)开始时,如何获取列表的第n个元素?我如何转换它,得到第n个元素,但列表从0索引开始。
element_at(X,[X|_],1).
element_at(X,[_|L],K) :- element_at(X,L,K1), K is K1 + 1.
答案 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/3
和nth0/3
可以执行您想要的操作:
?- nth1(1, [1, 2, 3], X).
X = 1.
?- nth0(1, [1, 2, 3], X).
X = 2.