3.3.1 农历年表示和转换
本节将介绍农历年的三个主要表示系统、以及农历年与公历年之间的转换。这些表示系统包括:天干地支计时系统(The Stem-Branch System),生肖计时系统(The Animal Sign System),以及皇帝封号年号计时系统(The Emperor's Title and Reign Title System)。
(1)基于干支系统的农历年表示。
干支系统自古以来就被用作主要的计时方法。干支系统包括十个有序天干(甲、乙、丙、丁、戊、己、庚、辛、壬、癸)和十二个有序地支(子、丑、寅、卯、辰、巳、午、未、申、酉、戌、亥)。这六十个干支组合表示了一个60个农历年的周期。例如,A.D.1902、A.D.1962、A.D.2022等被称为壬寅农历年(Ren-Yin Lunar Year),是壬寅农历年类(Class of Ren-Yin Lunar Year)的实例。从公元1903年到公元1961年是一个完整的周期,从公元1963到公元2022年也是一个完整的周期。需要注意的是,由于六十个干支组合的循环性,每个组合实际上表示一类农历年。
(2)基于生肖系统的农历年表示。
十二生肖系统是十二生肖的有序集,用来表示十二个农历年的周期。例如,公元1998年、公元2010年和公元2022年均被称为虎年(Tiger Lunar Year),是虎年类的实例,它们均对应第三个地支寅。
(3)基于皇帝封号和年号的农历年表示。
在中国历史上,皇帝基本上均采用封号或年号来表示农历年。一个朝代中的每个皇帝均以其在位的第一年开始计算农历年,作为使用皇帝封号或年号的第一年。例如,清朝皇帝爱新觉罗·玄烨的年号是康熙,其在位时间从公元1661年至公元1722年,所以公元1662年被称为清朝康熙元年。
设Sd是所有朝代的集合,Sep是所有皇帝的集合,Sty是集合{封号(Title),年号(Reign Title)},Set是所有皇帝的封号或年号集合,Sy是公历年集合。下面介绍三个函数。这些函数用于获取朝代d皇帝ep的封号或年号et的起始公历年,结束公历年以及第n个公历年,ty表示et的类型,值为封号或年号。构建转换公理TCT1。
a)starting-solar-yearFn(ty,ep,et,d):Sty×Sep×Set×Sd→Sy.
b)ending-solar-yearFn(ty,ep,et,d):Sty×Sep×Set×Sd→Sy.
c)nth-title-solar-yearFn(ty,n,ep,et,d):Sty×N×Sep×Set×Sd→Sy.
TCT1.(starting-solar-yearFn(ty,ep,et,d)=sy1)∧(ending-solar-yearFn(ty,ep,et,d)=sy2)→(nth-title-solar-yearFn(ty,n,ep,et,d)=sy1+n-1)
∧(1≤n≤sy2-sy1+1)
对于清朝皇帝爱新觉罗·玄烨,有下面的事实:
a)starting-solar-yearFn(Title,Ai-xin-jue-luo Xuan-ye,Kang-xi,Qing)=A.D.1662.
b)ending-solar-yearFn(Title,Ai-xin-jue-luo Xuan-ye,Kang-xi,Qing)=A.D.1722.
c)nth-title-solar-yearFn(Title,n,Ai-xin-jue-luo Xuan-ye,Kangxi,Qing)=A.D.(1722+n-1),where 1≤n≤61.
(4)农历年表示和公历年表示的转换。
对于时间点t,将讨论时间点t所属的公历年表示和农历年表示之间的转换方法。首先,引入相关函数和谓词。
为了在软件系统、知识图谱和实践应用中使用本章的中文时间本体,假定时间点t是可识别的。例如,如果时间点t表示一个公历月或农历月,则其所属的公历年或农历年(即更大的时间粒度)在t中是需要说明的。由此,引入yearFn(t,sl1),monthFn(t,sl1),dayFn(t,sl1),hourFn(t,sl2),and shichenFn(t,sl3),其中sl1∈{solar,lunar},sl2∈{solar},sl3∈{lunar}。这五个函数的值域分别是t所属的公历年/农历年,公历月/农历月,公历日/农历日,小时,时辰的集合。例如,yearFn(2022年1月30日,lunar)=辛丑年,yearFn(2022年2月1日,lunar)=壬寅年,yearFn(2022年1月30日,solar)=2022年,yearFn(2022年2月1日,solar)=2022年。
下面给出一些函数和谓词。
(1)关于模n余数函数,函数modFn(x,n)计算整数x除以正整数n的余数,0≤modFn(x,n)<n。
(2)关于干支系统农历年表示,谓词Predicate stem-branch-combination(sb,s,b)为真,当第s个天干和第b个地支构成第sb个干支组合。
(3)关于时间点表示隶属的干支系统索引,设v是集合{lunar year,lunarmonth,lunar day,Shi-chen}中的元素,谓词stem-branch-no(t,v,n)表示t所属的v干支组合是干支系统中的第n个索引。相应地,定义了谓词celestial-stem-no(t,v,n)和terrestrial-branch-no(t,v,n)。
(4)关于农历日的索引,last-lunar-dayFn(ly,lm)是一个函数,用于获取农历年ly中农历月lm最后一个农历日的索引。其中,ly和lm分别代表农历年和农历月。
由十个有序天干和十二个有序地支可以构成120个组合数,但是,干支系统只包含60个组合数。下面给出干支系统中60个组合数满足的约束公理:
TCT2.∀sb∀s∀b(stem-branch-combination(sb,s,b)
↔(s=10-modFn(10-sb,10)∧b=12-modFn(12-sb,12)))
对于时间实体,若其由公历计时系统所表示,则在信息系统中需要计算其对应的中国传统计时系统表示方法,反之亦然。因此,需要构建公历年表示和农历年表示之间的映射关系。以下公理TCT3和TCT4给出公历年表示映射的干支系统农历年表示的计算方法。TCT5和TCT6给出干支系统农历年表示映射的公历年表示的计算方法,其中k是整数。TCT7用于计算一个农历年的天干和地支表示。
TCT3.∀t∀y(before(A.D.1,t)∧y=yearFn(t,solar)
→stem-branch-no(t,lunar year,60-modFn(3-modFn(y,60),60)))
TCT4.∀t∀y(before(t,B.C.1)∧y=yearFn(t,solar)
→stem-branch-no(t,lunar year,60-modFn(modFn(y,60)+2,60)))
TCT5.∀t∀x(before(A.D.1,t)∧stem-branch-no(t,lunar year,x)
→yearFn(t,solar)=60k+x-57)
TCT6.∀t∀x(before(t,B.C.1)∧stem-branch-no(t,lunar year,x)
→yearFn(t,solar)=60k-x+58)
TCT7.∀t∀m(stem-branch-no(t,lunar year,m)
→celestial-stem-no(t,lunar year,10-modFn(10-m,10))
∧terrestrial-branch-no(t,lunar year,12-modFn(12-m,12)))
例如,计算公历年A.D.2022的干支组合表示如下:
a)Since before(A.D.1,A.D.2022)为真,60-modFn(3-modFn(2022,60),60)=39,根据TCT3,stem-branch-no(A.D.2022,lunar year,39)为真.
b)根据第39个干支组合是壬寅,因此获得A.D.2022是类“壬寅农历年”的实例。