Date 序言:寻找下一个日期
所以,我被这个问题困扰了好几个小时,似乎找不到解决办法。Date 序言:寻找下一个日期,date,time,prolog,Date,Time,Prolog,所以,我被这个问题困扰了好几个小时,似乎找不到解决办法。 我需要,给定一个当前日期,并且知道飞机在周二、周四和周六6:00起飞,计算下一次起飞的日期和时间。 我将此信息以事实的形式表示(第二个参数表示一周中的某一天,其中1=星期一): 有人能帮我吗? 谢谢。我提出了以下解决方案,我将尝试提出它 selNextDepH([], _, First, First). selNextDepH([Hd | _], Now, _, Hd) :- Now @<= Hd. selNextDepH(
我需要,给定一个当前日期,并且知道飞机在周二、周四和周六6:00起飞,计算下一次起飞的日期和时间。 我将此信息以事实的形式表示(第二个参数表示一周中的某一天,其中1=星期一): 有人能帮我吗?
谢谢。我提出了以下解决方案,我将尝试提出它
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).
接下来,我们使用sort/2对dep/2
structs的列表list
进行排序
sort(List, ListS),
因此,在列表
(列表已排序)中,我们将日期作为第一个键,时间作为第二个键来排序离开(在dep/2
表单中)
接下来,我们调用selNextDep/3
在dep/2
表单中查找下一个出发点(NextDep
)
并且,使用switchDep/2
,我们以出发/2
形式获得下一次出发
switchDep(NextDep, NextDeparture).
swithcDep/2
微不足道,但selNextDep/3
并非如此(IMHO)
selNextDep/3
背后的思想是返回(在第三个参数中)排序列表(第一个参数)的第一个sel/2
元素,它比第二个参数(现在的时间)大。如果没有找到更大的元素,则返回列表中的第一个元素(下周的第一次离开)
因此,我删除了一个简单的selNextDep/3
,它只调用具有相同参数的helper子句(selNextDepH/4
),并添加了列表的第一个元素(以防找不到更大的元素);就是
对于selNextDepH/4
来说,terminal子句很简单:如果列表为空,则返回(与最后一个参数统一)列表的第一个元素
selNextDepH([], _, First, First).
selNextDepH([Hd | _], Now, _, Hd) :-
Now @<= Hd.
selNextDepH([Hd | Td], Now, First, NextDep) :-
Now @> Hd,
selNextDepH(Td, Now, First, NextDep).
如果列表不是空的,我们有两种情况:(1)now time小于(或等于)列表的第一个元素,因此我们返回(统一最后一个参数)列表的第一个元素
selNextDepH([], _, First, First).
selNextDepH([Hd | _], Now, _, Hd) :-
Now @<= Hd.
selNextDepH([Hd | Td], Now, First, NextDep) :-
Now @> Hd,
selNextDepH(Td, Now, First, NextDep).
我提出了以下解决方案,我将尝试提出它
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).
接下来,我们使用sort/2对dep/2
structs的列表list
进行排序
sort(List, ListS),
因此,在列表
(列表已排序)中,我们将日期作为第一个键,时间作为第二个键来排序离开(在dep/2
表单中)
接下来,我们调用selNextDep/3
在dep/2
表单中查找下一个出发点(NextDep
)
并且,使用switchDep/2
,我们以出发/2
形式获得下一次出发
switchDep(NextDep, NextDeparture).
swithcDep/2
微不足道,但selNextDep/3
并非如此(IMHO)
selNextDep/3
背后的思想是返回(在第三个参数中)排序列表(第一个参数)的第一个sel/2
元素,它比第二个参数(现在的时间)大。如果没有找到更大的元素,则返回列表中的第一个元素(下周的第一次离开)
因此,我删除了一个简单的selNextDep/3
,它只调用具有相同参数的helper子句(selNextDepH/4
),并添加了列表的第一个元素(以防找不到更大的元素);就是
对于selNextDepH/4
来说,terminal子句很简单:如果列表为空,则返回(与最后一个参数统一)列表的第一个元素
selNextDepH([], _, First, First).
selNextDepH([Hd | _], Now, _, Hd) :-
Now @<= Hd.
selNextDepH([Hd | Td], Now, First, NextDep) :-
Now @> Hd,
selNextDepH(Td, Now, First, NextDep).
如果列表不是空的,我们有两种情况:(1)now time小于(或等于)列表的第一个元素,因此我们返回(统一最后一个参数)列表的第一个元素
selNextDepH([], _, First, First).
selNextDepH([Hd | _], Now, _, Hd) :-
Now @<= Hd.
selNextDepH([Hd | Td], Now, First, NextDep) :-
Now @> Hd,
selNextDepH(Td, Now, First, NextDep).