Prolog计算和

Prolog计算和,prolog,Prolog,我有一些笛卡尔坐标定义: point(a, 5, 1). point(b, 4, 2). point(c, 3, 3). point(d, 2, 4). route(path1, [a, c, b, d]). last(Sorted, Dist-Path). 以及“路线”的定义: point(a, 5, 1). point(b, 4, 2). point(c, 3, 3). point(d, 2, 4). route(path1, [a, c, b, d]). last(Sorted,

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

point(a, 5, 1).
point(b, 4, 2).
point(c, 3, 3).
point(d, 2, 4).
route(path1, [a, c, b, d]).
last(Sorted, Dist-Path).
以及“路线”的定义:

point(a, 5, 1).
point(b, 4, 2).
point(c, 3, 3).
point(d, 2, 4).
route(path1, [a, c, b, d]).
last(Sorted, Dist-Path).
然后我有一个函数来计算两点之间的距离,如下所示:

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).
如何计算路线的全程


此外,如果我有多条路线,如何找到最长的路线?

编辑:现在应该是正确的

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

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\u 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

point(a, 5, 1).
point(b, 4, 2).
point(c, 3, 3).
point(d, 2, 4).
route(path1, [a, c, b, d]).
last(Sorted, Dist-Path).

嗨,鲍里斯,谢谢你抽出时间。我得到的“false”是path_len函数的结果。有什么想法吗?@pvl不客气。请注意并在将来使用
path_len/2
path_len/4
之间的参数解包。这是一个非常有用的习惯用法,用于处理列表中成对的连续元素。