1

我在 Prolog 中有这个列表:

[[13,Audi A3,11.11.2011,75000,berlina,audi,12100,verde pisello,[4wd],3.0000133333333334],[11,santafe,11.11.2011,80000,fuoristrada,audi,2232232,verde pisello,[ Metalizzata,Sedile in Pelle,4wd],7.0000125]]|

我想将此列表排序为子列表的最后一个值,例如我想得到这个结果:

[[11,santafe,11.11.2011,80000,fuoristrada,audi,2232232,verde pisello,[Metalizzata,Sedile in Pelle,4wd], 7.0000125 ],[13,Audi A3,11.11.2011,75000,berlina,audi, 12100,verde pisello,[4wd], 3.0000133333333334 ]]

4

1 回答 1

1

predsort它是你的朋友。那么排序很容易,但卖一辆奥迪verde pisello仍然非常非常困难......

sort_on_last(List, Sorted) :-
    predsort(compare_last, List, Sorted).

compare_last(R, X, Y) :-
    last(X, Xl),
    last(Y, Yl),
    compare(R, Xl, Yl).

尝试一下:

test :- sort_on_last(
        [[11,santafe,'11.11.2011',80000,fuoristrada,audi,2232232,'verde pisello',['Metalizzata','Sedile in Pelle','4wd'],7.0000125],
         [13,'Audi A3','11.11.2011',75000,berlina,audi,12100,'verde pisello',['4wd'],3.0000133333333334]
        ], S),
    maplist(writeln, S).
?- test.
[13,Audi A3,11.11.2011,75000,berlina,audi,12100,verde pisello,[4wd],3.0000133333333334]
[11,santafe,11.11.2011,80000,fuoristrada,audi,2232232,verde pisello,[Metalizzata,Sedile in Pelle,4wd],7.0000125]
true.

predsort/3 的特殊性:它充当 sort/2,从而删除重复项。为了避免这个问题, compare_last/3 可以改变,避免 return =,这样:

compare_last(R, X, Y) :-
    last(X, Xl),
    last(Y, Yl),
    ( Xl < Yl -> R = (<) ; R = (>) ).
于 2012-06-05T10:35:55.470 回答