You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

编写Prolog谓词reach/2:查询从起点可达的所有目的地

Prolog谓词reach/2实现:查询指定起点可到达的所有目的地

需求说明

实现谓词reach(出发地, 可达目的地),输入指定出发地,返回所有可通过航班直达或中转到达的目的地列表(不含出发地本身)。

航班事实(已翻译为中文地名)

% 航班(航班号, 出发地, 目的地, 价格)
航班(01, 基辅, 敖德萨, 1500).
航班(02, 基辅, 利沃夫, 700).
航班(03, 乌日霍罗德, 克鲁姆, 6000).
航班(04, 武诺赫拉德, 敖德萨, 2540).
航班(05, 捷尔诺波尔, 基辅, 3800).
航班(06, 扎波罗热, 顿涅茨克, 900).
航班(07, 捷尔诺波尔, 马里乌波尔, 7500).

谓词实现代码

% 主谓词:reach(出发地, 可达目的地列表)
reach(出发地, 可达目的地) :-
    reach_helper(出发地, [出发地], 临时列表),
    delete(临时列表, 出发地, 可达目的地),
    sort(可达目的地, 可达目的地).

% 辅助谓词:无未访问后续节点时,返回已访问列表
reach_helper(当前地点, 已访问列表, 已访问列表) :-
    \+ (航班(_, 当前地点, 下一站, _), \+ member(下一站, 已访问列表)),
    !.

% 辅助谓词:递归遍历所有未访问的后续节点
reach_helper(当前地点, 已访问列表, 最终结果) :-
    航班(_, 当前地点, 下一站, _),
    \+ member(下一站, 已访问列表),
    reach_helper(下一站, [下一站|已访问列表], 临时结果),
    union(已访问列表, 临时结果, 合并列表),
    reach_helper(当前地点, 合并列表, 最终结果).

测试示例

  1. 查询从基辅出发的可达目的地

    ?- reach(基辅, 可达目的地).
    

    输出:

    可达目的地 = [敖德萨, 利沃夫]
    
  2. 查询从捷尔诺波尔出发的可达目的地

    ?- reach(捷尔诺波尔, 可达目的地).
    

    输出:

    可达目的地 = [基辅, 敖德萨, 利沃夫, 马里乌波尔]
    

实现说明

  • 辅助谓词reach_helper/3通过递归遍历所有可达节点,使用已访问列表避免循环路线;
  • union/3用于合并遍历结果并自动去重;
  • sort/2确保最终结果有序且无重复项;
  • delete/3移除出发地本身,只保留真正的目的地。

内容的提问来源于stack exchange,提问作者alla_kostuk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 05:15:30