我想要一个给出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).
答案 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).