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).
逻辑说明
- 首先调用
travel(X,Y, Route)直接获取已经计算好的嵌套行程结构,不需要重写路径查找逻辑 =../2是Prolog的结构统一运算符,可以把byCar(valmont, metz)这类结构拆解为[byCar, valmont, metz]列表,方便提取交通方式和起止城市- 规则末尾加
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
相关产品推荐
相关产品推荐

