ADR-27: 窓→値の射影一族を導入し、cycle を一般化する
判断: 選択子(窓 → 点)の双対として、点から「属する窓」を経由して値を読む射影一族を導入する
——窓内序数 ordinalIn(w, d)(nth の逆向き・窓ごとにリセット)、窓ラベル labelOf(w, d)、窓先頭への
snap snapTo(w)(floor)、紀元からの窓通し序数 epochOrdinal(w, d)(名はいずれも仮称)。あわせて
cycle を一般化して確定する: 周期長は任意、適用先は任意のパーティション窓(year cycle […] 可)、
anchor: は「属する対象窓が先頭ラベル」、cycle の束縛名は値式で「点 → ラベル」の値関数として読める
(解決は点 → 属する窓 → ラベルの二段)。値→時点の持ち上げ(dateOf(y, m, d))は導入を保留する。
窓ラベルの付与側(生成時の label: 引数)は候補に留め、読む側を先に確定する。
背景: 表現力検証で、一見バラバラな要求が同一の欠落に還元された。六曜は「(旧暦月数+旧暦日数) mod 6」
——窓の番号と窓内序数の値計算であり、月替わりでリセットされるサイクルを cycle の変種(resetBy:)と
して機構化するより、仕様の算式に直接対応する(綻び F17/F18)。旧暦の月名(閏五月)・ISO 週番号・年度
ラベル(既存宿題)は窓に貼る値の問題(F23)。イースターは Computus が値式で完全に書けたのに、最後の
「値 (y, m, d) → 時点」の一歩だけが書けなかった(F28)——だが点→値の射影があれば
filter(d => monthNo(d) == easterMonth(yearNo(d)) and …) の形で時点化でき、持ち上げは不要になる。
固定日祝日(毎年 2 月 11 日)・節気の瞬間→日(F21)も同族。既存宿題「ストライドの窓ごとリセット版」も
filter(d => (ordinalIn(w, d) - 1) mod n == 0) に還元されて専用記法が消える。片や cycle は周期長 10・
12・60、適用先 month・year への一般化に無修正で耐えた(F3/F4/F15)——確定を妨げる綻びは出なかった。
却下した案:
- リセット付きサイクル
cycle … resetBy: wを機構として足す案。六曜にしか効かず、旧暦月名・ISO 週番号・ 年度ラベル・イースターを救わない。射影一族なら五者が同じ根から出る。 - 値→時点の持ち上げ
dateOf(y, m, d)を今導入する案。射影+filterで全用例が書けるため二重装備になる。 無効日付(2 月 30 日)の扱いという roll 相当の論点も抱え込む。必要が実証されてから。 - cycle 同士の積(zip。干支 60 の構造的定義)。ラベル述語の
and合成(dayStem(d) == 庚 and dayBranch(d) == 申)で足りる。60 要素の直書きも可(鈍いが正しい)。 - 隣接窓の値への参照(閏月の「前月名を継ぐ」)。窓列に沿った再帰は純粋・遅延(I7)の評価モデルに 逐次依存を持ち込む。実務は暦要項が月名まで確定させるため、データ(ADR-26)側に倒す。
帰結:
- 六曜・旧暦月名(データ併用)・ISO 週番号・年度ラベル・イースター・固定日祝日・節気の日割りが 書けるようになり、40-examples の「要補完」判定のうちデータ起因でないものがすべて解消する。
- 既存宿題「ストライドの窓ごとリセット版」はこの一族への還元で解消(専用記法を設けない)。
- 年度ラベルの射影(2025 年度=開始暦年/US FY=終了暦年)は
labelOfのラベル式の与え方の問題に 変わる——独立の機構ではなく、付与側label:の設計(宿題継続)に吸収される。 - 派生とラベルの相互作用は新機構なし: 裸名は再解決・
Base.wordはピン(ADR-17 の機構 A そのまま)。 - 具体構文と各語の名は 30-syntax §1.16/§1.17 で確定する(名はすべて仮称のまま)。
改訂(2026-07-07・ADR-30 に伴う): 本 ADR が「読む側」に置いた射影の内部設計は、綻び出し
(40-examples/04-projections.md・F34〜F42)を経て ADR-30 で確定した。要点: ordinalIn は二窓引数
ordinalIn(u, w, d)(粒度非依存)、labelOf(汎用語)は廃止しラベルは束縛名で読む(weekday(d))、
点はラベルを格納しない(時間ストリーム型・値型を拡張せず、レコード型も新設しない)、ラベル付きデータは
テーブルリテラルの並行ラベル列 labels:(ADR-26 拡張)、snapTo は点変換として残す。読む側の中核は
epochOrdinal・ordinalIn の二語+束縛名射影に収束。本 ADR の「射影一族を導入する」判断は不変。