Skip to content

Java extraction backend: 未対応タスク #14

Description

@hiroshi-cl

#6 In proof-ninja/rocq の作り直し

優先度: 高

実際の抽出で高頻度に発生し、かつ発生時にコンパイル不能な Java(もしくは重大な正しさの欠陥)を生む項目。

No. 項目 元の優先度 対応内容 発生頻度の実態
1 ローカル MLfix を有効なJava式にする ラムダ本体・let右辺・関数引数など任意の式位置で使用可能な、単一・相互再帰対応のJavaエンコーディング(例: 即時実行ラムダやヘルパーメソッド化)を導入する occasional。2つの経路がある: ①Gallinaの項中に直接書かれたfix/cofix式は無条件にMLfixになる(extraction.ml:743-746,988-994)。②トップレベルのDfixが「インライン化」された場合にdfix_to_mlfixでローカル化される(modutil.ml:260-274,293-301)。mlutil.ml:1571-1577inline条件式はto_inline r(明示指定)の他にis_projection/is_recursor/manual_inline/inline_testの論理和だが、inline_test(:1528-1537)自体は「fixpointは自動インライン化しない」設計であり(optim_seが渡すfake_body = MLfix(0,[||],[||])のトリックもこれを担保する)、is_projection/is_recursorも通常Dfixブロックには該当しない。したがって相互再帰するDfixが実際にローカル化されるのは、事実上Extraction Inlineの明示指定、またはWf.Fix/Fix_F等コアライブラリのwell-founded recursionヘルパー(mlutil.ml:1545-1561のホワイトリスト、通常は単一再帰)が中心となる。相互再帰(idsが複数)が生じるのは主に①、またはユーザーが相互再帰FixpointExtraction Inlineを明示指定した場合に限られ、通常のFixpoint f ... with g ...をトップレベルで書いただけでは発生しない(Dfixのまま)。出現時、現状は宣言・代入・式を式位置に直接並べるため必ず構文不正になる。
2 浅いパターン(Pusual/Prel/Pwild)の正しい処理 パターン構造から分岐条件・フィールド参照・変数束縛を生成し、位置番号による束縛をやめる。実際にはネスト/再帰は一切発生しないため「再帰的パターンマッチャー」は不要で、各分岐がPusual/Prel/Pwildのいずれか(常にフラットな1段)であるケースを網羅すればよい extract_branchextraction.ml:968)は常に固定でPusualを構築し、Pcons/Ptupleの構築箇所は存在しない。Prel/Pwildmlutil.ml:1159-1171factor_branches最適化(複数分岐が同一コードを生成する場合に1本へ統合)でのみ後から生成される。この最適化(factor_branches)が発動する条件は「複数分岐が構文的に同一のコードへ簡約される」ことであり、Gallinaでワイルドカードを使っただけで自動的に保証されるわけではない。ただし、複数コンストラクタに対して同じ処理をする(ワイルドカードで束縛変数を使わない、あるいは同じ値を返す)典型的な書き方をした場合には現実によく起こりうる。
3 MLcase 全分岐のパターン適合性検査(チェックボックス再オープン要) 最終分岐も無条件キャストしない。分岐選択自体はml_branch arrayの要素数(通常は対象inductiveのコンストラクタ数と一致)から抽出時に静的に決まるため、本来は「全分岐にinstanceofを付ける」だけで足りる話であり、実行時に非網羅性を検出する仕組みは別問題として扱う common。ただし出力自体はコンパイルは通る(構文ブロッカーではない)。Rocqのmatchは本来網羅的にコンパイルされ絶対分岐はMLexnで埋まるため通常は安全なケースが多いが、MLmagic由来の型不一致等と相互作用した場合にサイレントな誤り・素のClassCastExceptionを生みうる。issue自身が完了条件として明記しており、堅牢性/診断品質の観点で高を維持。
4 MLexn/MLaxiom/MLdummy を有効なJavaとして生成する 共通の式位置 fail ヘルパー(例外送出式)を導入し、3構文すべてをこのヘルパーで解決する 3構文で頻度は異なる。MLdummyはcommon: Prop消去で日常的に生成される(extraction.ml:777,839,1095,1148,1224-1225)。MLexnはoccasional: 実際の構築箇所は空match=絶対分岐(extraction.ml:933「absurd case」)と、未使用な相互再帰コンポーネントの占位(modutil.ml:393「UNUSED」)の2箇所のみで、MLdummyほど頻出しない。MLaxiomもoccasional〜rare: 本来のAxiom/Admitted由来の生成(extraction.ml:1137)は開発次第で、加えてEvar/Meta(未解決項)に対するフォールバック(extraction.ml:748「evar」)は完全なdevelopmentでは通常発生しないはずの経路。いずれにせよ現状 (error "...")/__/(error "AXIOM...") は未定義Javaで、MLdummyだけでも費用対効果が最も大きい項目。
5 Tvar/Tdummy/Tunknown を有効なJava型として生成する 'a 形式や __ をやめ、有効なジェネリクス型変数名(例: T1, T2…)または Object への一律消去のいずれかの方針を決めて生成する occasional〜common。多相定義・型消去の残存で普通に出現する(extraction.ml:360-400,1027-1032,1074-1077,1124-1133)。現状は不正なJava型であり、出現する定義すべてがコンパイル不能になる。
6 Dtype を実装する Scheme同様に型エイリアスを消去するか、対応するJava宣言(インタフェース等)を生成するかを決定する occasional。実際の型シノニム定義(Definition foo := ...型)で発生する(extraction.ml:1124-1163)。現状は不正な type のみを出力しファイル全体が構文不正になる。
7 出力ファイルごとに固有のトップレベルクラス名を生成する file_naming が返すモジュール由来のファイル名からクラス名を生成し、class Main 固定をやめる 複数ファイル抽出では常に発生し、issue自身の完了条件(javac *.java の同時成功)を直接ブロックする。修正コストは低く効果は最大級。
8 MLmagic の型安全性を整理する Javaの静的型が食い違う場合にキャストを生成する。型戦略(Tvar系の消去方針)と合わせて設計する occasional。needs_magic/mgumlutil.ml:116-142)がMLレベルの単純型同士の単一化に失敗した箇所(変数参照・定数適用・コンストラクタ適用、extraction.ml:736,821-855,893-919)で挿入される。依存型(添字付き帰納型・依存matchの戻り型・整礎再帰等)を使うコードで発生しやすく、nat/list/option中心の一階関数型コードではほぼ発生しない。注意: skip_typing()(mlutil.ml:133)はlang() == Schemeの場合のみ真であり、Schemeは単一化チェック自体を行わないため構造的にMLmagicが生成されない。Java(table.ml:675)はOCaml/Haskellと同じく単一化チェック対象であり、Schemeのような「構造的に発生しない」対象ではなく実際にMLmagicノードが生成されうる。

