gpt4 book ai didi

prolog - 知道何时在序言中使用剪切

转载 作者:行者123 更新时间:2023-12-02 02:30:19 24 4
gpt4 key购买 nike

我参加了一门类(class),在其中学习了一些序言。我不知道如何/何时使用剪切。尽管我了解了剪切的一般概念,但我似乎无法正确使用它们。任何人都可以简要解释一下或提供一个关于他们可以推荐的“剪辑”的好教程(不是 learnprolognow.org)吗?

最佳答案

TL;DR:不要。

剪切修剪了 Prolog 的搜索树。也就是说,给定一个没有剪切的纯 Prolog 程序和带有剪切的相同程序,唯一的区别是带有剪切的程序可能会在无结果的分支上花费更少的时间,因此效率更高;可能会有更少的答案;它也可能终止,而原始程序则不会。

听起来相当无害......甚至有用,不是吗?嗯,大多数时候事情都比较复杂。

红色剪切

剪切的使用方式常常使得没有剪切的程序根本没有任何实际意义。这种切割称为红色切割。在更好的情况下,它用于实现非单调否定的原始形式。而在其他一些情况下,一半是否定,一半是一些很难理解的程序意义。不仅对于程序的读者,而且对于程序的作者也是如此。事实上,此类使用往往无意中缺乏稳定性。无论如何:这些削减不会放入到现有的程序中。他们从一开始就应该参与该计划。

要更结构化地使用此类红色剪切,最好使用 once/1(\+)/1(;)/2 – if-then-else 就像 ( If -> Then ; Else ) 一样。更好的是,尝试通过发出 instantiation_error 来防止此类构造被意外使用。或者使用iwhen/2它会产生实例化错误或 when/2 (在 SWI、YAP、SICStus 中提供),从而延迟目标。

绿色削减

删除无用选择点(以及冗余答案)的剪切称为绿色剪切。但请注意:您不能仅按 ! 和一些 #00ff00 将它们放入您的程序中。大多数时候,您需要一个干净的只读防护来确保此剪切不会变成#ff0000。还有一种简单的方法可以安全地删除一些剩余的选择点:call_semidet/1 。以下是一些相关案例:

剪切不是提交

最后,让我指出 cut 不是提交运算符。有时它的行为有点像它,但需要很多限制才能成为其中之一。提交运算符不能(滥用)用于实现 (\+)/1。提交要求每个子句彼此独立地进行尝试。因此,每个子句都需要一个完整的保护;它不能依赖于仅在先尝试了其他一些条款之后才进行尝试。此外,谓词的每个子句中都必须发生提交。剪切可以发生在任何地方。

关于prolog - 知道何时在序言中使用剪切,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14541164/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com