我在完成以下任务时遇到了一些麻烦:
在平面中给出N个点(通过它们的坐标)。 使用Backtracking in确定共线点的所有子集 序言
我不知道如何检查Prolog中3个或更多点是否共线或如何使用回溯。
答案 0 :(得分:1)
我已经写了一个解决方案但是我要避免完全分享它,除非你特别要求它。相反,我会概述解决方案的形状,看看是否足以让您填写详细信息。
我的解决方案很简单。我从输入中选择一个点并计算其斜率。然后,我浏览其余的输入,收集其斜率匹配的其他点。所以对于初学者来说,你至少需要一个谓词slope/2
来计算一个点的斜率。您可以使用select/3
从列表中选择一个项目,并为您提供列表的其余部分;对于这类问题,这是一个非常方便的驱动程序,因为select/3
的回溯行为将完全符合您的要求:它将从列表中获取下一个点,并为您提供没有该点的列表。
这种方法可行,我建议您尝试一下,因为它很简单。它会多次产生相同的信息。您可以通过稍微更改循环驱动程序来修复它,使其删除已经进一步考虑使用的点。我用“或”和递归调用来做到这一点。
另外,为了好玩,我定义了一个运算符@
,以便我可以将点作为X@Y
或3@4
进行讨论,但这对于解决方案来说不是必需的,它只是漂亮的。
编辑:直接回答您关于如何检查3个或更多积分的问题,您有一个积分列表,并且您可以单独检查每个积分。如果它通过,你保留它;否则你丢弃它。