首页 > 解决方案 > 在 Prolog 中,对两个相对于彼此的列表进行排序

问题描述

有没有办法对两个列表进行相对排序

假设我有两个列表如下:

Age = [14,12,17,15].
Name = ["Frank", "Micheal","Paul","Alex"].

Frank 的年龄是 14 岁,而 Alex 的年龄是 15 岁。
我想对 Age 列表进行排序,还希望 Name 列表更改其相对于 Age 列表的顺序。所以,基本上我想在结果中看到的是:

Age = [12, 14, 15, 17]
Name = ["Micheal", "Frank", "Alex", "Paul"].

有什么建议么?

标签: listprolog

解决方案


您可以将它们映射到单个关联列表,排序,然后取消映射:

associate(X, Y, X-Y).

sort_age_name(Ages, Names, SortedAges, SortedNames) :-
    maplist(associate, Ages, Names, AgesNames),
    msort(AgesNames, SortedAgesNames),
    maplist(associate, SortedAges, SortedNames, SortedAgesNames).

第一次maplist调用将这两个列表与一个列表相关联,其中每个元素是Age-Name,具有关联名称的年龄。您可以将其视为将两个列表“压缩”在一起。

msort调用按年龄对年龄-姓名关联列表进行排序。

第二个maplist调用将两个单独的列表与排序的关联列表相关联。它基本上将关联列表“解压缩”到组件列表中。

由于您在两个列表之间具有这种关联,因此如果它们是一个单一的关联列表开始是有意义的。将它们分开更麻烦。


推荐阅读