Alloyの人間関係をビビッドにするライブラリを作った
関係が言語の基本構成部品になっているalloy、やっぱり身近な「関係」を使って解説しようということで「人間関係」を例にあげることが多い。だけどman3とwoman1の間のロマンスとか砂を噛むようで味気ないよね。というわけで与えた選択肢の中からオブジェクトに一意な名前をつけるライブラリを作ってみた。
Susumuひどいww
ソースコードは他の勉強中に書いたコードと一緒にlearning_alloyリポジトリに置いた: https://github.com/nishio/learning_alloy
この画像を作るのに使ったコードはこちら: https://github.com/nishio/learning_alloy/blob/master/demo_of_named_man.als
ライブラリはパラメータを取る多相的モジュールってのになっていて、引数に与えられたシグネチャの子としてたくさんのシグニチャを作って、それぞれに「最大1個しか存在してはいけない」という制約をつける仕組み。tool/ディレクトリにこれを作るために作ったAlloyのコードを生成するPythonスクリプトが置いてある。
追記
run { #Man = 3 #Woman = 5 } for 10
という書き方でインスタンスの個数を制約しているけど、今は実例探しだからあんまり問題になってないだけで反例探しだと10個までのスコープ全部の中から述語を満たすものを探すのでコストが高い。typescopeを使った方が良いようだ。run {} for exactly 3 Man, exactly 5 Woman
追記
lone sig X, Y, Z extends Base {} とかできるのか。