每个月,你的伴侣都要和最好的朋友见一次面。两个人的日程都很满,想找一个合适的日期并不容易!考虑到你自己的日程也很忙,你的伴侣总是会先跟你确认可能的见面日期:
在这个月的通话里,你的伴侣问了你这样一个问题:
你一头雾水,便问什么是“teenth”日。你的伴侣解释说,teenth 日是他们自己编出来的一个概念,指的是一个月里以“-teenth”结尾的那些日期:
由于一周也有七天,因此可以保证,每个月里每个星期几都_恰好_有一个 teenth 日。
现在你已经明白了 teenth 日的概念,便查看自己的日历。teenth 星期四那天你没有别的安排,于是你愉快地和伴侣确认了这个日期。
你的任务是:给定月份、年份、星期几和周次,找出聚会的确切日期。
需要考虑的周次值有六个:first、second、third、fourth、last、teenth。
例如,可能需要你找出 2018 年 1 月的第 1 个星期一的聚会日期(2018 年 1 月 1 日)。
类似地,也可能需要你找出:
teenth 周指的是一个月中以 “-teenth” 结尾的那七天(13 日、14 日、15 日、16 日、17 日、18 日和 19 日)。
如果要找出 1953 年 8 月的 teenth 星期六,我们就查看它的日历:
August 1953
Su Mo Tu We Th Fr Sa
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
由此可知,teenth 星期六是 1953 年 8 月 15 日。
Prolog 内置的日期支持相当简陋。用 [date_time 包][date_time-package] 来处理日期要方便得多。
如果你安装的 Swipl 版本比较新,可以运行下面的命令来安装这个包:
swipl pack install date_time
如果这样不行,可以运行:
swipl -g 'pack_install(date_time)'
如果你使用的是在线编辑器,就不需要手动安装任何东西。
要在解答文件的顶部使用 date_time 包,请添加以下代码:
:- use_module(library(date_time)).
提示:[date_time 包的源码][https://www.swi-prolog.org/pack/file_details/date_time/prolog/date_time.pl?show=src]文档很完善,会很有帮助!