Prolog - 排序结果但逐个返回

时间:2017-03-23 10:47:05

标签: sorting prolog

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

我有一个谓词route_with_total_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/3bagof/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] ;
...
...

怎么做?

1 个答案:

答案 0 :(得分:2)

如果通过“逐一”表示回溯,则可以使用member/2

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