嘿伙计们我这学期正在学习人工智能课程,我们正在学习Prolog.我们的讲师告诉我们尽量避免在我们的任务中使用削减,但是,对于我似乎无法避免使用它们的几个问题.我只是好奇为什么削减被认为是罪(讲师的话)?我知道这是一种捷径,但我已经习惯了解它们如何影响我的节目.
谢谢.
我同意@dasblinkenlight和@mbratch.此外,我认为从绿色削减和红色削减方面考虑是有帮助的.
绿色切割不会影响程序的逻辑行为,只会影响性能.它们是你告诉Prolog你知道它是否继续下去它不会带来任何成果的一种方式.绿色削减从来都不是必需的 - 它们只是提高了性能.当你第一次学习Prolog时,还有很多东西需要处理,它似乎为一个小的好处增加了额外的复杂性.
红色切割确实会影响程序的行为.正如@mbratch所说,新用户经常会削减产量以"整理"产量.新用户经常将Prolog查询提示视为其程序的用户界面.这些切割使得它们的谓词不那么通用,并且在使输出更好的过程中不太有用.还有一些更清晰的选择,比如once/1
给你一个结果.专家们非常谨慎地使用红色切割 - 有些情况下它比逻辑方法更有效 - 但如果你能够获得纯粹的逻辑公式,那就更好了.通常,使用cut的错误的谓词会出现"向后正确性"的问题,这些问题会在您依赖谓词作为其他谓词的一部分时出现.这些可能很难调试和修复.
我不确定我会称他们为"罪",但我主要同意你的教授为初学者.如果您在不使用切割的情况下在逻辑上解决问题方面经验丰富,那就最好了.然后,当你更好地理解什么是容易的和什么是困难的时候,可以引入剪切.尽早使用它会让你依赖它作为程序编程的拐杖.
在开始时,尝试着重于Prolog的纯粹声明部分,原因很简单:正是Prolog与其他编程语言区别开来的部分.专注于语言的纯粹,单调的部分,并完全避免削减.你怎么能指望你沉浸在这种编程范式中?
但是,你肯定会遇到一些挑战.特别是在尝试编码if-then-else结构和一般否定时.当这样的构造的条件需要成功的if-part并且需要为then-part失败时,你将进入非单调代码.但是,Prolog从未构建为以干净的方式处理此类代码
相反,Prolog只知道if-then规则.所以基本上你会有一个规则用于一个部分而另一个用于另一个部分.一开始你会觉得很不寻常,但它允许你体验非常纯粹的代码.
有关纯代码的示例,请参阅我的页面.
另请参见:良好的Prolog代码的功能? 有趣的是,有趣的问题总是在SO上关闭.
对于绿色或红色切割,简单地认为几乎没有绿色切割.因为,如果你想以安全的方式使用切割,你将不得不添加额外的条件("防护"),否则没有任何意义.它确实适用于优化器,编译器编写器等.
没有if和else语句的Prolog
知道何时使用cut in prolog
为什么双重否定在Prolog中没有约束力
为了使我的答案更加平衡,下面是一个通过cut来提高效率的简洁方法示例:
Prolog附加切割操作符