在Prolog中解决七巧板拼图的好方法是什么?

时间:2011-11-08 23:51:41

标签: prolog declarative

我不确定这个最好是属于这里还是数学,但我想我可以在这里得到关于代码的一些指示。 对于赋值,我需要使用Prolog解决凸Tangram puzzles

所有谜题和可用部分都被定义为顶点列表。例如:     puzzle(1,[(0,0),(4,0),(4,4),(0,4)])代表一个方形拼图,piece(1,[(0,0),(4,0),(2,2)])可以是一个大三角形。

我已经定义了所有7个带有id和点列表的部分,我想我应该能够编写正确的代码来迭代这些部分并对它们执行一些操作。然而,当谈到几何学时,我并不那么有洞察力,所以我不知道如何根据它的顶点确定哪一块适合拼图的位置。

本课程中的大多数作业都是基于经典的组合问题,例如旅行推销员。是否有任何涉及凸形(或任何形状)的问题可能会激发我提出解决方案?我很难找到以这种方式处理形状的声明性代码的在线示例。如果我知道要寻找什么,那将是非常有帮助的。

我想通过检查拼图的外边框是否被覆盖一次并且内部拼图(由放置件产生)被覆盖两次,我可以验证解决方案是否正确。我可以将这个事实作为我解决方案某些部分的基础案例。除此之外,我现在能想到的最好的就是将每件作品强行插入拼图边界之间的一些空置空间,直到它们适合。

2 个答案:

答案 0 :(得分:2)

您是否必须使用纯Prolog解决问题,或者您也可以使用约束编程?

如果您可以使用CP,请查看本文:Perspectives on Logic-based Approaches for Reasoning About Actions and Change。第6节描述了作者如何用CLP(FD)解决七巧板。

即使您必须使用纯Prolog,也许本文会让您了解如何解决它,因为约束可以被被动测试所取代。然而,搜索将花费更长时间,因为搜索树不会被约束修剪。

我还记得很久以前在CLP课程中有人使用Gröbner基地来推理几何学(“如何在一个狭窄的角落里移动钢琴?”),虽然我不确定这是否适用于解决七巧板。

如果这有点理论和进步,我很抱歉。

答案 1 :(得分:1)

我认为解决这个问题的关键应该是检测碎片的重叠。根据定义,如果不发生重叠,则每个可接受的放置将是一个解决方案。然后,迭代片段的位置我们应该检测是否发生任何重叠。

每个形状可以表示为由单位网格细分产生的最小三角形的并集。我们总共有100个(4 * 5 * 5)小三角形。

因此,当我们将坐标列表正确转换为小三角形列表时,交叉点很容易检测到重叠。

例如,以升序坐标和顺时针方向编号,piece(1, [(0,0), (1,1), (2,0)])变为[2, 3, 4, 7]

如果我们注意到每次旋转:X'= Y和Y'= - X,则在原点周围顺时针旋转90°形状很容易。上面的那块,顺时针旋转90°:片(1,[(0,0),(1,-1),(0,-2)])。在Y:piece(1,[(0,2),(1,1),(0,0)])上标准化时。

确定哪些小三角形覆盖一个形状可以天真地重复每个小三角形的'point in polygon'测试。