Prolog:确定共线点的所有子集

时间:2015-11-30 13:34:32

标签: prolog backtracking

我在完成以下任务时遇到了一些麻烦:

  

在平面中给出N个点(通过它们的坐标)。   使用Backtracking in确定共线点的所有子集   序言

我不知道如何检查Prolog中3个或更多点是否共线或如何使用回溯。

1 个答案:

答案 0 :(得分:1)

我已经写了一个解决方案但是我要避免完全分享它,除非你特别要求它。相反,我会概述解决方案的形状,看看是否足以让您填写详细信息。

我的解决方案很简单。我从输入中选择一个点并计算其斜率。然后,我浏览其余的输入,收集其斜率匹配的其他点。所以对于初学者来说,你至少需要一个谓词slope/2来计算一个点的斜率。您可以使用select/3从列表中选择一个项目,并为您提供列表的其余部分;对于这类问题,这是一个非常方便的驱动程序,因为select/3的回溯行为将完全符合您的要求:它将从列表中获取下一个点,并为您提供没有该点的列表。

这种方法可行,我建议您尝试一下,因为它很简单。它会多次产生相同的信息。您可以通过稍微更改循环驱动程序来修复它,使其删除已经进一步考虑使用的点。我用“或”和递归调用来做到这一点。

另外,为了好玩,我定义了一个运算符@,以便我可以将点作为X@Y3@4进行讨论,但这对于解决方案来说不是必需的,它只是漂亮的。

编辑:直接回答您关于如何检查3个或更多积分的问题,您有一个积分列表,并且您可以单独检查每个积分。如果它通过,你保留它;否则你丢弃它。