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