Skip to content
This repository was archived by the owner on Aug 5, 2026. It is now read-only.

Latest commit

 

History

3 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

NEPLg3

Status: Design / RFC phase
Implemented compiler: No
Accepted RFCs: 0
Normative specification: Not yet established

証明できることと、信頼するしかないことを分けて見せる。

NEPLg3 は、前置記法オフサイドルール式指向を受け継ぎながら、依存型、精緻化型、契約、リソース検査、exact-first な数値系を一つの検証基盤へ統合するプログラミング言語である。

Rocq で仕様・参照コンパイラ・proof checker を定義し、WebAssembly を主要ターゲットとする。最終的には、NEPLg3 自身で記述した proof-producing compiler へ移行することを目指す。

Important

NEPLg3 は現在、仕様策定と実装計画の段階にある。コンパイラや Playground はまだ利用できない。この README に掲載する構文は候補であり、正式な RFC によって変更される可能性がある。

なぜ NEPLg3 なのか

NEPLg3 が目指すのは、単に「型が強い言語」ではない。ソースコードから生成物まで、何が検査され、何が証明され、どこに仮定が残っているかを追跡できる言語処理系である。

  • Proof と Runtime を分離する — 論理関数と実行時関数、Pure と Total、証明とリソースを混同しない
  • 保証範囲を明示する — 型検査、VC、Wasm AST、バイナリ、ホスト環境を一括して「Verified」と呼ばない
  • 正確な数を既定にする — 小数を暗黙に binary float へ丸めず、exact な値として扱う
  • 所有権を意味論へ組み込む — move、borrow、drop、region を静的検査とコンパイラ検証の両方で扱う
  • Web を第一級の実行環境にする — 参照コンパイラ自体を Wasm 化し、CLI と Web で同じ意味論を使う
  • Self-host を信頼の近道にしない — 自己コンパイルだけで正しさを主張せず、独立した再検査経路を残す

コードの姿

NEPLg3 の最終構文は今後変更する予定だが、この README では当面、NEPLg2.1 の正規構文で表す。型注釈は %T expr、関数型は fn A B、副作用を持つ関数型は impure fn A B、関数宣言・関数リテラルの binder は \arg とする。前置呼び出し、if: / then: / else:、オフサイドルールもそのまま引き継ぐ。

次は examples/rpn.nepl の演算適用処理を題材に、NEPLg2.1 の関数宣言へ契約と証拠を加えた apply_op_values 候補例である。

#entry main
#indent 4
#target core

#import "core/math/i32/arith" as *

enum RpnOp:
    Add
    Sub
    Mul

fn apply_op_values %fn RpnOp fn i32 fn i32 i32 \op\a\b:
    contract:
        ensures operator_semantics \result:
            match op:
                RpnOp::Add:
                    Eq i32 result add a b
                RpnOp::Sub:
                    Eq i32 result sub a b
                RpnOp::Mul:
                    Eq i32 result mul a b

    body:
        match op:
            RpnOp::Add:
                add a b
            RpnOp::Sub:
                sub a b
            RpnOp::Mul:
                mul a b

    prove ensures operator_semantics:
        by:
            cases op
            case Add:
                simp
            case Sub:
                simp
            case Mul:
                simp

fn main %fn void i32 \void:
    apply_op_values RpnOp::Add 1 2

contract:body:proveby: は NEPLg3 で追加する候補であり、それ以外の外形は現在の NEPLg2.1 に合わせている。契約は VC を生成する仕様、prove は特定の claim に対応する evidence、by: は proof term を生成する式である。NEPLg3 の正式な差分は Syntax RFC で決定する。

prove ensures operator_semanticsには、verified WP/symbolic executionが生成したpath conditionとreturn valueを持つVCを渡す。通常のproofをevaluatorのconstructor構造へ依存させない。raw evaluation derivationの直接反転は、意味論自体を証明する低水準escape hatchに限定する。

少なくとも Proof Syntax RFC では、unit 型・unit 値の unit、ゼロ引数 marker の void、前置適用を維持する。()expr : Type\x => exprf(a, b)への変更は前提にしない。

証明構文

証明項

命題も型であり、その証明も通常の NEPL 式である。既存の期待型境界 %T expr を命題へそのまま拡張し、%P proof_expr を「proof_expr を命題 P の証明として検査する」と読む。

let add_zero %Eq Nat add n 0 n by:
    simp

Theorem と tactic

theoremlemma の本体には proof term を置く。by: は tactic によって明示的な Core proof または certificate を生成する式であり、それ自体を kernel の authority にはしない。

theorem and_swap %Prop \P\Q %And P Q \h %And Q P:
    by:
        apply And::intro
        case left:
            exact And::right h
        case right:
            exact And::left h

theorem と lemma は既定で Total、Opaque、Erased とする。明示 proof term、match、再帰、induction principle の適用も通常式として書けるため、by: の使用は必須ではない。

Evidence の状態

solver が certificate を生成せず、結果を信頼する場合は oracle であることを構文上も明示する。

