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

再帰ステップは、再帰呼び出しの前に新しい距離を追加し、再帰呼び出しの戻り時に3番目の引数を統合するときにこの値を挿入するだけです。

于 2012-10-25T15:47:01.387 に答える
0

この句は、少なくともそのような構文を受け入れるプロローグでは、Resultを呼び出そ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).
于 2012-10-25T18:06:25.527 に答える