2011-12-23 48 views
1

示例数据库获得3个值:序言 - 停留在家庭作业 - 使用数据库和输入2倍的值从数据库中

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)为序言,并让它触手可及返回所有站。

例如:

如果输入:(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). 

< < <东西,我试过,但似乎没有工作X_X

+1

'c'距'b'3分钟吗? – dasblinkenlight 2011-12-23 01:19:53

+2

将其标记为家庭作业+1。 – xQbert 2011-12-23 01:30:04

+0

噢是的,提出了一个数据库输入错误 – daydream 2011-12-23 01:35:49

回答

2

那么,让我们来看看这个问题:

  1. 你需要能够找到站您的谓词中的“双向”(即any(MyStation, Y)any(Y, MyStation)),因此在使用any/3时需要使用分隔符。
  2. 如果需要,您需要通过递归找到离站不直接到达的站点。
  3. 由于您必须使用递归,所以您必须跟踪累积器递归给定点已花费的时间,以便知道给定点处的站点是否仍然满足时间限制。
  4. 因为你必须使用递归,所以你必须跟踪已经访问过的站点,以便不会陷入无限循环,或者只是通过一个电路中的一个循环来给出两倍的相同结果,这将会完成再次到累加器。

解决方案的通用外观:

第一步,调用工作谓语:

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

...应该是一个呼叫到达/ 5(这一+ 2个蓄电池)。

第二步,工作断言:

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

...应满足这些准则:

  • 首先你必须找到与从感谢任何/ 3
  • 然后你必须检查这个站是否在访问
  • 然后你必须写两个案件的分离(或写t WO条款):
    • 最后一种情况,即你检查的时间花费在极限之下,并与相应的变量
    • 递归情况下统一的结果,即你叫到达与您计算出新的TimeSpent,新的受访那你更新和一个新的出发站。

如果你想更精确的建议,我建议你发布你已经这样做了,我们可以从那里工作的工作!