所以,我几个小时都遇到了这个问题,我似乎无法找到解决办法 我需要,在当前日期,并知道飞机在星期二,星期四和星期六6点起飞,计算下一次出发的日期和时间。 我把这些信息以事实的形式存在(第二个参数代表星期几,其中1 =星期一):
departure(time(6,0,0), 2).
departure(time(6,0,0), 4).
departure(time(6,0,0), 6).
有人可以帮帮我吗? 感谢。
答案 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/2
以selNextDep/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.