Blawx
関連リンク
概要
非プログラマー向けのRule as Codeのツール
mainブランチの更新は去年まで。今年の開発状況は不明
ブラウザ上のWebアプリから、ドラッグ&ドロップでルールを作成できる
https://scrapbox.io/files/674b45dd46025779d91adaa2.png
作成されたルールはWeb APIとして利用できる
例えば、ヤドカリくんのWebアプリ(フロントエンド)からBlawxのAPIとやりとりするようなことができる
アルバータ大学の法律とコンピュータサイエンスの学部に所属
カナダ政府のRule as Code関連部署のディレクターも務める
カナダ政府はRule as Codeを進めるにあたり、OpenFiscaを検討したが、Blawxを継続検討することを決めた
カナダ政府内にBlawx作成者のJason Morrisがいることは影響している?
最初はOpenFiscaを使おうとしたが、難しい点が明らかになったため、Blawxの開発が進められた or 採用されたよう
ポリシー・特徴
Rule as Codeを広く普及させるには、法制度の制定者が自身の手によってRuleをCodeとして記述できることが重要
プログラマーが法制度を記述しようとすると、背景的な情報まで含めてどの範囲まで記述すれば良いか分からない
Rule as Codeは非プログラマーにとって使いやすいツールが望ましい
外部にデプロイされているサイトにブラウザでアクセスして作業する方式であれば、ユーザーの環境構築が不要
非プログラマーが自然言語で書かれた法制度の説明を見ながら、法制度を構造化できるようにデザインされている
自然言語の法制度の説明文をAIが解析してコード化しやすい。(実際にカナダ政府によって検討されている)
手続き型プログラミング言語ではなく、宣言型論理プログラミング言語
手続き型プログラミング言語
実現する手順を1つずつ記述するやり方
OpenFiscaに用いられるPythonは手続き型
宣言型論理プログラミング言語
ユーザーは最終的に欲しい結果を記述して、それを実現する手順は言語側で自動的に算出する
BlawxはSWI-Prolog言語を使用
論理プログラミング言語は一般に数値計算の実行速度が低いが、Prologはコンパイル化や数値計算に適した言語のラッピング化(Pythonのnumpyのような)により、高速化が可能らしい(参照サイト) 非プログラマーが法律や制度を記述するには、手続き型より宣言型論理プログラミングの方が簡単なため適している
無効可能性を実現
法制度には例外があふれているが、通常のプログラミング言語で広く例外を扱うのは難しい
Blawxではモジュール化(部品化)した複数の制度に対し、優先順位を設定できるため、例外を扱いやすい
システム構成
バックエンド
Django : PythonのWebアプリフレームワーク
swiplserver : 宣言型論理プログラミング言語SWI-PrologをPythonで使えるようにしたライブラリ
フロントエンド
基本的なページはDjango内で実装されているはず
スタイルはBootStrap, 動きはjqueryで実装
ブロックによるビジュアルプログラミングはnpmのBlocklyライブラリを使用
動かし方
ローカルで起動
code:bash
$ docker run -it -p 8000:8000 lexpedite/blawx:latest
BlawxのGithubリポジトリをクローンしてビルドする場合
code:bash
$ docker build -t blawx .
ただしM1(2) MacなどのIntel CPUでない場合は、Dockerfileを下記のように修正する必要あり
code:docker
#RUN ln -s /usr/lib/swipl/bin/x86_64-linux/swipl /usr/local/bin/swipl RUN ln -s /usr/lib/swipl/bin/aarch64-linux/swipl /usr/local/bin/swipl
http://0.0.0.0:8000/ではなくhttp://localhost:8000/のURLをブラウザに入力して起動(CORSエラー回避のため)
ログインを求められるので register でアカウント作成
ローカルで起動した場合、アカウント情報はコンテナ内にしか作られない?
username: admin, password: blawx2022 がデフォルトで登録されていて、全ての操作が実行可能
以降の操作方法(ルールの作成)は公式動画参照
ローカル以外にデプロイして起動
セキュリティ設定等必要なものは随時更新予定
ルールの形式
「プロジェクト」の単位でルールを管理
UIでも作成可能
文法
先頭行にタイトル
ヘッダー名とセクション番号(半角で 1. のように記載)で章立て
番号はルール全体で通し番号にする
症の中の項はスペースでインデントを付けて (1) or (a)のように記載
英語(半角英数字)しか使えない
CLEAN言語に用いられているライブラリpyparsing自体はunicodeに対応している 参考記事 例(READMEより引用)
code:_
Rock Paper Scissors Act
Players
1. A game of rock paper scissors has two players.
2. There are three signs:
(a) Rock,
(b) Paper, and
(c) Scissors.
Defeating Relationships
3.
(1) Rock beats Scissors,
(2) Scissors beats Paper, and
(3) Paper beats Rock.
Winner
4. The winner of a game is the player who throws
a sign that beats the sign of the other player.
ルールは共有可能(エクスポート、インポート)
例:じゃんけん(Rock Paper Scissors Act)
New Project→ Rock Paper Scissors Act を選択
ルールが以下のようにCLEAN形式で定義されている
https://scrapbox.io/files/674c306bc526b4ba5c002ee3.png
Code Editor → 上のナビゲーションの section を選択すると、先ほどのルールが段落付きでが表示される
https://scrapbox.io/files/674c30f6d404485ed60f6af3.png
ラジオボタンをクリックすると、その行に対応するルール実装がブロックで表示される
https://scrapbox.io/files/674c32a4c462e9132a541911.png
ビジュアルプログラミング言語だが、裏側で動いているのはProlog
https://scrapbox.io/files/674c3a25bf72d147efad7d5e.png
命題を定義していくプログラミング
概念の定義(category)
カテゴリー「手」は「勝つ」という属性を持つ
その属性の型は「手」
「{オブジェクト}が{値}に『勝つ』」という形式
https://scrapbox.io/files/674c359bb788119d33c44eaa.png
命題の定義
「チョキ」は「パー」に「勝つ」
https://scrapbox.io/files/674c35cbd855ad9a6a93a557.png
右側 Tests でテスト実行可能
https://scrapbox.io/files/674c38124182c41d619f7c3e.png
Run で実行、Answers からテスト結果が確認可能
シナリオはルール同様ブロックで記述
https://scrapbox.io/files/674c3899bf72d147efad6ee6.png
Explanations から結果とその推論にいたった理由(=適用されたルール)が確認できる
https://scrapbox.io/files/674c38d13de60e728dae5827.png
テストの Senario Editor → Devel でAPIのリクエスト形式が表示される
...はずだが、何も表示されず(要確認)
支援制度のRule as Codeを実装する際は以下の流れになる?
ルールエディターを開き、制度のドキュメントをCLEAN形式で記述
コードエディタ―を開き、ドキュメントの各行に対応するルールをUI上のブロックで実装
ソースコードを掛ける必要はないが、ブロックを覚える必要はありそう
ブロックが日本語に翻訳で来たらより使いやすくなる?
テストを新規作成し、想定通りの結果が得られるか確認
どんな制度であっても、論理的に定義されていればBlawxで(技術的には)扱えるように見える
Web API作成までの一連の流れ
マニュアルは、docker containerを起動しブラウザ上に表示されるページの左タブにある。ただ実際に動かしてみた方が理解しやすそう。
https://scrapbox.io/files/6782ae22dd6cfbb77285a868.png
試しに簡易版の児童手当を実装してみる
作成したRule, Code, Testはプロジェクト単位で外部テキストファイルに保存でき、そこから復元可能
「Export」ボタンを押すと、作成したRule, Code, Testが保存された「~.blawx」ファイルがダウンロードされるhttps://scrapbox.io/files/678be73c716ad3df4f818d91.png
blawxファイルはPrologで書かれているので、可読性はない。
Dockerコンテナを起動した時に、「New Project」→「Import Project」からblawxファイルを読み込むと、保存したRule, Code, Testが復元される。
同一のプロジェクトを開いている状態で読み込むとエラーになる。
https://scrapbox.io/files/678be7746cd9dc5b4841a4f8.png
Rule Editor
英語・日本語でフォーム欄に手入力するとパースエラー?になる。
左タブの"Load Example"から既存のRuleをコピーして英語で書き換えると保存できた。
Code Editor
作成したRuleをもとにブロックを作る
しかし「Save」ボタンを押しても保存されない。フロントエンドでエラーが起きている。https://scrapbox.io/files/6782b3befb612a668c4ded40.png
Ruleが構文エラーになっていると保存できないかもしれません
↑のruleでも試したら保存できたので環境差分の可能性もあるかもしれません...
以下で保存できました
https://scrapbox.io/files/67835dd5ce8297faeab205ee.png
以下で起動しています
$ docker run -it -p 8000:8000 lexpedite/blawx:latest
furuhashi.icon 起動するURLをhttp://0.0.0.0:8000/ではなくhttp://localhost:8000/にすると保存できました。
consoleにCORSのエラーが出ていてlocalhostを使うよう指示があったため
世帯・人物の定義
「世帯」(household)の型定義
「人物」(person)の型定義
世帯は大人を持つ。大人の型は「人物」
世帯は子どもを持つ。子どもの型は「人物」
人物は年齢を持つ。年齢の型は「数」
世帯は児童手当を持つ。児童手当の型は「数」
https://scrapbox.io/files/678be32835938937c30c2e73.png
児童手当の条件
ある世帯A・大人A・子どもAの変数を作成。大人A・子どもAの変数はそれぞれ世帯Aの大人・子どもであると指定。
子どもAの年齢が3歳以下のとき、世帯Aの児童手当は10000円
https://scrapbox.io/files/678be479737782ab83f7bc10.png
型の概念の理解が必要
Test
「New Test」ボタンからテストを作成。テスト名にスペースを含むとエラー。_, 数字はOK
https://scrapbox.io/files/678bedb61e7269c155e40b5e.png
Rule Editorを参考にブロックでテストシナリオを作るか、
https://scrapbox.io/files/678bedfc060f821b197af146.png
左上のボタンから「Scenario Editor」ボタンを押して、フォーム形式でテストを作成する。
https://scrapbox.io/files/678bee616cd9dc5b4841bd60.pnghttps://scrapbox.io/files/678bee67588d318c0f0cacbf.png
「Run」ボタンを押すと、推論過程・結果が得られる。ブロックのシナリオに矛盾があるとテストが通らない。
https://scrapbox.io/files/678beefd36fe4048d1d4c576.png
Web API
テストパターンのPOST → 推論結果のJSON出力 (コマンドでもできるはずですがブラウザ上で実施)
http://localhost:8000/[ユーザー名]/[プロジェクト名]/test/[テスト名]/run/をブラウザに入力すると、以下の画面が表示される。
Blawxのweb APIはユーザーごとに作られ、エンドポイントのURLにもユーザーが含まれる。
→管理者のWeb API URLを正とすれば一定のセキュリティは担保できる
interviewエンドポイントも同様のことができるが、違いは不明。
https://scrapbox.io/files/678bf201028672cea0438ad9.png
Scenario Editorで「Run」実行した後に、「Devel」タブを表示。「Payload」欄の{ から}までをコピー。({ }は含む。それより下の「Response」欄は含まない。)
https://scrapbox.io/files/678bf264716ad3df4f81b394.pnghttps://scrapbox.io/files/678bf268cfefcd47a20d89e8.png
コピーしたPayloadを先ほど開いた Run Test画面の「Content」内に貼り付け。「POST」ボタンを押す。
5~10秒ほど待つと、推論結果が表示される。(Scenario Editor「Devel」の「Response」欄と同じ。)
https://scrapbox.io/files/678bf3c18e24f3a9f49909d8.png
使えるAPIはここに書かれている一覧?
ブロックの種類
Blawxを起動して左側のメニュー「Help」→「Blawx Coding Features」で確認できるドキュメントの内容のまとめ
ブロック概要
茶色、黄土色(category): 概念を型として定義
紫(primary): 定義や命題等論理関係を表現
紺色(object): 概念の具体例(例:category person に対する taro)
緑(known attributes): objectの属性(具体例)(例: taro のageは 18)
numbers, data, list: 具体的な値
金色(variable): 条件を満たす具体例を探索するときに使用(後述)
Category
データの型を定義
属性( attribute)を持たせることも可能
属性の型は基本型or Category
属性の型として自身のCategoryを使用することも可
ex: category person に attribute friend(person)を定義
appearing asで属性を指定する構文を変えることも可能
https://scrapbox.io/files/678c8ca3945a3f09431bcf7a.png
命名規則
小文字はじまり
英数字と _ のみ
基本型
numbers
values
dates
times
datetimes
durations
lists
bool (true/false)
オブジェクト
categoryのインスタンス
objectsで定義
https://scrapbox.io/files/678c9586bc47e5bb00a154e5.png
定義したobjectはknown objectで使用可能
https://scrapbox.io/files/678c9568801f3bb822724071.png
テストでしか使用できない
known attributes(緑のブロック)に対しては、型が合わない場合ブロックがはまらない
→型安全!
known attributes, known objectsを使用して値を設定
https://scrapbox.io/files/678c954b21b47c9783ff38a4.png
条件式
数学のならば => に相当
○○のとき××
https://scrapbox.io/files/678ca18d586b7dbe61a22a19.png
厳密には他の言語のif文とは異なる機構
Prologは論理構造によって変数のパターンマッチを行っているため、上から順番に評価されるわけではない
注意点
以下を全て満たす場合にのみWhen we know に条件 X を加えること
X は結論が真になるための必要条件である
X 以外の条件が真のとき、Xの否定は結論が偽になるための十分条件である
要は裏が成り立つような命題にする必要がある
A => B だけでなく not A => not B が成り立つ
furuhashi.icon A <=> B(必要十分条件)ということですね
例:養子
誤った例(blawxドキュメントより引用)
https://scrapbox.io/files/678ca9eceb92693707288396.png
https://scrapbox.io/files/678ca9a58e1887e686a86aac.png が
真のとき Parent は里親である:真
偽、かつParentが Childの親であるとき、Parentは里親である: 偽...とは言い切れない!
反例:Child がParentの(生物学的な)実子で、かつ Child 以外に養子もいる
修正例(blawxドキュメントより引用)
https://scrapbox.io/files/678cadac2fec10f04eccc986.png
命題を確認する際、「Parentは里親である」ではなく、「ある人 child が存在し、Parentはその人の里親である」とする
https://scrapbox.io/files/678ca9a58e1887e686a86aac.png が
真のとき Parent は里親である:真
偽、かつParentが childの親であるとき、Parentは「childの」里親である: 偽
(ブロック名は any だが、数学的には someに相当)
furuhashi.icon (補足) 修正された箇所は「We also know: Parent is a foster parent "of Child"」ですね
and条件、or条件
and条件は when we know に直列に条件を足すことで実現
全て満たした場合のみ we also knowが trueとなる
or条件は、 ブロックそのものを複数作成することで実現
どれか1つでも満たした場合we also knowが trueとなる
https://scrapbox.io/files/678caf7a8e1887e686a8942d.png
変数
Blawx (や裏側のProlog)では、変数は条件を満たす任意の値とパターンマッチする
※通常の(いわゆる手続き型プログラミング言語の)「変数」とは挙動が異なる
変数を使用して、条件を満たす値の探索が可能
furuhashi.iconどんな値が入るか確認できて便利ですね
https://scrapbox.io/files/678caff68a2edb13ccec3cd6.png
変数名は大文字始まりにする必要がある(Prolog準拠)
注意点
別の変数名だからといって別の値が入るとは限らない
例:きょうだいの判定(ドキュメントより引用)
https://scrapbox.io/files/678cb1540a25121f96b73ca1.png
taro が一人っ子でも、Child1 = taro Child2 = taroとしてマッチしてしまう
正しくは not the same objectの制約を付ける
https://scrapbox.io/files/678cb1cbad48979440d3ad2b.png
条件を満たすオブジェクトの数を数えるのは難しい?
それらしいブロックが見当たらない
子どもの人数 * 支給金額 のようなロジックは書きづらいかも
furuhashi.icon Listsブロックで個数のカウントや総和などの計算ができるようです
コードブロック
条件を満たす要素のリストを作成
そのリストのカウントの変数を定義
カウントはなぜか要素の数に+1された値が出力されるため-1する。総和は正しく計算されましたが、、、。要調査ですが一旦無理やり対処
https://scrapbox.io/files/678d3c7b6ea5a0da924708bb.pnghttps://scrapbox.io/files/678d3c816ea5a0da924708c6.png
テスト
大人はルール通りカウントされずに子どもの数3が正しく出力されている
計算途中で子どもの数が1人多く計算されている。NULL的なものがカウントされている?
https://scrapbox.io/files/678d3e65de9c3d22277e78d7.png https://scrapbox.io/files/678d3ebf35d550978928f740.png
児童手当の実装
3歳以下の子どもの数をカウント
コードブロック
下図からブロック構成が少しでも変わるとエラーになる。原因もほぼ表示されないのでデバッグ難しい。
https://scrapbox.io/files/679e7959bc40771720f4fa07.pnghttps://scrapbox.io/files/679e7a0847147b3d18c5cbbc.png
同一名の属性(attribute)を複数持てる。(「世帯」に対する「子ども」等)
そのため、「人」の「年齢」等の単一の値を持つ属性は、「異なる複数の値を持ち得ない」ことを明示的に指定する必要あり
詳細は「Help」-「Blawx Coding Feature」- 「Logical Constraints」を参照
Listの条件ブロック(returned for~)はなぜか1ブロックでないとエラーになる
テストブロック
3歳未満の子どもが3人と正しくカウントされている。(上の事例で+1されていた問題はなぜか解消)
https://scrapbox.io/files/679e7d7664705c81f70ae767.png
https://scrapbox.io/files/679e7d8263950c176801f5df.png
簡易児童手当=(3歳未満の子の数×15,000円) + (3歳以上18歳以下の子の数×10,000円)
コードブロック
https://scrapbox.io/files/67a78ddabb61a56205ef074e.png
上の赤枠内のように、定数定義・代入はNumberブロックの=を用いる。
Logicブロックの~ is the same value as ~を用いるとエラーになるhttps://scrapbox.io/files/67a78e598ec207be7b8fd47a.png
テストブロック
https://scrapbox.io/files/67a78ebb10b90cd943e1ebea.png
3歳未満が3人、3歳以上18歳以下が2人なので、正解は 15,000×3 + 10,000円×2 = 65,000円
下記の結果の通り、正しく計算されている。過程も可視化されていて分かりやすい
https://scrapbox.io/files/67a78f0fe23ef884450beb18.png
簡易児童手当=①(第2子以前の3歳未満の子の数×15,000円) + ②(第3子以降の3歳未満の子の数×30,000円) + ③(第2子以前の3歳以上18歳以下の子の数×10,000円) + ④(第3子以降の3歳以上18歳以下の子の数×30,000円)
学年を年齢で置き換えている以外は実際の児童手当と同じ
コードブロック
異なる変数名の人・世帯は異なるオブジェクトであることを宣言
https://scrapbox.io/files/67a81fb1a9cb2fda628672bc.png
自分より年上の兄弟(22歳以下)を定義→「年上兄弟の数+1」で 何番目の子かの定義
https://scrapbox.io/files/67a8205c95ae1570e8beb3c5.png
年齢と何番目の子かによってどの金額タイプの子か割り当て
以下の2ブロックを①〜④の4パターン作成
https://scrapbox.io/files/67a820775f6c11b98f138c6f.png
それぞれの金額タイプの子どもの数から児童手当額を算出
https://scrapbox.io/files/67a8213819f496e03a07b579.png
テストブロック
child1 -> 23歳で第1子でない -> 0円
child2 -> 15歳で第1子 -> 10,000円
child3 -> 2歳で第2子 -> 15,000円
child4 -> 1歳で第3子 -> 30,000円
合計55,000円
https://scrapbox.io/files/67a8215d2af0bed2bbdc9cb4.png
正しく55,000円が計算されている
https://scrapbox.io/files/67a822186b6ec23d58b38b1b.png
所感
Blawxの作法と宣言型の記述は慣れればやりやすい。特に何番目の子かの定義は、自分に対する年上の兄弟を定義すれば、それのカウントから自動的に導けるため直感的。日本語が使えればより馴染みやすい
テスト結果で推論過程を出してくれるので、適切なテストかも確認しやすい
forループやif文が使えない制約や独特な記法により、手数やブロックが多くなる。(①〜④のように似たようなブロックを複数作る必要がある)
変数の組み立て方などはコツがいるが、非プログラマーにとってどれだけのハードルになるか要検証
制度の中でも、年齢などの基本的かつ応用的な扱いを要する児童手当が実装できたことは大きい。学年の扱いなど細かい点は未検証だが、多くの制度を実装できる可能性あり
プロジェクトのテンプレート
他のプロジェクトで指定したコードブロック等を使い回すことはできなさそう
→世帯や個人を定義したテンプレートを用意し、それをインポートしてから使う運用が必要
実装済みの多数の制度のプロジェクトに対して、共通する前提のコードブロックを追加・修正するのは難しい? プロジェクトのblawxファイルを直接テキスト編集するようなことはできる?
テンプレートプロジェクトをインポートする
https://scrapbox.io/files/678be7746cd9dc5b4841a4f8.png
Rule Editorの「Rule Name」と「Rule Text」1行目のプロジェクト名を変更して保存する。
https://scrapbox.io/files/67b23f331bfc70a3566818e5.png
Djangoのエラー画面が表示されるが、ブラウザの戻るボタンでBlawxページに戻り、ホーム画面に戻ると、プロジェクト名が変更されている
その後にテスト実行しても結果は変わらないため、コードの中身には恐らく影響なさそう
Rule Editorでルールの順番とコードブロックの順番が対応しているため、コードブロックに対応するルールがなくなるとコードブロックもなくなる
児童扶養手当
コードブロック
一人親
AdultとChildのカウントを同じ連結ブロック内で行うと正しくカウントされなかったため分割
https://scrapbox.io/files/67b26ab80e1988a6dfb3fe08.png
所得制限
簡易的に扶養人数によらず一定額の世帯高所得で判定
https://scrapbox.io/files/67b26b614a5579c362f3d149.png
対象児童の人数
18歳以下、ただし障害を持っている児童の場合は20歳未満 の児童の数
障害を持っている児童は19歳以上の場合を対象として、排他的にカウントする必要あり
そうしないと、18歳以下の障害児童は2回カウントされてしまう
https://scrapbox.io/files/67b26c2b0e1988a6dfb40222.png
手当額の算出
所得制限の種類に応じて、それぞれ最大・最小額を算出
https://scrapbox.io/files/67b26cb2021bc3321422c6af.png
テスト
https://scrapbox.io/files/67b26d61597e422ae4e855d1.png
https://scrapbox.io/files/67b26d452cd768cbb2e3e311.png
所感
所得制限による場合分け計算はわかりやすく書ける
OpenFiscaだとORを+で表記するため、わかりにくい書き方になってしまう
https://scrapbox.io/files/67b26fa3926866a0cfcf2397.png
はまりどころがあり、しかもその理由が明示されないため、デバッグが難しい。
論理プログラミングが裏側でどのように動いているかイメージしづらい。変数の概念が手続き型と異なる。
手続き型プログラミングになれている場合はOpenFiscaの方が扱いやすいか
障害者手帳
代表的な障害者手帳等級を実装
身体障害者手帳
1~7級まであるため、0~7の数字(0は身体障害者手帳なし)で表現
療育手帳(知的障害者手帳)
等級A, 等級Bの2種類を療育手帳A, 療育手帳B のそれぞれBool値(True/False)で表現
OpenFiscaのEnum型のような択一の文字列の型はない
療育手帳A, 療育手帳Bが両方Trueにならないよう、対応する数字を設定し、それらが異なる値とならないように指定する必要あり。身体障害者手帳等級の数字も同様。
https://scrapbox.io/files/67c343c7843f271865d6c8ce.png
対応数字は入力としては使わないが、対応数字→等級は明示的に指定しないと計算されない。
When we know~<=>We also knowは必要十分条件とヘルプページには書かれていたが違う?
https://scrapbox.io/files/67c345313ba7139989e20464.png
身体障害者手帳2級以下、療育手帳A・Bの場合に1万円給付される仮の制度を実装
対象障害者手帳等級は身障者手帳・療育手帳のOR
対象障害者の場合は1万円、そうでない場合は0円
否定はlogicブロックのthere is no evidence thatを用いる
否定を明示的に定義・指定していない場合も扱える
it is false thatブロックは明示的に偽の場合に使えるようだが、今回のケースではエラーになり使えなかった
https://scrapbox.io/files/67c3463262bad10e8dd8d583.png
テスト
https://scrapbox.io/files/67c347270981d8447dd24310.png
https://scrapbox.io/files/67c3473076650764d4be753e.png
ブロックの作り方
各世帯員の属性を世帯内で扱う方法(合計・最大など)
特定条件を満たす世帯員の数をカウント
例:18歳以下の世帯員の数
対象世帯員属性を世帯カテゴリーに設定
世帯員が条件を満たす場合にその世帯員を対象世帯員とする。
https://scrapbox.io/files/67cc7c143ce4db5c41e1e97a.png
対象世帯員の数をカウントする。(フィルタして作成したリストの要素数をカウント)https://scrapbox.io/files/67cc7d0f129ce060eb194d41.png
世帯員が持つ値の合計を算出
例:世帯高所得
世帯員の所得属性を世帯の所得属性に設定し、世帯の所得を合計する?
世帯員の所得を世帯内で合計できる?
世帯員の順番付
例:出生順
自分より年上の兄弟(22歳以下)を定義→「年上兄弟の数+1」で 何番目の子かの定義
https://scrapbox.io/files/67a8205c95ae1570e8beb3c5.png
最も所得が高い世帯員(世帯主)も所得順位が1位かどうかを条件付けすることで抽出可能
ロジックの組み方
「条件Aを満たす世帯員1人につきX円、条件Bを満たす世帯員1人につきY円」のような制度の金額は、以下のような形で計算するのが直感的かつブロックも組みやすい
(条件Aを満たす世帯員の数)× X円 + (条件Bを満たす世帯員の数)× Y円
Blawxで扱いにくいパターン
生活保護までいかなくても複雑なロジック:ブロックが増えすぎて見通しが悪くなる
複雑な2次元の条件(例:所得条件×居住地域): 表を扱う仕組みはないため
複雑な数式:計算ブロックが肥大化するため