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
$ cd blawx
$ docker run -it -p 8000:8000 lexpedite/blawx:latest
ログインを求められるので register でアカウント作成
ローカルで起動した場合、アカウント情報はコンテナ内にしか作られない?
以降の操作方法(ルールの作成)は公式動画参照
ルールの形式
「プロジェクト」の単位でルールを管理
UIでも作成可能
ルールは共有可能(エクスポート、インポート)
例:じゃんけん(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で(技術的には)扱えるように見える