2017-10-08 100 views
0

我有一個6x6數字的矩陣,我正在編寫一個序言代碼,它給出了特定行,列或方塊中的數字。例如:在Prolog中從矩陣生成正方形

0n 1n 2n 3n 4n 5n 
0n [[1,2,3,4,5,6] 
1n [2,3,4,5,6,1] 
2n [3,4,5,6,1,2] 
3n [4,5,6,1,2,3] 
4n [5,6,1,2,3,4] 
5n [6,1,2,3,4,5]] 

我已經有行和列的代碼,這是一樣的東西:

row(1,[A|_],A). 
row(Y,[_|B],X) :- 
    Y-1 is Y1, 
    row(Y1,B,X). 

但現在我卡在如何生成一個3x3正方形。我想用座標來處理,所以第一個參數應該是(1,3),它會給出行1n和列3n的平方,然後矩陣作爲第二個參數,而方形參數作爲第三個參數。 有沒有人有任何提示?我在想我可能不得不再次使用頭部尾部圖案;得到給定的行/列的前三個數字,然後做三次,但我不知道如何或如果這是可能的和有效的。

任何意見,非常感謝!

+0

無需在第一種情況下使用該模式。 Prolog有一個「nth1/3」謂詞。 –

回答

0

首先,你的謂詞來獲得該行,是不是安全的:

row(1,[A|_],A). 
row(Y,[_|B],X) :- 
    Y-1 is Y1, 
    row(Y1,B,X). 

如果我查詢row(0,[1,4,2,5],X).它將會立即陷入到一個死循環,萬一我有row(2,[1,4,2,5]).工作,它會首先給我正確的結果,但當搜索更多答案時進入無限循環。

一個更好的辦法是:

row(1,[A|_],A). 
row(Y,[_|B],X) :- 
    Y > 1, 
    Y-1 is Y1, 
    row(Y1,B,X).

因爲現在Y > 1守衛,你不會執行遞歸如果Y小於或等於1

話雖這麼說,你做的事實無需建設這個謂詞自己:最Prolog的解釋已經有這樣的斷言:nth1/3

nth1(?Index, ?List, ?Elem) 

ElemListIndex的第th個元素時爲true。在1

計數 開始如果你可以認爲這個謂詞存在,你可以使用:

elem(I,J,Matrix,Cell) :- 
    nth1(I,Matrix,Row), 
    nth1(J,Row,Cell). 

哪裏I是行的數量和J我們希望列的數量獲取。

如果它不存在,我建議將您的row/3謂詞重命名爲nth1/3,因爲它是等價的。

如果您想從0開始計數(您的問題的頂部建議),您可以使用nth0/3而不是nth1/3

+0

非常感謝!所以你寫的'elem'謂詞應該給出I,J座標上的一個數字,對嗎? – Rose

+0

@玫瑰:正確。但是你也可以使用它多項修正。例如查詢什麼'I' /'J's的矩陣具有'3',等等。 –