Skip to content

標準ライブラリ決定論的モジュール関数カバレッジ

2026-05-22 生成。Math.methods - Module.methods 等から各モジュールの公開関数を洗い出し、
Constant[T] または精度精緻化(non-empty-string 等の Refinement)が得られる関数を分類する。


記号意味
実装済み
🔲未実装だが Constant[T] または Refinement に折りたためる価値あり
🔷別ティア処理済み(RBS 等で十分)
🚫非対象(副作用・非決定的・型精度向上が negligible)

現行 ConstantFoldinginvoke_unary / invoke_binaryインスタンスメソッド受信者 を対象とする。
Math.sqrt(4.0) のようなモジュール関数呼び出しは受信者が Math モジュールオブジェクト(シングルトン)であり、
現状は未処理(CATALOG_BY_CLASSMath が存在しない)。

推奨実装方針(実装時に決定):

Option A: ConstantFolding に try_fold_module_function を追加し、
受信者型が Math / Shellwords / CGI / URI の singleton であることを
receiver_type.class_name で認識 → 専用 invoke ハンドラで実際に評価
Option B: 新規 ModuleFunctionFolding ティアを MethodDispatcher に挿入
(ConstantFolding と同列の独立ファイル)
Option A が低コスト。関数数が増えたら Option B に昇格を検討。

受信者型認識の課題: Rigor が Math 定数を Type::Nominal["Math"] として解決するか
Type::Constant[Math module object] として解決するかは既存の singleton 型処理(Random.rand など
CATALOG_BY_CLASS に含まれる Random に対するインスタンス/クラスメソッド分岐)を参照して確認が必要。


Math.methods - Module.methods → 28 関数(Ruby 4.0.5)。
全て Constant[Float] または Tuple[Constant[Float], Constant[Integer]] へ折りたためる。

メソッドシグネチャ返却型状態備考
acos(x)Float → Float[0, π] Floatドメイン外 (|x| > 1) で DomainError
acosh(x)Float → FloatFloat ≥ 0ドメイン外 (x < 1) で DomainError
asin(x)Float → Float[-π/2, π/2] Float
asinh(x)Float → FloatFloat
atan(x)Float → Float(-π/2, π/2) Float
atan2(y, x)Float, Float → Float(-π, π] Float2 引数。y/x ゼロの符号注意。
atanh(x)Float → FloatFloatドメイン外 (|x| ≥ 1) で DomainError
cbrt(x)Float → FloatFloat負の実数にも対応((-8)***(1/3.0) とは異なる)
cos(x)Float → Float[-1, 1] Float
cosh(x)Float → FloatFloat ≥ 1
erf(x)Float → Float(-1, 1) Float誤差関数
erfc(x)Float → Float(0, 2) Float相補誤差関数
exp(x)Float → FloatFloat > 0Refinement: positive-float 付与可能
expm1(x)Float → FloatFloat > -1exp(x) - 1(小さな x で精度良好)
frexp(x)Float → [Float, Integer]Tuple[Float, Integer]仮数・指数分解。返値が Tuple。
gamma(x)Float → FloatFloatドメイン外 (x ≤ 0 の整数) で DomainError
hypot(x, y)Float, Float → FloatFloat ≥ 0Refinement: non-negative-float
ldexp(f, e)Float, Integer → FloatFloat仮数・指数から Float 再構成
lgamma(x)Float → [Float, Integer]Tuple[Float, Constant[1|-1]]対数ガンマ + 符号。Tuple 返却。
log(x)Float → FloatFloatドメイン外 (x ≤ 0) で DomainError
log(x, base)Float, Float → FloatFloat2 引数形式別ハンドラ要
log10(x)Float → FloatFloat
log1p(x)Float → FloatFloatlog(1+x)(小さな x で精度良好)
log2(x)Float → FloatFloat
sin(x)Float → Float[-1, 1] Float
sinh(x)Float → FloatFloat
sqrt(x)Float → FloatFloat ≥ 0ドメイン外 (x < 0) で DomainError。Refinement: non-negative-float
tan(x)Float → FloatFloat
tanh(x)Float → Float(-1, 1) Float

Math 定数:

  • Math::EConstant[2.718281828459045] — 定数解決(メソッド畳み込みではない)。本スライス対象外。
  • Math::PIConstant[3.141592653589793] — 同上。定数キャリアの課題として別途。
