日本語 · English

coincides — 窓所属の述語

分類: 射影(本体層 §4.9・値関数) / シグネチャ: coincides(S, w, d) : 点 -> Bool / 名は確定(2026-07-09・F51 の一括確定。比較候補 hits/anyIn/sharesWindow は不採用)

2026 年の祝日表(covering 2026-01-01..2026-12-31)を 2026 年いっぱいの評価範囲で使ったときの範囲外註釈を、年の両端を拡大した数直線で示す図。窓頭領域では 25 日払いの roll(Preceding) が 1/1 の前の営業日=表の外に依存し得るので「⚠ 範囲外 2026-01-01..2026-01-02」、窓尾領域では 30 日払いの roll(Following) が 12/31 の次の営業日=表の外に依存し得るので「⚠ 範囲外 2026-12-31..2027-01-01」が出る。点列は 12 点とも確定し、註釈だけが併走する。

意味

点 d の属する w 窓の中に、ストリーム S の点が少なくとも一つ在るか(論理値)。 ordinalIn が「属する窓の中で数える」なら、coincides は「属する窓の中に 在るか」——点→属する窓→窓の中身、という射影一族の同じ骨格で、値式に有界存在量化が入る (ADR-38)。引数順は ordinalIn(u, w, d) と同型の〈対象, 窓, 点〉——ただし第 1 引数だけ一族で 唯一のストリーム(束縛名・修飾名・括弧のインライン式。窓語を S に置くのは静的エラー——原子点列 への暗黙降格は恒真化の罠。点列を意図するなら month |> first を書く)。w は在圏で解決される窓語 (パーティション型・segmentBy 窓とも可。cycle 名は不可)。

これが F68 の受け皿: 時刻付き・混合スケジュールに「例外日」を適用する形は等値の結合子では 書けず(snapTo は発火時刻を潰す)、所属で結合する明示手段が要る。値述語なので not・and/or・他の射影と自由に組める(「祝日の日は除く、ただし金曜なら残す」= not coincides(holidays, day, d) or weekday(d) == Fri)。

例(F68 の正準形: 毎営業日 9 時の通知から臨時休業「日」を除く)

9 時の tick は壁時計(市民時幅の歩進。ADR-38 改訂——旧形 shift(+9, unit: hour) は経過時間 意味論で DST 切替日に壁時計とずれるため正準から降格・「9 経過時間後」が意図のときの明示形)。 除外は coincides が「日」の所属で判定する(発火時刻 09:00 は保存される)。なおこの 「tick+coincides」の型は stdlib 糖衣 at に 1 語で縮む(… |> at(T09:00)= 展開が本節の正準形そのもの。ADR-51)——以下は展開形の理解のための正準例:

# eval: 2026-01-05..2026-01-10
premise Cal {
  calendar-system: Gregorian
  tz: "Asia/Tokyo"
  satSunC = everyDay |> filter(d => weekday(d) == Sat or weekday(d) == Sun)
  nonWorking = satSunC
}
premise Biz {
  calendar-system: Gregorian
  calendar: Cal
  tz: "Asia/Tokyo"
  wkst: Mon
  nineTick = everyInstant |> strideBy(1d, from: 2026-01-01T09:00)
}
@Biz
closures = [2026-01-07] covering: ..
nineTick |> filter(t => coincides(bizDay, day, t) and not coincides(closures, day, t))
#=> 2026-01-05T09:00 2026-01-06T09:00 2026-01-08T09:00 2026-01-09T09:00

day 整列が立つ導出型では前段差が簡明(同じ結果。ADR-38 判断 8——coincides の必然はテーブル直書き・ 混合・不規則時刻に絞られる):

# eval: 2026-01-05..2026-01-10
premise Cal {
  calendar-system: Gregorian
  tz: "Asia/Tokyo"
  satSunC = everyDay |> filter(d => weekday(d) == Sat or weekday(d) == Sun)
  nonWorking = satSunC
}
premise Biz {
  calendar-system: Gregorian
  calendar: Cal
  tz: "Asia/Tokyo"
  wkst: Mon
  nineTick = everyInstant |> strideBy(1d, from: 2026-01-01T09:00)
}
@Biz
closures = [2026-01-07] covering: ..
bizx = bizDay \ closures
nineTick |> filter(t => coincides(bizx, day, t))
#=> 2026-01-05T09:00 2026-01-06T09:00 2026-01-08T09:00 2026-01-09T09:00

なお実体が開場時刻を宣言していれば、この形自体が標準導出 bizOpen 一語に縮む (ADR-41——臨時休業は nonWorking の右辺へ)。

積の形も同じ一語——「S の点がある日だけ残す」= filter(d => coincides(S, day, d))。差と積が not の有無で書き分けられる。純増の表現力の例(実行検証は impl/test/coincides.test.ts):

# 閏月の検出——中気を含まない旧暦月が閏月(monthNos 手作業更新〈F62〉の照合検査を兼ねる)
lunarMonth |> first |> filter(p => not coincides(chukiDay, lunarMonth, p))
#=> 2025-07-25(閏六月の朔日)

証人規則——確定の三分岐(ADR-38 判断 4)

基準は常に実効被覆域(輸送済み註釈区間の補集合。テーブルリテラル の covering:・ADR-37)であり生 covering ではない:

coincides の証人規則の三分岐を、祝日表 national(covering 2026-01-01..2026-07-15)と month 窓で示す。5 月の窓は 5/3〜5/6 の祝日が証人なので真。6 月の窓は祝日がなく、窓の全体が covering の内なので偽。7 月の窓は祝日がなく、7/16 以降が表の外(註釈区間)なので範囲外。評価範囲 [2026-05-01, 2026-08-01) で month |> first |> filter(m => coincides(national, month, m)) は 2026-05-01 を返し、not を付けた式は 2026-06-01 を返し、どちらにも「⚠ 範囲外 2026-07-01..2026-08-01(JP.national covering 2026-01-01..2026-07-15)」が付く。

everyDay \ holidays の退化尾部の点は証人にならない——存在しないかもしれない祝日の上に 「確信付きの真」を築かない(「註釈は空でない結果にも付く」の消費側の規則)。

落とし穴

関連

filter(合成先)・結合子(等値所属の正道)・snapTo (点の整合)・ordinalIn(同じ骨格の「数える」側)・ADR-36/37/38・F68/F69/F75。