prolog 根据每个元素的子列表对列表进行排序

时间:2021-01-29 17:15:40

标签: prolog

我在序言中有一个带有列表的任务,在其他任何事情之前,我必须根据第二个元素对列表进行排序。 该列表是一个代码,例如,这个 [(a,[1,0]),(x,[0,0]),(d,[0,1])] 必须是 [(x,[0,0]),(d,[0,1]),(a,[1,0])],因为它是基于二进制代码排序的。现在我只是使用 sort/2 但它根据第一个字符对列表进行排序,例如 [(a,[1,0]),(d,[0,1]),(x,[0,0])] 这是错误的。 我对 prolog 没有经验,所以也许有一种方法可以使用 sort/2 来做到这一点,但我不知道?

我还看到另一个关于此建议的问题:

compareAvg(X,  [_,A1], [_,A2]) :- compare(X, A1, A2).

then you can call

predsort(compareAvg, [[1,2],[3,1],[5,3]],X).

但我的列表大小不一,所以我不知道如何使用它。

2 个答案:

答案 0 :(得分:2)

您可以使用 sort/4 谓词:

sort(2, @=<, Input, SortedOutput).

示例:

?- sort(2, @=<, [(a,[1,0]),(x,[0,0]),(d,[0,1])], Sorted).
Sorted = [(x, [0, 0]),  (d, [0, 1]),  (a, [1, 0])].

?- sort(2, @=<, [(a,[1,0,1]),(x,[0,0,1]),(d,[0,1,0])], Sorted).
Sorted = [(x, [0, 0, 1]),  (d, [0, 1, 0]),  (a, [1, 0, 1])].

答案 1 :(得分:0)

你可以试试

compareAvg(X,  [_,A1 | _], [_,A2 | _]) :- compare(X, A1, A2).
相关问题