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
之间的参数解包。这是一个非常有用的习惯用法,用于处理列表中成对的连续元素。