Prolog总和的计算

时间:2013-05-06 09:39:05

标签: prolog

我有一些笛卡尔坐标定义:

point(a, 5, 1).
point(b, 4, 2).
point(c, 3, 3).
point(d, 2, 4).

和“路线”定义:

route(path1, [a, c, b, d]).

然后我有一个函数来计算两点之间的距离,如下所示:

distance(P1, P2, D):-point(P1, X1, Y1), point(P2, X2, Y2),
 Z is ((X2-X1)*(X2-X1))+((Y1-Y2)*(Y1-Y2)),
 Z >= 0,
 D is sqrt(Z).

如何计算路线的全程?

另外,如果我有几条路线,我怎样才能找到最长的路线?

1 个答案:

答案 0 :(得分:1)

编辑:现在应该是正确的

首先,使用您提供的距离函数找到给定路线的长度:

path_len(Path, D) :- route(Path, [First|Points]), path_len(Points, First, 0, D).

path_len([], _Last, Dist, Dist).
path_len([P|Points], Prev, DAcc, Dist) :-
    distance(Prev, P, D),
    NDAcc is DAcc+D,
    path_len(Points, P, NDAcc, Dist).

其中 DAcc 是到目前为止距离的累加器(用0初始化)。您可以使用

进行查询
?- path_len(path1, D).

如果您已经定义了多条路线(我能正确理解吗?),path_len/2将通过回溯来计算所有路线的总距离。然后,您可以构建距离 - 路径对并使用keysort/2对它们进行排序,并使用reverse/2将最后一个放在第一位:

longest_path(Path, Dist) :-
    bagof(D-P, path_len(P, D), DPPairs),
    keysort(DPPairs, Sorted),
    reverse(Sorted, [Dist-Path|_]).

您也可以在谓词定义的最后一行使用last/2而不是reverse/2

last(Sorted, Dist-Path).