prove ensures external_claim:
    oracle solver::z3

この evidence は TrustedOracle として依存関係へ記録し、--certified では拒否する。未完成の証明も hole として明示する。

prove ensures unfinished:
    ?unfinished_proof

hole は IDE で goal として表示できるが、release artifact と certified build では常に拒否する。

設計の核

領域 方針
構文 当面は NEPLg2.1 と同じ prefix-oriented、off-side rule、expression-oriented な構文を用いる
Type / Prop、依存型、精緻化型、双方向型検査
関数 effect と termination を独立して表現
検証 contract から VC を生成し、proof または certificate で検査
リソース ownership、move、borrow、drop、region を静的に追跡
数値 IntRat、exact decimal を基礎とし、暗黙の丸めを避ける
コンパイラ Rocq を規範的 authority とし、各 pass の意味保存を証明
Backend WebAssembly を主経路とし、対象 profile を固定して検証
Artifact evidence、semantic scope、assumption、derivation を記録

検証パイプライン

flowchart LR
    S["UTF-8 source"] --> P["Planned verified lexer / spine parser"]
    P --> EL["Planned verified resolution / elaboration"]
    EL --> C["NEPL Core"]
    C --> K["Kernel checks"]
    K --> V["VIR / VC"]
    K --> R["Runtime IR"]
    V --> EG["Evidence gate"]
    R --> EG
    EG --> W["Wasm AST"]
    W --> B["Wasm bytes"]
Loading

NEPLg3 では、次の五つを直交する judgment として扱う。

  1. Typing
  2. Effect
  3. Resource Usage
  4. Termination
  5. Relevance

外部 solver は proof の探索に利用できるが、Certified build の authority にはしない。生成された proof または certificate を独立 checker が再検査できる場合だけ、保証の根拠として採用する。

native verification は任意の参照 backend として、Low IR -> Clight/Cminor -> CompCert の経路を計画している。主要な対話実行経路は Wasm のままである。

Exact-first

0.1 を最初から近似値にする必要はない。NEPLg3 は整数、rational、exact decimal を正確な表現として保持し、近似が必要になった時点で精度と丸め方を指定する。

embed Nat Int nat_to_int
embed Int Rat int_to_rat
embed Rat Number rat_to_number

FixedInt(bits, signed)
Interval(Number, precision)

これらの embed は subtyping ではなく、検査済みの明示 coercion である。Float32Float64 は標準数値系へ含めない。IEEE 754 が必要な platform integration だけが、任意 package の ieee754::Float32ieee754::Float64 を明示 import する。

一般の symbolic real equality は無理に Bool へ落とさない。証明できない比較、定義域を判定できない式、計算資源を超えた評価を、それぞれ異なる結果として返す設計である。

信頼を可視化する

check が通ったことと、生成バイナリまで証明されたことは同じではない。将来の toolchain は保証を scope ごとに表示する。

Core:            Kernel checked
VC:              Certificate checked
Wasm AST:        Semantics preserved
Binary encoding: Trusted
Host:            Browser assumed

.neplcert には claim、evidence、依存関係、未解決の gap を記録し、solver なしでも再検査できる形を目指す。

ロードマップ

Phase 到達点
G0 RFC process と phase ごとの構文、型理論、意味論、artifact、trust decision gate
G1a canonical Core から WasmCert AST までの最小意味保存 slice
G1b argument 境界未確定の raw item spine parser、名前解決、elaboration による Surface から Core までの経路
G1c canonical Wasm encoder と binary grammar conformance
G1d compiler Wasm、one-shot ABI、Worker、memory lifecycle を含む Web 実行
G2 Dependent Core、totality、erasure
G3 immutable/unrestricted value に限定した Refinement、contract、VC generation
G4 Ownership、effect、LogicalView、snapshot、resource-aware VIR
G5 Certificate、offline replay、trust report
G6 Algebraic / transcendental を含む exact Number の拡張
G7 Wasm backend と binary encoding の保証
G8 Proof を伴う NEPLg3 self-host compiler

最初から全機能を仮実装するのではなく、各 subset が依存する最終意味論を対応 RFC で固定したうえで、小さな実行可能 subset を縦に通していく。

系譜

NEPLg3 は、NLP / NLPS から B-debt、NEPLg1、NEPLg2 / NEPLg2.1 へ続く自作言語開発の次世代に当たる。前置記法、式指向、オフサイドルール、Web / CLI / desktop で核を共有する思想を引き継ぎ、当面は NEPLg2.1 の構文を基準に proof system と信頼モデルを設計する。

これまでの経緯は Neknaj Project — 自作言語 にまとまっている。

ドキュメント

現在の提案書は統合仕様候補であり、正式仕様ではない。各機能の実装開始前に、そのphaseをblockするRFCだけを批准する。後続phaseのRFC全体をG1aの開始条件にはしない。

License

MIT License © 2026 Neknaj

About

Prefix + off-side rule language targeting WebAssembly. Everything is prefix; blocks use : + indentation; almost everything is an expression. Entirely designed and supervised by Bem130

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages