我的问题是:
编写一个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中显示我的新列表。我该怎么做? (我已经尝试过打印它了。
答案 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
解决方案是二次的。
这假设您只是重新排列序列,即两个参数列表Idxs
和Vals
的长度相同。