2012-10-22 101 views
0

我遇到了在我的序言程序中構造列表列表的問題。 我有一個謂詞,它給了我一行單個案例。我必須將該行的所有情況分組並將它們轉換爲列表的列表。我可以很好地訪問它們,但是當我退出時,我會得到的是第一個元素。序言:遞歸列表構造

下面的代碼:

sudoku3to2 :- s3to2(1). 
s3to2(Line) :- 
    Line < 9, 
    Line1 is Line+1, 
    s3getLine(Line,0,[L]), 
    assert(sudoku2(Y,L])), 
    s3to2(Line1). 
s3to2(9). 

s3getLine(Line,X, ,) :- 
    X < 9, 
    X1 is X + 1, 
    sudoku3(Line,X,), 
    s3getLine(Line,X1, ,). 
s3getLine(Line,9,L,L). 

sudoku3/3將在X返回元素,Y座標。當我到達s3getLine(Line,9,L,L)時,我會開始回去。我想保留我收集的所有元素,而不僅僅是第一個元素。而且我真的很難構建正確的謂詞調用。

+0

什麼使我感到困惑:數獨是很難在任何**語言中解決的。爲什麼要開始如此艱鉅的任務?一些基本的列表處理應該更好... – CapelliC

+0

我不是真的解決數獨。我只是用它作爲背景。 sudoku3/3讓我在X,Y的價值。我想把所有這些值都放在一起作爲列表列表:例如[[1],[7],[2],...]等 – Swiftle

+0

我無法解析這個問題。 – NotAUser

回答

0

findall/3是「列表構造函數」更容易理解。

這是一個內置的列出找到的所有解決方案,用指定模式對元素進行整形。這裏的模式真的只是我們感興趣的變量。

我使用between/3來獲得正確排序的矩陣,而不考慮sudoku3規則的順序。

sudoku3(1, 1, a). 
sudoku3(1, 2, b). 

sudoku3(2, 1, c). 
sudoku3(2, 2, d). 

mat(M) :- 
    W = 2, 
    findall(Row, 
    (between(1, W, R), 
    findall(V, (between(1, W, C), sudoku3(R, C, V)), Row) 
    ), M). 

結果:

?- mat(M). 
M = [[a, b], [c, d]]. 

你應該改變W = 9。

HTH