aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/kernel/calendar.ml4
-rw-r--r--lib/kernel/liturgical_day.ml1
-rw-r--r--lib/kernel/liturgical_day.mli4
-rw-r--r--lib/kernel/rite.ml1
-rw-r--r--lib/kernel/rite.mli15
-rw-r--r--lib/rites/rite_ef/precedence_ef.mli16
-rw-r--r--lib/rites/rite_ef/rite_ef.ml4
-rw-r--r--lib/rites/rite_ef/rite_ef.mli4
-rw-r--r--lib/rites/rite_ef/rubrics_ef.ml223
-rw-r--r--lib/rites/rite_ef/rubrics_ef.mli37
10 files changed, 308 insertions, 1 deletions
diff --git a/lib/kernel/calendar.ml b/lib/kernel/calendar.ml
index 7fe9f67..d55e38d 100644
--- a/lib/kernel/calendar.ml
+++ b/lib/kernel/calendar.ml
@@ -547,6 +547,9 @@ let build_day (rite : ('s, 'r) Rite.t) (idx : 'r Layer.index)
rite.Rite.readings ~observed:resolution.Precedence.observed.Precedence.cel ~temporal ~date
~temporal_at:rite.Rite.temporal
in
+ let creed =
+ rite.Rite.creed ~temporal ~observed:resolution.Precedence.observed.Precedence.cel ~date
+ in
{
Liturgical_day.date;
rite = rite.Rite.id;
@@ -559,6 +562,7 @@ let build_day (rite : ('s, 'r) Rite.t) (idx : 'r Layer.index)
omitted;
citations;
formulary;
+ creed;
}
let year (rite : ('s, 'r) Rite.t) (layer : 'r Layer.t) (y : int) :
diff --git a/lib/kernel/liturgical_day.ml b/lib/kernel/liturgical_day.ml
index 709f878..09ac0a1 100644
--- a/lib/kernel/liturgical_day.ml
+++ b/lib/kernel/liturgical_day.ml
@@ -26,5 +26,6 @@ type ('s, 'r) t = {
formulary : Mass_formulary.t option;
(** which Mass the day says, and how that was decided; [None] only for
a rite with no lectionary -- see {!Mass_formulary} *)
+ creed : bool; (** whether the Creed is said at this day's Mass; see {!Rite.t.creed} *)
}
[@@deriving sexp]
diff --git a/lib/kernel/liturgical_day.mli b/lib/kernel/liturgical_day.mli
index 4a71d6d..eb45e61 100644
--- a/lib/kernel/liturgical_day.mli
+++ b/lib/kernel/liturgical_day.mli
@@ -33,5 +33,9 @@ type ('s, 'r) t = {
{!Mass_formulary}. [None] only for a rite with no lectionary; for
EF it is [Some] on every day of every year 1583..9999, asserted by
{!Validate}. *)
+ creed : bool;
+ (** Whether the Creed is said at this day's Mass -- {!Rite.t.creed},
+ EF: RG 475-476. A decision, not an [option]: [false] for a rite
+ that has not implemented the rule, same as [creed] itself. *)
}
[@@deriving sexp]
diff --git a/lib/kernel/rite.ml b/lib/kernel/rite.ml
index a7d21d3..4999fc2 100644
--- a/lib/kernel/rite.ml
+++ b/lib/kernel/rite.ml
@@ -18,4 +18,5 @@ type ('s, 'r) t = {
date:Date.t ->
temporal_at:(Date.t -> ('s, 'r) Temporal.t) ->
Mass_formulary.t option * Citation.t list;
+ creed : temporal:('s, 'r) Temporal.t -> observed:'r Celebration.t -> date:Date.t -> bool;
}
diff --git a/lib/kernel/rite.mli b/lib/kernel/rite.mli
index 45f3ed6..39538d0 100644
--- a/lib/kernel/rite.mli
+++ b/lib/kernel/rite.mli
@@ -92,4 +92,19 @@ type ('s, 'r) t = {
temporal identity (the preceding Sunday's, for the ferial rule)
without re-implementing the temporal cycle -- the same shape
[transfer_target]'s own [occupant] callback established. *)
+ creed : temporal:('s, 'r) Temporal.t -> observed:'r Celebration.t -> date:Date.t -> bool;
+ (** Whether the Creed is said, post-Gospel/homily, at this day's Mass
+ (EF: RG 475-476). A [bool], not an [option]: this is a decision,
+ and a rite that has not implemented the rule returns [false]
+ explicitly rather than leaving the question unanswered.
+
+ [temporal] and [observed] are supplied for the same reason
+ [readings] gets both: a rubric like this one can turn on either
+ the day's TEMPORAL-cycle identity (e.g. "is this a Sunday, even
+ one a feast has displaced") or on the celebration actually
+ observed, and only the rite knows which. [date] is supplied for
+ the same reason [readings] gets it too -- a rubric keyed to an
+ Easter-relative window (e.g. "within the octave of Easter") needs
+ the civil date and the rite's own Easter to test it, and neither
+ [temporal] nor [observed] alone carries that arithmetic. *)
}
diff --git a/lib/rites/rite_ef/precedence_ef.mli b/lib/rites/rite_ef/precedence_ef.mli
index 4c2523a..0100d40 100644
--- a/lib/rites/rite_ef/precedence_ef.mli
+++ b/lib/rites/rite_ef/precedence_ef.mli
@@ -132,6 +132,22 @@ val sunday_marker : string
recognising a live candidate again. *)
val major_litanies_slug : string
+(** RG 112(d)'s own closed, hand-verified list of sanctoral entries that are
+ themselves a feast/commemoration OF the Blessed Virgin Mary in her own
+ right -- see the .ml's own citation for the full derivation and the
+ entries considered and excluded. A celebration is "of the BVM" for
+ {!disposition}'s RG 112(d) branch when its [subject] is [Subject.Bvm] OR
+ its slug is on this list ({!Celebration.t}'s [subject] field is NOT
+ reliably [Bvm] for most Marian sanctoral entries -- bootstrapped from
+ lectio, most carry [Saint] instead, this list is the reliable signal).
+
+ Exposed (task 5, the Creed, RG 475(c) "festis II classis... B. Mariae
+ Virg.") so a second rite-local consumer can test the identical
+ Marian-identity question without re-deriving its own list and risking
+ drift from this one -- the same reasoning {!vigil_feast_table} and
+ {!is_vigil} are already exposed for. *)
+val marian_slugs : string list
+
(** [disposition ~winner ~loser]: RG 92-95, 33, 21-27, 94 (docs/research/
rules-register.md §4, "Occurrence", "Vigils" and "Caput IV, 'De
feriis'"). What becomes of a losing candidate, decided by the LOSER's
diff --git a/lib/rites/rite_ef/rite_ef.ml b/lib/rites/rite_ef/rite_ef.ml
index ec6d2b9..e48ff33 100644
--- a/lib/rites/rite_ef/rite_ef.ml
+++ b/lib/rites/rite_ef/rite_ef.ml
@@ -8,6 +8,7 @@ module Vocab_ef = Vocab_ef
module Temporal_ef = Temporal_ef
module Precedence_ef = Precedence_ef
module Lectionary_ef = Lectionary_ef
+module Rubrics_ef = Rubrics_ef
open Colitur_kernel
@@ -45,4 +46,5 @@ let context ~lectionary ~commons : (Vocab_ef.season, Vocab_ef.rank) Rite.t =
vigil_feast = Precedence_ef.vigil_feast };
season_runs = Vocab_ef.seasons;
transfer_target = Precedence_ef.transfer_target;
- readings = Lectionary_ef.readings ~lectionary ~commons }
+ readings = Lectionary_ef.readings ~lectionary ~commons;
+ creed = Rubrics_ef.creed }
diff --git a/lib/rites/rite_ef/rite_ef.mli b/lib/rites/rite_ef/rite_ef.mli
index 2183799..a4b5d87 100644
--- a/lib/rites/rite_ef/rite_ef.mli
+++ b/lib/rites/rite_ef/rite_ef.mli
@@ -10,6 +10,7 @@ module Vocab_ef = Vocab_ef
module Temporal_ef = Temporal_ef
module Precedence_ef = Precedence_ef
module Lectionary_ef = Lectionary_ef
+module Rubrics_ef = Rubrics_ef
(** The EF rite, bundled (design spec's [RITE] signature, realised as a
{!Colitur_kernel.Rite.t} value rather than a functor -- see rite.mli):
@@ -32,6 +33,9 @@ module Lectionary_ef = Lectionary_ef
slug, else (a weekday with no entry of its own) the preceding Sunday's
temporal slug, in data/ef/lectionary.sexp. See {!Lectionary_ef.readings}
for why the Common is consulted second rather than last.
+ - [creed]: {!Rubrics_ef.creed}, RG 475-476 -- whether the Creed is said.
+ The first rubric in this phase governing a part of Mass rather than
+ occurrence/precedence.
Deliberately carries no [sanctoral]/[lectionary] fields the way the
original design-doc sketch of [RITE] does: {!Colitur_kernel.Rite.t} (the
diff --git a/lib/rites/rite_ef/rubrics_ef.ml b/lib/rites/rite_ef/rubrics_ef.ml
new file mode 100644
index 0000000..eef86cb
--- /dev/null
+++ b/lib/rites/rite_ef/rubrics_ef.ml
@@ -0,0 +1,223 @@
+(* RG 475-476 (docs/research/LT.txt, grep "dicitur symbolum"; scan1.txt line
+ ~3872-3888), quoted here in full so every branch below can cite its own
+ letter without re-quoting the whole rubric:
+
+ "475. Post Evangelium aut homiliam, dicitur symbolum:
+ a) in qualibet dominica, etsi eius Officium alicui festo locum
+ cedat, vel Missa votiva II classis celebretur;
+ b) in festis I classis et in Missis votivis I classis;
+ c) in festis II classis Domini et B. Mariae Virg.;
+ d) per octavas Nativitatis Domini, Paschatis et Pentecostes, etiam
+ in festis occurrentibus et in Missis votivis;
+ e) in festis nataliciis Apostolorum et Evangelistarum, necnon in
+ festis Cathedrae S. Petri et S. Barnabae Ap.
+
+ 476. Non dicitur symbolum:
+ a) in Missis sive chrismatis sive in Cena Domini, feria V
+ Hebdomadae sanctae, et in Missa Vigiliae paschalis;
+ b) in festis II classis, iis exceptis quae supra, n. 475 c et e,
+ recensentur;
+ c) in Missis votivis II classis;
+ d) in Missis festivis et votivis III et IV classis;
+ e) ratione alicuius commemorationis in Missa occurrentis;
+ f) in Missis defunctorum."
+
+ SCOPE NOTE, checked once here rather than at every clause below: this
+ engine resolves ONE observed office and ONE Mass per civil day (see
+ Rite.t.readings' own doc comment) -- it has no separate "which votive
+ Mass is said" dimension. So the "vel/et...votivis" halves of 475(a)/(b),
+ 476(c) entirely, 476(d)'s "et votivis" half, and 476(f) (Requiem Masses,
+ also not modelled) are genuinely inapplicable to this implementation --
+ a documented scope limit, not a defect. 476(e) needs no branch at all:
+ [creed] below reads only [observed], never a day's admitted
+ commemorations, so a commemoration can never change its answer by
+ construction. *)
+
+open Colitur_kernel
+
+(* RG 475(e): "in festis nataliciis Apostolorum et Evangelistarum, necnon in
+ festis Cathedrae S. Petri et S. Barnabae Ap." NATALICIUM means the feast
+ of the saint's own death (dies natalis) -- not every feast that merely
+ names him. That is precisely why the clause has to name the Chair of St
+ Peter and St Barnabas EXPLICITLY: neither is a natalicium (Peter's own is
+ 29 June, shared with Paul; Barnabas's is his own day, 11 June, but the
+ clause names him anyway, redundantly with the natalicium reading, rather
+ than leave it to inference), so neither would be covered without the
+ explicit "necnon".
+
+ DERIVED, not copied from any list supplied with this task: grepped
+ data/ef/sanctoral.sexp directly for every entry whose English or Polish
+ name mentions "Apostle"/"Evangelist"/"Aposto{l/ł}a", then each
+ candidate's own date, rank and status checked against the calendarium
+ and against whether it is that saint's own dies natalis. Every entry
+ below was cross-checked against the shipped data, not assumed:
+
+ andrew (30 Nov, Class2) -- his natalicium.
+ barnabas (11 June, Class3) -- named explicitly; also his own natalicium.
+ bartholomew (24 Aug, Class2) -- his natalicium.
+ chair-of-st-peter (22 Feb, Class2) -- named explicitly ("Cathedrae S.
+ Petri"); NOT a natalicium (Peter's own is 29 June, shared with Paul)
+ -- exactly why the clause has to name it.
+ james-the-greater (25 July, Class2) -- his natalicium.
+ john-the-evangelist (27 Dec, Class2) -- his natalicium (the one Apostle
+ traditionally held to have died a natural death; "natalicium" still
+ names his own feast day, not only a martyr's).
+ luke-the-evangelist (18 Oct, Class2) -- his natalicium.
+ mark (25 April, Class2) -- the Evangelist ("Marka Ewangelisty" in the
+ data's own Polish name); NOT "mark-i" (7 Oct), a different saint (a
+ Pope), excluded.
+ matthew (21 Sep, Class2) -- Apostle and Evangelist, his natalicium.
+ matthias (24 Feb, Class2) -- his natalicium.
+ sts-peter-paul (29 June, Class1) -- the natalicium of both.
+ sts-philip-james (11 May, Class2) -- the natalicium of both (James the
+ Less; there is no separate "james-the-less" entry in the data).
+ sts-simon-jude (28 Oct, Class2) -- the natalicium of both.
+ thomas (21 Dec, Class2) -- his natalicium.
+
+ Checked and DELIBERATELY EXCLUDED (the Trap this clause is built around):
+ conversion-of-st-paul (25 Jan, Class3) -- not a natalicium: it
+ commemorates an EVENT of his life, not his death.
+ in-commemoratione-sancti-pauli-apostoli (30 June, Class3, status
+ Feast, so it CAN be observed, unlike the two entries below) -- a
+ secondary commemoration of Paul, not his dies natalis (his own is 29
+ June, with Peter); its own name says so ("In Commemoratione", not a
+ feast of his martyrdom).
+ "peter" (25 Jan) and "paul" (22 Feb) -- both status
+ [Commemoration_only] (RG 110's own Peter/Paul companions, on the
+ Conversion and Chair days respectively: {!Precedence_ef.disposition}'s
+ own citation), so neither can ever be [observed]; moot either way,
+ but neither is a natalicium regardless.
+ mark-i (7 Oct) -- a different saint (Pope St Mark), not the
+ Evangelist. *)
+let creed_apostle_slugs =
+ [ "andrew"; "barnabas"; "bartholomew"; "chair-of-st-peter"; "james-the-greater";
+ "john-the-evangelist"; "luke-the-evangelist"; "mark"; "matthew"; "matthias";
+ "sts-peter-paul"; "sts-philip-james"; "sts-simon-jude"; "thomas" ]
+
+let creed ~(temporal : (Vocab_ef.season, Vocab_ef.rank) Temporal.t)
+ ~(observed : Vocab_ef.rank Celebration.t) ~(date : Date.t) : bool =
+ let easter = Computus.gregorian_easter (Date.year date) in
+ let n = Date.to_rata date - Date.to_rata easter in
+ let m = Date.month date and dd = Date.day date in
+ let slug = Slug.to_string observed.Celebration.slug in
+ if
+ (* RG 475(d): "per octavas Nativitatis Domini, Paschatis et
+ Pentecostes, etiam in festis occurrentibus et in Missis votivis" --
+ an unconditional window override, checked first: EVEN a saint's
+ feast that wins the day within one of the three octaves (St Stephen,
+ 26 December, is the live witness -- RG 67's own "Com. octavae
+ Nativitatis" note, quoted in full in temporal_ef.ml's [named]) still
+ says the Creed. Pure date/Easter-offset arithmetic, not season or
+ rank: Ascension (Easter+39) and the Pentecost Vigil (Easter+48) are
+ both [Class1] and both fall inside the Paschaltide SEASON but
+ outside either 8-day OCTAVE, so a rank- or season-based test here
+ would wrongly include them -- checked and rejected for exactly this
+ reason.
+
+ Nativity: 25-31 December (its own day plus 7) + 1 January (RG 91
+ entry 5's own "Octave Day of the Nativity", the identical table
+ entry as 24 December's vigil -- temporal_ef.ml's [named]). Easter:
+ Easter Sunday (offset 0) through Low Sunday (offset 7) -- RG 11's
+ own "dominicae Paschatis et Pentecostes sunt pariter festa I classis
+ CUM OCTAVA". Pentecost: Pentecost (offset 49) through Trinity Sunday
+ (offset 56), the RG 91-entry-14-adjacent "octave day" Trinity Sunday
+ itself names in temporal_ef.ml. *)
+ (m = 12 && dd >= 25 && dd <= 31)
+ || (m = 1 && dd = 1)
+ || (n >= 0 && n <= 7)
+ || (n >= 49 && n <= 56)
+ then true
+ else if
+ (* RG 475(a): "in qualibet dominica, ETSI EIUS OFFICIUM ALICUI FESTO
+ LOCUM CEDAT" -- the Creed is said on any Sunday even when a feast
+ displaces the Sunday's own office (RG 16(a): a Feast of the Lord I
+ or II class occurring on a II-class Sunday takes its place "cum
+ omnibus iuribus et privilegiis"). Read off [temporal]'s own weekday
+ -- the day's calendar fact, independent of whatever [observed] turns
+ out to be -- never off [observed]'s slug or rank, which is exactly
+ what would go silently wrong the day such an impeding feast wins:
+ see {!Colitur_kernel.Precedence.rules.admit}'s own [~temporal]
+ parameter (precedence.mli) for the identical argument, made there
+ for RG 111(b) rather than RG 475(a). *)
+ temporal.Temporal.weekday = Date.Sun
+ then true
+ else if
+ (* RG 23 (Caput IV, "De Feriis"): "Feriae I classis sunt: a) feria IV
+ cinerum; b) omnes feriae Hebdomadae sanctae." Ash Wednesday and every
+ feria of Holy Week (Monday through Saturday -- RG 91 entry 2's
+ Sacred Triduum, Thursday-Saturday, is a THIRD sub-case of this same
+ "feria", not a "festum": RG 35, immediately below in Caput VI,
+ defines "festum" as a distinct liturgical-day category from "feria",
+ RG 21-27) are FERIAE, never FESTA, however high their RG 91 rank --
+ so 475(b)/(c)'s "in festis" never reaches them, regardless of rank.
+
+ This single structural check subsumes 476(a)'s own explicit naming
+ of the Chrism Mass, the Mass of the Lord's Supper (both Holy
+ Thursday) and the Easter Vigil Mass (Holy Saturday's date): both are
+ already excluded here as Holy Week feriae, so 476(a) needs no
+ separate branch. (Good Friday needs no rubric at all -- RG 28's own
+ closing sentence on the Paschal Vigil aside, Good Friday's own
+ liturgical action has no Mass in the 1955-restored Holy Week to
+ begin with, so the question is moot there independent of this
+ check -- but this structural test correctly excludes it too, since
+ it is also named in RG 23(b).) *)
+ n = -46 || (n >= -6 && n <= -1)
+ then false
+ else if
+ (* RG 28-34 (Caput V, "De Vigiliis"): a vigil is its OWN liturgical-day
+ category, distinct from "festum" (RG 35, Caput VI) the same way a
+ feria is (immediately above) -- so 475(b)/(c)'s "in festis" does not
+ reach a vigil either, regardless of its own RG 91 rank. This is also
+ why 476(a) has to name the Easter Vigil explicitly: RG 28's own
+ closing sentence says the Paschal Vigil, uniquely, "non sit dies
+ liturgicus" [is not a liturgical day] at all, so it is not even a
+ "vigilia" in RG 29-32's numbered sense -- nothing else in this
+ taxonomy would have excluded it without that explicit clause, unlike
+ every OTHER vigil, which is excluded merely by being one.
+ {!Precedence_ef.is_vigil} already tests both slug conventions this
+ codebase's data uses (the temporal cycle's "-vigil" suffix and the
+ sanctoral bootstrap's "vigil-of-" prefix) for the identical RG 33
+ question; reused here rather than re-derived, on the same footing as
+ {!Precedence_ef.marian_slugs} just below. *)
+ Precedence_ef.is_vigil slug
+ then false
+ else if
+ (* RG 475(b): "in festis I classis". Genuine feasts only, by
+ construction of the two exclusions immediately above (feriae,
+ vigils) -- every remaining [Class1] candidate reaching this branch
+ is a real festum: the Nativity, Epiphany, Ascension, Corpus Christi,
+ the Sacred Heart, Christ the King, a I-class sanctoral feast (the
+ Assumption, the Immaculate Conception...), or a I-class Sunday
+ (already [true] above via 475(a), so this branch is never the FIRST
+ to grant those a [true], only ever redundant with it). *)
+ observed.Celebration.rank = Vocab_ef.Class1
+ then true
+ else if
+ (* RG 475(c): "in festis II classis Domini et B. Mariae Virg." --
+ [subject = Lord] is reliably set on genuine II-class sanctoral
+ feasts of the Lord (Exaltation of the Holy Cross, the Purification,
+ the Transfiguration, the Commemoration of the Baptism of the Lord,
+ the Dedication of the Lateran Archbasilica -- checked directly
+ against data/ef/sanctoral.sexp: six [subject = Lord] entries ship,
+ none a vigil or feria) and on the two temporal-cycle Class2 Lord
+ feasts (Holy Family, Holy Name of Jesus). [subject = Bvm], by
+ contrast, is NOT reliable for the BVM half: checked directly against
+ the data, almost every Marian sanctoral entry (the Assumption, the
+ Annunciation, the Immaculate Heart, the Nativity of the BVM...)
+ ships [subject = Saint] instead -- {!Precedence_ef.marian_slugs} is
+ the list built (and, here, reused rather than re-derived) precisely
+ because the [subject] field cannot be trusted alone for this
+ question; see its own citation in precedence_ef.mli. *)
+ observed.Celebration.rank = Vocab_ef.Class2
+ && (observed.Celebration.subject = Subject.Lord
+ || observed.Celebration.subject = Subject.Bvm
+ || List.mem slug Precedence_ef.marian_slugs)
+ then true
+ else
+ (* RG 475(e): see {!creed_apostle_slugs}'s own citation. Checked last
+ and without a rank guard, on purpose -- Barnabas is only [Class3]
+ and the Chair of St Peter's own [subject] is [Saint], so neither
+ would ever be reached by the two branches above; every [Class1]
+ entry on the list (Sts Peter & Paul) is already [true] via 475(b),
+ so this branch is redundant, never wrong, for those. *)
+ List.mem slug creed_apostle_slugs
diff --git a/lib/rites/rite_ef/rubrics_ef.mli b/lib/rites/rite_ef/rubrics_ef.mli
new file mode 100644
index 0000000..16e7491
--- /dev/null
+++ b/lib/rites/rite_ef/rubrics_ef.mli
@@ -0,0 +1,37 @@
+(** RG 475-476 (docs/research/LT.txt, grep "dicitur symbolum") -- whether the
+ Creed is said at Mass. The first rubric in this phase governing a PART OF
+ MASS rather than occurrence/precedence, hence its own module: see the
+ .ml's own header for the rubric quoted in full and every branch's
+ citation. *)
+
+open Colitur_kernel
+
+(** RG 475(e)'s "festis nataliciis Apostolorum et Evangelistarum, necnon in
+ festis Cathedrae S. Petri et S. Barnabae Ap." -- see the .ml's own
+ citation for how each entry was derived from and verified against
+ data/ef/sanctoral.sexp, and for what was deliberately excluded. Exposed
+ so the test suite can assert completeness against the shipped data the
+ same way {!Precedence_ef.vigil_feast_table} already lets it. *)
+val creed_apostle_slugs : string list
+
+(** Whether the Creed is said, post-Gospel/homily, at the Mass this day
+ resolves to.
+
+ [temporal] is read for exactly one fact -- RG 475(a)'s own "in qualibet
+ dominica, ETSI EIUS OFFICIUM ALICUI FESTO LOCUM CEDAT" ("on any Sunday,
+ EVEN WHEN a feast displaces its own Office"): a Sunday impeded by a
+ Feast of the Lord (RG 16(a)) still says the Creed, so this reads the
+ TEMPORAL cycle's own weekday, never [observed]'s. Every other clause
+ reads [observed] -- the celebration whose Mass is actually said -- and
+ [date], read once against the rite's own (Gregorian) Easter for the two
+ Easter-relative window questions (RG 475(d)'s three octaves, RG 23's
+ Ash-Wednesday-and-Holy-Week feriae). [creed] never reads
+ {!Liturgical_day.t.commemorations}: RG 476(e), "ratione alicuius
+ commemorationis in Missa occurrentis" [never say the Creed merely
+ because of a commemoration], holds by construction rather than by a
+ checked branch. *)
+val creed :
+ temporal:(Vocab_ef.season, Vocab_ef.rank) Temporal.t ->
+ observed:Vocab_ef.rank Celebration.t ->
+ date:Date.t ->
+ bool