Conao3 Notes

Leanで証明した日付と税計算を、RustのcrateとWebページにした

lean-ritsuryoは、日本の法令が定める期間と税額の計算をLean 4で書き、条文どおりに計算することを証明したライブラリです。これをlean-rsでRustに変換して、Rustのcrateと、ブラウザだけで計算するWebページにしました。リポジトリはconao3/rust-ritsuryoで、ライセンスはApache-2.0です。crateはcrates.ioに ritsuryo の名前で公開しています。

ブラウザで計算する

Webページは次のURLで開けます。

https://conao3.github.io/rust-ritsuryo/

img

期間の満了日や祝日、所得税、相続税、消費税など、lean-ritsuryoのCLIと同じ計算をフォームから使えます。上の画像は、2025年分の課税総所得金額が500万円のときの所得税を計算したところです。納める額は584,500円になりました。計算はブラウザの中で行うので、入力はどこにも送りません。

Rustから呼ぶ

Cargo.toml に ritsuryo を追加すると、Rustから同じ計算を呼べます。

[dependencies]
ritsuryo = "0.1.0"
serde_json = "1"
use serde_json::json;

fn main() {
    let out = ritsuryo::invoke(
        "income-tax",
        "compute-tax",
        &json!({"TaxYear": 2025, "TaxableIncome": 5_000_000}),
    )
    .unwrap();
    println!("{}", out["Result"]);

    for h in ritsuryo::holiday::holidays(2027).iter().take(3) {
        println!("{}/{} {}", h.month, h.day, h.name);
    }
}
$ cargo run -q
{"DefenseTax":0,"IncomeTax":572500,"Payable":584500,"ReconstructionTax":12022,"Total":584522}
1/1 元日
1/11 成人の日
2/11 建国記念の日

invoke はCLIのサブコマンドとパラメータをそのまま受け取り、CLIが出力するものと同じJSONを返します。祝日や所得税のようによく使う計算には、引数と戻り値にRustの型を使う関数も用意しました。

Leanが入っていなくても、cargoだけでビルドできます。

仕組み

img

変換の入力には、Rustに出す関数だけを書いたLeanのmoduleを1つ置いています。lean-rsはこのmoduleを、そこから呼ばれるlean-ritsuryoの関数まで含めてRustのコードにします。

lean-ritsuryoのCLIは、ファイルや標準出力などのIOを扱う部分と計算の部分が分かれています。計算の部分はIOを使わない関数なので、そのままRustとブラウザから呼べます。

WebページはこのcrateをWebAssemblyにして、GitHub Pagesの静的なページから呼んでいます。lean-rsのruntimeはWebAssemblyでも動き、ファイル操作のようにIOを使う処理はエラーを返します。lean-ritsuryoの計算はIOを使わないので、そのまま動きます。

Rustのコードを作るときは、lean-ritsuryoの証明も含めてLeanのパッケージをビルドします。証明が通らない計算は、Rustのコードになりません。ただし、証明が保証するのはLeanの定義です。Rustのコードが同じ計算をすることは、lean-rsの変換が正しいことに頼っています。