日本語 · English(未訳)

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)——確定を妨げる綻びは出なかった。

却下した案:

帰結:

改訂(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 は点変換として残す。読む側の中核は epochOrdinalordinalIn の二語+束縛名射影に収束。本 ADR の「射影一族を導入する」判断は不変。