Prolog中breadth_search代码行s()构造含义及是否为系统谓词问询
关于Prolog搜索代码中
s()构造的说明 核心判定
breadth_search调用行里出现的s(State, [])不是Prolog标准库提供的系统谓词或内置函子,不存在“系统自带但没写声明”的情况——这是这套广度优先搜索实现自定义的二元复合结构。
结构的实际语义
结合Prolog版BFS的通用实现范式,这个参数数量为2的s/2结构,本质是用来打包两个强绑定的搜索节点信息:
- 第一参数位:存储当前搜索节点对应的实际问题状态,也就是代码开头通过
initial_state(State)拿到的初始状态实体 - 第二参数位:存储从初始状态走到当前节点,累计经过的完整路径;初始节点对应空列表
[]作为初始路径,完全匹配BFS从起点开始的初始逻辑
之所以要单独封装一个s()结构来存这两个值,是因为如果拆成两个独立列表分别存“待扩展节点的状态集合”和“对应状态的路径集合”,很容易出现顺序错位、状态和路径不匹配的问题。把两个强绑定的值打包成统一的复合项,再整体放进待扩展队列、已访问节点列表里,就能从设计上避免这类错位bug。
为什么看不到对应的前置声明
Prolog是动态类型语言,自定义复合项不需要提前写任何形式的声明,只要在代码执行时写出对应的结构形式就能直接使用,不需要像静态编译语言那样提前定义结构体、声明类型。这个结构的命名s是写算法的人取的简称(大概率是单词state的缩写),哪怕替换成node(State, Path)、current(State, Path)这类其他命名,实现的功能完全没有区别。
举个实际执行的对应例子:当初始传入队列参数为
[s(State, [])]时,代表当前待扩展队列里只有1个待处理节点:它的状态是初始状态,走到该节点的累计路径为空。当BFS扩展出下一个相邻状态NextState时,就会生成新的复合项s(NextState, [CurrentState|Path])追加到队列末尾,完成路径的自动更新。
内容的提问来源于stack exchange,提问作者user4798924
相关产品推荐
相关产品推荐

