编程中的削减是否有害?

时间:2014-04-09 17:29:48

标签: prolog prolog-cut

嘿伙计们我这学期参加人工智能课程,我们正在学习Prolog。我们的讲师告诉我们尽量避免在我们的任务中使用削减,但是,对于我似乎无法避免使用它们的几个问题。我只是好奇为什么削减被认为是罪(讲师的话)?我理解它是一种捷径,但我已经知道它们是如何影响我的程序的。

感谢。

2 个答案:

答案 0 :(得分:9)

我同意@dasblinkenlight和@mbratch。此外,我认为从绿色削减和红色削减方面考虑是有帮助的。

绿色切割不会影响程序的逻辑行为,只会影响性能。它们是你告诉Prolog你知道它是否继续下去它不会带来任何成果的一种方式。绿色削减绝不是必要的 - 它们只是提高性能。当你第一次学习Prolog时,还有很多东西要处理,它似乎为一个小的好处增加了额外的复杂性。

红色切割确实会影响程序的行为。正如@mbratch所说,新用户经常会削减产量以“整理”产量。新用户经常将Prolog查询提示视为其程序的用户界面。这些切割使得它们的谓词不那么通用,并且在使输出更好的过程中不太有用。还有一些更清晰的选择,比如once/1,它会给你一个结果。专家非常精细地使用红色切割 - 有些情况下它比逻辑方法更有效 - 但如果你能够获得纯粹的逻辑公式,那么它更可取。通常,使用cut的错误的谓词会出现“向后正确性”的问题,这些问题会在您依赖谓词作为其他谓词的一部分时出现。这些可能很难调试和修复。

我不确定我会称他们为“罪”,但我主要同意你的教授为初学者。如果您在不使用切割的情况下在逻辑上解决问题方面经验丰富,那就最好了。然后,当你更好地理解什么是容易的和什么是困难的时候,可以引入剪切。尽早使用它会让你依赖它作为程序编程的拐杖。

答案 1 :(得分:8)

在开始时,尝试着重于Prolog的纯声明部分,原因很简单:正是Prolog与其他编程语言区别开来的部分。专注于语言的纯粹,单调的部分,并完全避免削减。你怎么能指望你沉浸在这种编程范式中呢?

但是,你肯定会遇到一些挑战。特别是在尝试编码if-then-else结构和一般否定时。当这样的构造的条件需要成功的if-part并且需要为then-part失败时,你将进入非单调代码。但是,Prolog从未构建为以干净的方式处理此类代码

相反,Prolog只知道if-then规则。所以基本上你会有一个规则用于一个部分而另一个用于另一个部分。在开始时你会觉得很不寻常,但它允许你体验非常纯粹的代码。

有关纯代码的示例,请参阅my page

另见:Features of good Prolog code? 有趣的是,有趣的问题总是在SO上关闭。

对于绿色或红色切割,简单地认为几乎没有绿色切割。因为,如果你想以安全的方式使用削减,你将不得不添加额外的条件("守卫"),否则没有任何意义。它确实适用于优化器,编译器编写者等。

为了让我的答案更加平衡,下面是一个提高效率的简洁方法示例: