Prolog列表操作
我的问题是: 编写一个PROLOG程序,给定两个整数索引和值列表,返回一个列表,其 first element是存储在与列表值的 first element of INDEXS对应位置的值。 例如,给定INDXS=[2,1,4,3]和value=[2,4,6,8],输出为[4,2,8,6] 到目前为止,我已经做了以下工作: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).
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
的长度相同。谢谢您的准确简短回答!