문제

모든 사람은 유명한 하노이 프롤로그를 알고 있습니다

그리고 당신은 그것을 찾을 수 있습니다 여기

그리고 훌륭하지만이 쿼리 이동 (3, 왼쪽, 오른쪽, 중앙)을 작성할 때.

이 결과를 보여주지 않습니다

Move top disk from left to right
Move top disk from left to center
Move top disk from right to center 
Move top disk from left to right 
Move top disk from center to left 
Move top disk from center to right 
Move top disk from left to right 

내가 얻은 것은

Trace: >> RETURN: nl()
Trace: >> RETURN: hanoi(1,left,right,center)
Trace: >> RETURN: hanoi(2,center,right,left)
Trace: >> RETURN: hanoi(3,left,right,center)
True
1 Solution

따라서 결과를 더 나은 방법으로 인쇄 할 수있는 방법과 디스크의 이름을 지정하여 프로그램이 다음과 같은 "왼쪽에서 오른쪽으로 디스크 A 이동"으로 결과를 표시 할 수 있도록 디스크 이름을 지정할 수 있습니다.

많이 물어 보면 미안하지만 신은 프롤로그를 사랑합니다.

도움이 되었습니까?

해결책

우선, 그 결과를 얻기 위해 어떤 프롤로그를 사용하고 있습니까? 디버거가 활성화 된 것 같은 것 같습니다. 강력하게 추천합니다 Swi-Prolog, 올바른 결과를 제공합니다.

디스크의 이름을 지정하려면 그렇습니다. 다음과 같은 것을 고려하십시오.

move([Disc],X,Y,_) :-  
    write('Move disk '),
    write(Disc),
    write(' from '), 
    write(X), 
    write(' to '), 
    write(Y), 
    nl. 
move([Bottom|Rest],Start,Swap,Goal) :- 
    move(Rest,Start,Swap,Goal), 
    move([Bottom],Start,Goal,_), 
    move(Rest,Swap,Goal,Start).

당신이 달릴 때 move([biggest,middle,smallest], left, center, right). 다음과 같은 결과를 얻을 수 있습니다.

Move disk smallest from left to center
Move disk middle from left to right
Move disk smallest from center to right
Move disk biggest from left to right
Move disk smallest from center to right
Move disk middle from center to left
Move disk smallest from right to left

여기서 트릭은 이것이 상향식 알고리즘이라는 것입니다. 본질적으로 다음으로 요약됩니다.

  1. 하단 디스크 위에있는 모든 것을 스왑으로 이동하십시오 (재귀 단계)
  2. 하단 디스크를 목표로 이동하십시오
  3. 스왑에서 목표로 다른 모든 것을 이동하십시오

상향식이기 때문에 가장 바닥 디스크로 시작하여 목록을 제공해야합니다.

다른 팁

편집이 동료 검토 되려면 영원히 걸리기 때문에 여기에 수정을 게시하겠습니다. PESTO가 게시 한 코드에는 버그가 있습니다. 올바른 버전 (약간 더 예쁘게 출력 형식)이 있습니다.

move([Disc],X,_,Y) :-  
    format("Move disk ~w from ~w to ~w\n", [Disc, X, Y]).
move([Bottom|Rest],Start,Swap,Goal) :- 
    move(Rest,Start,Goal,Swap), 
    move([Bottom],Start,_,Goal),
    move(Rest,Swap,Start,Goal).

GNU Prolog에서 확인했습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top