Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 框架–;Stewart算法在prolog中的实现_Algorithm_Prolog_Towers Of Hanoi - Fatal编程技术网

Algorithm 框架–;Stewart算法在prolog中的实现

Algorithm 框架–;Stewart算法在prolog中的实现,algorithm,prolog,towers-of-hanoi,Algorithm,Prolog,Towers Of Hanoi,我正试图用四个钉子来编写河内塔问题的求解器 %hanoi4(NrOfDisks, From, To, Seged1, Seged2, ListOfSteps) hanoi4(1,From, To, _,_,[From -> To]). hanoi4(Disks,From, To, Seged1, Seged2, ListOfSteps):- Pozitiv is 2*Disks+1, Pozitiv > 0, K is Dis

我正试图用四个钉子来编写河内塔问题的求解器

%hanoi4(NrOfDisks, From, To, Seged1, Seged2, ListOfSteps)

hanoi4(1,From, To, _,_,[From -> To]). 

hanoi4(Disks,From, To, Seged1, Seged2, ListOfSteps):-
   Pozitiv is 2*Disks+1,
   Pozitiv > 0,                 
   K is Disks-round(floor(sqrt(Pozitiv))+1),
   hanoi4(K,From,Seged1,Seged2,To,Steps1),
   hanoi4(Disks-K,From,To,Seged2,Seged1,Steps2),
   append(Steps1,Steps2,Steps),
   hanoi4(K,Seged1,To,From,Seged2,Steps3),
   append(Steps,Steps3,ListOfSteps).
我将2*Disks+1表达式的值放入“Pozitiv”变量中,因为直接在sqrt谓词中写入时出错。(sqrt/1:算术:计算错误:`未定义')
我尝试按照的步骤进行操作。

请注意,在Prolog中,除非显式调用使用
is/2
、CLP(FD)操作和一些数值表达式比较器,否则术语不会作为表达式进行计算。因此
hanoi4(Disks-K,From,To,Seged2,Seged1,Steps2)
不执行
Disks-K的子操作。您需要类似于
Disks1是Disks-K
,后面是
hanoi4(Disks1,From,To,Seged2,Seged1,Steps2)
。我不知道你为什么需要
round(floor(…)
,因为
floor/1
将产生一个整数,
round
在这一点上没有任何作用。我非常感谢你的评论!我纠正了谓词调用,并去掉了ceil+round组合。在那之后,我发现我没有遵循算法的说明。它需要另一个函数来处理底部(n-k)磁盘的情况,因此当我们处理它们时,不会干扰前k个磁盘。现在一切都很好。