Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/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
Prolog 河内塔(河内塔)_Prolog_Towers Of Hanoi - Fatal编程技术网

Prolog 河内塔(河内塔)

Prolog 河内塔(河内塔),prolog,towers-of-hanoi,Prolog,Towers Of Hanoi,我正在尝试解决河内塔问题,目前为止我已经尝试过: move(1,[H|T],B,C,A1,B1,C) :- A1 = T, B1 = [H|B]. move(N,A,B,C,A1,B1,C) :- N>1, M is N-1, move(M,[H|T],C,B,A1,B1,C), move(1,[H|T],B,_,A1,B1,C), move(M,C,B,[H|T],A1,B1,C). 但这段代码不起作用,我需要得到的结果如下: ?-move(3,[1,2,3],[

我正在尝试解决河内塔问题,目前为止我已经尝试过:

move(1,[H|T],B,C,A1,B1,C) :-  
  A1 = T,
  B1 = [H|B].
move(N,A,B,C,A1,B1,C) :- 
N>1, 
M is N-1, 
move(M,[H|T],C,B,A1,B1,C), 
move(1,[H|T],B,_,A1,B1,C), 
move(M,C,B,[H|T],A1,B1,C).
但这段代码不起作用,我需要得到的结果如下:

?-move(3,[1,2,3],[],[],A1,B1,C).
  and the results:
  A1=[].
  B1=[1,2,3]
  C=[].
有人能帮我修改一下代码,然后得到这样的结果吗?这对我很重要,我真的需要帮助。 这就是我所做的,但有一些问题:

move(N,[H|T],[],[],A1,B1,C) :-
      N > 1,
      M is N - 1,   
      move(N,[H|M],[H|_],[],A1,B1,C),
      move(M,[_|M],[H|_],[H|_],A1,B1,C),
      move(M,[_|M],[],[H|T],A1,B1,C),
      move(M,[],[_|T],[H|T],A1,B1,C),
      move(M,[H|_],[_|T],[H|T],A1,B1,C),
      move(M,[H|_],[_|T],[],A1,B1,C),
      move(M,[],[H|T],[],A1,B1,C).
      move(N,[H|T],[],[]) :- write(A1), nl,
                             write(B1), nl,
                             write(C).

这是解决河内塔楼问题的逐条指令

   move(1,X,Y,_) :-  
        write('Move top disk from '), 
        write(X), 
        write(' to '), 
        write(Y), 
        nl. 
    move(N,X,Y,Z) :- 
        N>1, 
        M is N-1, 
        move(M,X,Z,Y), 
        move(1,X,Y,_), 
        move(M,Z,Y,X).
以这样的方式解决问题:在逐条指令的解决方案中,我们不会更改X、Y或Z的内容。但在您的问题中,您最终会更改它们的内容

更新: 由于声明这不是家庭作业问题,以下是完整答案:

towersOfHanoi(N,A,B,C,A4,B4,C4) :- move(N,A,B,C,A4,B4,C4),!.

move(1,[H|T],B,C,A1,B1,C1) :-  A1 = T,
                               B1 = [H|B],
                               C1 = C.
move(N,A,B,C,A4,B4,C4) :-   N>1, 
                            M is N-1, 
                            move(M,A,C,B,A1,C1,B1), 
                            move(1,A1,B1,C1,A2,B2,C2), 
                            move(M,C2,B2,A2,C4,B4,A4).

这是解决河内塔楼问题的逐条指令

   move(1,X,Y,_) :-  
        write('Move top disk from '), 
        write(X), 
        write(' to '), 
        write(Y), 
        nl. 
    move(N,X,Y,Z) :- 
        N>1, 
        M is N-1, 
        move(M,X,Z,Y), 
        move(1,X,Y,_), 
        move(M,Z,Y,X).
以这样的方式解决问题:在逐条指令的解决方案中,我们不会更改X、Y或Z的内容。但在您的问题中,您最终会更改它们的内容

更新: 由于声明这不是家庭作业问题,以下是完整答案:

towersOfHanoi(N,A,B,C,A4,B4,C4) :- move(N,A,B,C,A4,B4,C4),!.

move(1,[H|T],B,C,A1,B1,C1) :-  A1 = T,
                               B1 = [H|B],
                               C1 = C.
move(N,A,B,C,A4,B4,C4) :-   N>1, 
                            M is N-1, 
                            move(M,A,C,B,A1,C1,B1), 
                            move(1,A1,B1,C1,A2,B2,C2), 
                            move(M,C2,B2,A2,C4,B4,A4).

对不起,我把它标错了,这不是作业,是过去考试的一道题。如果你能给我完整的答案,我下周就要考试了。很抱歉,我想我可以用我的方式,但我不知道哪里错了,因为我只是按照步骤写代码。你的错误点不是通过A1、B1、C1改变A、B、C的内容。如果您正在列出要执行的操作,那么就可以了。但是如果你像我一样实现解算器,你需要改变列表的内容。没错,但是我的方法太完整了。另一个问题是在上面的这个问题之后。@user1400451太完整是什么意思?顺便说一句,我不在乎别的问题,因为你只给了我一道,也只给了我一道。对不起,我把它标错了,这不是家庭作业,是上次考试的一道题。如果你能给我完整的答案,我下周就要考试了。很抱歉,我想我可以用我的方式,但我不知道哪里错了,因为我只是按照步骤写代码。你的错误点不是通过A1、B1、C1改变A、B、C的内容。如果您正在列出要执行的操作,那么就可以了。但是如果你像我一样实现解算器,你需要改变列表的内容。没错,但是我的方法太完整了。另一个问题是在上面的这个问题之后。@user1400451太完整是什么意思?顺便说一句,我不在乎别的问题,因为你只给了我一个,也只给了我一个。