【问题标题】:How can I show the intermediate steps in Prolog of this graph pathfinder?如何在此图探路者的 Prolog 中显示中间步骤?
【发布时间】:2016-10-13 10:55:52
【问题描述】:

我在 Prolog 中创建了这个知识库,它反映了一家巴士公司的巴士往返地点、出发和到达时间:

connection(kerkrade, heerlen, 1100, 1200).
connection(kerkrade, bleijerheide, 1100, 1225).
connection(heerlen, kerkrade, 1115, 1230).
connection(heerlen, maastricht, 1230, 1330).
connection(maastricht, heerlen, 1430, 1530).
connection(maastricht, sittard, 1331, 1430).
connection(maastricht, sittard, 1345, 1445).
connection(sittard, maastricht, 1630, 1530).
connection(sittard, denbosch, 1530, 1700).
connection(denbosch, sittard, 1800, 1930).
connection(denbosch, amsterdam, 1000, 1330).

checkTime(X,Y,Z):-
    connection(X,Y,S,_),
    (Z =< S).

 aRoute(From, To, Time):-
    checkTime(From,To,Time).

testRoute(A,B,T):-
    walk(A,B,T,[]).


walk(A,B,Time,V) :-
    aRoute(A,X,Time),
    not(member(X,V)),
    (
        B = X;
        connection(A,X,_,S), walk(X,B,S,[A|V])
    ).

每当我询问我的知识库是否有两点之间的路线时,它都会返回是否可行; truefalse:

testRoute(kerkrade, sittard, 900).
true; (signifies that there are three routes, of which two are possible)
true;
false.

然而,这不是我想要的。在最好的情况下,我想显示用于在顶层的两点之间创建路线的连接,如下所示:

connection(kerkrade, heerlen, 1100, 1200)
connection(heerlen, maastricht, 1230, 1330)
/* and so on.. */

我该怎么做?我想我必须传递一个像X 这样的变量以及我对testRoute 的调用,以便它可以报告它的值。我无法为此编写谓词,因为我不确定将它放在哪里。我的想法是我必须向walk(A,B,Time,V) 添加一个额外的参数,但我不知道在那之后我可以用它做什么才能让它报告路线的中间步骤。

【问题讨论】:

    标签: prolog prolog-toplevel


    【解决方案1】:

    我想显示用于在两点之间创建路线的连接 [...] 我该怎么做?我想我必须在调用 testRoute 的同时传递一个像 X 这样的变量,以便它可以报告它的值。

    是的:我想你必须为路由传递另一个变量

    我提出以下解决方案

    walk(Stop, Stop, _, ReverseRoute, DirectRoute):-
      reverse(ReverseRoute, DirectRoute).
    
    walk(Start, Stop, TimeMin, ReverseRoute, DirectRoute) :-
      connection(Start, Mid, TimeStart, TimeArrival),
      TimeMin =< TimeStart,
      not(member(Mid, ReverseRoute)),
      walk(Mid, Stop, TimeArrival, [Mid | ReverseRoute], DirectRoute).
    
    testRoute(Start, Stop, TimeStart, Route) :-
      walk(Start, Stop, TimeStart, [Start], Route).
    

    【讨论】:

      【解决方案2】:

      您可以通过以下方式保留连接列表:

       checkTime(X,Y,Z, connection(X,Y,S,W)):-
          connection(X,Y,S,W),
          (Z =< S).
      
       aRoute(From, To, Time,Head):-
          checkTime(From,To,Time,Head).
      
      testRoute(A,B,T,L):-
          walk(A,B,T,[],L).
      
      
      walk(A,B,Tijd,V,[Head|L]) :-
          aRoute(A,X,Tijd,Head),
          not(member(X,V)),
          (
              B = X,L=[];
              connection(A,X,_,S), walk(X,B,S,[A|V],L)
          ).
      

      例子:

      ?- testRoute(kerkrade, sittard, 900,L).
      L = [connection(kerkrade, heerlen, 1100, 1200), connection(heerlen, maastricht, 1230, 1330), connection(maastricht, sittard, 1331, 1430)] ;
      L = [connection(kerkrade, heerlen, 1100, 1200), connection(heerlen, maastricht, 1230, 1330), connection(maastricht, sittard, 1345, 1445)] ;
      false.
      

      【讨论】:

      • 您的回答完美无缺,谢谢! L=[ ] 究竟做了什么?它是否评估空列表和 L 之间的相等性?
      • 它将 L 与空列表统一起来,因为您实例化了列表的头部并在那里完成,因此列表的尾部必须为空(没有其他要添加的元素)。
      猜你喜欢
      • 1970-01-01
      • 2014-10-16
      • 1970-01-01
      • 2022-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多