Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Date 序言:寻找下一个日期_Date_Time_Prolog - Fatal编程技术网

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).