prolog - 获取列表中指定索引处的元素

我需要编写一个程序,使用指定的索引从列表中返回一个元素。

我们有一个英文字母表 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 重叠。

相似文章

scala - 多个列表的组合 (Scala)

我正在尝试编写一个函数,该函数将多个列表作为输入并返回这些列表之间每个组合的字符串表示形式。样本输入:valintegers=List(1,2,3,4)valcharacters=List('a','...