Prolog - 递归函数Abs /创建新列表

时间:2012-10-25 15:39:55

标签: prolog

我想要一个给出Point的函数,以及它计算的点列表: (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).

2 个答案:

答案 0 :(得分: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).

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

答案 1 :(得分:0)

此条款absL((X,Y),[],Result) :- Result.尝试调用结果,至少在接受此类语法的Prolog中。

由于@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).