問題
契約日の 90 日後に更新確認を発火させたい。契約データは 2026 年分と 2028 年分だけ取得済みで、 2027 年分は未取得(covering の区間リストに中抜けがある)。評価範囲 2028-01-01..2028-06-01 で 実体化すると何が出るか。
premise JP {
calendar-system: Gregorian
tz: "Asia/Tokyo"
wkst: Mon
}
@JP
dues = [2026-03-01, 2026-09-01] covering: 2026..2026, 2028..2028
dues |> shift(90, unit: day)
- (a) 点ゼロ・註釈なし(2028 年の契約が無いだけ)
- (b) 点ゼロ+範囲外註釈 [2028-01-01, 2028-03-31)
- (c) 2027 年分の欠落は静的エラー
- (d) 2026 年の契約の 90 日後(2026 年 5 月・11 月)が出る
正答
(b)。
解説
註釈も演算子で輸送される(ADR-37 判断 4 の輸送表)。covering の中抜け [2027-01-01, 2028-01-01) は「この区間の契約は未知」という主張で、shift(90, unit: day) は その未知区間も +90 日の平行移動像として運ぶ——像 [2027-04-01, 2028-03-31) のうち評価範囲に 掛かる [2028-01-01, 2028-03-31) が註釈として並走する。意味は「2028 年 1〜3 月の発火は、未取得の 2027 年後半の契約から来ていたかもしれない」。点が出ないことと、出ない理由が信用できることは 別——後者を註釈が担う。(d) は評価範囲外なので出ない(2026 の像は 2026 年内)。 impl 実走検証済み(2026-08-02・公開 HEAD d1085ee)。
検証
# eval: 2028-01-01..2028-06-01
premise JP {
calendar-system: Gregorian
tz: "Asia/Tokyo"
wkst: Mon
}
@JP
dues = [2026-03-01, 2026-09-01] covering: 2026..2026, 2028..2028
dues |> shift(90, unit: day)
# ⚠ 範囲外 2028-01-01..2028-03-31(dues covering 2026-01-01..2026-12-31, 2028-01-01..2028-12-31)
# 被覆サマリ
# dues covering 2026-01-01..2026-12-31, 2028-01-01..2028-12-31 残走路 214 日