日本語 · English(未訳)

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)。

  1. 値域 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) の域外検査は所属の問い、本語は順序の問い——矛盾しない。
  2. 意味論は定義的等式: 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)。
  3. 点形 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) が返す。
  4. 1 起点——「第 N」は ordinalIn と同じ。0 起点は添字 l[i]・epochOrdinal に温存する。 labelOrdinal(weekday, Sun) == 7 は wkst に依らない(cycle のリスト順)。
  5. 値域の重複は呼び出し時の静的エラー(4 勤 4 休 cycle [On, On, On, On, Off, …] 級——序数が一意でない)。 宣言側に検査は足さない(labels: [m1, m1, …] は 1.0 で合法=実測。足せば動いている定義が割れる)。 数値・論理値の値域も一様に位置を返す(値域はリストであり型で特別扱いしない。1.0 で数値の値域が立つのは labels: cycle [1, 2, 3] だけ=実測)。
  6. 糖衣ではなく core——値層にリスト探索の原語がなく、再帰は禁止(F110)、値域は宣言に住む。 labelOrdinal は CORE_WORDS に加わり、同名の再定義は §4.8 の静的エラー。1 引数形 ord(lunar(d)) は原理的に 不可——ラベル値は素の文字列で所属宣言を持たない(ADR-30 判断 3。実測: == "m1" と == m1 は同じ点列)。
  7. 名は labelOrdinal——一族の綴り(ordinalIn=枠内の第 N・epochOrdinal=紀元からの座標・ labelOrdinal=値域内の第 N)に乗り、略語なし。全語彙集合・2,493 行のコードコーパス・検定・ブログ・供給側 文書で束縛名としての使用 0 件。ADR-30 で廃した labelOf とは別物=値域を読む語(ラベルの読みは従来 どおり束縛名射影)。
  8. 1.1 以降の新語は予約語(ADR-55 と共通の規約)——core・stdlib を問わず、1.1 以降に追加した語と同名の 利用側 top-level 束縛は誘導つき静的エラー(改名を案内)。1.0 の語の挙動(stdlib 公開語 at 等が利用側 top-level 束縛を黙って覆う)は不変。追加拡張の互換条件はこれで「既存の式の意味は不変(新語と同名の束縛を 除く)」と正確に述べられる。spec §4.8/§5.4 に 1 文。
  9. 供給契約と 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 の「実装の順序」):

検証の案(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・レビュー所見)