Sorting Prolog-对结果进行排序,但逐个返回

Sorting Prolog-对结果进行排序,但逐个返回,sorting,prolog,Sorting,Prolog,如何在prolog中按列表中的最后一个元素对结果进行排序,但在按时仍会逐个返回结果,而不仅仅是包含所有代码的列表 我有一个谓词route\u和\u total\u dist/3,它返回点a和点B之间的中间路线以及列车和方向的列表。总距离是最后一个元素。例如: ?- route_with_total_dist(alexanderplatz, prinzenstrasse, R). R = [[[alexanderplatz, u2, wittenbergplatz, ruhleben], [wit

如何在prolog中按列表中的最后一个元素对结果进行排序,但在按
时仍会逐个返回结果,而不仅仅是包含所有代码的列表

我有一个谓词
route\u和\u total\u dist/3
,它返回点a和点B之间的中间路线以及列车和方向的列表。总距离是最后一个元素。例如:

?- route_with_total_dist(alexanderplatz, prinzenstrasse, R).
R = [[[alexanderplatz, u2, wittenbergplatz, ruhleben], [wittenbergplatz, u1, prinzenstrasse, 'warschauer strasse']], 11400] ;
R = [[[alexanderplatz, u2, wittenbergplatz, ruhleben], [wittenbergplatz, u3, nollendorfplatz, nollendorfplatz], [nollendorfplatz, u1, prinzenstrasse, 'warschauer strasse']], 11400] ;
R = [[[alexanderplatz, u2, nollendorfplatz, ruhleben], [nollendorfplatz, u1, prinzenstrasse, 'warschauer strasse']], 9800] ;
R = [[[alexanderplatz, u2, nollendorfplatz, ruhleben], [nollendorfplatz, u3, wittenbergplatz, 'krumme lanke'], [wittenbergplatz, u1, prinzenstrasse, 'warschauer strasse']], 11400] ;
R = [[[alexanderplatz, u2, gleisdreieck, ruhleben], [gleisdreieck, u1, prinzenstrasse, 'warschauer strasse']], 6900] ;
R = [[[alexanderplatz, u2, stadtmitte, ruhleben], [stadtmitte, u6, 'hallesches tor', 'alt-mariendorf'], ['hallesches tor', u1, prinzenstrasse, 'warschauer strasse']], 5000] ;
R = [[[alexanderplatz, u8, 'kottbusser tor', hermannstrasse], ['kottbusser tor', u1, prinzenstrasse, uhlandstrasse]], 3900] ;
false.
现在我想按最后一个元素对这些结果进行排序,这是总距离(首先是最短距离),但仍然保留逐个返回的选项。我知道我可以做
findall/3
bagof/3
,然后
sort/2
,但这会给我留下一个巨大的列表,一下子就可以打印出来

在上面的示例中(巧合的是),结果以与我想要的完全相反的顺序打印。预计将是:

R = [[[alexanderplatz, u8, 'kottbusser tor', hermannstrasse], ['kottbusser tor', u1, prinzenstrasse, uhlandstrasse]], 3900] ;
[[[alexanderplatz, u2, stadtmitte, ruhleben], [stadtmitte, u6, 'hallesches tor', 'alt-mariendorf'], ['hallesches tor', u1, prinzenstrasse, 'warschauer strasse']], 5000] ;
R = [[[alexanderplatz, u2, gleisdreieck, ruhleben], [gleisdreieck, u1, prinzenstrasse, 'warschauer strasse']], 6900] ;
...
...
如何做到这一点?

如果说“一个接一个”,你的意思是回溯,你可以使用

如果说“一个接一个”,你的意思是回溯,你可以使用

routes_one_by_one(A, B, R) :- route_with_total_dist(A, B, List), member(R, List).