2012-10-25 70 views
1

我想要一個給定Point和它計算的點列表的函數: (Point - PointofList)的絕對值,列表中的每個點。 到目前爲止我有這個代碼,但我似乎在遞歸部分失敗。Prolog - 遞歸函數Abs /創建新列表

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). 

回答

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). 

的遞歸步驟將添加新的距離遞歸調用之前,只是在遞歸調用的返回統一的第三個參數,當插入此值。

0

本條款absL((X,Y),[],Result) :- Result.嘗試致電結果,至少在接受這種語法的序言中。

因爲@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).