我必须计算Prolog中koch曲线的坐标,并且已经得到了一些好的和好的 帮助here真正使人们更容易理解如何将问题分解为更小的问题。 我试图这样做,但没有那么远。我必须承认,我真的和递归争吵,并且不会落后于我做错的事情。 我必须编制一个N级的koch曲线,它应该从(Sx,Sy)开始,到(Ex,Ey)结束。
我已经得到的建议是按以下方式进行实施:
generatelines(N, S, E, Segments) :-
segments(S, E, InitialSegments),
iterate_level(N, InitialSegments, Segments).
我开始这样做:
segments(Ls1,Ls):-segments((Sx,Sy),(Ex,Ey),Ls).
segments((Sx,Sy),(Ex,Ey),Ls):-
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)]
],
next_level_segments(Ls).
next_level_segments(Ls):-next_level_segments(Ls,List).
next_level_segments([[(Sx,Sy),(Ex,Ey)]|E],Ls):-
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),
append(Cs,[
[(Sx,Sy),(X2,Y2)],
[(X2,Y2),(X3,Y3)],
[(X3,Y3),(X4,Y4)],
[(X4,Y4),(Ex,Ey)],
Ls ],
next_level_segments(E,Cs).
next_level_segments([],_):-!.
append([],Ls,Ls).
append([X|As],Bs,[X|Cs]):- append(As,Bs,Cs).
当我试图计算segments((60,0),(-60,0),X))
时没有
next_level_segments
我得到了正确的四个坐标
起点(60,0)和(-60,0):
[[ (60, 0), (20, 0)],
[ (20, 0), (0.0, -34.64)],
[ (0.0, -34.64), (-20, 0)],
[ (-20, 0), (-60, 0)]]
对于这些对,我想使用辅助谓词(60,0)
在例如起点(20,0)
和终点next_level_segment
之间生成接下来的4个坐标。
当我看到这条痕迹时,似乎我(希望)并没有错
实施,但我无法获得接下来的16个新坐标和
我想问题就是我进行递归的方式。
也许有人可能会给我一些建议,说明我做错了什么。 感谢
答案 0 :(得分:1)
我对您的问题域名不太了解,但我确实在您的代码中发现了一个问题:
next_level_segments(Ls) :- next_level_segments(Ls,List).
你可能在这里得到一个单例变量“警告”(每个单例变量警告应该被视为Prolog中严重错误的指示!)。因此,当Prolog到达此行时,您将继续评估segments
。让我删除一些干预线以突出问题:
segments((Sx,Sy),(Ex,Ey),Ls):-
Ls=[...],
next_level_segments(Ls).
所以,在这一点上,要让Prolog证明segments/3
,它所要做的就是看next_level_segments(Ls)
是否成功。因为next_level_segments/1
基本上会丢弃List
的绑定(您可以将其替换为_
),所以此处没有任何内容可以将该信息传播到任何地方。这可能是你问题的坚果。你需要得到结果并用它做点什么。