2016-12-26 51 views
2

我的問題是: 在學習序言時,我想製作一個NxN數獨求解器。 該解算器將得到輸入像學習序言,數獨求解器

[[1,2,3,4],[3,4,1,2],[2,3,4,1],[4,1,2,3]] 

當他們中的一些可能是變量。求解器必須解決這個數獨。 問題是方式更小:

firstElementsOf([],_). 
    firstElementsOf([[X|_]|Rest2],Y) :- 
     firstElementsOf(Rest2,Y2), 
     append([X],[Y2],NotFlat), 
     flatten(NotFlat,Y). 

這應該是檢查的開始,如果每列有不同的數字。來自firstElementsOfY應該只包含給定行的第一個元素。在舉例:

[1,3,2,4] 

可悲的是,由於追加,它總是增加了一個空的空間的Y列表。 它提供:

[1,3,2,4,_1320] 

問題1:有沒有擺脫_1320的一種方式?

問題2:這是對的嗎?有沒有辦法獲得輸入的第二和第三個元素?

回答

0

問題1:我認爲錯誤是在

firstElementsOf([],_). 

我想應該是

firstElementsOf([],[]). 

題外話:你確定,你不能簡單地寫其他條款如下?

firstElementsOf([[X|_]|Rest2],[X|Y]) :- 
    firstElementsOf(Rest2,Y). 

問題2:我提出了一個更一般的斷言:以下getPosList/3與支持的getPosElem/3

getPosElem([H | _], 1, H). 

getPosElem([_ | T], Pos, H) :- 
    Pos > 1, 
    Pm1 is Pos - 1, 
    getPosElem(T, Pm1, H). 

getPosList([], _, []). 

getPosList([H | T], Pos, [E | L]) :- 
    getPosElem(H, Pos, E), 
    getPosList(T, Pos, L). 

它提取Pos位置的所有元素的列表,所以

getPosList([[1,2,3,4],[3,4,1,2],[2,3,4,1],[4,1,2,3]], 1, L), 

它相當於firstElementOf([[1,2,3,4],[3,4,1,2],[2,3,4,1],[4,1,2,3]], L)和提取[1, 3, 2, 4],

getPosList([[1,2,3,4],[3,4,1,2],[2,3,4,1],[4,1,2,3]], 2, L), 

提取[2, 4, 3, 1]

getPosList([[1,2,3,4],[3,4,1,2],[2,3,4,1],[4,1,2,3]], 3, L), 

提取[3, 1, 4, 2]

getPosList([[1,2,3,4],[3,4,1,2],[2,3,4,1],[4,1,2,3]], 4, L), 

提取[4, 2, 1, 3]

getPosList([[1,2,3,4],[3,4,1,2],[2,3,4,1],[4,1,2,3]], 5, L), 

或多項greather小於5,返回false

+0

對於第一個......它真正的工作......我甚至不明白爲什麼。 – Shuumi

+0

第二......我也可以這樣做......但我也不明白:)讓我看看它以後:) – Shuumi

+0

@Shuumi;答案改進了(用點(2)方案;對於第(1)點中的「爲什麼」,計算一下'[]'是「空列表」,'_'是「一個值」;如果你寫'firstElementsOf ([],_)'你從空列表中強制提取「一個值」(在你的例子中是一個無限變量,_1320) – max66