1

我想要一个给定点的函数,以及它计算的点列表:列表中每个点的 (Point - PointofList) 的绝对值。到目前为止我有这段代码,但我似乎在递归部分失败了。

absL((X,Y),[],Result) :- Result.

absL((X,Y),[(X2,Y2)|Z], R) :- ABSX is abs(X-X2),
 ABSY is abs(Y-Y2),
 append([(ABSX,ABSY)], NL, R),
 absL((X,Y),Z,NL).
4

2 回答 2

1

您已经错误地定义了基本情况。当点列表中没有更多点时,结果列表应该是一个空列表,但您只是留下一个未实例化的变量:

因此,您的基本情况应为:

absL((_,_),[],[]).

我将第一个参数留给使用未命名变量的结构,因为基本情况不需要给定点的坐标。

您的递归子句比它应该的要复杂一些。您真的不需要使用append/3来构建结果列表。您可以直接在子句的头部构建列表:

absL((X,Y),[(X2,Y2)|Z], [(ABSX,ABSY)|NL]) :- 
  ABSX is abs(X-X2), 
  ABSY is abs(Y-Y2), 
  absL((X,Y),Z,NL).

递归步骤将在递归调用之前添加新距离,并在递归调用返回时统一第三个参数时插入此值。

于 2012-10-25T15:47:01.387 回答
0

这个子句absL((X,Y),[],Result) :- Result.试图调用Result,至少在接受这种语法的 Prologs 中是这样。

由于@gusbro 已经显示了所需的更正,我将展示一个替代方案:

absL((X,Y), L_In, L_Out) :-
   maplist(absPoint((X,Y), L_In, L_Out).

absPoint((X, Y), (X2,Y2), (ABSX, ABSY)) :-
   ABSX is abs(X-X2), 
   ABSY is abs(Y-Y2).
于 2012-10-25T18:06:25.527 回答