将动态生成的列表附加到新列表

时间:2013-07-10 15:32:45

标签: list dynamic prolog

我正在尝试将列表添加到已创建的列表中。 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]]等。

任何建议都表示赞赏。

1 个答案:

答案 0 :(得分:1)

在(纯)Prolog中我们无法分配给变量。在任何时候,它都是免费绑定

然后我无法回答你的问题。解决方案取决于path / 5被调用的上下文。一些替代方案是:

  • 断言(路线(路线)),并在程序完成后全部收集。
  • 使用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).