Prolog列表操作

时间:2018-06-04 18:52:10

标签: prolog

我的问题是:

  

编写一个PROLOG程序,给定两个整数INDEXS和VALUES列表,返回一个列表,其第一个元素是存储在与列表VALUES的INDEXS的第一个元素相对应的位置的值。   例如,给定INDXS = [2,1,4,3]和VALUES = [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).

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

3 个答案:

答案 0 :(得分:2)

为了好玩,您还可以使用import certifi import ssl import geopy.geocoders from geopy.geocoders import Nominatim ctx = ssl.create_default_context(cafile=certifi.where()) geopy.geocoders.options.default_ssl_context = ctx nom = Nominatim(scheme = 'http') nom.geocode('Empire State , Manhattan , NY')

定义maplist以将nth_value参数移动到方便的顺序:

nth1

然后:

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

答案 1 :(得分:0)

您接近解决方案。最简单的情况是索引列表为空时。在这种情况下,值列表无关紧要,结果是一个空列表:

values([], _, []).

_匿名变量。它可以被视为一个不关心变量"。如果索引列表不为空,我们需要沿着列表向下走,并且对于每个索引,检索该位置的相应值:

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].

答案 2 :(得分:0)

通过配对索引和值以及排序结果列表,有一个标准技巧可以实现这一点,因为对按词典顺序排序。索引将被排序,值将与它们一起拖动并找到自己在正确的位置:

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 解决方案是二次的。

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