2011-06-26 38 views
2

我是Prolog的新手。我正在編寫Prolog代碼來解決一個難題,它需要我在二維數字網格中找到重複項。使用Prolog在網格中查找同一行和列中的副本


我的輸入是這樣的:

grid(1,1,1). 
grid(2,1,2). 
grid(2,1,3). 
grid(5,1,4). 
grid(3,2,1). 
grid(4,2,2). 
grid(5,2,3). 
grid(9,2,4). 
grid(6,3,1). 
grid(7,3,2). 
grid(2,3,3). 
grid(8,3,4). 
grid(4,4,1). 
grid(5,4,2). 
grid(1,4,3). 
grid(3,4,4). 


代表矩陣:

1 2 2 5 
3 4 5 9 
6 7 2 8 
4 5 1 3 


我試圖像被東西代碼:

finddup(N,X,Y):- 
     a is X, b is Y, 
     print('Rule 1 \n'), 
     ((grid(N,U,1), U \= a, print('U->'), write(U), print('\n'), print('X->'), write(a)); 
     (grid(N,1,U), U \= b, print('U->'), write(U), print('\n'), print('Y->'), write(b)); 
     (grid(N,U,4), U \= a, print('U->'), write(U), print('\n'), print('X->'), write(a)); 
     grid(N,4,U), U \= b, print('U->'), write(U), print('\n'), print('Y->'), write(b))); 
     print('Rule 2 \n'), 
     ((finddup(N,X-1,Y), X-1 >= 1, X-1 =< 4, Y >= 1, Y =< 4); 
     (finddup(N,X+1,Y), X+1 >= 1, X+1 =< 4, Y >= 1, Y =< 4); 
     (finddup(N,X,Y-1), X >= 1, X =< 4, Y-1 >= 1, Y-1 =< 4); 
     (finddup(N,X,Y+1), X >= 1, X =< 4, Y+1 >= 1, Y+1 =< 4)). 


請幫助我o UT傢伙...我一直在嘗試這一點,因爲一兩個星期......


感謝,
維卡斯

+0

我不明白。矩陣由第一列表示,對嗎?其他專欄的目的是什麼?你叫什麼重複?你對你的輸入例子有什麼期望? – Ravan

+0

我的i/p是上面規定的網格。我的o/p應該是,如果我查詢finddup(1,1,1)。應該返回false ...類似finddup(2,1,3)。必須返回TRUE,因爲在同一行和列中出現另一個2(grid(2,1,2)和grid(2,3,3)。 –

+0

也許你想重新表達一下你的問題。爲什麼你想要檢測重複?我懷疑你最終想要把矩陣作爲一個大的術語 – false

回答

2

您不必因爲嘗試並指定行和列索引的範圍它們已經在網格(..)事實中明確給出。讓Prolog回溯價值觀。

finddup(N,R,C) :- 
    grid(N,R,C), 
    grid(N,R,C2), C \= C2, 
    grid(N,R2,C), R \= R2. 

grid(N,R,C)將驗證所述給定值是在網格,或者它將在回溯所有可能的組合,如果N,R,C的任何(或全部)沒有值。

grid(N,R,C2), C \= C2,會發現在同一行中的另一列具有相同的N.

同樣爲grid(N,R2,C), R \= R2 - 但對於另一行。

這將返回一個真實的任何重複它發現,但可能會返回一個假之後,因爲最後一次回溯可能會失敗。例如:

?- finddup(N,R,C). 
N = 2, 
R = 1, 
C = 3 ; 
false. 

?- finddup(2,1,3). 
true ; 
false. 

?- 

(其中分號用戶輸入)

您可以在末尾加上切停止任何進一步回溯一旦解決方案已被發現:

finddup(N,R,C) :- 
    grid(N,R,C), 
    grid(N,R,C2), C \= C2, 
    grid(N,R2,C), R \= R2, !. 

?- finddup(N,R,C). 
N = 2, 
R = 1, 
C = 3. 

?- finddup(2,1,3). 
true. 

?- 
+0

感謝尼克...你搖滾的傢伙....真的很感謝你的幫助... –

+0

@Vikas Upendra:如果尼克回答你的問題,不要忘記接受他的回答,或者如果有些事情還沒有解決,請發表評論。 – hardmath