2013-02-16 2 views
2

저는 프롤로그에서 미니 스도쿠 해결사를 쓰고 있습니다. 스도쿠는 4x4 필드로 구성됩니다 (예 :프롤로그 모호한 출력

_ _ 2 3 
_ _ _ _ 
_ _ _ _ 
3 4 _ _ 

스도쿠에는 (위의 스도쿠처럼) 가능한 해결책이 하나만 있다면 내 프로그램이 예상대로 작동합니다. I는 갭을 적어도 하나 개의 소정 필드를 대체한다면 (_하여 4로 대체함으로써 예) 프롤로그의 출력은 다음과 같다 :

[_#3(1:4),_#23(1:4),2,3..... 

I "는 _ # 3 (1 : 4)"추측 수단 " 1 또는 4 "걸리지 만 각 솔루션을 구분 된 모호하지 않은 목록으로 원합니다.

sudoku([_,_,2,3,_,_,_,_,_,_,_,_,3,_,_,_],Sol). 

내가 잘못 뭐하는 거지 : 나는은 GNU 프롤로그로로드 할 때

sudoku(Puzzle,Solution):- 
     Puzzle=Solution, 
     fd_domain(Solution,1,4), 

     Puzzle=[S11,S12,S13,S14, 
      S21,S22,S23,S24, 
      S31,S32,S33,S34, 
      S41,S42,S43,S44], 

     fd_all_different([S11,S12,S13,S14]), 
     fd_all_different([S21,S22,S23,S24]), 
     fd_all_different([S31,S32,S33,S34]), 
     fd_all_different([S41,S42,S43,S44]), 

     fd_all_different([S11,S21,S31,S41]), 
     fd_all_different([S12,S22,S32,S42]), 
     fd_all_different([S13,S23,S33,S43]), 
     fd_all_different([S14,S24,S34,S44]), 

     fd_all_different([S11,S12,S21,S22]), 
     fd_all_different([S13,S14,S23,S24]), 
     fd_all_different([S31,S32,S41,S42]), 
     fd_all_different([S33,S34,S43,S44]). 

, 나는 다음과 같은 쿼리를 입력 : 이것은 내 코드?

답변

1

Prolog가 잔류 물을 보여주는 여러 솔루션에 대해 조언하고 있습니다. 저장시 제약 조건이입니다. 레이블에 변수가 있어야합니다 (예 : 엔진이 유효한 값을 열거하도록 허용).

?- sudoku([_,_,2,3,_,_,_,_,_,_,_,_,3,_,_,_],Sol),fd_labeling(Sol). 

Sol = [1,4,2,3,2,3,1,4,4,1,3,2,3,2,4,1] ? ; 

Sol = [1,4,2,3,2,3,1,4,4,2,3,1,3,1,4,2] ? ; 

Sol = [1,4,2,3,2,3,4,1,4,1,3,2,3,2,1,4] ? ; 

Sol = [4,1,2,3,2,3,1,4,1,4,3,2,3,2,4,1] ? ; 

Sol = [4,1,2,3,2,3,4,1,1,2,3,4,3,4,1,2] ? ; 

Sol = [4,1,2,3,2,3,4,1,1,4,3,2,3,2,1,4] 
+0

내 코드에서 FD 함수를 사용할 때 FD 값이 일반 프롤로그 값과 다른 방식으로 표현되므로 항상 fd_labeling을 적용해야합니다. – Elayn

+0

예. 그것은 아프지 않습니다. 이미 경험했듯이 제약 조건이 충분히 '강력'할 때 솔루션은 이미 '사용 가능'합니다. – CapelliC

+0

고맙습니다. n_n – Elayn