我想@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