编写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(当前地点, 合并列表, 最终结果).
测试示例
查询从基辅出发的可达目的地
?- reach(基辅, 可达目的地).输出:
可达目的地 = [敖德萨, 利沃夫]查询从捷尔诺波尔出发的可达目的地
?- reach(捷尔诺波尔, 可达目的地).输出:
可达目的地 = [基辅, 敖德萨, 利沃夫, 马里乌波尔]
实现说明
- 辅助谓词
reach_helper/3通过递归遍历所有可达节点,使用已访问列表避免循环路线; union/3用于合并遍历结果并自动去重;sort/2确保最终结果有序且无重复项;delete/3移除出发地本身,只保留真正的目的地。
内容的提问来源于stack exchange,提问作者alla_kostuk
相关产品推荐
相关产品推荐

