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

lean-ritsuryoとRustのあいだには、Rustに出す関数だけを書いたLeanのmoduleを1つ置いています。 lean-rsはこのmoduleを、呼ばれるlean-ritsuryoの関数まで含めてRustのファイルにします。

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

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

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