计算koch曲线坐标时Prolog的递归

时间:2017-01-05 19:08:55

标签: recursion prolog

我必须计算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个新坐标和 我想问题就是我进行递归的方式。

也许有人可能会给我一些建议,说明我做错了什么。 感谢

1 个答案:

答案 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的绑定(您可以将其替换为_),所以此处没有任何内容可以将该信息传播到任何地方。这可能是你问题的坚果。你需要得到结果并用它做点什么。