我需要编写一个程序,使用指定的索引从列表中返回一个元素。
我们有一个英文字母表 X = [a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t , u, v, w, x, y, z]
从 0 开始,我必须返回,例如,索引为 13 的数字,所以字母 'n',如何从具有指定索引的列表中返回一个元素?
这是我工作过的,但仍然无法正常运行。
position(0, 0, [], a).
position(X, I, [H1|T1], _):-
position(X, I1, T1, H1),
I = I1 + 1.
回答1
这只是遍历列表并在进行时计数的问题。尝试这样的事情:
select( [X|_] , 0 , X ) .
select( [_,Xs] , N , C ) :- N > 0 , N1 is N-1, select(Xs,N1,C).
或者
select( Xs , N , C ) :- select(Xs,0,N,C) .
select( [X|_] , N , N , X ) .
select( [_|Xs] , V , N , C ) :- V1 is V+1, select(Xs,V1,N,C).
后者将以更像 Prolog 的方式双向工作。它不关心您是否指定了索引:
select( [a,b,c,d] , N , C )
连续成功- N=0, C=a
- N=1, C=b
- N=2, C=c
- N=3,C=d
select( [a,b,c,d] , 2 , C )
只需- C=c
select( [a,b,c,d] , N , d )
只需- N=3
回答2
我的方法也是“数数,当它达到零时从前面匹配”:
:- use_module(library(clpfd)).
position(0, [Elem|_], Elem).
position(Pos, [_|T], Elem) :-
Pos #= Pos_ + 1,
position(Pos_, T, Elem).
您的请求“使用指定索引从列表中返回元素的程序”是您可能在 Python 中使用的命令式请求;获取单个索引并返回单个元素。更改为 Prolog 关系型思维方式会将您带到 Nicholas Carey 的评论:
将双向工作。它不关心你是否指定了索引
所以你可以给一个元素并得到一个索引。除此之外,他们还可以检查元素是否在索引处;这确认“狗”在第 3 位,并说“牛”不在第 3 位:
?- position(3, [apple,box,cat,dog], dog).
true
?- position(3, [apple,box,cat,dog], cow).
false
在回溯时,找到一个元素的所有位置,这会在两个地方找到“盒子”:
?- position(Pos, [apple,box,cat,dog,box], box).
Pos = 1 ;
Pos = 4
这意味着与 Python 相比,此代码与 x = items[i]
和 i = items.index(x)
以及 enumerate(items)
和 items[i] == x
重叠。