優先度: 中

発生時は対応が必要だが、**発生頻度が低い(rare-requires-opt-in)**か、内部処理専用で最終出力への到達が稀であるため、実装より先に「明示的な抽出エラーを出す」ことを優先し、実装自体は需要が出てから着手すればよい項目。

No. 項目 元の優先度 対応内容 発生頻度の実態
9 プリミティブ値(MLuint/MLfloat/MLstring/MLparray)の実装 まず現状の Prelude.error(不正Java)を明示的な抽出時エラーに置き換える(高優先のfailヘルパーで解決可)。実装(MLstringString等)は需要が出てから rare-requires-opt-in。構築箇所はInt/Float/String/Arrayという核項コンストラクタに対応する4行のみ(extraction.ml:760-768)で、Gallinaソースが実際にRocqのネイティブint63/float/string/arrayリテラルを含む場合にのみ生成される(通常はこれらのプリミティブ機能を導入した開発でのみ出現する)。本プロジェクトの .v ファイル(common/theories/Demo.v, variants/proof-ninja/theories/JavaExtractionDemo.v)はいずれも未使用と確認済み。
10 Coinductive の扱いを決める 現状の「Javaとして無効な説明文」を明示的な抽出エラーに置き換える。遅延評価(thunk)の実装は需要が出てから rare-requires-opt-in。本プロジェクトの .vCoInductive は存在しない。パリティ実装にはthunk/lazinessの設計が必要で相応のコストがかかる。
11 Tmeta/Tvar' の処理 assert false を診断可能なエラーメッセージに置き換える 推論フェーズ専用の内部値であり、他バックエンド(OCaml/Haskell/JSON)も同様にassertしている不変条件。最終出力への到達は基本的に想定されない。

優先度: 低

miniml.ml の型定義上は存在するが、実際の抽出パイプラインに構築箇所が一つも存在しない(effectively-dead)、または他バックエンドと同一方針で現状維持が妥当な項目。実装は不要で、到達時に明確なエラーを返す程度で十分。

No. 項目 元の優先度 対応内容 発生頻度の実態
12 Ptuple・ネストした Pcons パターン 到達時に明示的な抽出エラーを返すのみでよく、再帰的パターンマッチャーの実装は不要 effectively-deadextraction.ml/mlutil.ml/modutil.ml のいずれにも構築箇所が存在しない。miniml.ml:170-174 自身が「main extraction では未使用、P.N. Tollitte の Relation Extraction プラグイン専用」と明記している。
13 MLtuple の実装 到達時に明示的な抽出エラーを返すのみでよい effectively-dead。構築箇所がなく、通常の prod(ペア型)は普通の帰納型コンストラクタ(MLcons)として抽出される。
14 モジュール変換(MEstruct/MEfunctor/MEident/MEapply/SEmodtype assert false を診断可能なエラーに置き換える程度に留める Haskell/Scheme/JSONも同一の「struct平坦化・他は破棄」方針。ident/apply は「extract_env で展開済みのはず」という上流の不変条件があり、到達は異常系。
15 Javaシグネチャ出力(pp_sig)の方針を決める 現状の「常に空」を明文化して方針として確定させる Haskell/Scheme/JSONも同様に空のシグネチャを返しており、パリティ上の欠落ではない。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions