我这学期正在学习AI课程,其中我们正在学习Prolog。我们的讲师告诉我们尽量避免在作业中使用截断符(cuts),但是对于一些问题,我似乎无法避免使用它们。我只是好奇为什么截断符被认为是一种罪过(讲师的话)?我知道这有点像取巧,但我已经使用了它们,知道它们如何影响我的程序。
我这学期正在学习AI课程,其中我们正在学习Prolog。我们的讲师告诉我们尽量避免在作业中使用截断符(cuts),但是对于一些问题,我似乎无法避免使用它们。我只是好奇为什么截断符被认为是一种罪过(讲师的话)?我知道这有点像取巧,但我已经使用了它们,知道它们如何影响我的程序。
我同意 @dasblinkenlight 和 @mbratch 的看法。此外,我认为将其分为绿剪枝和红剪枝的概念会有所帮助。
绿剪枝是不影响程序逻辑行为,只影响其性能的剪枝。它们是告诉Prolog,如果继续进行下去,不会有任何结果的方式。绿剪枝从来都不是必需的-它们只是提高了性能。在您首次学习Prolog时,有很多其他内容需要掌握,因此只为获得小幅好处而增加额外的复杂性似乎不太值得。
红剪枝会影响程序行为。正如@mbratch所说,新用户通常会随便使用剪枝以“整理”输出。新用户经常将Prolog查询提示视为其程序的用户界面。这些剪枝使他们的谓词变得不那么通用,也不那么有用,使得输出更加美观。同时还有一些更清晰的替代方法,例如once/1
,它可以给您一个单一的结果。专家非常谨慎地使用红剪枝-在某些情况下,它比逻辑方法更有效率-但如果您可以访问纯逻辑公式,则最好使用它。经常使用剪枝错误的谓词在后来依赖该谓词作为其他谓词的一部分时会出现“反向正确性”的问题。这些问题难以调试和修复。
我不确定是否应该称其为“罪过”,但对于初学者,我基本上同意您的教授的看法。最好先通过逻辑方法解决问题,而不使用剪枝。然后,在您更好地了解什么是易于完成和什么是困难之后,可以稍后引入剪枝。在早期过度使用它会使您依赖它作为过程式编程的支撑。