我刚开始学习 prolog,我想知道为什么它是 dfs 而不是 bfs 以及为什么没有简单的方法来改变它。
ISO序言是否强制要求?
最佳答案
首先,它很容易改变。大多数 Prolog 文本都解释了如何编写执行 BFS 的谓词以及如何创建使用任意术语执行此操作的元解释器。事实是,在大学里体验过 Prolog 的学生(基本上)在使用 Prolog 的第一周或两周就完成了。要做到这一点并不完全是一个基本的 Prolog 任务,但它也不是一种高级的 Prolog 技术。如果您在 Prolog 上花了两个月的时间,这不会是一件令人生畏的事情。这听起来像很多 Prolog,但与(比如说)Java 相比,它真的不多。出于某种原因,我们希望 Prolog 到达终点的速度比我们为实际上不那么有趣的系统所做的要快得多。
我相信 ISO 规定的搜索策略称为 SLD Resolution ,深度优先搜索源于这种解析机制。我没有读过 ISO 标准,所以也许有人比我更了解情况会发表评论。我认为如果分辨率方法(以及深度优先或广度优先)不是强制性的,那么管理 Prolog 标准化将很困难,因为以一种方式成功的计算可能会以另一种方式进入无限循环。不指定普通程序行为的语言标准将是一个相当差的标准。尽管如此,没有理由不能内置用于指定替代搜索策略的功能。
我不知道特别要求 DFS 的原因。使用 Prolog 一段时间后,not-DFS 的想法对我来说显然效率低下。例如,如果我添加一些代码来处理边缘情况,我将每次使用 BFS 都为此付费,但仅在 DFS 需要的情况下。我觉得 DFS 的内存效率会更高;例如,我不必跟踪一堆可能无用的代码路径。我觉得 DFS 可能更容易控制,因为我可以轻松修剪搜索树。但这些只是感觉;也许我对自然的感觉完全是我使用过的结果。不存在基于 BFS 的 Prolog 竞争对手是一种暗示,尽管它可能不是一个好主意。另一方面,1980 年效率低下的东西今天仍然影响着 Prolog 的实现,尽管现在情况已经大不相同了。
关于prolog - 为什么 prolog 统一是深度优先搜索而不是广度优先搜索?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44360781/