2017-01-01 13 views
2

私は制約プログラミングと再帰プログラミングについて学んでいます Prolog。私は(Sx,Sy)で始まり、(Ex,Ey)で終わるレベルNのコッホ曲線をプログラムする必要があります。計算されている線分はLsに格納されます。
私はgeneratelines(1,(60,0),(-60,0),Ls)を実行しようとすると、私はレベル1のコッホ曲線の右4点の 座標取得:私はgeneratelines(2,(60,0),(-60,0),Ls)を実行しようとすると、その後、私は次のスタートの間 すべての座標を取得Prolog - Koch-curveの座標を計算する

[[ (60, 0), (20, 0)], 
[ (20, 0), (0.0, -34.64)], 
[ (0.0, -34.64), (-20, 0)], 
[ (-20, 0), (-60, 0)]] 

(60,0)およびエンドポイント(20,0)

(20, 0), (0.0, -34.64), 
(0.0, -34.64), (-20, 0), 
(-20, 0), (-60, 0) 

すぎ: は、しかし、私はしても、次のスタートとエンドポイント間のすべての座標を必要とします。

私の問題は、実装する方法がわからないので、より高いレベルの座標 を得ることです。
実際に私は次のように起こるべきだと思う:

generatelines(N1,(60,0),(20,0),Ls1) 
generatelines(N1,(20,0),(0,-34.64),Ls1) 
generatelines(N1,(0,-34.64),(-20,0),Ls1) 
generatelines(N1,(-20,0),(-60,0),Ls1). 

はたぶん、この問題を解決する私を助けるために誰かここにはあります。あなたは1つの述語で、一度にあまりにも多くをやろうとしている

- consult(library(clpfd)). 
generatelines(0,_,_,Ls):- !. 
generatelines(N, (Sx,Sy),(Ex,Ey),[Ls|Ls1]):- 
N1 is N-1, 

X2 is Sx+(Ex-Sx)/3, 
Y2 is Sy+(Ey-Sy)/3, 
R1 is sqrt((X2-Sx)*(X2-Sx)+(Y2-Ey)*(Y2-Ey)), 
Phi1 is atan((Y2-Sy)/(X2-Sx)), 
X3 is X2 +R1*cos((Phi1-240)*pi/180), 
Y3 is Y2 +R1*sin((Phi1+240)*pi/180), 
X4 is X2+(X2-Sx), 
Y4 is Y2+(Y2-Sy), 
Ls = [ 
     [(Sx,Sy),(X2,Y2)], 
     [(X2,Y2),(X3,Y3)], 
     [(X3,Y3),(X4,Y4)], 
     [(X4,Y4),(Ex,Ey)] 
    ], 
generatelines(N1,(Sx,Sy),(X2,Y2),Ls1). 

答えて

1


感謝

は、これは私が今まで持っているコードです。他の多くのプログラミング言語では、1つの関数やメソッドに疎外されすぎてしまいがちです。それはスタイルの問題ですが、うまくいくことができます。 Prologでは、基本的に他の言語のようなループがないため、多くのことを補助述語なしで表現することはできません。

ここで重要なのは、いくつかの異なる述語にあなたのプログラムを分解することである

自身の責任とそれぞれ、このような何か:

  • segments(S, E, Ls)リストの開始との間に4つの「第一レベル」ラインセグメントのLsを計算します線分Segments、フォーム[P, Q]の各々のリストを取り、そしてエンドポイントP ANのような各対の間のセグメントの「次のレベル」リストを生成し、エンドポイントSE
  • next_level_segments(Segments, RefinedSegments)next_level_segments操作N

最終的な述語は、単に、その後で繰り返し処理D Q

  • iterate_level(N, InitialSegments, FinalSegments)た:もちろん

    generatelines(N, S, E, Segments) :- 
        segments(S, E, InitialSegments), 
        iterate_level(N, InitialSegments, Segments). 
    

    あなたはこれらの補助述語を定義する必要があり、それはあなたの宿題です。

    実際にはclpfdライブラリを使用していないことにも注意してください。

  • +0

    お返事ありがとうございます!あなたのアドバイスを試みたが、まだ問題がある:-( – claire

    関連する問題