Recursion Prolog中计算koch曲线坐标的递归

Recursion Prolog中计算koch曲线坐标的递归,recursion,prolog,Recursion,Prolog,我必须在Prolog中计算koch曲线的坐标,并且已经得到了一些很好的结果 帮助,使您更容易理解如何将问题分解为更小的问题。 我试着这么做,但没有达到目的。我必须承认,我真的在和递归争吵,不要对我做错的事情耿耿于怀。 我必须编程一条N级的科赫曲线,它应该从(Sx,Sy)开始,到(Ex,Ey)结束 我得到的建议是以以下方式实施: generatelines(N, S, E, Segments) :- segments(S, E, InitialSegments), iterate_level(N,

我必须在Prolog中计算koch曲线的坐标,并且已经得到了一些很好的结果 帮助,使您更容易理解如何将问题分解为更小的问题。 我试着这么做,但没有达到目的。我必须承认,我真的在和递归争吵,不要对我做错的事情耿耿于怀。 我必须编程一条N级的科赫曲线,它应该从(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). 
当我试图计算
段((60,0),(-60,0),X))时,没有
下一级\u段
我得到了正确的四个坐标 起点(60,0)和(-60,0):

有了这对,我想使用辅助谓词
下一级\u段
在例如起点
(60,0)
和终点
(20,0)
之间生成下4个坐标。 当我看到这些痕迹时,我似乎(希望)并没有错 实现,但我无法获得接下来的16个新坐标和 我想问题在于我做递归的方式

也许有人会给我一些建议我做错了什么。
谢谢

我对您的问题域了解不多,但我肯定看到您的代码中有一个问题:

next_level_segments(Ls) :- next_level_segments(Ls,List). 
这里可能会出现一个单例变量“警告”(每个单例变量警告都应被视为Prolog中严重错误的指示)。因此,当Prolog到达这一行时,您将继续计算
段。让我删除一些中间的行以突出问题:

segments((Sx,Sy),(Ex,Ey),Ls):-
    Ls=[...],
    next_level_segments(Ls).

因此,在这一点上,Prolog要证明
段/3
,它所要做的就是看看
下一级段(Ls)
是否成功。因为
next\u level\u segments/1
基本上放弃了
列表的绑定(您可以用
\u
替换),所以这里不会发生任何事情来将该信息传播到任何地方。这可能是你问题的症结所在。你需要得到结果,并用它做点什么。

嗨!谢谢你的回答!我听从了你的建议,但据我所知,不幸的是它没有改变。@claire请编辑你的问题并附加你修改过的代码,这样我就可以看一看它了!我会再试一次,我想我必须重新考虑我的实现。但是谢谢你的时间!!在回答你的问题时,我建议将其分解为不同的谓词。但我注意到,您应该使用“几个不同的谓词,每个谓词都有自己的职责”。你没有这样做。只有一个谓词应该包含所有的数值计算;只有一个(其他)谓词应将这些计算应用于成对的点;只有一个(其他)谓词应该在多个级别上迭代此计算。哦:-(好的,我再次尝试。根据你的建议,这是一次尝试,我想我不是最好的…没关系…我再试一次。谢谢你的回答。
segments((Sx,Sy),(Ex,Ey),Ls):-
    Ls=[...],
    next_level_segments(Ls).