编程中的削减有那么糟糕吗



本学期我将参加一门人工智能课程,学习Prolog。我们的讲师告诉我们尽量避免在作业中使用削减,然而,对于几个问题,我似乎无法避免使用它们。我只是好奇为什么削减开支被认为是一种罪过(讲师的话)?我知道这是一条捷径,但我使用过它们,知道它们是如何影响我的程序的。

我同意@dasblinkenlight和@mbratch的观点。此外,我认为从绿色削减和红色削减的角度思考是有帮助的。

绿切是指不影响程序的逻辑行为,只影响程序的性能。它们是你告诉Prolog的一种方式,你知道如果它继续下去,就不会结出任何果实。绿色削减从来都不是必要的——它们只是提高性能。当你第一次学习Prolog时,还有很多其他事情需要处理,这似乎只是为了一个小小的好处而增加了额外的复杂性。

红色切割确实会影响程序的行为。正如@mmbratch所说,新用户经常四处切换以"整理"输出。新用户通常将Prolog查询提示视为程序的用户界面。这些切割使它们的谓词不那么通用,在使输出更好的过程中也不那么有用。还有一些更清晰的替代方案,比如once/1,它只给你一个结果。专家们非常谨慎地使用红切——在某些情况下,它比逻辑方法更有效——但如果你能使用纯逻辑的公式,那就更好了。通常,在使用cut时出现错误的谓词会出现"向后正确性"问题,当您将谓词作为其他谓词的一部分时,会出现这种问题。这些问题可能很难调试和修复。

我不确定我会称之为"罪恶",但我基本上同意你的教授对初学者的看法。如果你在不使用切割的情况下有逻辑解决问题的经验,那就最好了。然后,当你对什么是容易的和什么是难的有了更好的感觉时,可以稍后引入切割。过早地使用它会使您依赖它作为过程编程的支柱。

一开始,尽量关注Prolog的纯声明性部分,原因很简单:正是这一部分将Prolog与其他编程语言区分开来。专注于语言中纯粹、单调的部分,完全避免删减。你还能指望自己沉浸在这种编程模式中吗?

然而,你肯定会遇到一些挑战。特别是当试图对if-then-else结构和一般否定进行编码时。当这样一个构造的条件对于if部分需要成功,而对于then部分需要失败时,您就进入了非单调代码。然而,Prolog从未被构建为以干净的方式处理此类代码

相反,Prolog只知道如果然后规则。所以本质上,你会有一条规则适用于一部分,另一条规则则适用于另一部分。这在一开始看起来很不寻常,但它允许您体验非常纯粹的代码。

有关纯代码的示例,请参阅我的页面。

另请参阅:好的Prolog代码的特性?有趣的是,有趣的问题总是在SO上结束。

对于绿色或红色削减,只需想当然地认为几乎没有绿色削减。因为,如果你想以安全的方式使用切口,你就必须添加额外的条件("保护"),否则就没有任何意义。它实际上是为优化器、编译器编写器和诸如此类的人准备的。

  • 没有if和else语句的Prolog

  • 知道何时在prolog 中使用剪切

  • 为什么双重否定;t在Prolog 中结合

为了让我的答案更加平衡,这里有一个通过削减来提高效率的干净方法的例子:

  • 带剪切运算符的Prolog追加

最新更新