Prolog:寻找下一个日期

时间:2016-12-13 08:25:29

标签: date time prolog

所以,我几个小时都遇到了这个问题,我似乎无法找到解决办法 我需要,在当前日期,并知道飞机在星期二,星期四和星期六6点起飞,计算下一次出发的日期和时间。 我把这些信息以事实的形式存在(第二个参数代表星期几,其中1 =星期一):

departure(time(6,0,0), 2).
departure(time(6,0,0), 4).
departure(time(6,0,0), 6).

有人可以帮帮我吗? 感谢。

1 个答案:

答案 0 :(得分:0)

我提出以下解决方案,我会尝试解释它

char[] wordDisplay = new char[k];

所有内容均从selNextDepH([], _, First, First). selNextDepH([Hd | _], Now, _, Hd) :- Now @<= Hd. selNextDepH([Hd | Td], Now, First, NextDep) :- Now @> Hd, selNextDepH(Td, Now, First, NextDep). selNextDep([Hd | Td], Now, NextDep) :- selNextDepH([Hd | Td], Now, Hd, NextDep). switchDep(dep(Day, Time), departure(Time, Day)). nextDep(DayNow, TimeNow, NextDeparture) :- findall(dep(Day, Time), departure(Time, Day), List), sort(List, ListS), selNextDep(ListS, dep(DayNow, TimeNow), NextDep), switchDep(NextDep, NextDeparture). 开始,其中nextDep/3收集所有findall/3但收集时间为departure/2,顺序相反(dep/2代替dep(Day, Time))因为它更容易订购

departure(Time, Day)

接下来,我们使用 findall(dep(Day, Time), departure(Time, Day), List),

List个结构的dep/2列表进行排序
sort/2

所以在 sort(List, ListS), (已排序的列表)中,我们排序(以ListS形式),当天为第一个键,时间为第二个。

接下来,我们致电dep/2selNextDep/3形式(dep/2

查找下一次出发
NextDep

并且,使用selNextDep(ListS, dep(DayNow, TimeNow), NextDep), ,我们会以switchDep/2形式

获得下一次出发
departure/2

switchDep(NextDep, NextDeparture). 是微不足道的,但swithcDep/2不是(恕我直言)。

selNextDep/3背后的想法是返回(在第三个参数中)排序列表的第一个selNextDep/3元素(第一个参数),它比第二个参数(现在的时间)大。如果没有找到更大的元素,那么想法就是返回列表的第一个元素(下周的第一个出发点)。

所以我已经开发了一个简单的sel/2,它只用相同的参数调用一个helper子句(selNextDep/3)并添加了列表的第一个元素(如果找不到更大的元素);

selNextDepH/4

对于selNextDep([Hd | Td], Now, NextDep) :- selNextDepH([Hd | Td], Now, Hd, NextDep). ,terminal子句是微不足道的:如果列表为空,则返回(与最后一个参数统一)列表的第一个元素

selNextDepH/4

如果列表不为空,我们有两种情况:(1)now-time低于(或等于)列表的第一个元素,所以我们返回(统一最后一个参数)第一个元素列表

selNextDepH([], _, First, First).

或(2)时间 - 现在比列表的第一个参数大,所以我们在下一个列表中寻找更大的离开

selNextDepH([Hd | _], Now, _, Hd) :-
  Now @<= Hd.