ADR-54: 列挙ラベルの序数射影 labelOrdinal(B, x)——宣言値域の宣言順から番号を読む(1.1 の追加拡張)
判断: 本体層 core の射影一族(spec §4.9)に第 4 の語 labelOrdinal(B, x) : 数値 を採用する。B は
列挙値域を宣言した束縛、x はラベル値(または点)。値は x の宣言順の序数(1 起点)。1.1 の
追加拡張=呼び出し形を 1 つ足すだけで、1.0 で合法だった式の意味は一つも変わらない(意味論・文法・字句は
凍結のまま。90-open 3-10 の確定)。確定 2026-10-19・本 ADR の起草 2026-10-21。実装は 1.1.0(ADR-55 と束ねて
一度に公開する。本 ADR の時点では未実装——候補設計は draft §1.34・経過の記録は
30-syntax/10・12)。
- 値域 dom(B) は宣言リストに限る——(i)
external(…, labels: [E₁ … Eₙ])の値域(ADR-46 判断 4)、 (ii) 窓束縛cycle [E₁ … Eₙ] anchor:、(iii)segmentBy(…, labels: cycle […] anchor:)(ADR-47)。いずれも 窓列・点列から独立に順序を持つ宣言である。並行ラベル列(segmentByの静的labels:・テーブルリテラルのlabels:)は窓順・点順の割り当て列で列挙順ではない(labels: [m12, m1, …]の m1 は位置 2)——対象外。label:ラムダは列挙不能(ADR-42 判断 7 (g))。これらとラベル源なしの束縛は誘導つき静的エラー(並行列→ 数値をlabels:に直接書く・ラムダ形→値域を持つ側を渡すlabelOrdinal(saku, lunar(d)))。ADR-42 判断 7 (g) の域外検査は所属の問い、本語は順序の問い——矛盾しない。 - 意味論は定義的等式:
labelOrdinal(B, v) ≡ v == E₁ ? 1 : … : v == Eₙ ? n : ⊥。右辺は 1.0 の値式だけで 書け、現行正準形(reference/segmentBy.md の三項 12 段)の畳み込みである。違いは既定枝が ⊥=明示エラー 「値域の外」になること(1.0.10 の実測: 値域に m13 を足すと三項形は 29 日が既定枝の 12 に化け、警告 0)。 型は==の規則を継承(§4.9)。識別子形と文字列形は同じ文字列値(§5.5)。 - 点形
labelOrdinal(B, d) ≡ labelOrdinal(B, B(d))(ADR-42 と同じ型 dispatch)。B(d)の規約(範囲外の 註釈輸送 §4.10・tz 名検査 ADR-40)を継承し、本語自身は註釈を生まない。点形の固有の価値は wkst に依らない 曜日番号(labelOrdinal(weekday, d))と external/labels: cycle 束縛(B(d)経由しか道が無い)に ある。「月=1…日=7」そのものは 1.0 で既にisoWeekday(d)が返す。 - 1 起点——「第 N」は
ordinalInと同じ。0 起点は添字l[i]・epochOrdinalに温存する。labelOrdinal(weekday, Sun) == 7は wkst に依らない(cycle のリスト順)。 - 値域の重複は呼び出し時の静的エラー(4 勤 4 休
cycle [On, On, On, On, Off, …]級——序数が一意でない)。 宣言側に検査は足さない(labels: [m1, m1, …]は 1.0 で合法=実測。足せば動いている定義が割れる)。 数値・論理値の値域も一様に位置を返す(値域はリストであり型で特別扱いしない。1.0 で数値の値域が立つのはlabels: cycle [1, 2, 3]だけ=実測)。 - 糖衣ではなく core——値層にリスト探索の原語がなく、再帰は禁止(F110)、値域は宣言に住む。
labelOrdinalは CORE_WORDS に加わり、同名の再定義は §4.8 の静的エラー。1 引数形ord(lunar(d))は原理的に 不可——ラベル値は素の文字列で所属宣言を持たない(ADR-30 判断 3。実測:== "m1"と== m1は同じ点列)。 - 名は
labelOrdinal——一族の綴り(ordinalIn=枠内の第 N・epochOrdinal=紀元からの座標・labelOrdinal=値域内の第 N)に乗り、略語なし。全語彙集合・2,493 行のコードコーパス・検定・ブログ・供給側 文書で束縛名としての使用 0 件。ADR-30 で廃したlabelOfとは別物=値域を読む語(ラベルの読みは従来 どおり束縛名射影)。 - 1.1 以降の新語は予約語(ADR-55 と共通の規約)——core・stdlib を問わず、1.1 以降に追加した語と同名の
利用側 top-level 束縛は誘導つき静的エラー(改名を案内)。1.0 の語の挙動(stdlib 公開語
at等が利用側 top-level 束縛を黙って覆う)は不変。追加拡張の互換条件はこれで「既存の式の意味は不変(新語と同名の束縛を 除く)」と正確に述べられる。spec §4.8/§5.4 に 1 文。 - 供給契約と EBNF は不変——wire・schema・解決子は触らない。
name(args)で導出済み・param-key 追加なし。 ADR README のチェックリスト 4 面=EBNF 変更なし・輸送表/整列表は値式の語で行なし(coincidesと同列)・ 入口の否定リストに該当なし。
背景: 供給側の大安・不成就日は external の識別子ラベル(旧暦月)を算術に使うため、列挙名→数の関数を
三項 12 段で premise に置く(実測で成立。収蔵 23)。可読性の代償に加え、補助関数名が標準語 monthNo と衝突した
事故(収蔵 28・monthLabelNo に改名)と、既定枝が黙って吸う罠(判断 2)がある。labels: の宣言順は既に序数を
定めており、それを読む 1 語で三者が同時に消える。需要は 1 例(供給側)+衝突事故 1 件。
却下した案: 案 0=labels: に数値を許す(新語ゼロだが供給契約〈cli の --supply 検査・supply.schema〉の
変更を伴い、名前ラベル〈十二支・六曜名〉には効かない)/ord(略語・文字コードの含意・1.0 で合法な束縛名の
面が最大)/ordinalOf(yearOf/monthOf の Of と向きが逆)/labelNo(stdlib の …No の register・
monthNo 事故と同じ面)/indexOf(list, v)(0 起点・列挙を素のリストに書けない=実測「未解決の名前: m5」)/
並行列を値域に含める(重複が無い間だけ効く緩い受理は閏月でデータが伸びた瞬間に割れる=ADR-46 判断 3 が退けた
「行数で変わる静的性質」と同型)/点形を anchor 起点の「コマの番号」にする(別の量の相乗り。4 勤 4 休の
「サイクルの何日目」は位相の量であって値域の順序ではない——90-open に別項として記録し、需要 2 例目で
phaseIn 級の候補設計へ)。
帰結(1.1.0 の実装時に貫通させる面。順序は 30-syntax/10 の「実装の順序」):
- spec: §4.9 の表に
labelOrdinal(B, x)行(値域 3 形・1 起点・註釈なし・点形の等式)と「読む側の中核は四語」・ §4.8 に予約語の規約(判断 8)・§5.2 の射影行にシグネチャ・§5.4 に命名確定行(候補比較)・§5.6 は「EBNF 変更なし」の注記・glossary §6.4 に 1 行・§2.7 の dispatch 表に 1 句。en ミラーは同一コミットでtools/refresh-source-sha.mjs。 - reference:
labelOrdinal.md(ja/en)新設(doctest: external 版六曜・weekday 番号・labels: cycle の節切り月・ 落とし穴=三つの序数の使い分けと並行列の不受理)・README の射影の表に 1 行・segmentBy.mdの正準形を差し替え 三項形は「1.0 互換の書き方」として併記(既定枝の罠の注記)・external.md・cycle.mdに 1 行。 - impl: CORE_WORDS・TableV に宣言値域・evalCall 分岐(引数 2 個→B の種別で値域導出→重複検査→x が点なら B(x) の 射影経路→型検査→位置+1・域外はエラー)。lexer/parser/stdlib は不変。witness は「検証の案」(1)〜(10)。 Playground 再構築・MCP 再バンドル(words.json はファイル名から自動)・検定の追従・semver minor。
- 記録: CHANGELOG は追補ではなく「## 1.1(日付)」の節(ADR-55 と同じ節)・状態行 4 入口は「1.0 で凍結・ 1.1 で N 語追加」の形・doc-consistency の状態行検査を 1.1 対応に。ADR-30/46/47 に改訂節(本 ADR の起草と 同日)。90-open 3-10 は 91-closed へ。
検証の案(1.1.0 の witness。変異試験の 3 系統で赤を実測してから数える): (1) 大安の外延一致——三項形と同じ
点列・同じ註釈(変異: 起点 0・順序反転で赤)(2) m13 の罠が明示エラー (3) 値域外・型不一致・引数個数の文言
(4) 並行列・label: ラムダ・ラベル源なしの誘導文言 (5) 重複値域のエラーと宣言の受理 (6) 点形の継承=範囲外註釈・
tz 名検査 (7) labelOrdinal(weekday, d) == ordinalIn(day, week, d)(wkst: Mon・全日)(8) 往復
E[labelOrdinal(B, v) − 1] == v (9) 予約語(変異: CORE_WORDS 未登録で赤)(10) 既存スイートが無変更で緑=追加拡張の
証人。
経緯: 還流 2026-09-08 定期便 §3(収蔵 23)で需要 1 例→90-open 3-10 に採録(2026-09-07)→monthNo 衝突事故
(収蔵 28・2026-09-24)→1.0 凍結後の宿題整理で「需要と実害で判断」→1.1 RC の設計材料として 3 観点
(最小の語彙追加/読みやすさと教材/実装と波及)×審査×横断の整合を起こし(2026-10-18・30-syntax/10・12)
→論点 T1〜T8・C1〜C8 を推奨案で確定(2026-10-19)→本 ADR(2026-10-21)。
改訂 1(2026-10-24・レビュー所見)
- 予約語はラベル名にも使えない(判断 8 の拡張・ADR-55 改訂 1 と共通)——
labelOrdinal/since/beforeをcycleのラベル列やlabels:に使うと誘導つき静的エラー(改名)。 - 値域の重複・値域外の検査(判断 5)は呼び出しが評価されたときに走る——
filterの述語の中の呼び出しは点が流れたときで、列が空なら走らない(文書に明記)。