Prolog列表操作

Prolog列表操作,prolog,Prolog,我的问题是: 编写一个PROLOG程序,给定两个整数索引和值列表,返回一个列表,其 first element是存储在与列表值的 first element of INDEXS对应位置的值。 例如,给定INDXS=[2,1,4,3]和value=[2,4,6,8],输出为[4,2,8,6] 到目前为止,我已经做了以下工作: newlist([], [], void). newlist([void|Tail], Values, X) :- newlist(Tail, Values, X).

我的问题是:

编写一个PROLOG程序,给定两个整数索引和值列表,返回一个列表,其 first element是存储在与列表值的 first element of INDEXS对应位置的值。 例如,给定INDXS=[2,1,4,3]和value=[2,4,6,8],输出为[4,2,8,6]

到目前为止,我已经做了以下工作:

newlist([], [], void).
newlist([void|Tail], Values, X) :- newlist(Tail, Values, X).

newlist([H|T], Values, X) :- 
   nth1(H, Values, Curr), %%Get element nr H in Values and bind it to Curr
   add(Curr, X, [Curr|X]), %%Add Current to array X
   newlist(T, Values, X). %%Recursive send back Tail, the values and new array X
newlist([2,1], [2,3], X).
并查询以下信息:

newlist([], [], void).
newlist([void|Tail], Values, X) :- newlist(Tail, Values, X).

newlist([H|T], Values, X) :- 
   nth1(H, Values, Curr), %%Get element nr H in Values and bind it to Curr
   add(Curr, X, [Curr|X]), %%Add Current to array X
   newlist(T, Values, X). %%Recursive send back Tail, the values and new array X
newlist([2,1], [2,3], X).

如果prolog代码正常,我想在变量X中显示我的新列表。我该怎么做?(我已经尝试打印它。

您接近解决方案。最简单的情况是索引列表为空。在这种情况下,值列表没有任何意义,结果是一个空列表:

values([], _, []).
\uuu
是一个匿名变量。它可以被视为“不关心变量”。如果索引列表不是空的,我们需要遍历列表,并针对每个索引,在该位置检索相应的值:

values([Index| Indexes], Values, [SelectedValue| SelectedValues]) :-
    nth1(Index, Values, SelectedValue),
    values(Indexes, Values, SelectedValues).
nth1/3
谓词是一个常见的库谓词,您可以在多个Prolog系统中找到它的实现。如果您使用的Prolog系统中没有它,那么定义它是学习Prolog的一个很好的练习

将您的示例用作示例查询:

?- values([2,1,4,3], [2,4,6,8], SelectedValues).
SelectedValues = [4, 2, 8, 6].

为了好玩,您还可以使用
maplist

定义
nth\u值
nth1
参数移动到方便的顺序:

nth_value(Values, Index, Item) :- nth1(Index, Values, Item).
然后:


实现这一点的标准技巧是将索引和值配对,然后对结果列表进行排序,因为对是按字典顺序排序的。索引将被排序,值将被拖动到正确的位置:

pair_up( X, Y, X-Y).
second( _-Y, Y).

newlist( Idxs, Vals, R) :- 
     maplist( pair_up, Idxs, Vals, L), 
     sort( L, S), 
     maplist( second, S, R).
它独立于索引方案:基于0和1的索引都可以工作

另一个优点是它是线性的(由于排序),不同于重复的
nth
解是二次的


这假设您只是在重新排列顺序,即两个参数列表
Idxs
Vals
的长度相同。

谢谢您的准确简短回答!