Visual Prolog 5.2中findall编译警告问题求助
Visual Prolog中findall编译警告问题
我编写了如下Prolog代码:
findFlight(DepartureP,ArrivalP,FinalResult) :- findall([Flight,DepartureP,ArrivalP,DepartureTime,ArrivalTime], flight(Flight,DepartureP,ArrivalP,DepartureTime,ArrivalTime), Result), bubblesort(Result, FinalResult).
这段代码在SWI Prolog中可正常运行,但在Visual Prolog环境中出现如下警告:
E;Test_Goal, pos: 969, 410 Variable expected
点击警告时光标定位在findall(后的[位置。
问题原因
Visual Prolog对findall的模板参数(第一个参数)语法要求比SWI Prolog更严格:
- SWI Prolog允许模板中直接包含外部已绑定的变量(比如代码中的
DepartureP、ArrivalP),会自动将这些变量的当前值带入结果列表。 - 但Visual Prolog的
findall实现要求模板必须是未绑定的变量,或者仅包含来自目标子句(这里是flight/5)内部的变量,不允许直接引用外部已绑定的变量,否则会触发"Variable expected"警告。
解决方案
将外部变量的组合逻辑从findall模板中分离出来,先收集仅来自flight子句的变量,再统一添加外部传入的DepartureP和ArrivalP:
findFlight(DepartureP,ArrivalP,FinalResult) :- % 先收集flight子句中的变量 findall([Flight, DepartureTime, ArrivalTime], flight(Flight,DepartureP,ArrivalP,DepartureTime,ArrivalTime), TempResult), % 为每个结果项添加出发地和目的地端口 maplist(add_ports(DepartureP, ArrivalP), TempResult, Result), bubblesort(Result, FinalResult). % 辅助谓词:将外部端口信息加入结果列表 add_ports(DepPort, ArrPort, [Flight, DepTime, ArrTime], [Flight, DepPort, ArrPort, DepTime, ArrTime]).
这样既符合Visual Prolog的语法要求,也能实现和原代码相同的功能。
内容的提问来源于stack exchange,提问作者Smth_Unknown
相关产品推荐
相关产品推荐

