警告 — 実行はされています
未実行
ドラッグで見て回る/ホイールで拡大
先頭12ヶ月は初期化の揺れ(ウォームアップ)。網掛けの区間は指標として読まない。
日本を千分の一に縮めた国を用意して、そこに法律を施行したら何が起きるかを見る装置です。 人口124,000人・世帯およそ60,000・企業200。 扱うのは経済の話だけです。税金・給付・消費・貯蓄・相続といった、お金が動く話しか計算しません。 外交も、教育の中身も、治安も、環境も、この国には存在しません。
左の官報に法律を書いて「施行」を押すと、同じ乱数の種で「法律なし」と「施行後」の2つの世界を回し、 並べて比べます。世界の違いは法律の有無だけです。
この3つ以外は「シミュレーション範囲外です」と理由を付けて断ります。 「外交」と書けば「国外がこの模型に存在しません」と返します。 それらしい数字を返さないことを設計の方針にしています。
まず、動く例をひとつ。子どものいる世帯に毎月15,000円を配る法律です。
法律 "こども未来給付法" {
対象: 世帯 where 子ども数 >= 1
効果 {
給付: 15000円/月 × 子ども数
}
財源: 所得税(+1%)
}
形はいつも同じです。法律 と名前と波括弧、その中に節を並べます。
// 骨組み
法律 "名前" {
節
節
}
節は6種類。順番は自由。効果 だけが必須で、他は省略できます。
| 節 | 書き方 | 省略したら |
|---|---|---|
| 対象 | 対象: 世帯 where 子ども数 >= 1 | 全員が対象 |
| 効果 | 効果 { … } | 必須。無いとエラー |
| 財源 | 財源: 所得税(+1%) | 国債扱い。警告が出る |
| 執行率 | 執行率: 80% | 100%(完全に守られる) |
| 施行 | 施行: 6ヶ月後 | すぐ(慣らし運転の直後) |
対象: 種類 または 対象: 種類 where 条件。種類は3つだけです。
| 種類 | 使える属性 | 単位 |
|---|---|---|
| 人 | 年齢 | 歳(省略可) |
| 人 | 所得 | 円 |
| 世帯 | 子ども数 | なし |
| 世帯 | 世帯人員 | 人 |
| 世帯 | 所得 / 貯蓄 | 円 |
| 企業 | 業種 | なし |
比べ方は < > <= >=
== != の6つ。
条件は かつ または でつなげられます。
優先順位はありません。左から順に読みますので、
A かつ B または C は (A かつ B) または C です。
人を対象にしても、お金は世帯の財布で動きます。「18歳未満に給付」は その子がいる世帯の口座に振り込まれます。
効果 { … } の中に1つ以上。できるのは次の3つだけです。
| 効果 | 書き方 | 意味 |
|---|---|---|
| 税率変更 | 税率変更: 消費税(食料品) 8% → 0% |
その品目の税率を変える |
| 税率変更 | 税率変更: 消費税 10% → 12% |
品目を書かなければ標準税率 |
| 税率変更 | 税率変更: 所得税 10% → 12% |
累進表の全段に一律で足す |
| 税率変更 | 税率変更: 相続税(基礎控除) 4200万円 → 1000万円 |
控除額を変える(ここだけ金額) |
| 給付 | 給付: 15000円/月 | 世帯に定額 |
| 給付 | 給付: 15000円/月 × 子ども数 |
属性を掛けられる |
| 禁止 | 禁止: 支出(カテゴリ=教養娯楽) > 5000円/月 |
上限を超えた分が消える |
税は 消費税・所得税・相続税 の3つ。
品目は家計調査の8分類です:
食料 / 住居 / 光熱水道 / 交通通信 / 教育 / 教養娯楽 / 保健医療 / その他
「食料品」「食品」「娯楽」「医療」「通信」「光熱費」という言い方でも通ります。 8分類に無い品目を書くと、近い分類の一部として扱ったうえでそう書いた警告を出します。
財源: 所得税(+1%) のように、税と増減幅を書きます。
財源: 国債 とも書けます。
書かなくても法律は通りますが、そのぶんは借金になり、
「国債発行として扱います。金利負担が発生します」という警告が出ます。
執行率: 80% なら、上限を超えた支出の8割が消え、2割はそのまま買われます。
0〜100%の外を書くとエラーです。禁止と一緒でなければ意味がありません。
施行: 6ヶ月後 または 施行: 即日。
起点は慣らし運転(先頭12ヶ月)が終わった時点です。
世界が落ち着く前に法律を当てると、法律の効果か慣らし運転の揺れか区別できないためです。
| 項目 | 決まり |
|---|---|
| 全角 | スペース・括弧・数字・記号すべて通ります。変換ミスで落ちません |
| 注釈 | 行頭に // か #。行末まで無視されます |
| 矢印 | → でも -> でも |
| 掛け算 | × でも * でも |
| 単位 | 円 / 万円 / % / ヶ月 / 年 / 人 / 歳 |
| 名前 | 必ず " で囲みます |
何行目の何文字目かと、期待していたものと、直し方を返します。
3行目 5文字目: '効果' の後には '{' が必要です
効果 給付: 15000円/月
^
ヒント: 効果は複数書けるので、必ず波括弧でまとめます
この模型に無いものを書いた場合は、それらしい数字を返さずに断ります。 「外交」なら「国外がこの模型に存在しません」、 「義務」なら「効果として作っていません」と、何が足りないのかを書きます。
街に立つ100体は、実際に計算されている100世帯です。 毎月その世帯の所得・貯蓄・困窮判定をそのまま受け取って、見た目と動きに使っています。 人が歩き、買い物をし、納税し、年を取って世代が入れ替わります。
| 灰色の人 | その月の所得がゼロの世帯(就業者も年金受給者もいない) |
|---|---|
| 赤い人 | 困窮世帯。基礎バスケットすら買えず、店に行かず家にいる |
| 消える人 | 世帯の最後の一人が死んだ。その財産は相続され、相続税がかかる |
| 右上の台帳 | その月に台帳を通った金額そのもの。棒の長さは実額に比例 |
1ヶ月はエンジンに実在する5つのフェーズがそのまま街の1日になります。 人口(加齢・出生・死亡・独立・相続)→ 所得(給料日)→ 消費(買物)→ 財政(納税)→ 記録(帰宅)。 労働と生産のフェーズはまだ作っていないので、並べていません。
お金は空を飛びません。人が手に持って運びます。 給料の硬貨を持った人が店に入ると買物袋に変わり、庁舎に入ると税として消えます。
この模型の土台は「金は湧かない、消えない」という一点です。 お金が動くときは必ず、払う側と受け取る側の両方に記録します。だから全口座の合計は常にゼロになります。
右上の「総和 0 ✓」がそれです。毎月おわりに機械が検算し、1円でもずれたらその場で止まります。 税や消費の式は「現実はたぶんこう動く」という推測なので、間違っていても数字はそれらしく出てしまいます。 でも保存則は推測ではなく算数なので、ここだけは機械的に間違いを捕まえられます。
この制約から思わぬものが出ました。初期の政府債務を仮定していないのに、 家計の貯蓄と企業の資本を負っているのは政府しかいないという理由だけで、 全国換算で約1,200兆円になります。実際の日本とほぼ同じです。
入力のうち出典があるのは8種類だけです。人口推計(e-Stat API)、第23回生命表、 賃金構造基本統計調査、国民生活基礎調査、家計調査、所得税・相続税の速算表、現行の消費税率。
残りはこちらが決めた設計値で、その数は約43個あります。 年金月額145,000円、消費性向の上下0.95/0.55、基準生活費120,000円、国債利率1%、 出生率7階級、法定相続人2人など。この43個を変えれば結論は変わります。
エンジンはPythonとNumPyで、成果物はLLMを呼びません。 実行時の依存はFastAPI・uvicorn・pydantic・NumPyとその依存の16個だけで、 法律の解釈はすべて自作の構文解析器(手書きの再帰下降)が行います。 画面はthree.jsですが、CDNではなくリポジトリに同梱しているので、ネットに繋がっていなくても動きます。
コードは関数名も変数名も日本語です。利子を支払う、
政府債務、消費税の逆進性。経済の言葉のまま読めます。
開発にはAI(Claude)を使いました。文法の設計・仕様・検証の合格条件・統計の収集は自分で行い、 エンジンとDSLの実装、テスト128本、この画面はAIに書かせています。 当初は再帰下降パーサを自分で書く計画でしたが、実装はAIです。今後はデバッグ機能を足しながら、エンジンとDSLは自分で書き直すつもりです。
ドラッグで街を見て回れます。ホイールで拡大。