構文仕様(初版・作業中)
本書は本体層の構文の作業中ドラフト。記法はすべて暫定(仮称)であり、確定した事項と未確定の事項を区別して記す。 根拠は各 ADR。
1. 確定している方針
1.1 記号の三役(ADR-22)
|>— 段の連結(時間ストリームを次段へ流す)。.— premise 修飾(名前空間の階層参照。Gregorian.monthEnd)。|— 結合子(ストリームの和)に温存。段連結には使わない。
1.2 基本形
本体式はパイプ主体で、各段の引数は名前付き、必要に応じ括弧で確定する混成。
生成子 |> 点変換 |> 選択子 |> …
1.3 前文と本体の分離(ADR-18)
premise 宣言(前文)と本体式は分割する。本体式は可能な限り一行、前文は一行にこだわらない。前文は
@名前(軽量形)または premise { ... }(完全形)で premise を供給する(具体構文は §1.6)。危険な premise
(カレンダー・ロール規約)が前文でも段でも解決できなければ静的エラー(ADR-16)。
1.4 core 族と糖衣(ADR-23)
日常は糖衣で短く書き、意味論は core 族で厳密に定義する。糖衣は core への展開で定義され、消せる。
1.5 窓記法(ADR-06/07/08/24, I4/I5)
窓は二種を別演算子に分ける(ADR-08)。パーティション型は窓名を、区間列型はマーカーのストリームを 取り、引数の種類が根本的に違うため一本化しない。
パーティション型 within(w) — 軸を余さず分割する窓。w は窓名(day/week/month/quarter/
year、またはユーザ定義のパーティション窓。ADR-07)で、現在の premise(暦法・WKST 等)の下に解決
される(ADR-17)。網羅・無重複が検査可能(I5)。
everyDay |> within(month) |> last # 各月の最終日
区間列型 segmentBy(m, edges:, empties:) — 任意ストリームのマーカーで切る窓。m はマーカーの
ストリーム式(決算期・月相など。ADR-07)。窓は隣り合うマーカーの半開区間。網羅は保証されないため、
隙間の意味を明示する引数を必須とする(I5「隙間の意味を明示」の構文適用)。
edges:— 最初のマーカー前/最後のマーカー後の、どの窓にも属さない点の扱い。drop(捨てる)/clip(前後に部分窓を作る)/error。empties:— マーカー間の要素ゼロ窓の扱い。keep(正当な空。ADR-15)/drop/error。
隙間ポリシーの省略はサイレントな誤結果(データ欠損で静かに発報が消える。ADR-15)を招くため、宣言必須
(ADR-16 の危険な省略)。よく使う組は将来 gaps: strict 等の糖衣で畳める(ADR-23)。
everyDay |> segmentBy(fiscalCloses, edges: clip, empties: keep) |> first
選択子のレベル nth(n, of: w)/first(of: w)/last(of: w) — 選択子は既定で最内窓(直近の
within/segmentBy)に束縛される。入れ子で対象が曖昧なときのみ of: w で窓を明示する。名指しした窓が
WKST 等の premise を背負い、「第 N」の起点を定める(ADR-24 の二段依存=選択子 → 窓 → WKST を局所化)。
窓なしの選択子は型エラー(I4)、曖昧なまま of: を省くのは静的エラー(ADR-16)。
everyDay |> within(quarter) |> within(month) |> nth(2, of: month) # 各月窓の第 2
everyDay |> within(quarter) |> first(of: quarter)
1.6 前文(premise 宣言)の構文(ADR-16/17/18/19)
前文は ADR-16 のスコープ階層(既定 → 評価文脈 → ブロック宣言 → 段引数、最内優先)のうち評価文脈・ ブロック宣言の層を書く。ドメインモデル §1 の「同一の束縛操作の長短三形」を次の三形で与える。
定義(premise 層 / DDL・多行可) — @名前 が束ねる中身を定義する。
premise JP {
calendar-system: Gregorian # 暦法(構造)
calendar: TSE # カレンダー(方針・営業日)
tz: "Asia/Tokyo"
wkst: Mon
asof: latest
source: "cao.go.jp/official"
}
軽量形(本体層 / DML) — 定義済みの束を前文に敷く。@名前 は単一値の別名(@TSE)でも
多メンバーの束(@JP)でも同じ参照(ADR-17/20)。
@JP
monthEnd |> roll(Preceding, on: bizDay) |> shift(-3, unit: bizDay)
完全形インライン — 名前を付けずその場で前文にする。
premise { calendar-system: Gregorian; calendar: TSE; tz: "Asia/Tokyo"; wkst: Mon }
monthEnd |> roll(Preceding, on: bizDay) |> ...
スコープ — 前文は以降の本体式を統べ、次の前文まで有効(契約の recitals に同型。ADR-16 の評価文脈層)。
範囲を明示的に括るときは @名前 { …本体式… } のブロック形(ブロック宣言層)。段引数は最内で前文を上書きする。
メンバー枠と省略の統治(ADR-16) — メンバーは暦法・カレンダー・ロール・粒度・TZ・asof・wkst・source。 危険なメンバー(取り違えがサイレント誤結果を生むもの)は宣言必須寄り、安全なメンバーは既定可。前文でも段でも 解決できない危険メンバーは静的エラー。
| メンバー | 省略時 | 危険性の根拠 |
|---|---|---|
calendar-system(暦法) |
既定可(Gregorian) | 取り違えは名前曖昧性で検出(ADR-17) |
calendar(営業日カレンダー) |
宣言必須 | 万能な既定が無い/別日を黙って出す |
axis(軸) |
宣言必須(言語既定なし) | 軸取り違えで別結果(shift の 3 日/3 営業日)。§1.7 |
roll(ロール規約) |
宣言必須 | ADR-16 代表例・サイレント誤結果 |
wkst |
宣言必須寄り | 「第 N」反転(ADR-24) |
tz |
宣言必須寄り | ローカル日がずれる(ADR-02) |
source(出所) |
宣言必須寄り | 公式版/ローカル上書きの混同(90-open-questions) |
granularity(粒度) |
既定可(「日」) | 明示でも既定でも結果不変が多い |
asof |
既定可(評価時点) | 再現性重視なら宣言推奨 |
1.7 スコープ既定(on:/unit: の畳み込み。ADR-16/21)
on:(roll・filter)と unit:(shift)は、操作する軸を premise 相対に名指す
(bizDay/day/hour…。cycle 名〈weekday〉はラベルでありストリームに解決されないので軸には
立てない。ADR-21。stride は入力相対=軸を取らない——ADR-38)。軸は在圏の calendar: に解決される
(bizDay は @JP なら TSE の営業日。ADR-17)。
特定カレンダーを直に固定する on: TSE も可。軸位置の premise 名の型は ADR-35 判断 4 の読み替え規約で
埋まる(F53 解消): 束縛として解決できれば通常解決・premise 名としてだけ解決できれば読み替え(両方は曖昧=静的エラー)、P が
カレンダー実体であることを正体判定で要求し、「その段(またはそのスコープ)だけ calendar: を P に
上書きして標準導出 bizDay を読む」=everyDay \ P.nonWorking(everyDay は在圏解決)。実体でない
premise 名は静的エラー。calendar: 在圏では bizDay は言語予約の導出名(手動束縛は静的エラー)。
複数段が同じ軸を書く冗長は、軸を前文メンバー axis: に一度だけ宣言して畳む。省略した段は在圏の axis:
から解決する。これは ADR-16 のレキシカルなスコープ既定(既定 → 評価文脈 → ブロック宣言 → 段引数、最内優先)
であり、後段推論ではないため各段の局所性は保たれる(ADR-21)。
供給元はスコープ全域、最内優先で解決する。
- 束定義
premise JP { axis: bizDay }— 文脈全体で一つの軸を使うとき。 - 軽量形の後置
@JP axis: bizDay— 束は共有しつつ軸だけ本体寄りに与える(軸は本体ごとに変わり @JP は 安定、という粒度差に沿う置き所)。束定義に無ければここで供給、有ればここで上書き。 - 外側の評価文脈 — ファイル頭などの広域宣言。
- 段の明示
on:/unit:— その段だけ別軸に(最内、前文を上書き)。
axis: は宣言必須寄り(言語既定を持たない)。軸取り違えはサイレントな誤結果(shift の「3 日」と「3 営業日」は
別物)を生むため。畳み込みに頼る段があるのにどのスコープにも axis: が無ければ静的エラー。全段が on:/unit:
を明示する本体は軸既定を要しない(各段自足)。同じ機構で roll:(規約)も前文メンバーとして束/後置で宣言し
段が継承できる。ただし危険メンバーゆえ規約は明示を推奨。
# 明示(軸を各段に書く)
@JP
monthEnd |> roll(Preceding, on: bizDay) |> shift(-3, unit: bizDay)
# 畳んだ姿(軸の既定を後置で本体に与える)
@JP axis: bizDay
monthEnd |> roll(Preceding) |> shift(-3)
# その段だけ別軸(最内優先で上書き)
@JP axis: bizDay
monthEnd |> roll(Preceding) |> shift(-3, unit: day)
1.8 結合子(和・積・差と優先度付き上書き。ADR-01/04/22)
結合子はストリーム × ストリーム → ストリーム。premise 層のカレンダー構築(祝日の増減)と本体層の横合成・ 例外日の両方で同じ記号を使う(ADR-18)。
- 和
|— 合併(ADR-22 で確定)。 - 積
&— 交叉(両方に含まれる点)。「和|に積&」の対称。 - 差
\— 除去(A から B の点を除く)。記号はバックスラッシュ U+005C(REVERSE SOLIDUS)。日本語 フォント/JIS 配列では円記号 ¥ のグリフで表示・入力されることがあるが、ソースのコードポイントは U+005C とする(¥=U+00A5 とは別物)。
優先度付き上書き(カスケード。ADR-01/04)は独立記号を持たず、和・差の左結合順序適用で表す。 宣言順 (後の項)が優先=CSS レイヤーの後勝ち。ADR-01 が却下したのは「差・積だけの純フィルター」であり、和を含む 順序適用は対象外。加算(国民の休日)・移動(振替休日は元日を残し翌日を足す)=和、反転(調休)・例外(ある年 だけ営業に)=差、と分解できる。
# 非営業日カスケード(premise 層、後勝ち)
weekends | statutory | substitutes \ specialBiz
# 本体層(横合成・例外日)
tokyoBiz | osakaBiz # 和
schedule \ blackoutDays # 差
結合子はすべて同一優先度・左結合とし、優先度は式の順序で表す。&(積)が絡む混在は意味が順序に依存する
ため、括弧で明示する(ADR-16 の明示志向)。
粒度整合(ADR-36・F56 解消): &・\(と軸所属 filter(on:)/roll(on:)/shift(unit: 点列軸))は、
両辺の整列(全点が同一の原子グリッド G=幅・正規化位相・tz 名の目盛り上にある、
という導出構造からの静的主張)を要求する(stride は入力相対の確定=ADR-38 で対象外に)。不一致・
「なし」は静的エラー、整合の明示は意図で分ける——同じ点なら snapTo・同じ所属(日)なら
coincides(§1.21・ADR-38)。和 | は不問(混合出力は整列なし)。詳細は ADR-36(改訂含む)・spec §4.5。
1.9 ストライド(走査して間引く。ADR-10/11)
ストライドは走査しながら数えて間引く状態付きオンライン変換(ADR-11)で、選択子とは別族。選択子(nth/last)が
窓を消費して窓相対に「第 N」を選ぶ(各窓→1 点・窓ごとリセット。I4)のに対し、ストライドは窓を消費せず「N ごと」に
間引く(境界を無視して連続・リセットしない)。「月境界を無視して N 営業日ごと」は選択子では書けず(窓リセット)、
これがストライドの存在意義(ADR-11)。「第 N」ではなく「N ごと」。
引数の種類で二演算子に割る(ADR-08 の窓分割と同じ教訓:軸単位の整数 vs 複数軸の物理量)。
| 演算子 | 引数 | 数えるもの | 例 |
|---|---|---|---|
stride(n, from:) 入力カウント |
1 以上の整数(違反は静的エラー) | 入力ストリームの点(軸引数なし=ADR-38・F70。何を数えるかは前段が決める) | filter(on: bizDay) \|> stride(3, from: …)=3 営業日ごと |
strideBy(w, from:) 幅刻み |
幅=複数軸の物理量 | 幅(絶対量・DST 等は幅の規約 ADR-12) | strideBy(24h39m35.244s, from: …)=1 sol ごと(ADR-19) |
@JP
everyDay |> filter(on: bizDay) |> stride(3, from: 2026-01-05) # 3 営業日ごと(入力相対=前段が決める)
everyInstant |> strideBy(24h39m35.244s, from: 2026-01-01) # 1 sol ごと(幅刻み)
数え起点は「from: 以上の最初の入力点」(第 0 歩=残る。from: が入力の点であることは要求しない。
ADR-38)。
起点(位相アンカー) は from: で必ず明示する(無ければ静的エラー。位相の取り違えはサイレント誤結果。
ADR-16/I3)。かつての「前段の窓の起点から供給」は、窓が複数あるとき多義で評価範囲依存(I7 と緊張)のため
ADR-31(F49)で廃止した。リセットは既定しない(境界無視・連続。ADR-11)。窓ごとに数え直す版は
ordinalIn への還元(§1.17・ADR-27)で書く。
1.10 値式・変数(ADR-25)
premise 層は時間ストリームでない値式を持つ(ADR-25)。値型は数値・論理・列挙(Mon・Preceding 等)・
文字列("Asia/Tokyo"。ADR-32 で導入)。本体層の引数変数(将来の shift(n) の n)も同じレイヤー。演算子は
既存記号と衝突しないよう選ぶ(ADR-25 の統廃合)。
| 種別 | 記号 |
|---|---|
| 算術 | + - * /、剰余 mod(語。論理と同じく英単語系) |
| 比較 | < <= > >= == != |
| 論理 | and・or・not(語。記号 &/\| は結合子に温存) |
| 条件 | 三項 cond ? a : b |
| 束縛/等値 | = は束縛(定義)、== は等値比較 |
述語と変数 — 述語は対象の各要素をラムダで束縛する。矢印は =>(型記法 -> と区別)。where は filter
に統合し、filter が premise 述語(on:)と値式述語(ラムダ)の両方を取る(ADR-25)。束縛名で参照するので
入れ子でも曖昧にならない(ADR-16 明示志向)。
# 閏年規則(値述語)と月の非一様境界。窓生成語は §1.11 で確定(ボトムアップ集約が主)
isLeap = y => y mod 4 == 0 and not(y mod 100 == 0 and y mod 400 != 0)
daysInMonth = m => monthLengths(isLeap(yearOf(m)))[monthOf(m)] # 閏は m から値計算(year 窓を見ない)
month = day span daysInMonth
year = month span (_ => 12) phase: 0
1.11 原始的定義の窓生成語と公開語(ADR-07/10/11/19/20/25)
原始的定義(Gregorian 等・派生元を持たない根。ADR-19)は、連続時間軸(基底。ADR-10)を窓へ刻んで暦法を
組み立て、公開語を生む。窓生成語は三系統+一(窓を作る grid/span/split と、窓でなくラベルを生む
cycle)。窓を作る三語はいずれもパーティション型窓(ADR-08)を作り、網羅・無重複が構造的に保証される(I5)。
依存はボトムアップ集約を主とする:原子 day を month に束ね、その month を
year に束ねる(month が基本の括り)。year の従属窓(quarter)だけは year を split で割って作り、
year の変化に自動追従させる。この向きの選択には理由がある(下記「閏は窓でなく値」)。
| 語(仮称) | 種別 | 意味 | 例 |
|---|---|---|---|
grid(w) |
一様分割 | 連続軸を幅 w(物理量・DST は幅の規約 ADR-12)で等幅にタイル。暦の原子を作る。strideBy と幅概念を共有するが grid は網羅分割・strideBy は間引き(ADR-11/25) |
day = chronos grid 1d |
span(f) |
可変集約(ボトムアップ) | 細かい単位の列を連続窓へ束ねる。f = n => 個数 は生成中の窓の序数 n(premise の紀元起点)を束縛し、束ねる単位個数を返す。個数は可変でも定数でもよい(month は日数可変、year は 12 定数) |
month = day span daysInMonth / year = month span (_ => 12) |
split(g) by: u |
可変分割(トップダウン) | 親窓を連続部分窓へ割る。g = y => [幅…] は親の序数 y を束縛し部分窓幅のリストを返す。by: u は幅の単位を明示(「3 月」対「3 日」の取り違えはサイレント誤結果ゆえ ADR-16 明示)。幅総和が親に一致することは I5 で検査可能。従属窓(親に自動追従させたい quarter 等)に使う |
quarter = year split (_ => [3,3,3,3]) by: month |
cycle(labels) anchor: |
並列ラベル | 単位窓に反復ラベルを付す。年・月に入れ子でなく並列に回る(曜日。ADR-03)。窓ではなくラベルを生む点で span/split と別。anchor: が位相(どの実日が先頭ラベルか)を固定。WKST(§1.6 の premise メンバー)とは別で、cycle は律動を・WKST は週選択子の「第一」を担う(ADR-24) |
weekday = day cycle [Mon,…,Sun] anchor: 2000-01-03 |
ラムダ束縛は §1.10 の => をそのまま用いる(新規判断なし)。span は生成中の窓の序数を、split は親窓の序数を
束縛する(向きの差=ボトムアップは束ねる窓自身の序数/トップダウンは親窓の序数、がそのまま引数に出る)。
閏は窓でなく値(依存方向を決める要) — 「2 月は 28 日か 29 日か」は year という窓への依存に見えるが、
実際には month の通し番号 m から算出できる値依存である(m から暦年と月位置を割り出し isLeap で判定。
下の daysInMonth)。だから month を year 窓に依存させる必要がなく、month を基本の括り(day を束ねる)に
置ける。もし month を year の子(year split)にすると、派生(会計暦。§1.12)で year を month から束ね直す
とき month ↔ year が循環する。閏を値依存と見て month を親に置けば循環は最初から生じない。これが上の
ボトムアップを主とする選択の理由であり、§1.12 の会計暦が一行で・回避策なしに書ける根拠。
公開語(premise メンバー) — ブロック top-level の束縛だけが公開され、Gregorian.month のように . で参照
される(ADR-22・ADR-17)。窓束縛(month=パーティション、within(month) で使う)と境界束縛を書き分ける。
境界は本体層の選択子を再利用して導く(新機構ゼロ):
monthStart = month |> first # 各月窓の先頭点
monthEnd = month |> last # 各月窓の末尾点(=暦日の月末 5-31)
これにより §2.1 の生成子 monthEnd(暦法純粋・5-31 を出す。ADR-20・I8)の正体が判明する:それは公開境界語
Gregorian.monthEnd = month |> last そのもの。「生成子」は原始的定義の公開境界語である(別機構ではない)。
本体層は現在 premise 下で裸名を解決し(ADR-17)、曖昧なら Gregorian.month と修飾する。派生的定義(ADR-19・
次段)はこの公開語をパイプ変換する(会計暦=Gregorian.monthStart |> shiftBoundary(+3))。
Gregorian(抜粋):
premise Gregorian {
day = chronos grid 1d # 原子(連続軸を市民日で分割)
weekday = day cycle [Mon, Tue, Wed, Thu, Fri, Sat, Sun] anchor: 2000-01-03
isLeap = y => y mod 4 == 0 and not(y mod 100 == 0 and y mod 400 != 0) # 値述語(§1.10)
daysInMonth = m => monthLengths(isLeap(yearOf(m)))[monthOf(m)] # 閏は m から値計算(year 窓を見ない)
month = day span daysInMonth # 基本の括り:day を束ねる(year 非依存)
year = month span (_ => 12) phase: 0 # month を 12 ずつ束ねる
quarter = year split (_ => [3, 3, 3, 3]) by: month # year の従属窓(会計暦で自動追従)
monthStart = month |> first # 公開境界語(選択子の再利用)
monthEnd = month |> last
yearStart = year |> first
}
補助値関数 yearOf(m)/monthOf(m) は month の通し番号 m から暦年と月位置(0–11)を、monthLengths(bool) は
閏真偽から 12 か月の日数リストを返す(いずれも値式・§1.10。year 窓を参照しない=閏は値依存)。ブロック内の
束縛は依存順に解決する(day → month → year → quarter)。相互参照は可、循環はエラー。名前・記号はすべて
仮(grid/by:/axis/日付リテラル等は第 4 節の残件)。
1.12 派生的定義(premise → premise の閉包。ADR-19/23/25)
派生的定義は、既存 premise(Gregorian 等)の公開語を上書き・追加して新しい premise を作る。premise → premise
の閉包であり、本体層の stream → stream 閉包と対称(ADR-19)。典型は暦法の派生(会計暦)で、結果は元と同じ
資格で使える(calendar-system: Fiscal)。
core は with 上書き — base を土台に、指定した公開語だけ差し替え、残りは継承する。
premise Fiscal = Gregorian with {
year = month span (_ => 12) phase: 3 # 暦月を 4 月始まりで 12 ずつ束ね直す
# month は触れないので暦月・月末は不動(Gregorian のまま継承)
# quarter は継承定義(year split by month)が新 year に自動追従 → 会計四半期 Apr-Jun/…
# yearStart = year |> first も新 year に追従(4 月 1 日群)
}
名前解決(機構 A・ADR-17):
- 裸名は派生スコープで再解決 — 上書き(
year)が shadow し、それに依存する継承語(quarter・yearStart)は 自動で新しい語に追従する。冗長な再列挙が要らない。会計暦がyear一行で済むのはこのため。 Base.wordの修飾参照は base の解決済み値にピン — 継承語をあえて base 値に固定したいときの明示手段。 会計暦ではmonthを上書きしないのでピンは不要(monthは Gregorian のまま継承され、暦月・月末は不動)。 §1.11 でmonthを基本の括り(day span・閏は値計算)に置いたのでmonth ↔ yearの循環が生じず、旧稿のようなmonth = Gregorian.monthの据え置きピンは要らなくなった。2 月の 28/29 が暦年で決まる事実はdaysInMonthの値 計算(§1.11)が担い、窓依存ではない。
日付は動かない(基底固定 ADR-09・I1) — 派生が動かすのは窓の切れ目だけ(ADR-19 の解釈 P)。暦日・
day/month/week・monthStart は不動。2026-03-01 は「3 月 1 日」のまま、所属する年窓だけが変わる
(2025 年度=Apr2025–Mar2026)。軸ごと平行移動する解釈 Q(Gregorian |> shiftBoundary(+9) で Oct が Jan に
なる類)は却下済み(ADR-19)。Oct は Oct のまま、会計年度内の第 1 月という序数になるだけ。
パイプは糖衣、展開は span の位相ずらし一発 — 日常形は
premise Fiscal = Gregorian |> shiftBoundary(+3, on: year, unit: month)。|> は premise 層では premise → premise
を繋ぐ(閉包の対称。ADR-22 の段連結の premise 版)。shiftBoundary は上の with 上書きへ展開する糖衣(ADR-23)で、
展開規則は一般に:
shiftBoundary(δ, on: W, unit: U) ≡ W = U span (_ => k) phase: (φ₀ + δ)
# k = W が含む U の個数(year ⊃ month なら 12)
# φ₀ = base での W の位相(Gregorian の year は 0)
W を「U を k 個ずつ束ねる span」と見て、その位相を δ だけ進めるだけ。§1.11 をボトムアップに組み替えた
(month が親)ことで、旧稿で懸念した split の分割リスト回転や k 可変の扱いは不要になった。k が定数でない
組(month ⊃ day を day 単位でずらす等)はそもそも「括りを単位個数でずらす」会計暦型の操作ではなく、
shiftBoundary の射程外(必要なら別演算子。§4 残件)。
直交する別ノブ(追跡) — 「2025 年度」の番号付け(開始暦年ラベル/US FY は終了暦年)は窓の切断とは独立した
序数・ラベルの射影で、規約が国ごとに違う。shiftBoundary に埋め込まず別論点として扱う(90-open-questions)。
名前・記号は仮(with・phase:・shiftBoundary)。phase: は §1.11 の窓生成語(span/split)の位相起点引数。
1.13 糖衣定義(core への展開規則。ADR-23)
糖衣(monthEnd・businessDays・nextWeekday 等)は core 族の合成に名前を付けた略記で、core への展開で消せる
(片方向依存。ADR-23)。その定義を書く構文をここで確定する。要点は「専用の新構文は要らない」:既存の束縛
=(§1.10)に、右辺として core のパイプ列を書くだけ。§1.10 の値関数 isLeap = y => …、§1.11 の premise 公開語
monthStart = month |> first と、同じ = 束縛機構が右辺の型(値/premise/変換)を変えて現れているだけ。
基底 B(ラムダ明示) — 前段ストリームを s => で束縛し、s |> で core 列に流す。|> は「値 → 変換の適用」の
一義(§1.10 のラムダの素直な再利用、意味論が最小)。
businessDays(on: p) = s => s |> filter(on: p)
nextWeekday(d) = s => s |> roll(Following, on: (everyDay |> filter(x => weekday(x) == d)))
(nextWeekday の展開先は当初 within(week) |> selectWeekday(d) としていたが、F30/F31 の綻びにより
前方 roll に改めた。§1.16 補を参照。)
略記 A(ポイントフリー) — 前段 s が素直に流れるだけ(先頭が s |> で s が他に現れない)なら s => を
省ける。これは B の eta 簡約であり、糖衣定義それ自体の糖衣(ADR-23 の自己相似が糖衣定義構文にも現れる)。省くと
|> の左に変換が来るので、|> は「変換 |> 変換=合成」も担う。ADR-22 の |>=「段の連結」の枠内で、適用と合成は
型(値か変換か)で区別され一義は保たれる。§1.11 の公開語 monthStart = month |> first と見た目も揃う。
businessDays(on: p) = filter(on: p)
nextWeekday(d) = roll(Following, on: (everyDay |> filter(x => weekday(x) == d)))
前段を名前で使う(分岐・再結合する)糖衣は A に畳めないので B で書く。
aroundMonthEnd(k) = s => (s |> within(month) |> last) | (s |> within(month) |> last |> shift(-k))
宣言印は付けない — 「これは糖衣だ(core へ展開できる)」ことは、右辺が core 語(+既定糖衣)だけに依存する
ことから依存解析で自動判定できる。sugar 等のキーワードは置かず = 束縛のまま(§1.10/§1.11 との統一)。core 語
(生成子・点変換・結合子・フィルタ・窓・選択子・ストライド)は言語組み込みの予約で、それ以外の名前付き束縛が
糖衣・公開語。core 語を再定義する束縛(片方向依存を破る。ADR-23)は静的エラー。
premise は焼き込まず遅延解決 — 糖衣は定義時に premise を固定せず、呼び出し時の在圏 premise で解決する
(ADR-17)。nextWeekday の weekday ラベルは呼び出し文脈の暦法から解決され、糖衣自身は暦法を知らない
(ADR-23・ADR-24)。week 窓の wkst 参照(§1.16 補)も同じ規則。複雑さは展開先の core が背負い、糖衣は薄い。
展開=右辺の機械的差し込み — x |> nextWeekday(Fri) は定義右辺を差し込んで
x |> roll(Following, on: (everyDay |> filter(x => weekday(x) == Fri))) に開く。全糖衣を展開すれば core だけが
残る(ADR-23)。premise 層のパイプ糖衣(shiftBoundary。§1.12)も同じ片方向展開で、そちらは
premise → premise の with に開く。
1.14 暫定語彙(サンプル検証用・すべて仮)
40-examples/ の表現力検証(既知スケジュールのサンプル記述=綻び出し)で使う、既出だが未定義の語を
ここに一括で仮置きする。すべて(暫定)であり確定ではない。表記をここに固定するのは、サンプルごとにその場
発明すると表記が割れ、綻びの分析が濁るため。対応する宿題は 90-open-questions.md に登録済み。
| 語(暫定) | 仮の定義 | 既出箇所 |
|---|---|---|
| 日付リテラル | ISO 8601 サブセット 2000-01-03(日)・2026-02-11T09:00(時刻付き)。TZ は埋め込まず在圏 premise の tz: で錨を打つ(I6) |
anchor:(§1.11)で使用中 |
| 幅リテラル | 数値+単位接尾の並び。d=市民日(規約幅)、h/m/s=経過時間。例 1d・24h39m35.244s。市民時と経過時間の区別は ADR-12 の規約集合 |
grid 1d(§1.11)・strideBy(§1.9) |
div |
整数除算(mod と同族の語) |
yearOf(m)=紀元年 + m div 12(stdlib/gregorian.md) |
リストリテラル […]・添字 l[i] |
値式のリスト構築と 0 起点アクセス | monthLengths(...)[monthOf(m)](§1.11・stdlib) |
everyInstant |
連続基底の全点を流す生成子(strideBy と併用) |
§1.9 の sol 例 |
| cycle ラベルの述語参照 | cycle 束縛名を「点 → ラベル」の値関数として読む: filter(x => weekday(x) == Mon)。cycle の律動(§1.11)と値式(§1.10)の接続 |
stdlib/gregorian.md §4.4 が説明文中で使用 |
selectWeekday(d) |
filter(x => weekday(x) == d)nextWeekday の決着は §1.16 補(roll のラベル軸版)へ |
§1.13 |
week 窓 |
WKST 位相の 7 日並列窓(月・年に非入れ子)。決着は §1.16 補(wkst: 遅延解決の segmentBy 定義) |
within(week)(§1.13・spec §7.2) |
単位窓以外への cycle |
cycle の適用対象を任意のパーティション窓に読む(year cycle […]・month cycle […])。anchor: は「anchor の属する窓が先頭ラベル」と解釈 |
例は weekday(day)のみ |
1.15 データの持ち込み口(テーブルリテラル。ADR-26)
表現力検証(40-examples)で確定した最大の欠落は、周期規則から生成できない列(官報の春分秋分・朔・
二十四節気・調休の特例日)を premise へ持ち込む口が無いことだった(F5)。受け皿(segmentBy・結合子・
カスケード)は既存語彙で足りる。設計は次の通り(ADR-26 で確定)。
テーブルリテラル — 時点リテラルのリストは時間ストリーム定数に昇格する。構文は値リスト(§1.14)と 同一で、型は要素で決まる(数値要素→値リスト、時点要素→時間ストリーム。要素ゼロは covering: の 有無で決まる——空テーブルの合法化は §1.26=ADR-45)。列は昇順を要求(乱順・重複は 静的エラー。無限ストリームのマージ(結合子)が有限定数列でも成り立つための整列則)。
premise JPGazette {
source: "cao.go.jp/official"
asof: 2025-02-03
vernalEquinoxDay = [2025-03-20, 2026-03-20, 2027-03-21] covering: 2025..2027
}
- 出所の統治: テーブルリテラルを含む premise は
source:宣言必須寄り(データの出所取り違えは サイレント誤結果=ADR-16 の基準で危険 premise)。版はasof:が担う。cycle のanchor:(干支の 甲子日)も同じ「権威データ」であり、規則(巡回列)とデータ(位相)の境界は premise の中を走る(F13)。 - 有効範囲
covering:(仮称): データ列は尽きる(2028 年分は未告示)。範囲外の評価は「事故の空」 ではなく範囲外の出自として評価註釈(ADR-15)に流す。省略時は列の端が範囲(端の外=範囲外)。 - 範囲リテラル:
2024-02-10..2024-02-17は連続日の列挙に展開される糖衣(F12)。 - 層またぎ規則(F25): premise 束縛の右辺には、値式・窓生成語に加えて本体層のストリーム式
(テーブルリテラル・
segmentBy・stride・snapToなどのパイプ列)を書ける。ADR-25「語彙は本体層と 共有」の明文化。公開語の型は右辺の型で決まる(窓/ラベル/値/ストリーム)。旧暦 (lunarMonth = day |> segmentBy(newMoons |> snapTo(day), …))はこの規則の上に成立する。 - 軸とストリーム(F7):
on:に渡す軸名は在圏 premise で有効点ストリームに解決される。ゆえに 導出ストリーム(nonHoliday = everyDay \ statutory)をそのまま軸として渡せる(型は同じ)。 - segmentBy の所属規約(F22): 粗い単位列(日)を細かいマーカー(瞬間)で切るとき、各要素の所属は
その代表点(窓要素なら先頭点)が区間に入るかで決まる。旧暦の朔日規約(朔を含む日から新月)の
ように「含む単位から」としたいときは、マーカーを先に
snapTo(day)で単位境界へ落としてから渡す。 - カレンダー実体(F10):
calendar:メンバーに与える実体は「非稼働日ストリーム+出所・版」の束 である、と型を確定する(bizDay軸はeveryDay \ nonWorking相当の導出)。束ねる宣言構文の詳細は 宿題継続。 外部供給宣言(socket)— 方向提示のみ・未確定→externalとして確定(§1.27 → ADR-46・2026-07-14): テーブルリテラルは「式に埋めるデータ」・external は「器で受けるデータ」。 当初の方向提示(器=名前・型・出所表記のみ・取得/真正性は外部=ADR-15)は維持され、器の中身が 「実行時に解決されるテーブルリテラル」(kind=整列の主張・labels=値域・covering/asof は解決値が 必ず運ぶ供給契約)として具体化された。
1.16 cycle の一般化(確定。ADR-27 に同居)
検証(40-examples 02)で cycle は周期長・適用先の一般化に耐えた。暫定(§1.14)を次の通り確定する。
- 周期長は任意: 7(曜日)に限らず 10(十干)・12(十二支)・6・60 も同じ意味論(巡回列+位相)。
- 適用先は任意のパーティション窓:
day cycle […]に限らずmonth cycle […]・year cycle […]・ 自作窓への適用を許す。anchor:は時点リテラルで、「anchor の属する対象窓が先頭ラベル」(day なら その日、year ならその年窓。F3・F15)。 - ラベルの述語参照: cycle の束縛名は値式の中で「点 → ラベル」の値関数として読める
(
filter(d => weekday(d) == Mon)・yearBranch(d) == 午)。解決は「点 → 属する対象窓 → その窓の ラベル」の二段(F15)。 - 派生との相互作用: 裸名は派生スコープで再解決される(機構 A)ので、派生が対象窓を動かせばラベルの
張り付き先も動く。暦年に固定したい干支のような語は
Gregorian.yearBranchと修飾ピンで base に 据え置く(ADR-17 の既存機構で足りる。新機構なし)。 - cycle 同士の積(zip。干支 60 の構造的定義)は導入しない——ラベル述語の
and合成で足りる(F16。 60 要素直書きも可・鈍いが正しい)。
§1.16 補: week 窓と nextWeekday の決着(F30/F31)
week 窓は Gregorian の公開語として次で定義する——右辺が前文メンバー wkst: を参照し、使用時の
在圏 premise で遅延解決する(糖衣と同じ規則。ADR-17)。wkst: 未宣言の premise 下で within(week) を
使うと静的エラー(宣言必須寄りの統治がそのまま効く):
weekStart = day |> filter(d => weekday(d) == wkst) # wkst は前文メンバー(遅延解決)
week = day |> segmentBy(weekStart, edges: clip, empties: error)
生成は segmentBy(区間列型)だが、weekday の巡回により網羅・無重複が I5 で検査証明できるので
within(week) に使える——「パーティション性は生成語でなく検査で立つ」。専用の窓生成語(span 位相版 or
cycle 由来。§4 の宿題)は不要になった。層またぎ(§1.15)・ラベル述語(§1.16)・遅延解決(§1.13)の
合成だけで立つのがこの決着の要点。
nextWeekday は within(week) 展開を撤回し、roll のラベル軸版で定義する:
nextWeekday(d) = roll(Following, on: (everyDay |> filter(x => weekday(x) == d)))
理由(F31): 旧展開 within(week) |> selectWeekday(d) は「同じ週窓の d 曜」を選ぶため、点が週後半に
あると過去へ選択が飛び得る(wkst: Mon の下で土曜の点の「同週金曜」は前日)。要求「翌週金曜=次の
金曜へ進む」の意味論は前方 roll そのもの。導出ストリームを軸に渡せる(§1.15・ADR-26)ので新語は不要、
selectWeekday は廃語。この定義は WKST 非依存になる(週窓を経由しないため)——「第 2 週の金曜」の
ような窓序数依存の式だけが WKST を要する、という整理に揃う(stdlib/gregorian.md §4.4 と整合)。
1.17 窓→値の射影一族(候補設計。ADR-27)
六曜(旧暦月+日の剰余)・旧暦の月名・ISO 週番号・年度ラベル・イースターの時点化・固定日祝日は、 検証の結果すべて同一の欠落に還元された(F2/F17/F18/F21/F23/F28): 点から「属する窓」を経由して 値を読む手段が無い。選択子(窓 → 点)の双対として、射影(窓 → 値)を一族で導入する。
| 語(仮称) | 型 | 意味 |
|---|---|---|
ordinalIn(w, d) |
点 → 数値 | 点 d が属する w 窓の中で第何要素か(1 起点・窓ごとにリセット)。nth の逆向き |
labelOf(w, d) |
点 → ラベル/値 | 点 d の属する w 窓のラベル。cycle ラベル読み(§1.16)の一般形 |
snapTo(w) |
ストリーム変換 | 各点をその属する w 窓の先頭点へ写す(floor。節気の瞬間→日)。窓の属性(境界点)を読む射影のストリーム版 |
epochOrdinal(w, d) |
点 → 数値 | 属する w 窓の紀元からの通し序数(§1.11 の窓序数 n・m と同じ座標)。yearOf/monthOf(stdlib)と接続 |
- 導出できるもの: 点の暦座標
yearNo(d)・monthNo(d)・dayNo(d)は標準 premise の糖衣 (epochOrdinal/ordinalInから算出)。ストライドの窓ごとリセット版(既存宿題)はfilter(d => (ordinalIn(w, d) - 1) mod n == 0)に還元され、専用記法が不要になる。六曜は(lunarMonthNo(d) + ordinalIn(lunarMonth, d)) mod 6。イースターは射影+filter で時点化できる (値→時点の持ち上げdateOfは保留——射影で全用例が書けるため。F28)。 - 窓ラベルの付与(書く側・仮): 生成時に
label:引数でラベル式を与える (lunarMonth = day |> segmentBy(…) label: (m => 中気番号から算出))。閏月の「前月名を継ぐ」のような 隣接窓参照は導入しない(F24。射程外——実務は暦要項が月名まで確定させるためデータ側に倒す)。 付与側の構文はその後 ADR-34 で確定した——ラムダは窓の先頭点を受け、名前(d)≡ 付与式(先頭点) (射影時・遅延評価。点±幅算術は導入しない)。
綻び出しの結果(40-examples/04-projections.md・F34〜F42) — 01〜03 の「要補完」を射影で書き直して
穴を炙り出した。暦座標 yearNo/monthNo/dayNo は epochOrdinal+ordinalIn+既存値関数の糖衣で
導ける(新規語は epochOrdinal・ordinalIn の二つで足りる)ことが確認できた。一方、次の六点が未決の
まま残り、これらが決まらないと六曜の月名・ISO 週番号・年度ラベル・節気名が書けない(次段の設計対象):
ordinalIn/epochOrdinalの引数設計(数える対象と枠が引数で絡む。二窓引数ordinalIn(数える窓, 枠窓, d)への一本化を検討。F34)。- 射影値は入力ストリームの粒度に依存する(
ordinalIn(month, d)は入力が日なら「第何日」・瞬間なら 「第何瞬間」)。「窓の下位窓を数える」粒度非依存版を分けるか(F35・F42)。 labelOfが読むラベルの源が三種(cycle 由来/label:付与/暦座標糖衣)で未区別。「窓はラベルを 一つ持ち源は生成時に決まる」モデルの明文化が要る(F36)。label:付与式の表現力: 隣接窓参照は射程外(F37)だが、ISO 週番号・年度ラベルは別の点の窓(週の 木曜が属する年)を参照する。付与式がどの点の窓まで見てよいかの設計(F40)。- ラベル付きテーブルリテラル(時点+名前+黄経の三つ組)。ADR-26 の「時点のみ」を列を持つ表へ拡張。 節気 24 名の 1 対 1 ラベルは cycle(律動)でなく表の列(F38・F39)。
-
snapTo(w)は「点 → 属する w 窓> first」の糖衣にできる( w|>first・公開境界語との重複解消。F41)。
読む側の中核は epochOrdinal・ordinalIn の二語に絞れた。labelOf と label:(付与)が本体で、上記
3〜5 がその設計。snapTo は糖衣化で新規語から外せる見込み。
確定(ADR-30・2026-07-07) — 上記六点を次のように決めた。読む側の中核は epochOrdinal・ordinalIn の
二語+束縛名射影で、labelOf は廃語、snapTo は基本語として残す。
ordinalInは二窓引数ordinalIn(u, w, d)=「点dが属するw窓の中で、dが属するu窓が 第何番目か」(1 起点)。ordinalIn(day, month, d)=月内の第何日。数える単位uを明示するので入力 ストリームの粒度に依存しない(F35/F42 解決)。epochOrdinal(u, d)は枠を紀元にした版。labelOfは廃止。ラベルは「点 → 値の射影」で、ラベルを持つ窓/サイクルの束縛名を点に適用して 読む(weekday(d)・sekki(d)・lunarMonthNo(d)。束縛名がそのまま射影名=F48)。§1.16 の「cycle 束縛名は点→ラベルの値関数」をlabel:付与窓・データ列に一般化しただけ。汎用語は要らない。- 点はラベルを格納しない。時間ストリームの点は基底位置(時刻)のみを持ち、ラベルは点→値の射影
として外にある。その源は (i) cycle の律動(暦独立・無限)、(ii) テーブルのラベル列(有限データ・1 対 1)、
(iii) 暦座標の値関数、の三つだが、読む側は一様に
名前(d)。時間ストリーム型も値型も拡張しない (レコード型を新設しない)。 - ラベル付きテーブルリテラルは時点列に並行ラベル列
labels:を添える(同長・位置対応)=(3) の源(ii)の 定義データ。sekki = [2026-01-05T17:23, …] labels: [小寒, 大寒, …]でsekki(d)が定義される (束縛名がそのまま射影名。F48 で字面を統一)。 cycle(無限律動)と表のラベル列(有限データ)は源が違うだけ(F38/F39)。 label:付与式は本体層の式(窓内の点の射影・他窓参照)を書ける。ISO 週番号・年度ラベルの「別の点の 窓を参照」(週の木曜が属する年)は可。隣接窓(前後の同種窓)参照は射程外(I7 純粋遅延・F37)。 ——のち ADR-34 で「別点」は先頭点(代表点)への参照に精密化(「週の木曜」は点±幅算術が無く 字義どおりには書けないが、ISO 週番号自体が F57 の等価変形で label: 不要になった)。snapToは点変換として残す(「点→属する窓の先頭点」)。公開境界語(窓→点)とは入口が違い重複でなく 補完。糖衣化は「点→属する窓」語を要するため見送り、基本語のまま(F41 の重複懸念は役割分離で解消)。
1.18 字句と値式の追補(ADR-28)
- 日付リテラル: ISO 8601 サブセット。
YYYY-MM-DD(日)・YYYY-MM-DDThh:mm(:ss(.fff)?)?(時刻付き)。 TZ 指定子は持たない——錨は在圏 premise のtz:が打つ(I6。同じリテラルが premise により別の 基底点を指すのは「意味は premise 相対」の帰結であり仕様)。 - 幅リテラル:
数値+単位の並び。d=市民日(規約幅・ADR-12)、h/m/s=経過時間。24h39m35.244sのような複合は経過時間内でのみ許し、市民時(d)と経過時間の混合は静的エラー (規約集合をまたぐ幅は意味が立たない)。 - 値式の追補: 整数除算
div(modと同族の語)・リストリテラル[…]・添字l[i](0 起点)・ リスト所属述語in(x in [a, b]。F20)。 - 識別子・ラベルの字句: Unicode 文字を許す(漢字ラベル
甲・子等。F14)。記号・空白・予約記号 (|> . | & \ = > < [ ] ( ) { } : , ? @)は識別子に使えない。 - 値束縛の置き場(F29): 値関数・値定数の束縛は (1) premise ブロック内(§1.10)と (2) ファイル
top-level(糖衣定義 §1.13 と同じ場所)の両方に書ける。top-level 束縛は在圏 premise で遅延解決される
点も糖衣と同じ(束縛の場所は一つの体系=「
=はどこでも同じ束縛」)。
1.19 カレンダー実体の束の宣言(確定=ADR-35・F10。粒度整合は ADR-36)
calendar: メンバーに与える実体(TSE・JPCal)を定義する構文。ADR-26 で型は確定済み——
「非稼働日ストリーム+出所・版」の束。40-examples 01 §1.7 で「holidays を作った後、それを
カレンダーとして登録する接続が書けない」(F10)が残っていた。ADR-35 で確定(2026-07-08。
正体判定の追加要件=nonWorking は day 整列・引数なし・実体は tz: 必須、bizDay は calendar:
在圏で言語予約、軸位置の解決順、member 解決規則、派生の source: 上書き必須寄り——詳細は ADR-35。
粒度整合の検査は ADR-36)。以下は起草時の候補設計の記録。
候補(案 1・推奨→ADR-35 で採用): 実体は premise そのもの=予約公開語を持つ premise
観察——「ストリーム束縛+source:・asof:」を束ねる構文は既にある。premise 定義(§1.6)と
層またぎ規則(§1.15)がそれで、カレンダー実体に固有なのは「どの束縛が非稼働日か」の指名だけ。
ゆえに新構文ゼロで、予約公開語 nonWorking(仮称)を持つ premise をカレンダー実体と認める:
premise TSE {
calendar-system: Gregorian # weekday の解決に要る(satSun の定義)
tz: "Asia/Tokyo" # 非稼働「日」がどの市民日かを確定(F54)
source: "jpx.co.jp/trading-calendar"
asof: 2026-01-05
satSun = everyDay |> filter(d => weekday(d) == Sat or weekday(d) == Sun)
holidays = [2026-01-01, 2026-01-12, …] covering: 2026..2026
nonWorking = satSun | holidays # 予約公開語(仮称)=実体の「正体」
}
premise JP {
calendar-system: Gregorian
calendar: TSE # nonWorking を公開する premise だけがここに立てる
tz: "Asia/Tokyo"
wkst: Mon
}
- 型要件=正体判定(ADR-19):
calendar:に立てるのは「公開語nonWorking(時間ストリーム型)を 持つ premise」。持たない premise を置くと静的エラー——ADR-16 の取り違え検出が「premise 型の中の 正体の違い」にそのまま延長される(暦法 premise とカレンダー premise は同じ premise 型で、正体= 公開語の相で区別する。calendar-system:との対称)。 粒度は型に含めない(レビュー裁定 2026-07-07): テーブルリテラルは時間ストリーム定数(ADR-26)で あり、「非稼働日」の「日」は代表用例であって型の制約ではない。細粒度の点(半日休の非稼働時間帯・ 営業時間)も同じ実体の中の時間ストリームとして射程内(F52 の裁定)。標準導出bizDayは この実体を日粒度で読む規約であり、細粒度軸(営業時間のbizHour等)は同じ導出形の 細粒度版として立てられる。 bizDayの導出は言語が一律に規定: 在圏calendar:を C としてbizDay = everyDay \ C.nonWorking相当(§1.15 の型確定に既記)。各カレンダーが個別に bizDay を公開するのではない——導出を実体側に 置くと定義がばらけて取り違えの検出面が消える。stdlib の導出糖衣(遅延解決・§1.13 と同じ規則)。- ADR-01(カスケード)との整理: 足し戻し・反転の上書き合成は
nonWorkingの右辺で表す (§1.8 の宣言順・左結合)。中国の調休はnonWorking = (satSun | holidays) \ workdaysSpecial。 実体が束ねるのは合成の結果であり、「濾過の残余」への退行ではない——濾過は導出の最終段 (everyDay \ …)にだけ現れ、そこへ至る合成が ADR-01 のカスケードを担う。 - 版差・組織ローカルの上書きは既存の
with(§1.12): 公式実体を base にpremise MyCompany = TSE with { nonWorking = TSE.nonWorking | companyHolidays }。 右辺の base 参照は修飾ピン(機構 A の据え置き。裸名nonWorkingは自己参照になるため)。 公式版と組織上書きの混同防止(出所 premise の宿題)は、派生側のsource:上書きがそのまま担う。 - external との直交:
holidaysの右辺はテーブルリテラル(ADR-26)でもexternal(kind: dates)(§1.27・ADR-46 で確定)でも良い。実体宣言は持ち込み口の形に関知しない。 - 統治は要求駆動で従来どおり: 実体 premise 自身は
calendar:を要求しない(§1.6 の静的エラーは 「解決できないのに使う」とき)。実体内の束縛が bizDay 系の軸を使うと自己のcalendar:を要求し、 自己参照の循環は静的エラー。
却下・比較案:
- 案 2: 専用宣言
calendar TSE { … }(キーワード新設)。型が字面で立つ利点はあるが、束の中身 (束縛・source/asof・名前解決)は premise と完全に同じもの。二重の宣言形は ADR-26 が専用テーブル 構文を却下したのと同じ「構文の節約」に反する。正体判定で型は立つので字面の印は不要。 - 案 3:
calendar:に裸のストリームを渡す(calendar: satSun | holidays)。出所・版が実体から 剥がれ ADR-26 の型確定(束である)に反する。名を持たない実体は組織間の共有・上書き(TSE を皆で 参照する)を壊す。 - 案 4:
nonworking:を前文メンバーに昇格し利用側 premise に直書き。メンバー(文脈値)と ストリーム束縛の層が混ざり、かつ実体が名を持てず案 3 と同じ共有の問題。
この設計で出た綻び(F51〜F54。正本は 40-examples/90-findings.md)と、レビューの裁定(2026-07-07):
- F51: 予約公開語の名
nonWorkingは仮称(方法論どおり確定を急がない)。 - F52:
半日非稼働・時間粒度の営業時間は「非稼働日」の二値・日粒度モデルに乗らない→ 裁定で解消の方向:[…]の中身は時間ストリーム(ADR-26)であり型は粒度を固定しない。 時刻も射程内(上記・型要件の粒度注記)。残る規定は集合演算の粒度整合(F56)と、 標準導出bizDayが実体を日粒度で読む規約の明文化。 F53:→ ADR-35 判断 4 で 確定(2026-07-08): 束縛は通常解決・premise 名だけなら読み替え(正体判定+標準導出 bizDay)・ 両方に解決できる名前は曖昧=静的エラー。§1.7 に反映済み。on: TSEの直固定はon:が軸(ストリーム)を取るのと型が合わないF54: 実体の→ ADR-33 判断 10(名前等値・内側固定)を経て ADR-36 で詳細確定(2026-07-08): 整列の検査が tz 名不一致を静的エラーで止め、整合はtz:と利用側のtz:の不一致で集合差が黙って空振りする問題snapToで明示(「同じ日付ラベル」の整合は F69・宿題)。
レビューで新出した綻び(正本は 90-findings):
F55(TZ の定義欠落)→ ADR-33 で確定(2026-07-08): TZ=chronos から市民座標への 版付き写像(射影パラメータモデル・premise 相対)。市民日は「最初の瞬間」規則・うるう秒はスコープ外・ DST 隙間/重複リテラルは明示エラー。F54 の統治は判断 10 の帰結(上記)。F56(集合演算の粒度整合)→ ADR-36 で確定(2026-07-08): 整列(幅・正規化位相・tz 名の 原子グリッド G への静的主張)を導入し、&・\・軸所属は両辺同一 G を要求(違反は静的エラー・ 細分の自動整合なし・snapToが明示の再整列・和|は不問)。F52 の裁定は「nonWorkingは day 整列の予約語・細粒度は同実体の別束縛」(ADR-35 判断 2)として整合。設計過程で新綻び F67〜F70 が新出(正本は 90-findings)。
1.20 範囲外出自と covering: の活性化(候補設計。F61・評価註釈 I6/ADR-15 の初めての具体化)
データは尽きる(暦要項は年次告示・取引所カレンダーは翌年分まで)。尽きた先の評価を「黙って空」に
すればサイレント故障(ADR-15 の背景そのもの)、「エラーで止める」にすれば覆域に一部でも掛かる評価が
全滅する。ADR-15/26 は第三の道——範囲外の出自を評価註釈に流す——を予約していたが、註釈の実体は
未設計だった(F61)。ADR-35 判断 3 で優先度が上がった: bizDay = everyDay \ C.nonWorking の標準導出は、
祝日データの尽きた先で everyDay \ satSun へ黙って退化する——出自を落とすと退化が観測できない。
以下、棚卸し済みの 8 論点(INDEX)に対応する候補設計。
判断 1(covering: の意味論——値に触れない。論点 5): covering: は「範囲内は完全・範囲外は
未知」という二面の主張であり、値には一切触れない——テーブルの値は書かれた列そのもの。
主張が値と食い違わないことは静的検査で保証する: 列の全要素は covering に包含(違反は乱順・重複と
同格の静的エラー——覆域外の要素はほぼ確実に誤記か覆域の書き漏らし)。この検査により「覆域外に点は
無い」が静的に立ち、覆域外の評価は結果として「空+範囲外註釈」になる——が、値を切る刃は言語に
存在しない(当初案の clip は敵対検証で致命と判明し廃止——覆域外の支持点アンカー〈旧暦 newMoons の
2024-12-31〉を黙って抹消し、F60 の窓序数が繰り上がって並行リストが全ずれ、覆域内・註釈ゼロのまま
全期間誤答する。値は列が決め、註釈は covering が決める——分離が正しい)。値と註釈の分離は I6 の
字面どおり: 註釈は評価の随伴であって値の要素データではない(点はラベルを格納しない ADR-30 と
同じ据え方)。覆域の端は premise の tz の市民日で解決し(テーブルの tz は内側固定=ADR-33 判断 10)、
covering: または日付テーブルを持つ premise は tz: 宣言必須(執行点は宣言時——ADR-35 判断 2 の
実体要件の延長。無宣言だと覆域=註釈区間が利用側 tz で動く)。省略時は列の端(閉区間
[先頭要素, 末尾要素])が覆域(ADR-26 既定のまま——安全はうるさい側に倒す。空テーブルは端が
無いため covering: 明示必須=§1.26・ADR-45)。
判断 2(出自の値域。論点 1): 註釈の種は「範囲外」(out-of-coverage)一種から始める。
属性は〔区間・源(premise.束縛名)・その covering・asof〕。「正当な空」は註釈なしの空として
表現され、専用の種を持たない(該当なしは正常結果)。ただし字面に注意——註釈なしは「既知の
データ端に起因しない」ことを言うだけで、正当性の証明ではない(タイポの全落ち・供給未投入は
註釈ゼロの空のまま外部判定に渡る。証拠の不在を不在の証拠に格上げしない——この一文は判定器の
文書にも義務づける)。「事故の空」の判定は言語の責務外のまま(ADR-15)——主要な事故種=データ
切れが「範囲外」で観測可能になる、が本設計の前進のすべて。種の集合は開放的に設計する(将来:
asof: の版差・観測データの未確定域〈40-examples 05〉が同じ器に入る)が、今回規定するのは一種のみ。
判断 3(註釈の付き先。論点 2・★裁定対象): 区間註釈——結果ストリームに、chronos 上の 註釈区間の列〔[a, b) ごとの種と属性〕が並走する。点註釈は不可(範囲外の本質は「点が無いかも しれない」こと——存在しない点には付けられない)。ストリーム全体フラグは粗すぎる(覆域に一部でも 掛かる評価が全体不信になり、信頼できる部分範囲が識別できない——「狭い評価範囲を殺す」の再発)。 註釈は空でない結果にも付く——範囲外区間に satSun 由来の点は出続ける(nonWorking の例)。 ADR-15 の「空の出自」から「区間の出自」への一般化であり、ADR-15 に改訂節を足す。
判断 4(伝播の代数=註釈の輸送表。論点 3・★裁定対象): 規範は一つ——「結果が覆域外データに 依存し得る区間を漏らさない」(過小近似は不可・過大近似は許容)。当初案の「入力点が註釈区間内 なら着地点へ写す」は検証で過小と判明した——註釈区間には定義上点が無い(判断 1 の包含検査)ので 点渡しの伝播は空振りし、shift が依存領域を平行移動させる形(満了 90 日前通知)で漏れる。よって 点でなく区間そのものを輸送する。ADR-36 の統治表と同型に、core 全演算子に輸送行を義務づける (行の無い演算子は註釈を通せない=新演算子追加時は輸送行の定義が必須。構造的に漏れを塞ぐ):
- 結合子
|・&・\: 両辺の註釈区間の和。自動相殺なし——A | Bで B が覆う区間でも、A の 失われた点は B では補われない(|も例外にしない)。bizDay の標準導出(\の右辺が範囲外)は この規則だけで ADR-35 判断 3 の要請を満たす: 退化はするが観測可能。 - 明示の被覆主張(相殺の唯一の口・★裁定対象): 年別テーブルの合成
(
nonWorking = satSun | h2024 | h2025 | h2026——各年が各 asof を持つ現実の運用形)は和規則だけだと 全期間が恒常註釈になり狼少年化する(覆域の積の補集合=ほぼ全時間)。自動相殺は偽陰性を作る ため却下のまま、束縛への covering: 後置を認める:nonWorking = (satSun | h2024 | h2025 | h2026) covering: 2024..2026。これは検証不能な意味論的 主張でありsource:/asof:と同格の統治(黙って消すのではなく名指しで引き受ける・出自に記録・ 被覆サマリに常時表示)。必要条件の静的検査を付す: 主張範囲のうち註釈が掛かる区間は、いずれかの データ成分の covering に含まれること(規則成分の「全時間」は数えない——ADR-37 改訂で精密化)。 socket の器の被覆主張も同じ形になる(ADR-36 が整列で行った送りと同型)——ADR-46 で受けた (精密化=器が含むのは被覆の要求・主張の内容は解決値が運ぶ。§1.27 判断 4)。 - shift(n, unit: U): 註釈区間を n·U ぶん平行移動した像(窓語 unit は窓添字ずらしの像・ 過大近似可)。入力側の註釈と和。
- roll(規約, on: A): 出力註釈=入力註釈の像 ∪ 軸 A の註釈区間の依存像——註釈区間を規約の
逆方向へ「直前(Following)/直後(Preceding)の既知軸点」まで拡張した区間(その帯の入力は、
軸に在ったかもしれない未知の点へ着地し得た)。
Modified等の双方向探査は軸の有効性を照会した 領域全体の包。着地先が無い(軸のデータ端で尽きた)→空+註釈、ただし軸の覆域が完結 (開端 covering・追補)なら註釈なしの空(正当な「該当なし」=ADR-15。完結データの尽きは 範囲外ではない)。 - 選択子 first/nth/last(within/of:): 対象窓が註釈区間に交差したら、その窓全域を出力 註釈に拡幅(窓内の序数は覆域外を覗き得る——「真の first は覆域外だったかもしれない」を窓単位で包む)。
- ストライド stride/strideBy(from:): from: から評価点までの歩行が註釈区間に交差したら、 最初の交差点から先すべてを註釈(位相は状態——数え直さないので汚染は下流へ伝染し続ける)。
- segmentBy: マーカー覆域の補集合が窓列の註釈区間。
edges:/empties:の発火判定は 「マーカー覆域の端」であって「マーカー列の端」ではない——覆域は「範囲内に他のマーカーは無い」 を保証するので、覆域内では最終マーカー起点の窓も覆域端まで確定して張る(旧暦 2027-12-28 起点の 窓は 12-31 まで確定。この確定域が窓列の実効被覆域=判断 6 の分類の基準。「覆域内なのに窓が 無い」帯を作らない)。頭側(覆域始端〜最初のマーカー)だけが edges: の領分。 - フィルタ・述語: 点 d の述語評価が範囲外データの射影を要求→ d を落とし、依存束縛の註釈区間 ∩評価域を出力に註釈(判断 6 の移行と同じ規則)。
- 射影(窓→値): ストリーム文脈では「落として註釈」(上記)。純値文脈は判断 5。
- premise 束縛は定義でなく評価ごとに註釈を得る(I6——註釈は評価文脈の随伴。定義に焼き込まない)。
なお「単調(太ることはあっても痩せない)」は結合子の性質であり、輸送は区間を移す——正しい 不変量はスローガンでなく冒頭の規範(依存区間を漏らさない)。過大近似の裏面も明記する: roll・filter 通過後の太った註釈区間では、本物のプログラミングエラーが判断 6 で「範囲外」へ軟化され得る (安全方向の選択の対価。分類の一次基準はあくまで実効被覆域)。
判断 5(「判定は外部」の器。論点 4): 言語仕様が定めるのは「実装表面は結果とともに註釈を 提示しなければならない」(I6)まで。対処(失敗させる・警告する・進む)は呼び手の責務(ADR-15)。 器は二つに分ける:
- 区間註釈(動的・交差計算用):
RunResult.results[i].annotations = [{from, to, kind: "out-of-coverage", source, covering?, asof?}]——評価範囲 [from, to) にクリップして返す。 - 被覆サマリ(静的・監視用・クリップしない): 評価が参照した各データ源の 〔源・covering・asof・完結主張の有無・評価 to からの残走路(runway)〕。クリップ済み註釈だけ だと「to の直後にデータが尽きる」が観測できず、発報運用(次回実行分のデータがもう無い、を更新 リードタイム付きで知りたい)が立たない——覆域は静的に判明しているのに捨てるのは誤り。開端 covering(追補)の完結主張もここに常時出す(黙らせた事実そのものを可観測にする)。
正準形では annotations・coverage は results と同格のフィールド(註釈を捨てる短絡アクセスを既定に しない。実装は註釈非空時の非零終了などの厳格モードを提供してよい——それは呼び手の判定の実装であって 言語の判定ではない)。CLI は結果の後に註釈ブロックと被覆サマリを表示する。純値文脈(label: の 表示等)の覆域外射影は「値なし」スロットを導入せず範囲外分類の明示エラーに落とす(属性〔源・ covering・asof〕をメッセージが運ぶ。部分定義値を持ち込まない——本体式の値形対応の設計時に 「値なし+註釈」形を再検討)。
判断 6(硬エラー 2 種の移行。論点 6): 実効被覆域がエラーの分類器になる——失敗した参照の 点が、その参照が実際に読む束縛の実効被覆域の外(=判断 4 の輸送で計算された註釈区間の内)に あれば「範囲外」(ストリーム文脈は落として註釈・純値文脈は判断 5 の明示エラー)、実効被覆域の内に あれば従来どおり硬エラー(取り違え=プログラミングエラー。ADR-16 の統治のまま。例: 実効被覆域内の テーブル射影で点が列にない・I4 の窓の外)。基準を生テーブルの covering にしないのが要—— 派生構造(窓列)の実効被覆域は輸送でずれる(segmentBy の頭の edges: 領域など)ので、生 covering で 分類すると「覆域内・窓なし」の帯で系統的に誤爆する。細則:
- 多依存: 失敗したその参照の依存だけで分類する(式中の他のデータ源は無関係)。範囲外とも 取り違えとも説明がつく場合は安全側=硬エラー(黙って軟化しない)。
- 完結データの正当な尽きは失敗ではない(判断 4 の roll 規則参照——開端 covering の軸が尽きた Following は註釈なしの空)。
- 適用される失敗種は ADR 化時に閉じて列挙する(テーブル射影・束縛名射影・ordinalIn/epochOrdinal の 窓所属・roll/shift の着地・並行リスト添字〈F62 連動〉)。
- 限界の明記: 評価範囲を覆域外に取ったテストは誤イディオム(
filter(d => sekki(d) == 立春)級)を 「落として註釈」で通す——同じ式が覆域内では硬エラーになる非対称は分類器の原理的性質。観測面は 「註釈つきの空」であり、結果を主張しないテストからは見えない(判定は外部、の限界。ADR に明記)。
impl の「計算範囲(to+約 400 日)越え」の硬エラーは snapTo だけでなく roll 終端・shift(窓語/ 点列軸)を含む 4 サイトが同族——言語の地平線ではない(判断 8)ので、共通の三分岐に統一して降格する: ①点/着地が計算範囲以遠→クリップ+実装警告(warnings・機械可読)、②実効被覆域外→落として註釈 (本判断)、③それ以外→硬エラー維持。
判断 7(ADR-16 との整理。論点 7): 危険の種類で層を分ける——構造の危険(取り違え・省略・ 曖昧名・整列不一致)は静的エラー(ADR-16/17/36。定義から判定できる)、データの端(範囲の危険)は 評価註釈(評価範囲に依存し静的に判定できない。覆域内だけの評価は註釈ゼロで走る)。「黙って空」は サイレント故障・「エラーで止める」は覆域内の正しい結果も殺す——註釈+外部判定はその中間ではなく、 値の確定と危険の報告を直交させる第三の軸である(値は常に確定・危険は常に観測可能)。
判断 8(二重の地平線。論点 8): 混同しない——(a) データ被覆域(covering:)は言語概念で
註釈の源、(b) 評価範囲(from/to)は評価の需要域で註釈のクリップ枠(評価しない領域の註釈は
出さない。覆域内に収まる狭い評価は註釈ゼロ——「狭い評価範囲を殺さない」の実現形。ただし註釈ゼロは
判断 2 の字面のとおり安全証明ではなく、to 直後のデータ切れは判断 5 の被覆サマリが担う)。クリップは
表面(結果組み立て)で一度だけ行い、内部伝播は非クリップで走らせる——葉で先にクリップすると、輸送
(shift の平行移動・roll の依存像)で覆域外から評価範囲内へ入ってくる註釈を取りこぼす。impl の
実体化範囲(to+約 400 日)は第三の、プロトタイプ限りの近似地平線であり、言語には存在しない
(impl/README の制約に留まる。判断 6 の①がその執行形)。
追補(開端・区間リストの covering:・★裁定対象): 二つの表現拡張。
- 開端の範囲: 意図的に有限なデータ——五輪特例の振替(2021 限り)・過去に完結した列——は
「覆域外=未知」ではなく「列は全時間で完結(この先も点は無い)」。閉区間しか書けないと一回性の
データが未来を永久に註釈で汚す。
covering: 2021..(以後完結)・covering: ..2027・covering: ..(全域完結=註釈を生まない宣言。ADR-36 が推奨する単発除外テーブル[2026-01-05] covering: ..の 受け皿)。統治: 開端は検証不能な完結主張(「註釈を黙らせる最短の 2 文字」になる——毎年更新する 祝日表に書けば ADR-35 判断 3 の悪夢が無音で再来)なので、source:/asof:と同格の統治を掛ける—— 開端 covering を持つテーブルはsource:/asof:宣言必須寄り、かつ完結主張は判断 5 の被覆サマリに 常時表示(黙らせた事実の可観測化)。作法: 根拠が一回性の法・告示であるときに限る。 - 区間リスト: 中抜けデータ(アーカイブ破損で 2023 だけ欠落等)を正直に申告できないと、過大主張
(欠落年が「完全」の証明書付きで沈黙——ADR-15 の原文「祝日定義の年が抜けている」が偽の安全証明
付きになり従来より悪い)か過小主張(恒常註釈)を強いる。
covering: 2020..2022, 2024..2027を 許す——註釈の器は最初から区間列であり、EBNF の小拡張で済む。
意味の対比を明文化する: 省略=列の端(最狭の主張)・covering: ..=全域完結(最広の主張)——
正反対であることに注意(混同の芽として glossary に注記)。省略既定は非空では変えない(単発テーブルの
恒常註釈は covering: .. を書かせることで解消する——黙って完結扱いにすると官報表の書き忘れが
データ切れの黙認になる。うるさい側が安全側。空テーブルは省略が定義不能のため明示必須=§1.26・ADR-45)。
却下した案:
- covering: が値を切る(clip。当初案): 覆域外の支持点アンカーを黙って抹消し、旗艦例 rokuyo.kairos を覆域内・エラーゼロ・註釈ゼロのまま全期間誤答に変える致命反例(敵対検証)。 「黙って違う結果」を本設計自身が最良の形で再生産する。判断 1 の包含検査+非介入に置換。
- 点註釈・ストリーム全体フラグ(判断 3 に理由)。
- 有効点ゼロでエラー停止(ADR-15 で却下済み。データ端で再燃するがなお異物)。
- 警告文字列(warnings)だけで返す: 機械可読の区間・源が無く「判定は外部」の器にならない (外部が判定するには交差計算できる区間が要る)。
|で被覆の自動合成(自動相殺):A | Bの B の覆域で A の註釈を消す案。値が「たまたま正しい」 ことは B からは言えず(A の失われた点は補われない)、偽陰性を作る。相殺が要る正当な意図(年別 テーブルの合成)は判断 4 の明示の被覆主張が名指しで引き受ける——黙って消えるのと、主張として 記録・表示されるのが違い。with 派生の合成(TSE covering 2026 と社内 2030 の和)では双方の切れ目が 出るのが正しい——2027 以降が要注意、そのとおり。
この設計が実行を変える例(rokuyo.kairos ヘッダの運用注意「評価範囲もデータ内で使うこと」が不要になる。 covering は包含検査に合わせ実端へ広げる=2024-12-31..2027-12-31):
# newMoons covering: 2024-12-31..2027-12-31 のもとで --from 2026-01-01 --to 2029-01-01
lunarMonth |> first
#=> 2026〜2027 の朔日列(2027-12-28 起点の最終窓まで確定=edges: の発火は覆域端)
# ⚠ 範囲外 2028-01-01..2029-01-01(Kyureki.newMoons covering ..2027-12-31, asof 2026-02-02)
# 被覆サマリ: Kyureki.newMoons covering 2024-12-31..2027-12-31 asof 2026-02-02(残走路 to から −366 日)
検証の記録(2026-07-08・4 視点並列=整合性・コーパス全数掃引・実装可能性・敵対的、指摘約 40 件を
反映): 当初案からの構造修正は四つ——(1) clip 廃止+包含の静的検査(敵対の致命反例)、(2) 点渡し
伝播→区間輸送表(shift の平行移動・roll の依存像・選択子の窓拡幅・stride の位相汚染——過小近似の
穴を演算子ごとに閉じる)、(3) edges: の発火を覆域端に規定=実効被覆域(「覆域内・窓なし」帯の
解消・判断 6 の分類基準)、(4) 明示の被覆主張と被覆サマリ(恒常註釈の狼少年化と「to 直後の
データ切れが知れない」への器)。実装は GridTag(ADR-36)同型の値随伴伝播+純値文脈の例外チャネルで
400〜600 行級・既存 153 テスト無風の見込み。
設計者裁定が要る核: 判断 1(covering は値に触れない=clip 廃止・包含検査)・判断 3(付き先=区間)・ 判断 4(輸送表+自動相殺なし+明示被覆主張)・追補(開端・区間リスト covering と統治)。裁定後に ADR 化(ADR-15 に改訂節〈空の出自→区間の出自〉・ADR-26 の「範囲外」字面を本設計へ接続・ADR-35 判断 3 の伝播の具体化)。
1.21 窓所属の述語と stride の入力相対(候補設計。F68+F70)
ADR-36(整列)が顕在化させた「所属の意味論の縁」二つを確定する。F68=時刻付き・混合スケジュールへの
例外日適用が等値の結合子では書けない(従来は黙って空振り・現在は安全側の静的エラー)。F70=stride(n) の
数え方が「軸の点列を n 歩」か「入力の点を n 個ごと」かで二義(文書と実装は入力相対・§1.9 の字面は軸相対)。
判断 1(F68 の受け皿=窓所属述語・★裁定対象): 新しい結合子でも専用段でもなく、値関数一語を 射影一族(§1.17・ADR-27/30)に足す:
coincides(S, w, d) # 仮称。点 d の属する w 窓の中に、ストリーム S の点が少なくとも一つ在るか(論理値)
F68 の正準形は filter との合成:
# 毎営業日 9 時の通知から、祝日の「日」に落ちるものを除く
notices |> filter(d => not coincides(holidays, day, d))
- 射影一族との整合:
ordinalIn(u, w, d)が「属する窓の中で数える」なら、coincides(S, w, d)は 「属する窓の中に在るか」——点→属する窓→窓の中身を見る、という §4.9 の同じ骨格。専用記法を 持たず値式に還元する路線(ストライドの窓リセット版=ordinalIn還元・ADR-27)とも一貫。 - 合成力が理由の核: 値述語なので
not・and/or・他の射影と自由に組める(「祝日の日は除く、 ただし金曜なら残す」=not coincides(holidays, day, d) or weekday(d) == Fri)。専用の 結合子・段はこの合成を全部引数化する羽目になる。 - 意味論細則:
wは在圏で解決される窓語(パーティション型・segmentBy 窓とも可。cycle 名は不可——軸に立てない ADR-21 と同じ禁止)。Sは時間ストリームに解決される式(束縛名・修飾名・括弧のインライン式。 解決は軸位置と同一規則の準用=有効点ストリームへ。ADR-35 判断 4 の premise 名読み替えは 適用しない——標準導出はbizDayの名で書ける。窓語を S に置くのは静的エラー——原子点列 への暗黙降格は恒真化の罠。点列を意図するならmonth |> firstを書く)。- 確定は証人規則の三分岐(検証で確定・安全側): (i) d の w 窓内に非註釈区間の S の点
(=証人)が在る → 真(∃ は単調——証人の存在は未知データに依存しない。註釈不要)。
(ii) 証人なし かつ 窓 ∩ S の註釈区間 ≠ ∅ → 範囲外(ADR-37 判断 6——ストリーム文脈は落として
註釈・純値文脈は明示エラー。窓内で見つかった点が註釈区間内なら証人にならない——
everyDay \ holidaysの退化尾部の点を証人にすると「存在しないかもしれない祝日の上の確信付きの 真」になる)。(iii) 窓が完全に実効被覆域内 → 偽。基準は常に実効被覆域(輸送済み註釈区間の 補集合)であり生 covering ではない(ADR-37 判断 6 と同じ据え方)。 - tz の静的検査: S の整列が市民時グリッド(tz 名つき)で、w の要素グリッドの tz 名と不一致なら
静的エラー(幅・位相は不問=所属だから細分は許す。tz だけは日付座標系そのもの——等値の
\で ADR-36 判断 6 が止めていたクロス tz の黙った 1 日ずれを、免除系の裏口から再開させない)。 S の整列「なし」(時刻付き・混合)は検査不能——coincides は chronos 所属であり「同じ日付 ラベル」ではない(クロス tz の日付ラベル所属は F69 の再錨の領分)。 - 整列要求(同一 G)は課さない——所属は区間所属であり、ADR-36 判断 7 の免除系に加える(改訂節。 これが F68 の解——等値でなく所属で結合する明示手段)。
dがwのどの窓にも属さない場合は ADR-37 の分類器(実効被覆域の外=範囲外・内=硬エラー。 判断 6 の失敗種列挙に「coincides の窓所属」を追記=改訂)。- filter 輸送行の精密化が要る(ADR-37 改訂): 述語が読むのは d 自身でなく d の窓の全域なので、
輸送は「述語が読んだ領域(窓)の逆像へ拡幅」と一般化する(選択子行と同型。coincides 固有でなく
データ由来窓越しの
ordinalInにも潜在していた過小近似の穴——coincides が強制事例になった)。 - I7: d の窓は有限区間で S をその区間だけ読む(オンライン)。I8: フィルタ層のカレンダー依存=合法。
- 積の形も同じ一語: 「S の点がある日だけ残す」=
filter(d => coincides(S, day, d))。 差と積がnotの有無だけで書き分けられる(結合子の対称&/\を述語側で再現)。 - 純増の表現力(コーパス掃引で確認): 値式に有界存在量化が入ることで、従来どの組合せでも
書けなかった形が立つ——閏月の検出
lunarMonth |> first |> filter(p => not coincides(chuki, lunarMonth, p))(中気を含まない月=閏月。monthNos 手作業更新(F62)の照合検査を兼ねる)・ ティティ欠日(kshaya)の列挙・朔×節気の同日競合の時刻保存検出・瞬間列テーブル(潮汐級)への 営業日絞り(40-examples 05 §5.2 系の帰結——不規則時刻には前段差の回避形が存在しない)。 - 使い分けの整備が導入とセット: day 整列同士の例外日は従来どおり結合子(
schedule \ blackoutDays)が 正で、coincides に書き換えるのは悪化(整列検査の合法な迂回路を育てる)。規範は「同じ点なら 結合子(不整列は snapTo で整合)・同じ所属(日)なら coincides」——ADR-36 の整列エラーの文言と reference にこの分岐案内を足す。導出型((bizDay \ closures) |> shift(+9, unit: hour)で書ける形)も 前段差が簡明で、coincides の必然はテーブル直書き・混合・不規則時刻に絞られる。 - 糖衣は今回導入しない:
except(B, within: day)級の段は頻出が確認できたら標準糖衣(F1 の器)で 足す——core の最小性(ADR-23)と「還元で書けるものに専用記法なし」(ADR-27)を優先。 - 名は仮称:
coincidesのほかanyIn・sharesWindow・hitsを比較候補として記録(方法論どおり 綻び出し優先・確定は急がない)。引数順はordinalIn(u, w, d)に合わせ(対象, 窓, 点)。
却下した案(F68):
- 結合子の引数付き変種(
\ within(day)・A \ B on: day級): 記号三役(ADR-22)を破る。結合子は 無引数の中置記号だから読める——引数が要る時点で段(ステージ)の領分。 - 両辺 snapTo の等値差: 左辺の snapTo は発火時刻を潰す(F68 初出時に確認済み・修理形にならない)。
- 右辺を窓ストリームへ持ち上げた新型結合子(点列 × 窓列 → 点列): 型の追加が ADR-05/18 の 「型は最小」に反し、within/segmentBy の窓機構と役割が重複する。
- 専用段
except/onlyを core に: 値述語より合成力が弱い(否定・複合条件は結局ラムダに戻る)。 糖衣としてなら将来余地あり(上記)。
判断 2(F70 の確定=stride は入力相対・★裁定対象): stride(n, from:) は入力ストリームの点を
数える。軸引数を持たない——§1.9 の表の「在圏 axis:(on: で上書き)」行を削除する
(表面の削減。コーパスの使用例 2 件——filter(on: bizDay) |> stride(3)・sekkiInstants |> stride(2)——は
どちらも入力相対で、on: 上書きの使用例はゼロ。reference/stride.md の記述・impl の実装も入力相対)。
- 「3 営業日ごと」の正準形は先に filter——
everyDay |> filter(on: bizDay) |> stride(3, from: …)。 何を数えるかは前段が決める(文書の定石をそのまま規範に昇格)。 - from: の規約を明文化: 「from: 以上の最初の入力点が数え起点(そこが第 0 歩=残る)」。 from: が入力の点であることは要求しない(位相の取り違えは F32 で踏んだ危険域——規約を正本に置く)。
- n の域: 1 以上の整数。さもなくば静的エラー(現行 impl の
stride(0)は JS の剰余で 黙って空になる既存バグ——「黙って空」は根絶対象の故障クラス。F70 と独立に直す価値がある指摘)。 - ADR-36 の stride 整列検査は削除(ADR-36 に改訂節): stride は入力しか読まないので突合が無い。
軸との整列は
filter(on:)の段が既に検査している。impl の「stride 検査は不発」の制約も解消。 傍証: ADR-37 判断 4 の stride 輸送行(歩行の交差)も入力相対を暗黙前提に書かれ実装・テスト済み。 - 呼称「軸相対カウント」は「入力カウント」へ字面修正(
strideBy=幅で刻む、との対は 「点で数える/幅で刻む」に整理)。 - 却下=軸相対(軸の点列を n 歩・入力は篩): 隠れた依存(在圏 axis)が段の自足(ADR-21)に反し、
on:の上書き面と整列検査を必要とし、入力=軸で一致・真部分集合で割れる二義の温床。使用例も無い (コーパス全数掃引で「軸相対でしか書けない」需要ゼロ——F32 のsekkiInstants |> stride(2)は 入力相対でのみ意味を成す実例。軸で数えて入力へ当てる形は(axis の stride 列) & input〈day 整列〉 またはfilter(d => coincides(stride 列, day, d))〈時刻付き〉で常に合成可能——後者は判断 1 に 依存する。二判断はセットで裁定する)。
F70 の帰結の波及(検証で増補・全数): draft §1.7(on:/unit: の列挙から stride を外す)・§1.8
(検査リスト)・§1.9(表・例の前文 @JP axis: bizDay も無用化)・§3 暫定シグネチャ(stride 行——
「起点は前段窓 or from:」という ADR-31 以前の残骸も併存・同時修正)・spec §3.3(軸の列挙)・
§4.5(検査リスト)・§4.7(表)・§5.4・40-grammar「演算子シグネチャ」・glossary(stride 行・「軸」行)・
domain-model §2.7・reference/stride.md(表題「軸相対に」・落とし穴)・strideBy.md・README 索引・
impl/README(stride 検査不発の制約削除)。意味論の変更はコーパス上ゼロ([明文化]+表面の削減+
n 域の検査追加)。
設計者裁定が要る核: 判断 1(受け皿=値述語一語で良いか・糖衣の見送り・証人規則と tz 検査は安全側で
確定寄り)・判断 2(入力相対の確定と on: 行の削除・n ≥ 1 静的エラー)。裁定後に ADR 化
(F68+F70 で一本の新 ADR・ADR-36 判断 3/7 と ADR-37 判断 4〈filter 行の逆像拡幅〉/判断 6
〈失敗種追記〉に改訂節)。
1.22 窓列への並行ラベル列(候補設計。F62)
旧暦の月番号イディオム monthNos[epochOrdinal(lunarMonth, d)] は、値リストと窓列の結びが書き手の
頭の中にしかない——朔を 1 件書き漏らすと窓が減り、リストが窓数より長い方向のずれは黙って全月番号が
ずれる(短い方向は添字外の硬エラーで止まるが、長い方向は検査面が無い。ADR-16 の危険基準)。
優先度は二度上がった: ADR-37 の覆域端確定で実際に窓が 37→38 になり monthNos の追記が要った(実例)、
ADR-38 の coincides(閏月検出)が照合の道具を提供した。検査は宣言に錨するしかない——一般の値式
list[expr] に「このリストはあの窓列と並行」という意図は読めない。なお本設計が守るのは長さであり、
同長の位置ずれ(先頭に朔を足しラベルを末尾に足す誤更新)は検査を通る——中身の照合は従来どおり
doctest(旧正月照合)と coincides(閏月検出=ADR-38)の分担。F62 の処置は「解消」でなく
「検査を運ぶ器と正準形の確定」(ordinalIn 還元と同じパターン)と呼ぶのが正確。
判断 1(受け皿=segmentBy の labels: 引数・★裁定対象): テーブルの並行ラベル列 labels:
(ADR-30)を窓列へ一般化する。新しい語は増えない(確定語 labels: の適用先が増えるだけ):
lunarMonth = day |> segmentBy(lunarStart, edges: drop, empties: error, labels: monthNos)
- 読みは束縛名射影(ADR-30/34 と同じ規則):
lunarMonth(d)が点 d の属する窓のラベル(月番号)を 返す。lunarMonthNo = d => monthNos[epochOrdinal(lunarMonth, d)]はlunarMonthNo = d => lunarMonth(d)に縮む(そもそも別名が不要になる)。窓もラベルを格納しない(ADR-30 の原理の 窓版——窓列は区間のみ・ラベルは束縛に付く射影の定義データ)。空窓のラベルの読み口: 空窓には 入力点が属さないが、読みは区間所属なので窓区間内の任意の点——実用上はマーカー点そのもの (tithiB |> filter(t => tithiW(t) == 6))——から読める(欠ティティの番号が立つ)。 - 三つのラベル源の対称が完成する: テーブル+
labels:=点のデータラベル(ADR-30)・窓+label:ラムダ=窓の規則ラベル(ADR-34)・窓+labels:リスト=窓のデータラベル(本設計)。cycle (無限律動)を含め、源が違うだけで読みは一様に束縛名(d)。ラベル値の型域は ADR-34 判断 3 と同一 (スカラー値・等質のリスト・リテラルまたはリスト束縛名。空リストは不可)。 - 同長性検査が F62 の器: リスト長 ==窓数。窓数は覆域基準で数える——実効被覆域内の マーカー起点の窓数(=マーカー数。ADR-37 の覆域端確定の最終窓を含む——kyureki なら 38。評価範囲や 実体化範囲には依存しないので、検査は近似でなく正確に立つ)。ずれは期待/実際つきのエラー。 朔とラベルを対で更新しないと長さの面で即座に割れる。
判断 2(整列規則と前提条件): 意味論は定義的等式一行——名前(d) ≡ labels[窓列序数(d の属する窓)]。
窓列序数は本設計の専用座標: 実効被覆域内の先頭マーカー起点の窓が 0。epochOrdinal(F60)とは
マーカー列が紀元に届かない場合に一致するが、紀元を跨ぐ歴史データでは epochOrdinal が負になるのに対し
窓列序数は常に 0 起点——相乗りしない(検証で確定)。前提条件と締め:
- マーカー点列は有限であること(導出構造で静的判定——テーブル由来は有限・生成子由来は無限。
ADR-36 の整列計算と同型の保守近似)。規則マーカーの segmentBy(stdlib の
week・isoWeek)は 静的エラー——無限の窓列は有限リストで覆えない。エラー文言が正しい形へ誘導する: 周期ラベルは cycle・計算番号はordinalInかlabel:ラムダ。開端 covering(covering: ..)の 有限列テーブルは合法(覆域は無限でも点列は有限・最終窓の幅が無限になるだけ)。 - マーカー流の実効被覆域は全マーカー点を包む単一の無註釈区間であること。合成マーカー
(
t1 | t2)の註釈域には未知のマーカーがあり得て窓数が確定しない(先頭側が註釈なら窓 0 自体が 不定=全整列が崩れる)——確定しない場合は安全側エラー(ADR-37 判断 6 細則と同じ据え方。 合成には束縛後置の被覆主張で覆域を確定してから)。 edges: clipとは組めない(静的エラー)——clip は頭・尾に擬似窓(マーカー起点でない窓)を 足し、窓列序数とリスト添字の対応を黙ってずらす。ティティ(05 §5.1)の現行 clip 形は「頭擬似窓が 番号 0 を占める偶然」に依存しており、edges: drop+labels: [1..7]で期待値不変に移行できる ことを検証済み——禁止は緩めない(clip 窓にラベルが要る真の実例が出たら再訪)。empties: dropとも組めない(静的エラー)——空窓の除去は序数を詰め、どのラベルが落ちたか リストからは判別できない。欠ティティ(empties: keep)はラベル対象——空窓にもラベルは付く。label:ラムダとの同居は静的エラー(ラベル源の二重化=束縛名射影の一意性。ADR-34 が cycle×label: を締めたのと同じ面)。cycle・grid/span/split へのlabels:も静的エラー (未知の名前付き引数を黙って捨てない検査を同時に規定——現行実装は未知キーを黙殺しており タイポの検査面がない)。- 検査の時点: 窓束縛の評価(実効被覆域の確定)と同時——射影が起きるかに依らず走る (ADR-34 の label: 射影時遅延とは干渉しない: 長さ検査はラベル値を評価しない)。with 派生で マーカーやリストを上書きすれば premise 実体化ごとに再走(ADR-36 の検査層の準用)。
判断 3(複数の並行列): labels: は一列(束縛名射影の一意性)。旧暦は monthNos(番号)と
monthNames(月名)の二列が要る——正準形は同じマーカーで別の窓束縛を立てる:
lunarMonth = day |> segmentBy(lunarStart, edges: drop, empties: error, labels: monthNos)
kyuMonth = day |> segmentBy(lunarStart, edges: drop, empties: error, labels: monthNames)
重複は軽く(マーカー共有)、検査が二重に効く(両リストとも窓数に照合される——従来イディオムでは
monthNames 側が無検査だった)。ADR-34 の label: ラムダ経由(monthNames[epochOrdinal(…)])は
「labels: に乗らない計算ラベル用」に位置づけを降格して残す(ADR-34 判断 5 の補助束縛パターンの
主用途は本設計で消える——ADR-30 改訂節で再配置)。二重束縛の相互整合(monthNos と monthNames が
同じ窓を指すこと)は本検査の射程外——正準はマーカーの束縛名を共有すること(lunarStart を両方に
書く。束縛名の同一は目視で立つ・将来の警告級検査の候補)。「既存の窓束縛へのラベル後置」
(kyuMonth = lunarMonth labels: monthNames 級=窓列の同一性が構文で立つ形)は将来候補として記録
(ADR-34 帰結「within で被せた別名からは読まない」との線引きの再整理が要るため今回は見送り)。
判断 4(旧イディオムの扱い): 生の list[epochOrdinal(w, d)] は値式として合法のまま(一般の
添字を禁じる理由はない)。F62 の保護は宣言形を使うことで得る——ordinalIn への還元(ADR-27)と同じ
「正準形が検査を運ぶ」パターン。kyureki の公開文書は labels: 形へ書き換える。
却下した案:
- マーカーテーブルの labels: を窓へ継承(
newMoons = […] labels: [12, 1, …]の点ラベルを segmentBy が窓ラベルに昇格):lunarStart = newMoons |> snapTo(day)の snapTo で点とラベルの 対応が剥がれる(ラベルはテーブルに付き、点は格納しない=ADR-30。マーカー変換を挟むと結びが切れる)。 変換を挟まない場合に限る特例は規則が二重になる。 - 使用点での検査(
list[epochOrdinal(…)]を見て自動照合): 一般の値式から「並行」の意図は 読めない(リストが窓数より長いのが誤りかどうかは意図次第)。宣言なしの検査は原理的に立たない。 - 値レベルの表明(
assert length(monthNos) == windowCount(lunarMonth)級): 検査専用の値関数 二つ(length・windowCount)と表明文の新設が要り、宣言形(labels:)より表面が大きい。窓数は 評価範囲依存でなく覆域依存であることの説明も難しい。
検証の記録(2026-07-08・2 視点=整合性+敵対/コーパス+実装、指摘 22 件を反映): 主要修正は 四つ——(1) epochOrdinal への相乗りを廃し専用の窓列序数(紀元跨ぎで F60 座標と食い違う)、 (2) 前提条件の明文化(マーカー点列の有限性=規則マーカー segmentBy を締める・無註釈の覆域=合成 マーカーの三値の縁)、(3) 窓数は覆域基準(評価範囲非依存=検査は近似でなく正確)、(4) 主張の 較正(守るのは長さのみ・「解消」でなく「器の確定」)。ティティの clip 依存が「偶然に頼った番号」で あることも判明——drop+labels: への移行で除去(期待値不変)。実装見積もり: parser 0 行・eval 約 50 行・テスト 12〜15 本・既存 208 テスト波及ゼロ。F64(同名適用の二義)の面積が labels: 束縛の 常態化で広がる点は open-questions に追記。
設計者裁定が要る核: 判断 1(受け皿=segmentBy の labels: 一般化で良いか)・判断 2 の締め (clip/drop/同居/規則マーカーを全て静的エラー——緩める案は「clip 擬似窓はラベルなし・読みは 硬エラー」だが黙ってずれる面が残り、ティティも drop 移行で足りる)。裁定後に ADR 化 (ADR-30 に改訂節=labels: の適用先一般化と判断 5 の再配置)。
1.23 日付ラベル保存の再錨(候補設計。F69)
クロス tz の「同じ日付」合成——TSE(Asia/Tokyo)と NYSE(America/New_York)の共通営業日——は
chronos 等値では原理的に書けない(ADR-36 帰結・F69)。snapTo の整合は「chronos 上の重なりを
利用側の日界で読む」意味であり、東京の日先頭は NY の前日に floor される(系統的 1 日ずれ)。
coincides(ADR-38)も chronos 所属であり、tz 検査が安全側で止める——「同じ日付ラベル」の所属は
未充足のまま送られてきた。要るのは日付ラベルを保存して別 tz の同ラベル窓へ写す演算。
判断 1(受け皿=点変換の第 4 メンバー・★裁定対象): roll/shift/snapTo に並ぶ点変換として
rebase(to: "America/New_York") # 仮称。各点(day 整列)を「同じ日付ラベルを持つ、to tz の市民日の先頭点」へ写す
を足す。共通営業日は
(tseBiz |> rebase(to: "America/New_York")) & nyseBiz # 出力は NY の日付列(& は両辺 NY day 整列 ✓)
——rebase が「ラベル対応」の再整列を宣言し、& は既存の等値のまま。ADR-36 の整合手段が二本に
なる: snapTo = chronos 所属(同じ瞬間を含む窓)・rebase = ラベル対応(同じ日付)。どちらを
意図しているかが字面で立つ(ADR-36/38 の分岐案内に三本目の枝)。
- 意味論(day 固定): 入力の各点 p(source tz の市民日の先頭点)の日付ラベルを取り、to tz の 同日付の市民日の先頭点へ写す。着地は ADR-33 判断 4 の「その日付になる最初の瞬間」——DST の隙間に 真夜中が落ちる日も定義済みの規則がそのまま効く。日付順は tz に依らず同順なので単射・順序保存 (I7 オンライン)。例外=存在しない日付: 日付変更線の移動で丸ごと消えた日(Pacific/Apia の 2011-12-30 等)への再錨は明示エラー(ADR-33 判断 9 のデータ相対エラーの層——検証で発見・ 「全 tz に全日付が在る」は tzdb 上偽)。
- w は当面 day 固定(引数に取らない——検証の帰結): month/year への一般化は「同月の全点が同一点へ 潰れる」多対一で単射性が破れ、「市民ラベルを持つ窓」の判定も導出構造で立たない(会計暦の phase ずらし month が系譜判定を素通り・ISO 週の W ラベルは tz 写像の座標成分でない)。市民ラベル= tz 写像の座標成分(Y-M-D)に直結する day だけが健全に定義でき、三つの問題が同時に閉じる。 一般化は実例が出たら別途(単射性の主張ごと再設計)。
- source tz は入力の整列から: 入力は G=幅 1d・日内オフセット 0(既定整列の day グリッド・
tz 名つき)を要求——それ以外(「なし」・anchor 付き・時刻オフセットつき市民グリッド)は静的
エラー(毎日 9 時級の時刻つき列は字面の「市民時グリッド」をすり抜ける——精密化)。時刻保存の
再錨は DST の隙間・重複で ADR-33 リテラル規則と同じ穴を踏むため将来拡張(時刻つきクロス tz の
絞りは
rebase+同 tz 化後のcoincidesの合成で書ける——表現力の穴は無い。検証で確認)。 - 出力整列は to tz の day グリッド(構成的——ADR-36 の表に行を足す)。
to:は文字列リテラル (tz 名等値はリテラル等値のまま)。source == to は恒等。to: の統治: tz は版付き写像 (ADR-33)——rebase は写像を二つ(source=整列から・to=名指し)参照する変換で、版・隙間規則は 在圏の評価文脈に従う(to: は評価文脈の供給でなく変換の対象座標系の名指し=shift の n と同じ 引数の層。I6 と衝突しない——この言い分を ADR に明記)。 - 免除系の tz 検査を同時に拡張(検証の重要発見・ADR-36 判断 7 改訂 2): rebase はクロス tz 整列の
ストリームを常態化させる——to tz グリッドの出力を在圏 premise の
within(month)・ordinalIn・ 選択子・cycle/値射影(weekday(d))に流すと、免除系は tz を見ずラベル 1 日ずれの束ね・曜日読みが 黙って通る(東京 3/1 の日先頭は NY premise の within(month) で 2 月窓へ)。市民グリッド入力 × 窓要素グリッドの tz 名検査を免除系へ拡張する(snapTo は chronos 所属が文書化済みの意味なので 除外。ADR-38 判断 5 の根拠「tz は日付座標系そのもの」の一般化)。 - 註釈の輸送: 端点を source の day 窓へ floor/ceil で膨らませてからラベル対応で写す(過大近似 許容——端点は任意の chronos 位置であり day 先頭とは限らないため。輸送表に行を足す)。
- 規範:
shift/rollは rebase の前段で(rebase 後の窓語 unit は在圏解決で整列が乱れる—— 分岐案内と reference に一行)。I8: tz は暦法・カレンダーと独立の射影パラメータ(ADR-33)—— 点変換ファミリーの位置で整合。
却下した案:
- 結合子の日付等値モード(
&date級): 記号三役(ADR-22)違反・ADR-38 が結合子の変種を 却下したのと同根。 - 日付ラベルの値化+述語(
filter(d => …yearNo/monthNo/dayNo の三重突合…)): 突合相手 (nyseBiz 側)の探索が述語では書けない(coincides は chronos 所属で、クロス tz は ADR-38 判断 5 の 検査が正しく止める)。三値の同時比較は冗長でエラーの温床。 - snapTo の tz 引数拡張(
snapTo(day, tz:)): snapTo は chronos 所属(属する窓の先頭)・rebase は ラベル対応(同ラベルの窓の先頭)——意味の違う演算に同名を重ねる取り違え面(ADR-16)。別語が正。 - premise 側で解く(クロス tz の合成 premise): tz は premise 相対の射影パラメータであり、 一つの premise に二つの日界は立たない(ADR-33)。式レベルの変換が正しい層。
to:に premise 名を許す: premise は日界だけでなく暦法・カレンダーも束ねる——tz だけを 抜き出す名指しに premise を使うと「その premise の何に合わせたのか」の取り違え面(ADR-16)。 tz 文字列の名指しが正。
検証の記録(2026-07-08・整合性+敵対 1 視点・発見 8 件反映): 当初案からの修正は四つ—— (1) w=day 固定(month/year は多対一で単射性が破れ・「市民ラベルを持つ窓」は導出構造で判定 不能——市民ラベル=tz 写像の座標成分 Y-M-D に直結する day だけが健全)、(2) 存在しない日付は 明示エラー(Pacific/Apia 2011-12-30——「全 tz に全日付」は tzdb 上偽)、(3) 免除系の tz 検査 拡張(rebase がクロス tz 整列を常態化させ、within/ordinalIn/選択子/値射影のラベルずれが黙って 通る既存の潜在穴が主要動線になる)、(4) 入力前提の精密化(既定整列の day グリッドに限定—— 時刻オフセットつき市民 G のすり抜け封じ)と註釈輸送の操作化(floor/ceil 拡幅)。
設計者裁定が要る核: 判断 1(受け皿=点変換 rebase・day 固定・時刻保存は将来拡張・免除系 tz 検査の
同時拡張)。裁定後に ADR 化(ADR-36 帰結の F69 送りを閉じる・ADR-36 判断 7 に改訂 2・輸送表と
整列表に行を追加)。命名は仮称(rebase——ADR-36 が「再錨(rebase)」と呼んだ語をそのまま。
ほか relabel・sameDate を比較候補に)。
1.24 営業時間の供給規約と標準導出(候補設計・検証済み。F67 本体=F79、あわせて F81/F83 の規定)
前提: 綻び出し(40-examples/06)で読む側は確定語彙のみで全部書けると実証済み。裁定 3 件 (2026-07-08)——(1) F79=標準導出を規定する(実体に開閉時刻の供給規約を指名し、bizDay と 同格の導出を言語規定)、(2) F76 の据え方=premise 層の問題(「DST で時刻をずらすかそのままかは 文化=premise の決まり」——開閉時刻は市民座標〈壁時計〉で宣言し DST 挙動は premise の tz 規則 から従う・経過は明示の特殊形)、(3) F81/F83=ADR-31 改訂で規定。 起草後に 4 視点検証(整合性・コーパス掃引・実装可能性・敵対的、指摘 39 件)を通し、当初案の 構造欠陥 4 件(F86〜F89)を修正済み——修正の要点は各判断に付記、記録は節末の「検証の記録」。
判断 1(候補): 供給規約=実体の予約公開語の対 sessionOpens・sessionCloses(いずれも仮称)
カレンダー実体(ADR-35)は、nonWorking に加えて開場列 sessionOpens・閉場列 sessionCloses(時間
ストリーム型・引数なしの束縛)を宣言できる。宣言は対(片方だけは静的エラー。with 派生では
継承込みで判定——sessionOpens だけ上書きし sessionCloses を継承する派生は合法)・宣言自体は任意(無ければ
細粒度導出が使えないだけ)。点は実体 tz の市民座標の事実(壁時計。裁定 (2)——規則は時刻付き
anchor の市民グリッド〈F81 で規定〉か strideBy の市民時幅、例外データは時刻付きテーブル。
ADR-33 判断 10 の内側固定はそのまま効く):
premise TSE {
calendar-system: Gregorian
tz: "Asia/Tokyo"
source: "jpx.co.jp/trading-calendar"
satSun = everyDay |> filter(d => weekday(d) == Sat or weekday(d) == Sun)
holidays = [2026-01-01] covering: 2026..2026
nonWorking = satSun | holidays
# 営業時間 9:00–11:30・12:30–15:00(二部制)。半日休(大納会級)は前場のみ
am9 = chronos grid 1d anchor: 2026-01-01T09:00
pm30 = chronos grid 1d anchor: 2026-01-01T12:30
am30c = chronos grid 1d anchor: 2026-01-01T11:30
pm3c = chronos grid 1d anchor: 2026-01-01T15:00
halfDays = [2026-12-30] covering: 2026..2026
sessionOpens = (am9 |> first) | (pm30 |> first |> filter(t => not coincides(halfDays, day, t)))
sessionCloses = (am30c |> first) | (pm3c |> first |> filter(t => not coincides(halfDays, day, t)))
}
セッションの意味論は区間の和: sessionOpens/sessionCloses は半開区間 [open_i, close_i) の列(セッション)を
定める。この読みから整合性の規則が全部出る:
- 整合性検査(F84 の封じ・当初形は F86 で全面修正): 検査の定義域は結合実効被覆域 (sessionOpens/sessionCloses の全構成枝の被覆の積)∩ 実体化範囲——註釈区間(データの尽きた側)は未知で あって違反ではない。条件は局所: 定義域内で「各 close の直前のマーカーは open・各 open の 直前のマーカーは close」(隣接種別の交互。両無限の規則列に「先頭」は無いので大域条件は 置かない)。定義域の端の孤立 close(頭)・孤立 open(尾)は切り欠きとして合法(深夜 セッションが範囲頭で必ず close 始まりに見える偽エラーの封じ・edges: clip と同型の端規約)。 エラーの層はデータ相対(ADR-33 判断 9 の層。「静的」ではない——マーカー位置はデータと tz 評価に依存する)。検査の走る点は細粒度導出の初回使用時(bizDay しか使わない利用では 走らない=sessionOpens/sessionCloses の実体化コストも払わない)。
- 同時刻の open/close は両点とも存在する(設計者裁定 2026-07-09——当初の「同時刻禁止」も
検証中間案の「相殺」も採らない): sessionOpens と sessionCloses は別々のストリームなので同一瞬間に両方あって
よく、言語は両点を保持する(消さない)。順序は交互性の要件から一意に定まる——前後の
文脈により「close→open」(前場 15:00 引け→後場 15:00 開場=連続営業)か「open→close」(幅 0 の
セッション=その回は実質営業なし。DST 縮退で合法な壁時計宣言が同一瞬間に落ちた日もこちら)に
読みが定まる。isOpen(区間の所属)はどちらの読みでも同じ答え([9,15)∪[15,17)=[9,17)——
15:00 ちょうども営業中・幅 0 は空)。同時イベントの発火の扱いは処理系(発報層)の領分
(00-overview §2 の線引き——言語は点集合と区間構造まで)。なお和
sessionOpens | sessionClosesの上では 同時刻対が観測できない(点集合の併合)ため、検査・順序付けは対のストリーム上で規定する。 - 深夜セッションは合法(開 22:00・閉 翌 03:00——「同一市民日」は要件にしない)。
- 24 時間営業はこの器の外(作法): 終日営業は日粒度の層(bizDay・coincides(bizDay, day, t))が 既に表しており、sessionOpens/sessionCloses を宣言しない。「毎日 00:00 開・24:00 閉」と書くと同時刻対の連続で 全時間が連続営業と読まれる(両点保持の帰結)——「細粒度の区別が無い」なら宣言しないのが作法。
- grid の束縛が実体(非 with の premise)に書けることは impl で確認済み——reference/grid.md の 「書くのは暦法定義者だけ」は代表用例の記述であって機械的制約ではない(字面は確定後に補正。 F79 の裁定材料に使った「暦法層混入の強制」の論証は失効——06 §6.1 の当該注記も確定時に補正)。
- 派生の統治は ADR-35 判断 5 の延長: sessionOpens/sessionCloses を上書きする派生は
source:も上書き (宣言必須寄り——改変した営業時間が公式出所を名乗らない)。整合性検査は派生実体でも その初回使用時に走る(継承 sessionCloses と上書き sessionOpens の不整合はここで捕まる)。 循環検査(ADR-35 判断 8)は新導出語まで延長(isOpen → bizOpen → C.nonWorking の鎖越しの 自己・相互参照)。
判断 2(候補・F89 で実体相対に修正): 標準導出=bizOpen・bizClose(導出ストリーム)と
isOpen(t)(導出値述語。いずれも仮称)。在圏 calendar: の実体 C が sessionOpens/sessionCloses を宣言して
いるとき、言語が一律に規定(calendar: 在圏で予約名——手動束縛は静的エラー。bizDay と同格):
bizOpen = C.sessionOpens のうち「開場点の属する C-tz の市民日が C の営業日」の点
(C の営業日 = C.everyDay \ C.nonWorking を C の内側で読む)
bizClose = 各 bizOpen セッションの閉場点(区間の和の右端)
isOpen(t) = t が bizOpen セッションの区間の和に入っているか(半開・Bool)
- 導出は実体相対(bizDay と非対称・F89): セッションは実体の状態の chronos 事実であり、
日粒度の bizDay(利用側の日々から引く軸=ADR-35 判断 3)と違って利用側の日界に依存しない。
これによりクロス tz の利用が自然に立つ——NY の premise から
isOpen(t)(いま東証は 開いているか)は tz 検査に掛からず読める(chronos 述語だから正しい)。取り違え面は glossary と 導出名の解説で「実体相対」を明示(bizDay=利用側相対との対比表)。 - セッションの営業日性は開場日(実体 tz)で読む——深夜セッションの尾部(翌日 0:00–3:00)は 開場日が営業日なら営業中(F85 の修理形を導出に焼き込む)。祝日の開場 tick は bizOpen から落ち、 そのセッションは丸ごと isOpen 偽(実体側で祝日の tick を消す細工は不要)。帰属は開場日固定: CME Globex 級(日曜 17:00 開場=月曜取引日)の「トレード日帰属」はこの既定と食い違う—— 実体側の供給合成(開場列を先に翌日所属で濾す)で書けるため、帰属ノブは需要が立つまで導入しない (F90・宿題)。
- 覆域は証人規則の三分岐(ADR-38 判断 4 と同じ骨格・F86 の一部): 真=判定が非註釈の マーカー・営業日データだけで立つ/範囲外=判定が sessionOpens・sessionCloses・nonWorking いずれかの註釈区間に 依存する(マーカー覆域だけでなく bizOpen の依存註釈も源——「未知を偽と答えない」=ADR-37 の 過小近似不可)/偽=覆域完全の側。混合供給(規則枝 ∪ データ濾過枝)の実効被覆域は註釈の和で 例外テーブルの covering に頭打ちになる(規則枝だけ確信を残す粒度は註釈の器に無い——保守側。 被覆サマリの残走路が運用の監視点・ADR-37 判断 7。実体データの年次更新は bizDay の holidays と 同じ運用)。
- isOpen は値述語なので
not・and/or・他の射影と自由に合成(「営業時間内の毎時」=hourly |> filter(t => isOpen(t))。値関数は第一級値ではないためポイントフリーfilter(isOpen)は 書けない——ラムダで書く。coincides と同じ)。 - 正準例の更新(F76 の帰結・ADR-38 改訂): 「毎営業日の開場に発火」=
bizOpen(単一 セッション実体なら「毎営業日 9 時」がこれ)。多セッション実体の「9 時ちょうど」・開場と無関係な 時刻(毎営業日 14 時)は壁時計 tick + coincides(06 §6.1 の形)。経過形shift(+9, unit: hour)は 「9 経過時間後」が意図のときの明示形に降格(但し書き。より強い統治〈評価時註釈〉は将来候補)。
判断 3(候補): bizHour 級の点列は導出しない。「営業中の毎正時」の 1h は式の側の粒度選択
であってカレンダーの属性ではない(30 分毎・15 分毎も同格)。hourly |> filter(t => isOpen(t)) の
合成で書く。セッション内序数(第 n 営業時間)が要るときは 06 §6.3 の帯を手元で張って ordinalIn——
gappy な窓列(営業側だけの窓列)は窓の型の新設になるため導出しない(却下案 (v))。
判断 4(候補・F87 で「現行一致」の主張を撤回): ADR-31 改訂=F81(時刻付き anchor の市民
グリッドの窓境界)。市民時幅 nd の grid に時刻付き anchor: を与えたとき、窓境界は「anchor の
属する市民日から n 日ごとの各市民日で、anchor の壁時計時刻(ラベル読み)を最初に読む瞬間」——
(a) その時刻が存在しない市民日(DST の隙間)は隙間明けの最初の瞬間(ADR-33 判断 4 の時刻版)、
(b) 二度ある市民日(秋戻し)は最初の出現、(c) 存在しない市民日(Pacific/Apia 2011-12-30 級の
丸一日スキップ)には目盛りを置かない(窓は存在する市民日で数える=impl の現行)。窓幅は市民日と
同じく伸縮する。「anchor 点からの経過時間タイル」の読みは幅規約(1d=市民日・ADR-11/12)が既に
排除している。注意(F87): impl の現行は anchor の日内オフセットを経過 ms で計算しており、
anchor が DST 切替日に落ちると全目盛りが壁時計からずれる(NY で anchor: 2026-03-08T09:00 →
全日 08:00 発火・anchor 自身を通らない。同じ壁時計の 2 本の grid が整列不一致になる副作用も実測)——
本改訂はこの挙動の修正を含む(「既存の式の意味を変えない追加規定」ではない。通常日 anchor では
不変)。strideBy の時刻付き from: も同じ規定に従う(整列同一視の維持)。
判断 5(候補・裁定要。検証で推奨を (a) へ反転=F88): ADR-31 改訂=F83(shift(unit: 市民窓語)
の窓内オフセット)。候補:
- (a) 経過オフセット保存の明文化(推奨・現行 impl の追認): 窓内オフセットを経過時間で保存
(着地=着地窓の開始+経過オフセット。オフセットが着地窓の幅を超えれば次窓へ掛かる——
「必ず動かす」を守り、寄せるのは roll の係=ADR-21 の分担)。DST 切替日をまたぐと壁時計が
変わる(
[3/7T09:00] |> shift(+1, unit: day)→ 3/8 10:00)が、壁時計の用途は本節の導出 (bizOpen・isOpen)と壁時計 tick(F81・strideBy)が引き受けるので、shift に壁時計保存を 背負わせない。単射・順序保存・往復可逆(+n → −n 恒等)が立つ。既存テスト・doctest への影響 ゼロ(現行の (a)/(b) を判別する既存テストは無い——採択時に (a) を固定する回帰テストを足す)。 - (b) 市民オフセット保存(検証で難数件=非推奨へ降格): 壁時計の時刻ラベルを保存する案。 検証で構造難が三つ——(i) 秋戻しの重複ラベル(01:00 EDT と 01:00 EST は chronos 上の別点)が 同一着地に併合され点集合として黙って消える・順序も反転(ADR-40 が時刻保存の再錨を将来 拡張へ送った理由と同根=単射・順序保存の喪失)、(ii) 往復可逆性を失う、(iii) 真夜中に遷移する tz(America/Santiago 級=日開始が 01:00 の日)で「窓開始の点→壁時計 01:00 保存→着地が日開始で ない」となり day 整列が壊れる(ADR-36 が封じた「& の黙った空振り」の再導入。救うには 「窓開始点は窓開始へ」の特例が要り、規則が複合化)。month/year 幅では日数成分の数え方まで 変わり影響が読みにくい。
統治・検査のまとめ: 対宣言(継承込みで判定・片方欠け=静的エラー)・整合性検査(結合実効
被覆域∩実体化範囲・局所交互・端の切り欠き合法・同時刻対は相殺・データ相対の層・細粒度導出の
初回使用時)・calendar: 在圏の bizOpen/bizClose/isOpen 手動束縛=静的エラー・sessionOpens/sessionCloses
未宣言の実体で導出語=静的エラー・派生の source: 上書き必須寄り(判断 1)・循環検査の延長
(判断 1)・覆域は証人規則の三分岐(判断 2)。C.sessionOpens の修飾ピンによる生読みは合法(実体 tz の
事実の直接利用——結合すれば既存の整列・tz 検査網に掛かる)。
却下・比較案:
- (i) 供給を帯(窓列)で宣言: 窓は生成の産物で持ち込み口が無い(テーブルは点列・ADR-26)。 点列(開閉マーカー)が原始で、帯は導出——供給は点列側が正しい層。
- (ii)
sessionOpens:/sessionCloses:を前文メンバー(文脈値)に: ストリームをメンバーに持つのは層違い (ADR-35 却下案 4 と同型)。可変規則(二部制・半日休の合成)が書けない。 - (iii) 時刻リテラルのメンバー(
sessionOpens: 09:00): 新字句(単独の時刻リテラル=F66 隣接)が 要る上に、固定時刻しか書けない(二部制・曜日別・データ由来が全滅)。糖衣(dailyAt(09:00)級・ F77)が将来この字面を回復する余地は残る。 - (iv)
bizHour点列の言語規定: 判断 3 のとおり(粒度は式の選択)。 - (v) 営業側だけの gappy 窓列(
bizSession窓語)の予約:ordinalIn(hour, bizSession, t)(セッション内序数)が書ける利点はあるが、隙間のある窓列は窓の型の新設(I5 のパーティション性とも 別物)。点列+述語で足りる——将来の拡張候補として記録のみ。 - (vi) isOpen を導出せず作法に留める: 裁定 (1) で却下済み(記録)。
- (vii) 利用側相対の bizOpen(当初案):
coincides(bizDay, day, ・)(利用側の日々)で濾す形は、 利用側 tz ≠ 実体 tz で導出が全滅し「いま開いているか」という chronos 的に定まる問いを塞ぐ (F89)。実体相対へ修正済み(判断 2)。
命名(すべて仮称・F51 の一括確定に合流): sessionOpens/sessionCloses(比較: openings/closings・
sessionOpens)・bizOpen/bizClose(比較: openTick・sessionStart)・isOpen(比較:
openAt・withinHours・trading)。予約公開語は「偶然の同名束縛と衝突しにくい」観点(ADR-35
帰結)を F51 で併せて適用——sessionOpens/sessionCloses は一般英単語で衝突面が広い(検証指摘)ため、確定時に
要注意。
検証の記録(2026-07-08・4 視点=整合性/コーパス/実装可能性/敵対的・指摘 39 件反映): 当初案 からの修正は四つ——(1) 整合性検査の全面修正(F86=「open 始まりの厳密交互・実体化範囲上」は 両無限列で定義不能・深夜営業を範囲頭で誤エラー・和の上では同時刻対が観測不能・覆域制限なしでは 正当な実体が止まる → 局所交互+結合実効被覆域+端の切り欠き+対ストリーム上の相殺+データ相対の 層へ)、(2) F81 の「現行一致」撤回(F87=impl は anchor を経過 ms で計算・切替日 anchor で 全目盛りがずれる欠陥——改訂は修正を含む)、(3) F83 の推奨反転(F88=候補 (b) は秋戻しの併合・ 往復非可逆・Santiago 級の day 整列破れ——ADR-40 が時刻保存を据え置いた理由と同根。壁時計の用途は F67 導出が引き受け、shift は (a) 経過保存の明文化を推奨)、(4) 導出の実体相対化(F89=利用側 bizDay 経由はクロス tz の自然な問いを塞ぐ → C の内側で解決する chronos 述語へ)。ほか: 24h 営業は 器の外(作法)・帰属は開場日固定(CME 型トレード日は F90 宿題)・相殺規則が接するセッションの 融合と DST 縮退の救済を兼ねる・「規則なら覆域無限」の誤り訂正(混合供給は例外テーブルの covering に 頭打ち=保守側)・束縛右辺の複数行継続の構文が無い(F91 宿題)。
設計者裁定 3 件で確定(2026-07-09): (1) F83=(a) chronos 側の算術(経過保存の明文化。 設計者の読み「中身は chronos=UTC 相当・読みは premise の射影」=ADR-33 のモデルから自然に 導出——ずらす算術は chronos・壁時計に貼り付く決まりは premise 層の宣言、という役割分担)、 (2) 同時刻の open/close=両点保持(順序は交互性から一意・発火の扱いは処理系の領分——相殺案は 取り下げ)、(3) isOpen=実体の文化で解決(実体相対。東証が開いているかは東証の文化だけで 決まる事実・別文化圏の事実の利用は常に実体の名指し経由)。 → ADR-41(F67 本体)・ADR-31 改訂 2(F81/F83)・ADR-38 改訂(正準例)・ ADR-35 改訂(予約語の対・派生統治・循環の延長)として確定。
1.25 位置依存の名前解釈と窓インスタンス参照(候補設計・検証済み。F64+F9)
問題: 三つの規則が別々の場所に立っている。(a) 束縛名射影 year(d)=点→値(ADR-30/34/39)、
(b) 宿題 F9 の窓インスタンス参照 year(2020)=値→「その年の日々」(未定義)、(c) 軸位置の
premise 名 on: TSE=実体の標準導出への読み替え(ADR-35 判断 4)。(a)(b) は同名適用の二義
(F64)で、規定しないまま両方入れるとサイレント取り違えの芽。ADR-39 で「窓語かつ射影名」の
二役束縛が常態化し、面積は既に広い。統一の受け皿(型規則)ごと設計する(90-open-questions の
持ち上げ・2026-07-08)。
設計原理(受け皿): 名前の解釈は候補集合を出現位置の期待型で絞り、絞った後に複数の解釈が 残るなら黙って選ばない=曖昧エラー(ADR-17・ADR-35 判断 4 と同じ統治)。三面はこの原理の実例:
| 位置 | 名前の種別 | 解釈 | 出典 |
|---|---|---|---|
軸位置(on:/unit:/axis:) |
premise 名 | 実体の正体判定+標準導出への読み替え | ADR-35 判断 4(確定済み・不変) |
適用・点引数 W(d) |
ラベル源つき束縛 | 束縛名射影(点→値) | ADR-30/34/39(確定済み・不変) |
適用・値引数 W(v) |
ラベル源つき窓束縛 | 窓インスタンス参照(値→点列)=逆像 | 本節(新設) |
判断候補(検証 3 視点〈整合性コーパス・敵対・実装〉の指摘を反映済み。★は裁定点):
-
意味論=逆像。ADR-34 の定義的等式(点→値)の対として一行で立てる:
W(v) ≡ W の要素点列 |> filter(d => W(d) == v)「W の要素点列」=W の定義が窓に束ねた入力点列のうち、W の窓に属する点(内部概念—— ユーザーが直接書く語は増えない)。
grid/span/split連鎖では原子グリッド(ADR-36 の 整列 G)の目盛りと同値、segmentByでは入力ストリームの点(当初案の「原子グリッドの 目盛り」は未 snap マーカーの窓〈ティティ級〉で G=なしとなり未定義・濾過入力では窓の実要素で ない点が混入する構造欠陥——検証で発見・入力点列ベースに修正)。結果の整列は入力の整列を filter 保存で継承(lunarMonth(6)=day 整列・tithiW(3)=整列なし→&は ADR-36 が安全側で 止めcoincidesの S 位置では使える)。空窓(欠ティティ級)は空を返す(ADR-15・正当な値)。 解決値は時間ストリーム(型は増えない・I2)。ラベルが一意でなければ全マッチの和 (kyuMonth("六月")=毎年の六月。番号ラベルは一意キーではない——lunarMonth(6)は閏六月 〈前月番号の繰り返し〉を含む。これは全マッチ和の正しい帰結で、一意が要る問いは名前ラベル 側か filter+序数で)、ゼロマッチは空。輸送行を一行新設: 「窓列→要素点列」の出力の註釈 区間=窓列の実効被覆域の補集合(ADR-37 の segmentBy 行の継承・F82 の 4 サイトに続く第 5 の 窓リーダーサイト。これが無いとマーカー覆域の外=要素点そのものが無い側で註釈の湧き口が消え、 F61 と同型の黙った退化になる——検証で発見)。規則由来の窓(year/month)は覆域完全なので 註釈ゼロ=既存例に波及なし。それ以外の輸送・覆域・整列は filter の既存規則(ADR-37 輸送表・ F75 逆像拡幅・F82)からすべて従う——評価器の新機構は輸送一行を除きゼロ・新語彙ゼロ。 - 適用範囲=窓束縛のみ(表現力の必然基準)。cycle・ラベル付きテーブルの逆像は台の点列が
手元にあり filter 一行で書ける(
everyDay |> filter(d => weekday(d) == Mon)・sekki |> filter(s => sekki(s) == 立春)——コーパス全数掃引で全用例が既にこの形=退行ゼロ)。 窓束縛だけは要素点列が premise 相対(原子が day とは限らない)で、書き手が原子を知らずに 済む自己完結の式が現行に無い——ここだけが表現力の穴。cycle・テーブルへの対称拡張は将来糖衣の 枠として空けておく(意味論は判断 1 がそのまま延びる)。 - 射影値の源=ラベル源(
label:/labels:)を持つ窓束縛に限る。持たない窓束縛への値引数 適用は静的エラー(「label:を付けるか filter で書く」誘導つき。ISOWeek 級はfilter(d => isoYearNo(d) == 2026)へ——誘導先は全て実在をコーパスで確認済み)。 ★stdlib へ標準ラベルを追加: Gregorian のyearにlabel: (p => yearNo(p))・monthにlabel: (p => monthNo(p))——month(5) & year(2026)(2026 年 5 月の日々)の合成が立つ。 Fiscal のyear上書き行にも同時付与が必須(fiscal.md §5 の字面を §1 の正式定義へ昇格): 上書きはラベルを継承しない(label: は定義の一部)ため、放置すると (a) Gregorian で動き Fiscal で 落ちる非一貫、(b)shiftBoundaryは base の label: を保存する(F65)ため「year 一行と同じ 展開」の等価主張が観測可能に破れる——検証で発見。quarter・week は見送り(week は WKST・ ISO 系と絡む・quarter は需要待ち——誘導エラーで書き手に見える)。impl 試作で year/month の label: 追加は自己参照検査に掛からず 301 テスト無傷を確認済み。 - ★dispatch=F64 の型規則。引数式の型(ADR-25 の三型)で一意に分岐——点なら射影、
値(数値・列挙・文字列)ならインスタンス参照。ラムダ変数の型は束縛サイトの文脈で確定する
(
filter/label:のラムダは点・spanのラムダは窓序数=数値・値関数は本体の型付けから ——「ラムダ変数=点型」という当初の字面は誤りで検証が棄却)。自由なラッパ (f = v => year(v))は定義体単独で引数型が定まらない——判定時点を「糖衣展開後・実引数 束縛後」と定める(ADR-36 が整列を同じ時点で計算する先例。判定時点では実引数の型は常に 一意なので、統治の曖昧エラーはここでは構造上発火しない)か、型が一意に付かない束縛を静的 エラーにするかは裁定。year(2026-05-15)=射影=2026(日付リテラルは点。なお日付リテラルの 裸の値束縛〈d0 = 2026-05-15〉の型は未規定の既存穴——F66 と束ねて宿題)。W(v)はストリーム期待位置のすべてで合法(頭位置・結合子被演算子・on:/unit:・coincidesの S スロット等)。純値位置(x = year(2020) + 1)のみ型エラー——ストリームは 値式に混ざれない(ADR-18 の型分離から従う。coincides の S はストリーム期待位置なのでfilter(d => coincides(year(2020), day, d))は合法)。EBNF はほぼ変更なし——頭位置のname(args)は stream-atom に既在(糖衣適用が使用中)で、弁別は意味規則(束縛の種別と引数 型)。唯一の追補は stream-atom への修飾適用形C.W(v)(機構 A の修飾ピンGregorian.year(2020)——Fiscal 下で暦年を指す唯一の手——が現行文法で頭位置に書けない穴の 解消。修飾ピンは射影・インスタンス参照の両面に同一に効く)。 - 静的検査群: (a) ラベル源なし窓束縛への値引数(判断 3・誘導つき)、(b) 窓束縛以外(cycle・
テーブル・点列束縛)への値引数=filter 正準形へ誘導(判断 2)、(c) ラベル値の型域と引数型の
不一致(数値ラベルに文字列等)、(d) 細粒度ストリームとの
&は既存の整列検査がそのまま守る (誘導: 粒度が違うなら値述語yearNo(t) == 2020かcoincides——ADR-38 の使い分け規範に 合流)、(e) 窓束縛へのストリーム引数(year(mondays)級)=静的エラー、(f)label:付与式内の自束縛への値引数適用も ADR-34 判断 6 の自己参照ガードの対象(逆像は射影を内包 するため・相互参照含む——ガード拡張を ADR-34 改訂ポインタで)、★(g) ラベル値域が静的に 列挙できる束縛(labels:リテラル)では域外の値引数=静的エラー(month(2020)・month(0)級のタイポが「註釈なしの空」で黙って流れるのを封じる。計算ラベル〈label:式〉は列挙不能 なので空=正当のまま)——採否は裁定。
却下案:
- 窓値型の新設(
year(2020)を「窓オブジェクト」で返す)——ADR-30(レコード型)・ADR-34 (案 B=窓値)で二度却下した型拡張と同じ筋。点列で返せば&の正準形(F9 の動機)に直結する。 - 窓記法の拡張(
within(year, instance: 2020)級)——新 named-arg が増え、動機のmarineDay & year(2020)から遠い。窓所属が要るなら既存のwithin/coincidesで足りる。 - 暦座標への暗黙フォールバック(ラベル源なしでも
yearNoに黙って落ちる)——ADR-16 「省略の統治」に反する魔法。ラベル源の明示(判断 3)が premise 相対の意味(ADR-16)を守る。 - 全ラベル源への値引数適用(判断 2 の対称形を今入れる)——表現力の必然が無い(filter 一行)。
- 要素点列=原子グリッドの目盛り(当初案)——segmentBy 窓で未定義・濾過入力で混入 (検証 critical)。入力点列ベースへ差し替え済み(判断 1)。
正準例(判断 1〜4 の帰結。検証でコーパス整合を修正済み):
# F9 の元例: 2020 年だけ海の日を移動(東京五輪)——「移動元」を式で指す
# covering: .. =全域完結の主張(2020..2020 だと 2020 外が恒常註釈になる——ADR-37 判断 9 (a))
marineDayActual = (marineDay \ year(2020)) | [2020-07-23] covering: ..
# 旧暦の六月の日々(毎年・名前ラベル。閏六月は「閏六月」で別)
kyuMonth("六月") # 番号引き lunarMonth(6) は閏六月を含む(全マッチ和の帰結)
# 2026 年 5 月——インスタンス参照どうしの積(同一 G・day 整列)
month(5) & year(2026)
実装ノート(impl 試作で確認済み・約 70 行で全正準例動作・301 テスト無傷): 窓束縛は内部で
WindowsV(gen-expr 由来)と StreamV+wins(segmentBy 由来)の二表現——dispatch・逆像は対で実装。
逆像は「ラベルは窓ごとに一定」(ADR-34 の構造保証)から窓単位評価に最適化でき外延等価
(naive filter の 1/5〜1/25・year(2020) 実測 29ms)。切れ端窓(impl 制約)のラベルずれは
インスタンス参照で「別の年への漏れ」に増幅される——除外か警告(impl/README 注記)。繰り返し
使う参照は premise 束縛に置く誘導(F80・本体層は defCache されない)。
reference への分岐案内(ADR 化後の反映先): sekkiW("立春")=節の期間の日々 vs
sekki |> filter =節気点の対比・coincides の S 位置エラー文言に「特定インスタンスなら W(v)」・
roll の軸に短い軸(on: year(2020))を渡すと着地なしは註釈なしの空・premise 相対の罠
(Fiscal 下の year(2020) は年度——逃げは修飾ピン Gregorian.year(2020))・year(d) と
yearNo(d) の二綴りは暦座標糖衣が正準(label: は主に逆像の資格付与)。
spec の受け皿(検証の提案): 統一原理+dispatch 表は §2(型と層)に新設小節(三面が
premise 層と本体層に跨るため・「型は増えない」宣言群と同居)、逆像の意味論本体は §4.9 に
束縛名射影の双対として追記(射影一族の表に行を足す最小差分)。EBNF は stream-atom の修飾適用
のみ・glossary に「窓インスタンス参照」「要素点列」。spec §4.9 の残骸 lunarMonthNo(d)
(ADR-39 で廃止済みの語)も同時に修正。
設計者裁定 4 件で確定(2026-07-09): (1) 意味論=逆像で確定(入力点列ベースの要素点列・ 全マッチ和・空は正当・輸送行の新設込み)、(2) dispatch=展開後判定(糖衣展開後・実引数束縛後 ——ADR-36 が整列を計算するのと同じ時点。判定時点では実引数の型が常に一意で曖昧は構造上発火せず、 自由なラッパは呼び出しごとに型確定=多相を許容)、(3) 標準ラベル=year+month+Fiscal.year (quarter/week は見送り・誤導つきエラーで需要待ち)、(4) ゼロマッチ=域外は静的エラー (labels: リテラル等の静的列挙可能なラベル値域では域外値引数を静的エラー・計算ラベルは 「該当なし=空」のまま=多マッチ設計の裏面として明文化)。→ ADR-42 として確定。
1.26 空テーブルリテラルの合法化(候補設計・検証済み。F98=発報層還流第一次 → ADR-45)
動機(F98): 「点ゼロだが覆域は主張したい」束縛の一次形が無い。発報層は DB 未投入でも boot が
通る合法ソースを要し(boot throw はソース不正のみに限定——適用検討 03〈非公開〉の実測)、データ
供給層の「まだ何も無い」は初回 boot・年替わりの定常状態。回避形=恒偽 filter への束縛後置の
被覆主張 (everyDay |> filter(d => 1 == 2)) covering: …(ADR-37 判断 5)は観測面では意図どおり
(点ゼロ・runway 即負の運用信号)だが、恒偽が迂遠で読み手に意図が伝わらず、ソース生成器に
行ゼロ分岐を強いる。
設計者裁定(2026-07-13・方向): 候補 3 形(本形・empty 生成子・恒偽の標準述語=比較は
90-open-questions が正本)から空テーブルリテラルの合法化を設計に進める。socket の要否判断は
F98 確定後(同日裁定)。
規定(検証済み・ADR-45 で確定):
- 昇格規則の拡張(ADR-26 改訂): 空リスト
[]はcovering:が後置されたときに限り 時間ストリーム定数(空テーブル)に昇格する。covering の無い[]の型は従来どおり空の値 リスト(値位置では現に合法——in []等)で、ストリーム期待位置に置くと静的エラー(従来 どおり・誘導文言を追加=「covering: を付ければ空テーブル」)。labels:だけ付けた[]も誘導 つき静的エラー(「空テーブルは covering: を明示する」)——省略既定「列の端=閉区間 [先頭要素, 末尾要素]」(ADR-37 判断 1)が空列で定義できないため、覆域の主張なしに空テーブルは書けない (うるさい側が安全側=判断 9 の省略既定と同じ統治)。segmentBy(labels:)の空リスト不可 (ADR-39——窓列側)とcycle/split等のリスト引数の扱いは本節の射程外・従来どおり。 - 静的検査は空虚に成立: 包含(列の全要素 ⊆ covering・ADR-37 判断 1)・昇順/重複(ADR-26)・
labels:同長(ADR-30——labels: []は 0=0 で合法・空でない labels は同長違反の静的エラー。 ADR-39 の「空リスト不可」は窓列〈segmentBy〉側の規定と改訂で限定する)。ソース生成器は テーブル直書き生成に限り行数 0..N で同一の出力形になる(F98 の実駆動〈sekki テーブル〉は これで救われる。segmentBy+labels: 生成形〈kyureki 型〉の空マーカーは従来どおり硬エラー= 射程外・需要が立てば別綻び)。 - 整列=空虚適合の第三状態(ADR-36 改訂): 空テーブルは全ての整列に空虚適合(違反しうる
点が無い=空虚な真)。規定の射程は判断 2〜4 に及ぶ——(i) 判断 2 の「G か『なし』の二値」宣言に
第三状態を追加、(ii) 判断 3 の検査は相手が「なし」でも通す(「なし」は主張できない=検査に
落ちる・空虚適合は検査に通る——F93 の未 snap マーカー窓との対比)、(iii) 判断 4 の和の出力
規則・
&/\の出力整列は相手側を継承(空虚適合|B = B。「両辺同一でなければなし」の字面 より優先)、(iv) 保存系の段(filter・選択子・shift 窓語・roll・snapTo・rebase〈点ゼロは恒等〉)は 空虚適合を保存。カレンダー実体の day 整列要件(ADR-35 正体判定)も空虚に通る=空 nonWorking の実体が boot し bizDay = everyDay(覆域内)。tz 名検査(ADR-36 改訂 2)は市民グリッド同士の 規定のため空虚適合には掛からない(点ゼロに 1 日ずれは起き得ない)。 - 意味論: 値は空列・covering は通常どおり二面の主張(「範囲内は完全=点が無いことは知識・
範囲外は未知」=判断 1 の字面の空列読みそのもの)。範囲外評価は範囲外註釈・被覆サマリに〔源・
covering・asof・残走路〕——回避形と動的観測(点・註釈・サマリ・残走路)で等価。静的には
受理域が広がる(回避形は day 整列・本形は空虚適合——経過グリッド相手の
&/\が本形では通る)。 束縛名射影の失敗分類は判断 6 のまま不変——完全主張は分類を軟化しない(覆域内のsekki(d)失敗は従来どおり硬エラー=取り違え検出。「正当な該当なし」と混同しない)。規則性 (endless)は有限=テーブル由来が正(回避形〈everyDay 由来=無限〉との唯一の静的差。 ADR-39 の規則マーカー検査で空テーブル合成が正しく受理される側に倒れる)。開端[] covering: ..は「全時間で恒空」の完全主張(単発除外テーブル[点] covering: ..の双対。判断 9 の統治=source:/asof:宣言必須寄り・被覆サマリ常時表示が同様に掛かる。boot 用途は閉端で書くのが 作法——残走路信号を恒久に消さない)。区間リスト covering も可。tz:宣言必須は従来どおり (覆域端の市民日解決=ADR-37 判断 1。premise の日付テーブル判定は covering 後置で発火)。 - EBNF は変更なし:
list-literal = "[" , [ list-elem , … ] , "]"は要素列が既に省略可能 (spec §5.6)で、空を弾いているのは意味層。「空⇒covering 必須」も静的検査に置く(エラー文言の 質のため——文法エラーは誘導を語れない)。変更は §5.6 の意味論注記(「型が要素で決まる」→空は covering: の有無で決まる・束縛後置注記「テーブルの属性と同義」→「テーブル属性として読む」)。 - 束縛後置の被覆主張(判断 5)との関係:
[] covering:はリテラル自身の覆域(データの主張・ 包含検査の側)。束縛後置は合成への検証不能な主張(必要条件検査の側)のまま別物——「rhs が裸の テーブルリテラルなら listLiteral が先に食う」の既存規則も不変。
書ける形(doctest は reference/table-literal.md):
sekki = [] covering: 2026-07-13..2026-07-13 # 点ゼロ・覆域は主張——boot 可・runway 即負の運用信号
検証(2026-07-13・3 視点=整合性/コーパス全数掃引/敵対的・実装可能性): 構造欠陥 0・要修正 7
(本節に反映済み=裸 [] の線引き・ADR-39 との字面衝突の限定・射影失敗分類の明文化・EBNF 前提の
誤り・整列第三状態の射程・§5.6 束縛後置注記・行ゼロ分岐消滅の限定)・注記 4(動的観測等価の限定・
0 行→1 行で整列が変わる非連続は字面ベース整列の原理的帰結〈ADR の限界に明記〉・開端の統治・掃引
リスト増補)。検証の副産物=F99: roll の空軸で依存像(ADR-37 判断 4 roll 行)の早期 return が
保守拡張を殺し、「有限 covering=空+註釈」と「開端=註釈なしの空」の観測差が消えていた既存 impl
欠陥——修正済み(90-findings F99)。impl 実装済み・全消費位置の掃引テスト 23 本
(empty-table.test.ts)を含め全テスト通過。
1.27 外部供給宣言(socket)——実行時に解決されるテーブルリテラル(確定 → ADR-46。裁定 2026-07-14=採用・宣言語 external)
動機: 発報層還流第一次(適用検討 03・非公開)でソース生成方式の実測痛点 2 件が確定——
(1) ソースが静的でいられない(日次再実体化ごとに DB から再生成=プロバイダ形への拡張が必須。
決定性の担保がソース差分検査の回り道になる)、(2) 統治の焼き忘れ(covering 必須・asof 焼き込み・
昇順正規化を生成器が写経し続け、漏れると観測面が欠ける)。実装後の見立て=「socket 宣言 1 行の
価値は生成器に写経される統治の量に比例」。方向提示は §1.15(external(kind:, source:)・器だけ
規定)と 90-open-questions(ADR-36 帰結=器は整列の主張を含むこと)が既存。
設計の核——「socket =実行時に解決されるテーブルリテラル」: 新しい型・新しい代数は導入しない。 socket 束縛の解決値はテーブル値そのもの(点列・covering・asof・labels?)であり、テーブル リテラルが字面で運ぶ静的性質だけを、字面が無い代わりに宣言で先取りする。解決値には テーブルリテラルと同一の統治検査(包含・昇順/重複・labels: 同長・covering 必須)を課す—— 生成方式で生成器が写経していた統治が、そのまま言語の供給契約になる。
規定(検証済み → ADR-46 で確定):
- 形:
束縛名 = external(kind: 種別 [, labels: [値域]] [, source: "…"])(語はすべて仮の 呼び名——命名比較は判断 9)。premise 束縛の rhs 限定(本体層直書きは意味層の静的エラー・ 誘導つき——source: 統治が premise に居るため。文法で縛らない=「文法エラーは誘導を語れない」 ADR-45 判断 5 と同型)。パイプ合成は可(external(…) |> snapTo(day)等——「テーブルリテラルと 同格」は統治検査の面の同格。出自の焼印は external 評価点で束縛名を焼く〔パイプ中間で 無名化しない〕)。externalは予約語(core 語再定義エラーの面に載せる)。EBNF の変更は param-key へのkind(とsource)の追加のみ(頭位置name(args)は stream-atom で既に 導出可・kind 値は列挙ラベルと同じ「位置依存のキーワード解釈」=ADR-42 の統一原理)。 - kind: =整列の主張(静的・宣言が字面の代役): ADR-36 判断 2 のテーブル規則は字面から整列を
推論する。socket は字面が無いためその二分類そのものを宣言する——
kind: dates(定義側 tz の 市民日グリッド整列)/kind: instants(整列なし)。整列は宣言から静的に決まり、解決値の 行数・中身に依存しない(空でも宣言どおり。ADR-45 の空虚適合は字面規則の帰結であり socket には適用しない——宣言があるのに使わないのは主張の放棄。帰結として、ADR-45 が原理的限界として 引き受けた「0 行→1 行で整列が変わる」非連続を socket は宣言で解消する)。契約検査は字面 でなく幾何——解決値の全点が宣言整列 G の目盛り上(dates=定義側 tz の各市民日の最初の瞬間。 DST 隙間日の 01:00 開始も正しく通り、壁時計 h==0 判定は誤り)。 - labels: =値域の列挙宣言: 有無フラグでは足りない——ラベル語彙は静的知識(裸名
filter(s => sekki(s) == 立春)の名前解決・ADR-42 判断 7 の域外静的検査が要る)のため、labels: [立春, 雨水, …]と値域を列挙して宣言する。解決値のラベルは宣言値域内(域外= 契約違反)・無宣言の socket にラベルが到着したら契約違反(ADR-39「未知の named-arg を黙って 捨てない」と同じ統治)。 - 統治の随伴——「要求は器・内容はデータ」:
source:は必須(premise メンバーで宣言・ 束縛ごとの上書きはexternal(source: "…")の named-arg——premise 単位の with 上書き〈ADR-35〉 とは別の束縛単位機構として明記)。covering と asof は解決値が必ず運ぶ(どちらも欠落=契約 違反——第一次還流の痛点 (2)〈asof 焼き忘れ〉を契約で消すには asof も必須でなければならない。 ADR-37 帰結「socket の器は被覆主張を含む」の精密化=器が含むのは被覆の要求・主張の内容は データが運ぶ)。解決値 asof の効力は当該束縛の出自属性(註釈・被覆サマリの asof 欄)に 限る——premise の静的asof:(版ピン)と食い違うときは被覆サマリに常時表示(黙って 上書きしない・ADR-16)。socket 束縛を持つ premise はtz:宣言必須(ADR-37 判断 1 の 延長——covering 端と dates の錨は定義側 tz で解決=ADR-35 判断 8)。束縛後置の covering: (ADR-37 判断 5=合成への被覆主張)は従来どおり付けられる(必要条件検査は解決時に走る)。 - 解決の意味論(純粋性 I7 との整理): 解決は評価文脈の随伴であり評価中の副作用ではない
——先例が既に二つある(
asof: latest=評価時点の環境入力・tzdb の版供給〈ADR-33 判断 3〉)。 要求駆動=評価内の初回参照時に一回解決(ADR-33 判断 8 の tz と同型。未参照の socket は 解決されない——解決子が無くてもエラーにならない)。スナップショットの単位は〔定義側 premise(base 連鎖の解決後)・束縛名・上書き後の source:〕ごと——with 派生・多文脈・修飾 参照はすべて同一スナップショットを見る(解決子に渡すのも定義側 premise 名)。錨打ち・ covering 端の解決(変換)は評価文脈ごと(リテラルの再錨と同型・tz が違えば違って正しい)。 スナップショット識別(解決値 asof)はメモ化の文脈キーに参加(ADR-35 帰結「参照した文脈 メンバーをキーに含める」の延長——常駐評価器での版差の誤共有を封じる)。評価はスナップショット 相対で純粋・決定的。解決の手段は言語が規定しない(ADR-15——言語は器〈宣言・契約検査・ エラー分類〉まで。DB・ファイル・HTTP は実装系の責務)。 - 契約検査(解決時・リテラルと同一の文言体系): covering 欠落・asof 欠落・kind 不一致 (幾何=判断 2)・乱順/重複・包含(全点 ⊆ covering・ADR-37 判断 1)・labels 同長/域外/ 無宣言到着・日付の実在(2026-02-30 級——リテラルでは字句層〈ADR-43〉が守るが解決値は字句を 経ないため再執行が必須。黙ったロールオーバーの再発防止)・数値の有限性(ms wire)。 根拠法は ADR-33 判断 9(データ相対エラーの並置は「拡張であって矛盾ではない」)。wire 形式は kind ごと——dates=市民日付(年月日)で受けて言語側が錨打ちする(派生の tz 上書きで再錨 できる・DST 隙間日の day 開始も言語側 civilDayStart に一元化)・instants=epoch ms で受ける (壁時計字面は DST 重複で二意になり得るため)。
- エラー分類: (a) 解決失敗(解決子なし・供給側不達)=評価エラーの機械可読な部分類(供給 エラー)——実装系はこの部分類を boot throw から除外して劣化運転に落としてよい(還流 §3-1 の 実測「インフラ失敗を boot throw に含めるとプラットフォーム全体を巻き込む」に適合するための 識別の器。言語が規定するのは「黙って空にしない」まで)、(b) 契約違反(判断 6)=評価エラー (ソース/契約の不正=boot throw 対象)、(c) 空データ(0 行+covering)=正当な値(ADR-45。 「まだ無い」と「解決失敗」が型で区別される)。
- 既存機構は全部そのまま乗る: 範囲外註釈・被覆サマリ・残走路(ADR-37)・整列検査・coincides・
束縛名射影(テーブルへの値引数は従来どおり静的エラー=ADR-42 判断 5——socket でも filter が
正準)。実体の正体判定(
nonWorking = external(kind: dates))は全項目が解決前に静的に通る (存在・型・引数なし・day 整列=宣言 kind・tz: 宣言——ADR-36 帰結〈器は整列の主張を含む〉の 解決)。新しい観測面はゼロ。 - 参照実装の器と命名(裁定事項):
run(source, opts)に同期の解決子フック (resolve(定義側premise名, 束縛名, 宣言) → データ)。契約検査はリテラルの検査部 (evalList 後半)を括り出して共用(文言体系の一致が構造で立つ)。doctest は# resolve:ディレクティブ(テーブルリテラル字面の流用+asof ミニ構文)で書ける——契約違反の実行例だけは エラー期待の照合形が要る(任意・第二段)。命名: 宣言語external(§1.15 初出形)/socket(通称——ただし英語版 ADR-15 の “socket”〈器の比喩〉と同綴り別義になるため external 推奨)。 kind 値dates/instants(everyInstant・date-literal と語感整合・衝突なしを掃引確認済み)。
書ける形(候補確定後の想定):
premise EphDB {
source: "supplier-db/eph_event"
tz: "Asia/Tokyo"
sekki = external(kind: instants, labels: [小寒, 大寒, 立春, 雨水]) # 時刻付き・ラベル値域を宣言
holidays = external(kind: dates) # 日付列=市民日グリッド整列
}
要否の判断材料(裁定の本体・検証で較正済み):
- 採る価値(第一次還流の実測に基づく): (1) 式が静的に戻る——プロバイダ形・ソース差分 検査・毎回の再パースが消え、再実体化=「同じソースの再評価」になる(決定性はスナップショット 規律〈判断 5〉が実装されて成立する条件付き)。(2) 統治の検査が言語に移る——評価器は今日 でも昇順・包含・同長を検査済みで、socket が新規に足すのは covering 必須化・asof 必須随伴・ 整列主張の宣言・ラベル値域の静的化の 4 点。「黙って観測面が欠ける」事故クラスが契約違反エラーに 変わる(写経そのものが消えるのではない——覆域の算出・昇順化・asof の正しさは解決子に残る)。 (3) 「まだ無い」と「解決失敗」の型区別(ADR-45 との噛み合い)+ 0 行→1 行の整列割れの 解消(ADR-45 が字面規則の原理的限界として引き受けた非連続を、宣言が字面の代役になることで socket は持たない——socket 固有の差別化)。
- 対価: (1) 言語に「実行時解決」の概念が入る(評価文脈の随伴として整理でき純粋性・決定性は 保てる=判断 5。先例〈asof: latest・tzdb 版〉があり異物ではない)。(2) スコープ外連動の境界 規定(判断 5/7 で線は引いた——解決子の規約は実装系ごと)。(3) 監査・再現の担い手が移る—— 生成方式では生成ソースそのものが完全な監査証跡・socket ではスナップショットの保存が実装系の 新たな責務(spec §7.8 の決定性の字面も「同一スナップショット相対」への改稿が要る)。
- 解決子(供給側)に残る責務(過大に売らないための明示): 点列の昇順化・重複除去(言語は 検出のみ・正規化しない)・covering の真実性(「本当にその範囲を網羅取得したか」は検査 不能)と完結主張(開端)の判断・asof の正しさ・日付の実在または正しい ms・ラベル値域の整合・ kind の忠実性・再現用の版規律。
- 代替案: (a) 本候補の採用、(b) 生成方式の継続+作法の文書化(統治チェックリストを解説層に)、 (c) 保留(第二次還流の運用データ後に再判断)、(d) 生成方式の継続+検査ツール(boot/公開時に 統治チェックリストを機械検査する linter——言語を太らせず「焼き忘れ検出」だけを得る中間案)。
検証(2026-07-14・3 視点=整合性/コーパス全数掃引/敵対的・実装可能性): 構造欠陥 0。要修正 16(本節に反映済み——主なもの: 空解決値の整列は宣言どおり〈視点間の衝突を裁定——ADR-36 の 「整列は静的・データの値に依存しない」原則が、リテラルとの空形観測等価より優る〉・解決失敗の 機械可読部分類〈boot throw 線引きの器〉・asof 必須化と上書き射程・tz: 必須の拡張・labels は値域 列挙・契約検査の幾何化と F66 再執行・スナップショット三層粒度・要求駆動の明記・EBNF は param-key 追加のみ・価値主張の較正 2 点・対価に監査責務を追加)・注記 7(ADR-42 誤引用の修正・被覆主張の 「要求/内容」整理・代替案 (d) の追加ほか)。実装差分の見積もり=src +160〜210 行・全変更が 加算的(parser 差分ゼロ=既存 call 構文で読める)・テスト 25〜35 本+観測等価スイート。socket 言及の既存字面は 34 箇所(採用時要更新 13・不採用時 12——掃引リスト確保済み)。
1.28 窓列への周期ラベル——labels: の cycle 形(候補設計・検証済み。発報層還流 第 5 便 §3。裁定 3 件済み 2026-07-25・ADR 化と実装は指示待ち)
動機: 「窓列=暦の単位・ラベル=固定周期」の形(節切り月の十二支・月家九星・月星座の 12 宮巡回)
で、現行の静的 labels: は同長性検査(リスト長=窓数=マーカー数)を課すため、covering が複数年に
伸びるとリストを年数分(24・36…個)並べ直す必要がある。これは ADR-46 の静的ソース原則(式は静的・
データは実行時解決)と衝突する——マーカーが external で増減するたびに式(labels 列)の改稿が要る。
第 3 の適用ドメイン(暦×占い)の主要形で実需が立った(第 5 便 §3)。
設計の核: segmentBy の labels: の値位置に cycle 形を許す——
sekkiMonth = everyDay |> segmentBy((setsu |> snapTo(day)), edges: drop, empties: error,
labels: cycle [寅, 卯, 辰, 巳, 午, 未, 申, 酉, 戌, 亥, 子, 丑]
anchor: 2026-02-04)
意味論は窓束縛への cycle(ADR-03/30)と同一——「anchor の属する窓が先頭ラベル」(実装の
定義式 labels[(idx − anchor) mod N]〈eval 1808〉と同型。「先頭」とは list[0] が anchor の窓の
ラベルになるという意味であり、リストの回転は anchor を取り直さない限り別の暦——reference/cycle.md
の旧落とし穴文の誤りは本検証で検出し訂正済み)。対象が「パーティション束縛」から「窓列」に変わる
だけで、cycle の既存規約(リストは巡回順・anchor が位相を留める実日・読みは束縛名射影)を再利用
する。新語彙ゼロ(cycle・anchor: とも既存語)。
定義:
- ラベル(窓 i) =
list[(i − i₀) mod N](i=窓列序数〈ADR-39〉・i₀=anchor の属する窓の窓列 序数・N=リスト長)。負の差も法で正規化(F65 規約)。 - i₀ はマーカー列基準で計算する(最後の「marker ≤ anchor」の添字+覆域端・頭側の所属判定)—— 実体化範囲・評価範囲に依存しない正確な数え方(ADR-39 判断 2 の原則の継承。実装が窓 iv の computeEnd クランプ後に ivIndexOf すると評価範囲依存の偽エラーが出る——検証で検出済みの罠)。
- 同長性検査は課さない——周期は任意の窓数を覆う(リスト長の倍数である必要もない・巡回)。
位相保存は端の増減に限る: 前方・後方延伸/過去側切り詰めは i と i₀ が同数ずれて
(i − i₀) mod N不変(数学的保証・コーパス検証で 3 年延伸を実証)。中途の挿入・欠落は 無検出で位相が回る(守備範囲の較正・後述)。 - anchor の所属要件(評価時検査・窓束縛の評価と同時=external では解決後): anchor は窓列の
いずれかの窓に区間所属する実日であること(空窓〈empties: keep〉も序数を消費し anchor を
受ける=ADR-39 の空窓読み口と同一規約)。頭側(覆域始端〜最初のマーカー・ADR-37 改訂 3)・
範囲外に落ちる anchor は一般評価エラー(裁定 2026-07-25——供給エラーには乗せない。解決は
成功しており、式側の宣言と新データの不整合だから式の更新を促す明示エラーが筋)。エラー文言には
同位相の付け替え候補(N 周期先の窓内実日——付け替えで全ラベル不変が常に成立・検証済み)を
提示する。マーカー点との一致は要求しない(属する窓で決まる=cycle と同じ)。境界日は半開区間
[mᵢ, mᵢ₊₁)で新窓側に一意・最終窓は覆域端まで(端は排他)。時刻付きリテラルも可(instant 級 マーカーの窓列で位相を時刻で留める用)。 - リスト値域はリテラルまたはリスト束縛名(裁定 2026-07-25=静的 labels: と対称・ADR-39 判断 1。 型域は ADR-34 判断 3〈スカラー値・等質・空リスト不可〉。十二支リストを窓束縛 cycle の dayBranch と共用できる)。
- 締めの継承:
edges: clip・empties: drop・label:同居・規則マーカー(無限窓列)は静的 エラー(規則窓列の周期ラベルは窓束縛 cycle で——既存誘導文言は二形化に合わせ「窓束縛」を 明示する書き分けへ)。マーカー覆域が全マーカーを包む単一の無註釈区間であること(ADR-39 判断 4 第 2 項)も継承——根拠は「窓数確定」から「位相確定」に読み替える(註釈域内の未知マーカーは 全ラベルを黙ってずらすため)。 - named-arg の重複は静的エラー(labels: は一回——静的形か cycle 形の二択。現行実装の named()
先勝ち黙殺も同時に封じる)。
labels: cycle […], anchor: …のカンマ混入(anchor: が segmentBy の 未知引数に化ける誤記)は専用文言で cycle 形へ誘導する。 - 窓インスタンス参照 W(v): 周期ラベルは非一意キー——全マッチ和(
sekkiMonth(寅)は各年の 寅月の和・覆域が 1 周期未満でリスト内未出現のラベルは正当な空)。リスト外の値引数は ADR-42 判断 7 (g)(静的列挙可能な値域の域外=エラー)を適用——リストが cycle 形の全値域。 - 読み口・空窓の扱いは静的 labels: と同一(束縛名射影・区間所属・空窓にもラベル)。
守備範囲の較正(裁定 2026-07-25=トレードオフ受け入れ): cycle 形が守るのは位相の宣言
のみ。同長性検査(F62 の器)を外すため、(a) マーカーの中途挿入・欠落(external の節気重複・
欠測・供給側訂正)は挿入点の片側の全ラベルが黙って一斉に回る、(b) 非周期列への誤用(旧暦
月番号——閏月は前月番号の繰り返しで周期でない)は閏のたび永続ずれが累積する——いずれも照合相手の
リストが存在せず機械検出は原理的に不可能(静的 labels: なら同長性検査が割れていたクラス)。
中身と周期性の照合は doctest・coincides の分担(ADR-39 判断 6「守るのは長さのみ」と同じ
線——cycle 形では「守るのは位相のみ」)。reference には使い分け(周期→cycle 形・非周期データ→
静的 labels:)と誤用時の症状(無エラーの黙走)・反例 doctest を必置する。
対比検討(不採用・第 5 便裁定): (a) cycle のオペランド拡張(sekkiMonth cycle […])は、窓
(windows 値・暦法純粋の律動)と窓列(stream+wins・データ由来)の型差を跨ぐ——cycle の暦法
純粋(I8)の性格を壊し、影響範囲も広い。labels: の器内で閉じる (b) を採る。
縁の確認(コーパス検証 2026-07-25・全一致):
- 節切り月の十二支: 2026 年 12 窓を全数追跡——i₀=1(anchor 2026-02-04 ∈ 窓 1)で窓 0=丑・ 窓 1=寅・…・窓 11=子。照会 §3 の現行静的形と外延一致・十二直の式(dayBranch == sekkiMonth 比較) も不変。
- 月家九星: 逆行は逆順リスト——
cycle [八白, 七赤, …, 九紫] anchor: 2026-02-04で 2026 寅月=八白・2027 寅月=五黄・2028 寅月=二黒(伝統の年家グループ規則と 3 年+頭側全一致。 非倍数周期 9∤12 と負 mod の実証)。九星日盤の陽遁陰遁切替は周期でない→対象外(第 5 便 §1 整合)。 - 月星座: 入宮マーカー(約 2.3 日間隔・snapTo(day) 衝突なし)× 12 宮巡回——静的形なら年約 161 要素の並べ直しになる形で圧縮効果は三用途中最大。
- 旧暦月番号(閏月)は周期でない→対象外・静的 labels: のまま(kyureki の monthNos が正当な 残存例。誤って cycle 形で書くと閏六月以降が黙って永続ずれ——較正節の反例として reference に明記)。
- 粒度の罠: マーカーが instant 級(snapTo 前)の窓列に date 級 anchor を書くと、代表点所属 (spec §5.2)で意図の前窓に付き得る(立春 10:23 より日の先頭 00:00 が前)——エラーではなく 一貫した区間所属だが意図とずれる。落とし穴に明記し、実用形は「マーカーと同じ snap を経た anchor」 または時刻付き anchor。
- 照会 §3 の想定記述からの差分は
empties: drop→errorの一点のみ(締めの継承どおり。 everyDay ベースは空窓が出ず実害なし——回答時に明記する)。
構文(EBNF 案・segmentBy の named-arg 限定):
segment-labels = "labels" , ":" , ( list-literal | name | cycle-labels ) ;
cycle-labels = "cycle" , ( list-literal | name ) , "anchor" , ":" , date-literal ;
テーブルリテラルの labels: には入れない(テーブルは点への 1 対 1——周期を貼りたい点列は「テーブル
でなく cycle」の既存誘導が立つ)。cycle は spec §5.4 で premise 層の窓生成語——本体層 segmentBy
の named-arg 値位置への出現は位置依存のキーワード解釈(ADR-42 統一原理)として §5.4 に配置
注記を足す。
実装スケッチ(実装可能性検証 2026-07-25 反映): AST に { t: 'cycleLabels', list, anchor }
ノード新設(Arg は Expr 単値のため anchor を同ノードに畳む)・parser は labels: キーで cycle を
先読み分岐(現行は name atom→index 後置と誤解釈して ParseError——先読みが必須)・scanVocab に
cycleLabels 分岐(欠くと列挙名が語彙に入らず「未解決の名前: 寅」で落ちる——検証で検出済み)・
WinLevel に別フィールド labelsCycle?: { list; i0 } を足し参照 8 サイトに mod 分岐(既存 labels に
窓数分実体化する近道は W(v) の域外検査を壊すため不可)・既存エラー文言 2 箇所(eval 2256/2031 の
「周期ラベルは cycle へ」)を「窓束縛 cycle」へ書き分け。規模概算=実装 3 ファイル(ast 約 2 行・
parser 15-20 行・eval 60-80 行)・文書 4-6 ファイル・テスト 12-15 本。
検証記録(2026-07-25): 4 視点並列(整合性・コーパス・実装可能性・敵対)=指摘 32 件(critical 2〈パース経路・語彙収集〉・major 10・minor/規定不足ほか)→全件を本節に反映済み。設計者裁定 3 件= ①同長性検査喪失のトレードオフ受け入れ(較正明文化)②リスト値域は束縛名も許す③anchor 窓消失は 一般評価エラー(同位相付け替え候補の提示つき)。付随修正=reference/cycle.md 落とし穴の既存誤り (「リストを書き換えても anchor が同じなら同一の暦」——実装・spec と矛盾)を訂正。
2. 代表例(core と糖衣の対応)
2.1 毎月末の 3 営業日前
# 糖衣
@JP
monthEnd |> roll(Preceding, on: bizDay) |> shift(-3, unit: bizDay)
# core 展開
@JP
everyDay |> within(month) |> last |> roll(Preceding, on: bizDay) |> shift(-3, unit: bizDay)
意味: 全日を月ごとに束ね、各月の最終日を採り、営業日でなければ前営業日へ寄せ、そこから 3 営業日戻す。
monthEnd は暦法純粋(I8)なので 5-31 を出す。営業日への調整は後段の roll が担う(ADR-20)。on: bizDay は
@JP の calendar: TSE に解決される(ADR-17)。軸を後置に畳めば @JP axis: bizDay の下で on:/unit: を省ける(§1.7)。
2.2 毎月第 2 営業日の次の金曜
# 糖衣
@JP
everyDay |> businessDays(on: bizDay) |> within(month) |> nth(2) |> nextWeekday(Fri)
# core 展開
@JP
everyDay |> filter(on: bizDay) |> within(month) |> nth(2)
|> roll(Following, on: (everyDay |> filter(x => weekday(x) == Fri)))
意味: 全日から営業日だけ残し、月ごとに束ね、各月窓の第 2 を採り、次の金曜へ進める。nextWeekday(Fri) の
展開先は前方 roll(§1.16 補。旧 within(week) 展開は F31 で撤回)で、WKST 非依存。
3. 演算子の暫定シグネチャ(作業中)
everyDay : () -> Stream— 暦法純粋の生成子。within(w) : Stream -> Stream(partitioned)— パーティション型窓。wは窓名(month/week/quarter/…)。網羅・無重複は I5 で検査可能。segmentBy(m, edges:, empties:) : Stream -> Stream(interval)— 区間列型窓。mはマーカーストリーム。隙間ポリシー(edges:/empties:)は必須(I5)。first / nth(n) / last : Stream(windowed) -> Stream— 窓内選択。既定は最内窓、of: wで対象窓を明示(ADR-24)。窓相対(I4)。filter(on: P) : Stream -> Stream/filter(x => 条件) : Stream -> Stream— premise 述語(on: P)または 値式述語(ラムダ)で間引く。whereを統合(ADR-25)。roll(conv, on: P) : Stream -> Stream— 無効点を conv(Following/Preceding/Modified…)で有効点へ寄せる。shift(n, unit: U) : Stream -> Stream— U 単位で n(符号つき)だけ動かす。方向は符号で表し方向語は採らない (back: 3は将来 n を変数化したとき方向が語と符号に二重化し、処理系の解析も煩雑。ADR-21)。- 結合子:
A | B和/A & B積/A \ B差(\=U+005C、円記号 ¥ ではない)。優先度付き上書きは和・差の 左結合順序適用で表す(専用記号なし。§1.8)。 - ストライド(走査して間引く・選択子と別族):
stride(n)入力相対カウント(from:以上の入力点を n ごと・ 軸引数なし=ADR-38)/strideBy(w)幅刻み(複数軸の物理量、例24h39m35.244s)。起点はfrom:必須 (ADR-31)、strideの n は 1 以上の整数(ADR-38)、リセットは既定しない(§1.9)。
premise 層・原始的定義の窓生成語(§1.11。名は確定=spec §5.4):
grid(w) : Chronos -> Stream(partitioned)— 連続軸を幅wで一様分割(暦の原子)。網羅(I5)。strideByと幅概念を共有。span(n => w) : Stream -> Stream(partitioned)— 細かい単位を可変幅で束ねる root 窓。nは生成中の窓の序数。split(y => [w…]) by: u : Stream(windowed) -> Stream(partitioned)— 親窓を単位uの可変幅で割る子窓。幅総和=親(I5 検査可能)。cycle(labels) anchor: r : Stream -> Stream(labeled)— 並列反復ラベル(曜日。ADR-03)。窓でなくラベルを生む。- 公開語は premise ブロック top-level の束縛(
Gregorian.month)。境界は選択子の再利用(monthStart = month |> first)。
premise 層・派生的定義(§1.12。with は確定・旧仮称 shiftBoundary は rephase に裁定済み〈2026-07-26〉):
Base with { w = … } : premise -> premise— base の公開語を上書き/追加した新 premise。裸名は派生スコープで再解決、Base.wは base 値にピン(機構 A・ADR-17)。継承語は依存する上書き語に自動追従。|> shiftBoundary(δ, on: W, unit: U) : premise -> premise— 窓Wの切れ目を単位Uで δ ずらす糖衣。展開はW = U span (_ => k) phase: φ₀+δ(k=W ⊃ Uの個数、φ₀=base の位相。§1.12)。k可変組は射程外。日付は不動(解釈 P・I1)。span/splitの位相起点phase:(会計暦の 4 月始まり等)。§1.9 stride のfrom:と同族の位相引数。
糖衣定義(§1.13。専用構文なし=既存の = 束縛):
-
name(引数) = s => s |> core列(基底 B)/前段が素直ならs =>を省くポイントフリー略記(A・eta 簡約)。|>は A で「変換> 変換=合成」も担うが ADR-22 の「段の連結」で一義。 - 宣言印なし(糖衣性は依存解析で自動判定、core 語再定義は静的エラー)。premise は焼き込まず呼び出し時の在圏 premise で遅延解決(ADR-17)。展開=右辺の機械的差し込み(core への片方向・ADR-23)。
4. 未確定事項(構文レベル)
宿題の正本は ../90-open-questions.md(RC 時点の整理済み一覧)。構文レベルの残りは:
年度ラベル・序数の射影→ ADR-27 の射影一族(窓ラベル付与label:)に吸収。付与側も ADR-30 で確定 (別点の窓参照は可・隣接窓は射程外)。rephase(旧仮称shiftBoundary)の射程外=k(W ⊃ Uの個数)が可変な組(month ⊃ dayをday単位でずらす等)を扱う別演算子(必要になれば。§1.12 の位相ずらしはk定数の span に限定)。- 命名は全語確定(spec §5.4・仮称ゼロ〈2026-07-26〉):
grid/span/split/cycle・anchor:/phase:/by:・withは RC1 で確定。基底の名→ ADR-29 で解消(基底=axisの二義chronos・操作軸=axis:双方確定)。射影一族の名→ RC2 で確定(ordinalIn/epochOrdinal/snapTo・label:/labels:・covering:。labelOfは ADR-30 で廃語)。最後の仮称shiftBoundaryもrephaseに裁定済み〈2026-07-26〉(nonWorkingは 2026-07-09 の F51 一括確定で正式名。正本は spec §5.4)。 並列 week 窓の生成語→ §1.16 補で解消(segmentBy+wkst 遅延解決・専用生成語なし)。of:が匿名窓(segmentByで作った名前の無い窓)を指すときのラベル付け(窓の参照方法)。裸ストリームへのof:付き選択子の窓解決規約(40-examples F27)も同所。ストライドを窓ごとにリセットして数え直す版の記法→ ADR-27 のordinalInへの還元で解消(専用記法なし)。カレンダー実体の束の宣言構文→ ADR-35 で確定(2026-07-08。§1.19=実体は予約公開語nonWorking(仮称は継続=F51)を持つ premise・新構文ゼロ・F53 の軸位置規約込み)。結合子の 粒度整合(F56)も ADR-36 で確定(整列の静的検査)。残る宿題は F51(純命名)と新出の F67〜F70(正本は 90-findings)。外部供給宣言はexternalとして確定(§1.27 → ADR-46・ 2026-07-14。ADR-36 帰結=器の整列の主張はkind:が担う)。- 発報層の記法。