2017-01-01 6 views
2

프롤로그에서 제약 프로그래밍과 재귀 프로그래밍에 대해 배우고 있습니다. 나는 (Sx,Sy)에서 시작하여 (Ex,Ey)에 끝나야하는 Level N의 koch-curve를 프로그래밍해야합니다. 계산되는 라인 세그먼트는 L에 저장됩니다. 내가 generatelines(2,(60,0),(-60,0),Ls)을 실행하려고하면프롤로그 - 코흐 곡선의 좌표 계산

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

, 그럼 내가 다음 시작 사이 모든 좌표를 얻을 : 나는 generatelines(1,(60,0),(-60,0),Ls)을 실행하려고하면
, 내가 바로에게 레벨 1의 코흐 곡선의 4 개 좌표를 얻을 (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). 

것은 어쩌면 여기 저기 사람입니다이 문제를 해결 도와주세요.
감사

이 지금까지 내가 가지고있는 코드 :

- 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

당신은 하나의 술어에, 너무 한 번에 할 노력하고 있습니다. 다른 많은 프로그래밍 언어들에서는 너무 쉽게 옮겨서 하나의 함수 나 메소드에 넣는 것이 쉽습니다. 그것은 스타일 문제이지만 작동 할 수 있습니다. 프롤로그에서는 다른 언어와 같은 루프가 없기 때문에 보조 술어 없이는 많은 것을 표현할 수 없습니다.

여기서 중요한 몇 가지 별개의 술어로 프로그램을 분해하는 것입니다

자신의 책임을 각각이 같은 :

  • segments(S, E, Ls) 목록 시작 사이 네 "첫 번째 수준"선분의 Ls을 계산 및 종점 S 선분 Segments[P, Q] 각각의리스트를 취하고, 종점 P를 각각 같은 쌍의 세그먼트 "다음 단계"목록을 생성 E
  • next_level_segments(Segments, RefinedSegments)을 당신이이 보조 술어를 정의해야 물론

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

    ,하지만 당신의 숙제입니다 다음 next_level_segments 작업을 N 시간

귀하의 최종 술어를 반복 할 D Q

  • iterate_level(N, InitialSegments, FinalSegments) 간단히이다.

    실제로는 clpfd 라이브러리를 사용하고 있지 않습니다.

  • +0

    답변 해 주셔서 감사합니다. 귀하의 조언을 시도했지만 여전히 문제가 :-( – claire