2017-04-25 10 views
1

재미있게 Warnsdorf의 규칙을 사용하여 gprolog에서 Knight 's Tour (https://en.wikipedia.org/wiki/Knight%27s_tour) 솔버를 작성하려고 시도했습니다.b-prolog의 표제어를 gprolog로 번역

나는 B-prolog에서 해결책을 제시 한 다른 SO 게시물을 찾았습니다. knight's tour efficient solution.

내 문제는 다음과 같은 섹션 발생 :

:- table warnsdorff(+,+,+,+,+,-,-,min). 
warnsdorff(R, C, X, Y, Visits, NewX, NewY, Score) :- 
    possible_knight_moves(R, C, X, Y, Visits, NewX, NewY), 
    possible_moves_count(R, C, NewX, NewY, [(NewX, NewY) | Visits], Score). 

B-프롤로그 기능은 술어를 상정하고 gprolog하지 않습니다. 테이블 섹션을 gprolog로 변환하는 데 많은 어려움을 겪고 있습니다. 실제로이 함수는 현재 위치에서 이동하여 최소 개의 새 위치에서 가능한 이동 수를 반환합니다 (매듭은 무작위로 선택됩니다).

도움을 주시면 감사하겠습니다. 건배!

+1

"기사의 여행 프롤로그"에 대해 Dr. Google에 문의하십시오. 많은 솔루션이 있습니다. – false

+0

"재미있게"비슷한 질문이 나를이 asignment 생각하고 있습니다 (참조 http://stackoverflow.com/questions/43622353/gprolog-knights-tour-using-warnsdorffs-rule 및 http : // stackoverflow. com/questions/43628413/나이트 - 움직임 - 사용 - 프롤로그) – Rafalon

답변

1

아마도이 문제에 대해 표를 사용하는 것은 과도한 행동 일 수 있습니다. Visits 목록은 이미 해결 중에 수행되므로 memberchk/2를 사용하십시오. 나는 SWI - 프롤로그에서이 솔루션을 얻을 수 (BTW, 테이블 화를 구현됩니다 만, 원래는 연결 코딩을 사용하여 퍼즐을 해결하기 위해 실패) : 당신이 원하는 경우

?- time(knight(8, 8, 1, 1, [], Path))... 
% 19,973 inferences, 0.019 CPU in 0.019 seconds (100% CPU, 1047591 Lips) 
[(1,1),(2,3),(1,5),(2,7),(4,8),(6,7),(8,8),(7,6),(6,8),(8,7),(7,5),(8,3),(7,1),(5,2),(3,1),(1,2),(2,4),(1,6),(2,8),(3,6),(1,7),(3,8),(5,7),(7,8),(8,6),(7,4),(8,2),(6,1),(4,2),(2,1),(1,3),(3,2),(5,1),(6,3),(8,4),(7,2),(5,3),(4,1),(2,2),(1,4),(3,3),(2,5),(4,4),(6,5),(4,6),(3,4),(5,5),(4,3),(6,2),(8,1),(7,3),(5,4),(3,5),(4,7),(2,6),(1,8),(3,7),(4,5),(6,4),(5,6),(7,7),(5,8),(6,6),(8,5)] 

, 내가 Warnsdorff 규칙을 표시 할 수 있습니다 . 나는 최소 수를 얻기 위해 setof/3을 사용했다. possible_knight_moves/7possible_moves_count/6을 합친다.

편집 필요에 따라

는 :

warnsdorff(R, C, X, Y, Visits, NewX_, NewY_) :- 
    setof((Count, NewX, NewY), (
       possible_knight_moves(R, C, X, Y, Visits, NewX, NewY), 
       possible_moves_count(R, C, NewX, NewY, [(NewX, NewY) | Visits], Count) 
     ), [(_, NewX_, NewY_)|_]). 

명확성을 위해, 나는 출력 변수 NewX_, NewY_ 이름을 변경했지만, 그 무관 - 그것은뿐만 아니라 원래의 이름으로 일했다.

+0

나는 동의하지만 코드를 훨씬 더 단순하게 만든다. Warnsdorff 규칙을 보여 주면 감사하겠습니다. 나는 당신이 정한 목표에서 무엇을 사용했는지 알 수 없다. –

+0

아, 그건 아주 간단합니다. 나는 Prolog에서 아침에 2시에 갈 생각이 없다고 생각한다. 나는 not_noight_moves/7이 not 절 (\ New memberchk ((NewX, NewY), Visits))에 이미리스트에있는 NewX와 NewY가 주어 졌을 때 'no'를 반환하는 이상한 문제를 겪고있다. 이것이 발생하기 전에 약 15 번의 반복이 발생합니다. 다른 섹션을 수정 했습니까? –

+0

수정 : 다른 이동을 찾을 수 없어 실패합니다. 내 이전의 코멘트는 어쨌든 전혀 이해가되지 않았다. –