Prolog - 坚持做作业 - 使用数据库并输入2个值以从数据库中获得第3个值

时间:2011-12-23 01:16:46

标签: database list recursion prolog

示例数据库:

 any(a,b,2). 
 any(b,c,2). 
 any(c,d,3). 
 any(d,e,1). 
 any(e,f,3).

键:(Station1,Station2,Time)

问题:

(station1,time)输入prolog并让它返回所有可到达的电台。

例如:

如果输入:(b,2)

输出应为:'a'和'c'

这是因为在'2'分钟内从电台'b',你可以到达电台'a'和'c',因为它们在输入时间范围内。


我已经厌倦了使用列表和递归但没有运气,任何帮助/建议?


reachable(Station1, Limit, Result) :-
    reachable(Station1, Limit, 0, 0, Result).

reachable(Station1, Visited, TimeSpent, Limit, Result) :-
    overground(Station1,Station2,Time),
    Visited is Limit - Time,
    Limit =< TimeSpent,
    Result = [Station2];
    overground(Station1, Waypoint, Time),
    NewVisited is Visited - Limit,
    NewTimeSpent is TimeSpent - NewVisited,
    reachable(Waypoint,Station2, NewTimeSpent, NewVisited,Result).

&LT;&LT;&LT;我试过的东西,但似乎没有工作X_X

1 个答案:

答案 0 :(得分:2)

那么,让我们看看问题:

  1. 您需要能够从谓词“双向”找到电台,即any(MyStation, Y)any(Y, MyStation),因此在使用any/3时您需要断开连接。< / LI>
  2. 如果需要,您需要通过递归找到一个不能直接到达出发站的电台。
  3. 因为你必须使用递归,你必须用累加器跟踪已经在递归的给定点花费的时间,以便知道给定点的站是否仍然满足时间限制。
  4. 因为你必须使用递归,你必须跟踪已经访问过的站点,以便不会陷入无限循环,或者只是通过循环中的一个循环给出两倍相同的结果,这将完成谢谢这次再次累积。
  5. 解决方案的一般外观:

    第一步,调用工作谓词:

    reachable(From, Limit, Result) :-
        ...
    

    ...应该是对可达/ 5的调用(这一个+ 2个累加器)。

    第二步,工作谓词:

    reachable(From, Visited, TimeSpent, Limit, Result) :-
        ...
    

    ...应符合这些准则:

    • 首先你必须找到一个与From感谢任何/ 3
    • 相关的电台
    • 然后你必须检查这个电台是否在访问
    • 然后你必须写两个案例的分离(或写两个条款):
      • 最后一种情况,即您检查花费的时间是否在限制之下并使用适当的变量统一结果
      • 递归案例,即您使用您计算的新TimeSpent调用可达,新的Visited更新和新的出发站。

    如果您需要更精确的建议,我建议您发布您已经完成的工作,以便我们可以在那里工作!