You need to enable JavaScript to run this app. Prolog中breadth_search代码行s()构造含义及是否为系统谓词问询
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.27 19:36:03