1

我正在尝试将列表添加到已创建的列表中。program(Route, FinalRoute).Route变量是一个列表,在程序执行过程中会多次更改,但是有一个阶段Route需要附加到FinalRoute.

这个过程可能会发生多次,但我不确定如何实现这一点。

以下是相关(重要/必需)代码,可以解释我现在正在做什么:

path(_, _, Route, FinalRoute, []):-
    %% code to add Route to FinalRoute

path(Source, Dest, Route, FinalRoute, Conditions):-
    [Cond|Rest] = Conditions,
    get_info(Source, Dest, Path, NewDest),
    path(Dest, NewDest, [Path|Route], FinalRoute, Rest).

路径谓词不是调用一次而是多次调用,因此简单是Route = FinalRoute不够的。

所以Route可以[1, 2, 3]那么FinalRoute应该[[1, 2, 3]]

那么应该是什么Route时候,等等。[4, 5, 6]FinalRoute[[4, 5, 6], [1, 2, 3]]

任何建议表示赞赏。

4

1 回答 1

1

在(纯)Prolog 中,我们不能分配给变量。在任何时候,它要么是免费的,要么是绑定的

那么我无法对你的问题做出有意义的回答。解决方案取决于调用 path/5 的上下文。一些替代方案是:

  • assert(route(Route)),并在你的程序完成时收集它们。
  • 使用 findall(FinalRoute, path(Source, Dest, Route, FinalRoute, Conditions), AllRoutes)
  • 添加一个累加器,起到类似于当前Route/FinalRoute对的作用

编辑path累加器很容易添加,但只有当您在没有回溯的情况下实际调用时才会有用,因此(例如,在“前进”模式下)。

path(_, _, Route, RoutesSoFar, [Route|RoutesSoFar], []).
path(Source, Dest, Route, SoFar, AllRoutes, Conditions):-
    [Cond|Rest] = Conditions,
    get_info(Source, Dest, Path, NewDest),
    path(Dest, NewDest, [Path|Route], SoFar, AllRoutes, Rest).
于 2013-07-10T16:52:43.973 回答