我想@KarolyHorvath想給大家分享的是如何與你試圖解決這個爲自己的任何想法在Prolog中表示板,在一起。在下面我將使用列表表示的列表,內部列表是行和它們的項目符號或原子(單個小寫字母,以保持簡單)。
的問題在某種意義上拉丁方,這需要準確的每個符號之一,在每一行和每一列的推廣。用一個只包含一些新符號的新行和列來拉丁廣場,拉丁廣場中沒有顯示,並且您將有滿足您問題要求的解決方案。
也就是說,你的問題涉及到一個部分完成的矩形板,不一定是方形的,並且符號頻率可以在行到列和列到列之間變化。
對於像Example Board這樣的小型電路板,3x3陣列,蠻力方法是誘人的。但是有一些簡單的事情可以編碼,以保持搜索效率。
某些行和某些列必須是「常量」,即它們只能包含一個字母。我想我會把它作爲搜索樹的最高選擇,即選擇一個可以是單個字母的行和列。請注意,由於每一行都與每一列相交,因此我們將對該行和列使用相同的字母。
但在開始搜索解決方案之前,您需要輸入表示包含「給定」條目的電路板的數據。使用你自己對此的判斷,但是對於合理大小的板子,你可能會要求用戶輸入行數和列數,然後逐行提示它們。
請記住,Prolog術語讀者希望輸入被句點終止。所以輸入可能工作是這樣的:
Enter a list of all letters: [a,b,c].
How many rows? 4.
How many cols? 4.
Enter a row as a list: [_,_,b,a].
Enter a row as a list: [b,_,_,c].
Enter a row as a list: [c,_,_,_].
Enter a row as a list: [_,a,_,_].
下劃線作爲輸入匿名變量和葉代表董事會作爲自由變量列表中的條目對應的列表。
可以因此與代表你的程序中的所有字母的列表:
Symbols = [a,b,c]
,並用列表的列表中的板可能看起來像:
Board = [[A1,A2,b,a],[b,B2,B3,c],[c,C2,C3,C4],[D1,a,D3,D4]]
在具體的例子有隻是將所有行和列設置爲相同字母的一種可能方式,並且通過使第二列和最後一行都具有所有a:
Board = [[A1,a,b,a],[b,a,B3,c],[c,a,C3,C4],[a,a,a,a]]
但是現在我們發現尋找解決方案的方法會陷入盲目。第二行有三個字母,但是在四行中,三個字母不可能出現相同的次數。這個例子沒有解決方案。
然而,「無解」結果非常有效。
希望這給你一些關於如何在Prolog中編寫一般求解過程的想法。
家庭作業,對吧? – 2012-03-31 11:12:15
當然可以。這是一種作業:) – mastah 2012-03-31 11:13:09
請張貼董事會的代表和任何想法,你可以拿出。 – 2012-03-31 11:28:23