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 として機能するため、重複を削除します。この問題を回避するために、次のように return =を回避して、compare_last/3 を変更できます。

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