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

Prolog中基于现有travel/3规则实现path/2路径查询规则的方法

解答

你可以直接复用已有的travel/3的行程计算能力,再加一个辅助打印谓词拆解行程结构即可,完整实现如下:

% path/2 主规则
path(X,Y) :-
    travel(X,Y, Route),
    write('行程:'), write(X), write(' -> '), write(Y), nl,
    write('详细路线:'), nl,
    print_route(Route),
    nl, fail. % 去掉fail或替换为!可只输出第一条匹配路径

% 辅助谓词:打印单段行程
print_route(go(Segment)) :-
    Segment =.. [Transport, From, To],
    write('- 乘坐'), write(Transport), write(':'), write(From), write(' → '), write(To), nl.

% 辅助谓词:打印多段行程
print_route(go(Segment, RestRoute)) :-
    Segment =.. [Transport, From, To],
    write('- 乘坐'), write(Transport), write(':'), write(From), write(' → '), write(To), nl,
    print_route(RestRoute).

逻辑说明

  1. 首先调用travel(X,Y, Route)直接获取已经计算好的嵌套行程结构,不需要重写路径查找逻辑
  2. =../2是Prolog的结构统一运算符,可以把byCar(valmont, metz)这类结构拆解为[byCar, valmont, metz]列表,方便提取交通方式和起止城市
  3. 规则末尾加fail是为了触发回溯,自动输出所有满足条件的可行路径;如果你只需要第一条匹配路径,删掉fail或者替换为截断符!即可

示例查询效果

如果你查询path(valmont, auckland),会自动输出所有可行的路线,类似如下格式:

行程:valmont -> auckland
详细路线:
- 乘坐byCar:valmont → metz
- 乘坐byTrain:metz → paris
- 乘坐byPlane:paris → losAngeles
- 乘坐byPlane:losAngeles → auckland

行程:valmont -> auckland
详细路线:
- 乘坐byCar:valmont → saarbruecken
- 乘坐byTrain:saarbruecken → frankfurt
- 乘坐byPlane:frankfurt → bangkok
- 乘坐byPlane:bangkok → auckland
... 其他所有可行路线

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 20:06:03