我想要一个给定点的函数,以及它计算的点列表:列表中每个点的 (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).
我想要一个给定点的函数,以及它计算的点列表:列表中每个点的 (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).
您已经错误地定义了基本情况。当点列表中没有更多点时,结果列表应该是一个空列表,但您只是留下一个未实例化的变量:
因此,您的基本情况应为:
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).
递归步骤将在递归调用之前添加新距离,并在递归调用返回时统一第三个参数时插入此值。
这个子句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).