前提:
[x] Math シングルトン受信者の認識方法を確認(Type::Singleton, class_name == "Math")
[x] MathFolding モジュール(Tier D。option B — 独立 *_folding.rb ファイル)
高優先度(頻用・返値が単純 Float):
[x] sqrt → Constant[Float]
[x] exp → Constant[Float]
[x] log → Constant[Float](1/2 引数の可変長)
[x] log2 → Constant[Float]
[x] log10 → Constant[Float]
[x] sin / cos / tan → Constant[Float]
中優先度(2 引数または特殊返値):
[x] atan2 → Constant[Float]
[x] hypot → Constant[Float]
[x] ldexp → Constant[Float]
[x] frexp → Tuple[Constant[Float], Constant[Integer]]
[x] lgamma → Tuple[Constant[Float], Constant[Integer]]
低優先度(ニッチな数値解析用途):
[x] erf / erfc / expm1 / log1p / cbrt
[x] acos / asin / atan / acosh / asinh / atanh
[x] cosh / sinh / tanh / gamma
Refinement 追加(値の範囲が分かる場合)— 今回は対象外:
[ ] exp → positive-float
[ ] sqrt / hypot → non-negative-float

実装ファイル: lib/rigor/inference/method_dispatcher/math_folding.rbShellwordsFolding パターンの Tier D モジュール。dispatch_stdlib_module_tiers に配線)。Refinement 付与(positive-float / non-negative-float)は需要が出たときの follow-up。


Shellwords.methods - Module.methods → 7 メソッド(実体 3 関数 + エイリアス)。

メソッドエイリアスシグネチャ返却型状態備考
escape(str)shellescapeString → StringConstant[String]ShellwordsFolding 実装済み。"" 入力でも "''" を返すため常に非空。
split(line)shellsplit, shellwordsString → Array[String]Tuple[Constant[String]…]ShellwordsFolding 実装済み。不正クォートは nil を返し RBS に委譲。
join(array)shelljoinArray[String] → StringConstant[String]ShellwordsFolding 実装済み。Tuple[Constant[String]…] 引数時のみ。
高優先度:
[x] escape / shellescape → Constant[String] (Constant[String] 引数時)
[x] split / shellsplit / shellwords → Tuple[Constant[String]…] (Constant[String] 引数時)
[x] join / shelljoin → Constant[String] (Tuple[Constant[String]…] 引数時)

実装ファイル: lib/rigor/inference/method_dispatcher/shellwords_folding.rb (ShellwordsFolding モジュール)。
dispatch_precise_tiersFileFolding 直後に接続。
Singleton["Shellwords"] 受信者を dispatch_target? で検出し、Shellwords.escape / .split / .join を inference 時に直接呼び出す。


Regexp.methods - Class.methods:compile, :escape, :last_match, :linear_time?, :quote, :timeout, :timeout=, :try_convert, :union

メソッドシグネチャ返却型状態備考
escape(str)String → StringConstant[String]🔲正規表現メタ文字エスケープ。高優先度。
quote(str)String → StringConstant[String]🔲escape の別名。同上。
compile(pattern)String → RegexpConstant[Regexp]🔲Regexp.new 別名。Constant[Regexp] への折りたたみ。低優先度(用途限定)。
union(*patterns)String… → RegexpRegexp🔲可変引数・Regexp 型返却。低優先度。
last_match→ MatchData?MatchData|nil🚫グローバル $~ に依存。実行時状態。
linear_time?(pattern)String → boolConstant[bool]🔲パターンが線形時間かを静的解析。低優先度。
timeout / timeout=🚫グローバル設定。
try_convert(obj)Object → Regexp?🚫ダックタイプ変換。
高優先度:
[ ] escape / quote → Constant[String] (Constant[String] 引数時)
低優先度:
[ ] compile → Constant[Regexp] (Constant[String] 引数時)
[ ] union → Regexp (全引数 Constant[String] 時)

4. CGI(エスケープ / アンエスケープ系)

Section titled “4. CGI(エスケープ / アンエスケープ系)”

CGI.methods - Module.methods → エスケープ関係 16 メソッド(実体 4 機能 + CamelCase / snake_case / エイリアス)。

機能CamelCasesnake_caseエイリアス返却型状態
URL エスケープCGI.escapeConstant[String]🔲
URL アンエスケープCGI.unescapeConstant[String]🔲
HTML エスケープCGI.escapeHTMLCGI.escape_htmlCGI.hConstant[String]🔲
HTML アンエスケープCGI.unescapeHTMLCGI.unescape_htmlConstant[String]🔲
要素エスケープCGI.escapeElementCGI.escape_elementConstant[String]🔲
要素アンエスケープCGI.unescapeElementCGI.unescape_elementConstant[String]🔲
URI コンポーネントエスケープCGI.escapeURIComponentCGI.escape_uri_componentConstant[String]🔲
URI コンポーネントアンエスケープCGI.unescapeURIComponentCGI.unescape_uri_componentConstant[String]🔲

