2014-11-24 42 views
-1

我試圖解決SWI-Prolog的一個9x9的數獨謎題,序言:「假」的查詢

我給出的查詢是空的數獨,但它不會給任何錯誤它只是陳述「錯誤」。

代碼也編譯正確。

我的代碼如下所示:

:- use_module(library(clpfd)). 

valid([]). 
valid([Head|Tail]) :- 
    all_different(Head), 
    valid(Tail). 

sudoku(Puzzle, Solution) :- 
    Solution = Puzzle, 
    Puzzle = [S11, S12, S13, S14, S15, S16, S17, S18, S19, 
      S21, S22, S23, S24, S25, S26, S27, S28, S29, 
      S31, S32, S33, S34, S35, S36, S37, S38, S39, 
      S41, S42, S43, S44, S45, S46, S47, S48, S49, 
      S51, S52, S53, S54, S55, S56, S57, S58, S59, 
      S61, S62, S63, S64, S65, S66, S67, S68, S69, 
      S71, S72, S73, S74, S75, S76, S77, S78, S79, 
      S81, S82, S83, S84, S85, S86, S87, S88, S89, 
      S91, S92, S93, S94, S95, S96, S97, S98, S99],   

    Puzzle ins 1..9, 

    Row1 = [S11, S12, S13, S14, S15, S16, S17, S18, S19], 
    Row2 = [S21, S22, S23, S24, S25, S26, S27, S28, S29], 
    Row3 = [S31, S32, S33, S34, S35, S36, S37, S38, S39], 
    Row4 = [S41, S42, S43, S44, S45, S46, S47, S48, S49], 
    Row5 = [S51, S52, S53, S54, S55, S56, S57, S58, S59], 
    Row6 = [S61, S62, S63, S64, S65, S66, S67, S68, S69], 
    Row7 = [S71, S72, S73, S74, S75, S76, S77, S78, S79], 
    Row8 = [S81, S82, S83, S84, S85, S86, S87, S88, S89], 
    Row9 = [S91, S92, S93, S94, S95, S96, S97, S98, S99], 

    Col1 = [S11, S21, S31, S41, S51, S61, S71, S81, S91], 
    Col2 = [S21, S22, S32, S42, S52, S62, S72, S82, S92], 
    Col3 = [S31, S32, S33, S43, S53, S63, S73, S83, S93], 
    Col4 = [S41, S42, S43, S44, S54, S64, S74, S84, S94], 
    Col5 = [S51, S52, S53, S54, S55, S65, S75, S85, S95], 
    Col6 = [S61, S62, S63, S64, S65, S66, S76, S86, S96], 
    Col7 = [S71, S72, S73, S74, S75, S76, S77, S87, S97], 
    Col8 = [S81, S82, S83, S84, S85, S86, S87, S88, S98], 
    Col9 = [S91, S92, S93, S94, S95, S96, S97, S98, S99], 

    Square1 = [S11, S12, S13, S21, S22, S23, S31, S32, S33], 
    Square2 = [S14, S15, S16, S24, S25, S26, S34, S35, S36], 
    Square3 = [S17, S18, S19, S27, S28, S29, S37, S38, S39], 
    Square4 = [S41, S42, S43, S51, S52, S53, S61, S62, S63], 
    Square5 = [S44, S45, S46, S54, S55, S56, S64, S65, S66], 
    Square6 = [S47, S48, S49, S57, S58, S59, S67, S68, S69], 
    Square7 = [S71, S72, S73, S81, S82, S83, S91, S92, S93], 
    Square8 = [S74, S75, S76, S84, S85, S86, S94, S95, S96], 
    Square9 = [S77, S78, S79, S87, S88, S89, S97, S98, S99], 

    valid([Row1, Row2, Row3, Row4, Row5, Row6, Row7, Row8, Row9, 
     Col1, Col2, Col3, Col4, Col5, Col6, Col7, Col8, Col9, 
     Square1, Square2, Square3, Square4, Square5, Square6, Square7, Square8, Square9]). 

和我的查詢是這樣的:

sudoku([_, 9, 6, 8, 5, 1, _, 4, _, 
      1, _, 8, 2, 9, 4, 3, 5, 6, 
      5, 2, _, 6, _, _, 8, _, 1, 
      9, _, 5, _, 8, 7, 2, 6, 3, 
      4, 8, 3, 9, _, 6, 5, _, 7, 
      _, 6, 7, 3, 1, _, 9, 8, 4, 
      6, 5, _, 1, 3, 8, _, 7, 9, 
      7, 4, 9, 5, 6, 2, 1, _, 8, 
      _, 3, 1, 7, _, 9, _, 2, 5], 
Solution). 

我reviewd代碼無數的時間,不知道爲什麼它不返回true。

謝謝

+0

也許這個實例是不可解的。嘗試放鬆架構,將其他號碼改爲'_' – CapelliC 2014-11-24 14:19:04

+0

@CapelliC我很確定它是可以解決的。你認爲我的查詢格式可能是錯誤的,因此它給我「錯誤」回來? – marcusvbb 2014-11-24 14:31:02

+0

'Colx'變量是錯誤的。他們應該註冊'Col2 = [S12,S22,S32 ...]'但爲什麼不'maplist(all_different,Puzzle),轉置(Puzzle,T),maplist(all_different,T)....' – false 2014-11-24 15:00:26

回答

1

想想你的拷貝/粘貼在ColX中的速度太快了。第一位和第二位數字在很多情況下都被切換。試試這個:

Col1 = [S11, S21, S31, S41, S51, S61, S71, S81, S91], 
    Col2 = [S12, S22, S32, S42, S52, S62, S72, S82, S92], 
    Col3 = [S13, S23, S33, S43, S53, S63, S73, S83, S93], 
    Col4 = [S14, S24, S34, S44, S54, S64, S74, S84, S94], 
    Col5 = [S15, S25, S35, S45, S55, S65, S75, S85, S95], 
    Col6 = [S16, S26, S36, S46, S56, S66, S76, S86, S96], 
    Col7 = [S17, S27, S37, S47, S57, S67, S77, S87, S97], 
    Col8 = [S18, S28, S38, S48, S58, S68, S78, S88, S98], 
    Col9 = [S19, S29, S39, S49, S59, S69, S79, S89, S99], 

?- sudoku([_, 9, 6, 8, 5, 1, _, 4, _, 
      1, _, 8, 2, 9, 4, 3, 5, 6, 
      5, 2, _, 6, _, _, 8, _, 1, 
      9, _, 5, _, 8, 7, 2, 6, 3, 
      4, 8, 3, 9, _, 6, 5, _, 7, 
      _, 6, 7, 3, 1, _, 9, 8, 4, 
      6, 5, _, 1, 3, 8, _, 7, 9, 
      7, 4, 9, 5, 6, 2, 1, _, 8, 
      _, 3, 1, 7, _, 9, _, 2, 5], 
Solution). 
Solution = [3, 9, 6, 8, 5, 1, 7, 4, 2|...]. 
+0

謝謝許多!是的,當這個想法開始流動時,我非常興奮......而且在經常看到它之後,我猜想我會遐想,並且看不到數字。 – marcusvbb 2014-11-24 15:41:25