序言根据每个元素的子列表对列表进行排序
prolog sorting a list based on the sublist of each element
我在 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).
但是我的列表大小不一,所以我不知道如何使用它。
您可以使用 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])].
你可以试试
compareAvg(X, [_,A1 | _], [_,A2 | _]) :- compare(X, A1, A2).
我在 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).
但是我的列表大小不一,所以我不知道如何使用它。
您可以使用 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])].
你可以试试
compareAvg(X, [_,A1 | _], [_,A2 | _]) :- compare(X, A1, A2).