優先度: escapeHTML / unescapeHTML / h が最頻用途。escape / unescape (URL) が次点。

高優先度:
[ ] escapeHTML / escape_html / h → Constant[String]
[ ] unescapeHTML / unescape_html → Constant[String]
中優先度:
[ ] escape (URL) → Constant[String]
[ ] unescape (URL) → Constant[String]
[ ] escapeURIComponent / escape_uri_component → Constant[String]
[ ] unescapeURIComponent / unescape_uri_component → Constant[String]
低優先度:
[ ] escapeElement / escape_element → Constant[String]
[ ] unescapeElement / unescape_element → Constant[String]

実装ファイル: constant_folding.rbtry_fold_cgi メソッド。
エイリアスは同じハンドラから分岐(1 メソッドに集約)。


5. URI(エンコード / デコード系)

Section titled “5. URI(エンコード / デコード系)”

URI.methods - Module.methods → 16 メソッド。精度向上対象は encode/decode 系のみ。

メソッドシグネチャ返却型状態備考
encode_www_form_component(str)String → StringConstant[String]🔲高優先度。 RFC 3986 パーセントエンコード。
decode_www_form_component(str)String → StringConstant[String]🔲高優先度。
encode_uri_component(str)String → StringConstant[String]🔲高優先度(Ruby 3.2+)。
decode_uri_component(str)String → StringConstant[String]🔲高優先度。
encode_www_form(arr)Array/Hash → StringConstant[String]🔲Tuple / HashShape 引数時に折りたためる。中優先度。
decode_www_form(str)String → ArrayTuple[Tuple[Str,Str]…]🔲中優先度。
parse(str)String → URIURI オブジェクト🔲RBS で十分。Constant[URI] は複雑。低優先度。
join(base, *paths)String… → URIURI オブジェクト🔲低優先度。
extract(str)String → Array[String]Tuple?🔲低優先度。
split(str)String → Array[String?]🔷RBS Array[String?] で十分。
for(scheme, …)URI🚫オブジェクト生成。
regexp / scheme_list etc.🚫設定 / メタ情報。
高優先度:
[ ] encode_www_form_component → Constant[String]
[ ] decode_www_form_component → Constant[String]
[ ] encode_uri_component → Constant[String]
[ ] decode_uri_component → Constant[String]
中優先度:
[ ] encode_www_form → Constant[String] (Tuple / HashShape 引数時)
[ ] decode_www_form → Tuple[Tuple[Constant[String], Constant[String]]…]

実装ファイル: constant_folding.rbtry_fold_uri メソッド。


これら 2 モジュールは 計算自体は決定論的 だが、精度向上の実益が薄いため
非決定論的グループ文書 (20260522-stdlib-nondeterministic-module-coverage.md) に収録した。

モジュール理由
Base64encode64("hello")"aGVsbG8=\n" は確かに定数。しかし実用コードで Base64 を定数リテラルに折りたたむ場面はほぼない。返値型は常に String であり RBS が十分。Refinement non-empty-string は追加可能だが効果が小さい。
DigestMD5.hexdigest("foo") → 32 文字 hex 文字列。定数折りたたみで実際のハッシュ値が得られても静的解析上の用途がない。返値型 String は RBS 済み。hex 文字列専用 Refinement (hex-string) を追加する場合は決定論グループへ昇格を検討。

優先度モジュール・メソッド期待する精度向上
🔴 高Regexp.escape / quoteConstant[String]
✅ 済Shellwords.escape / shellescape / split / shellsplit / join / shelljoinConstant[String] / Tuple[Constant[String]…]
🔴 高CGI.escapeHTML / hConstant[String]
🔴 高URI.encode_www_form_component / decode_www_form_componentConstant[String]
✅ 済Math.sqrt / exp / log / sin / cos ほかConstant[Float]
✅ 済Math.atan2 / hypot / frexp / lgammaConstant[Float] / Tuple
🟡 中CGI.escape / unescape (URL)Constant[String]
✅ 済Math 全 28 関数(MathFoldingConstant[Float] / Tuple
🟢 低URI.encode_www_form / decode_www_formConstant[String] / Tuple

© 2026 TypedDuck. Licensed under CC BY-SA 4.0.