diff --git a/courseA/Alloy.html b/courseA/Alloy.html index b886006..283e0fa 100644 --- a/courseA/Alloy.html +++ b/courseA/Alloy.html @@ -29,7 +29,7 @@
以下の仕様記述では名前の集合を Name,アドレスの集合を Addr,アドレス帳の集合を Book で表しています.
-
+
Book は,2つのフィールド owner と addr を持っています.Alloy におけるフィールドは,インスタンスの内部構造を表すものではなく,基本的に2つの集合の要素間の関係を表しています.たとえば Book の owner フィールドは,Book の各要素に Name の要素を対応づける関係を表しています.フィールドの詳細な意味については後ほど説明します.
Alloy では,操作も関係で表されます.たとえば add 操作は,連絡先を登録する前の Book の状態と,登録した後の Book の状態の間の関係を表していると考えます.
より具体的には Book の状態 b,登録後の Book の状態 b',登録する連絡先の名前 n,登録するアドレス a の間に成り立つ述語として定義されています.
述語の本体は 1つ以上の式によって構成されます.これらの式は変数間に成り立つ制約関係を表しているため記述順は関係ありません.たとえば,b'.owner = b.owner は,add 操作前の Book の owner と,add 操作後の Book の owner が同じであることを示しています.
- b'.addr = b.addr + n -> a は,add 操作前の Book の addr (Book の各インスタンスが持つ,名前とアドレスの対応表)に,名前 n とアドレス a の対応を付け足したものが,add 操作後の Book の addr になることを示しています.これらの式は順番を入れ替えても意味は変わりません.
+ b'.addr = b.addr + n -> a は,add 操作前の Book の addr (Book の各インスタンスが持つ,名前とアドレスの対応表)に対して,名前 n とアドレス a の対応を付け足したものが,add 操作後の Book の addr になることを示しています.これらの式は順番を入れ替えても意味は変わりません.
実行は,execute という引数を持たない述語が呼び出されます.
@@ -85,7 +85,7 @@
ここでは,b0, b1, b2, b3 という Book のインスタンスのある組み合わせにおいて(n0, n1, n2 という Name の互いに異なる3つのインスタンスのある組み合わせについて,
さらに,a0, a1 という Addr の互いに異ならなくてもよいインスタンスのある組み合わせについて,| 以下の論理式が成り立っていることを示しています.| 以下の論理式は { と } で囲まれている4つの論理式をまとめたもの,すなわち4つの論理式が同時に成り立っていることを示す1つの論理式になります.
この4つの論理式も同時に成り立っているので,記述の順序を変えても意味は変わらないのですが,しかし,実行において最初に init 操作が呼ばれて,次に add 操作が2回呼ばれ,最後に del 操作が呼ばれることを表しています.
- 詳細は後ほど説明しますが,これには,Book の4つのインスタンスが関係しています.まず初期化の操作 init に関わるのは b0 です.次に,最初の add 操作は,b0 を b1 に変更します.
+ 詳細は後ほど説明しますが,これには,Book の4つのインスタンス(b0, b1, b2, b3)が関係しています.まず初期化の操作 init に関わるのは b0 です.次に,最初の add 操作は,b0 を b1 に変更します.
さらに,次の add 操作は,b1 を b2 に,最後の del 操作は b2 を b3 に変更します.このようにインスタンス(の状態)を受け渡すことによって,実行が進んでいくことを表すことができます.

- 可視化では実行時に生成される1つのインスタンスが,1つの矩形で表されます.たとえば,図の上部に並んでいる4つの矩形は,execute 述語内で宣言されている4つの変数,b0, b1, b2, b3に対応しています.
+ 可視化では実行時に生成される1つのインスタンスが,1つの矩形で表されます.たとえば,図の上部に並んでいる4つの矩形は,execute 述語内で宣言されている4つの変数,b0, b1, b2, b3が参照する Book の4つのインスタンスに対応しています.
矩形内部には,そのインスタンスが所属しているクラス名とインスタンスのIDが記されています.また,括弧の中にはそのインスタンスを参照している変数名が記されています.
Book のインスタンスは4つありますが,これは手続き型プログラムで考えると Book の1つのインスタンスの状態が3回変わったことに相当しています.
Book の初期化後の状態が Book3,最初の add 操作後の状態が Book2,次の add 操作後の状態が Book1,最後の del 操作後の状態が Book0 に当たります.
diff --git a/courseA/DTRAM.html b/courseA/DTRAM.html
index da54b77..457a669 100644
--- a/courseA/DTRAM.html
+++ b/courseA/DTRAM.html
@@ -25,33 +25,33 @@
形式的アーキテクチャ記述言語とは,システム全体の構造を箱や線などの図ではなく,厳密に意味が定義された言語の形式で記述する方法です.形式的アーキテクチャ記述言語では一般に,
- DTRAM は仕様とアーキテクチャの両方を形式的に記述することが可能な言語です.形式的仕様記述言語として見ると表現能力が高いため,網羅的な解析はできません.
+ DTRAM は仕様とアーキテクチャの両方を形式的に記述することが可能な言語です.形式的仕様記述言語として見ると表現能力がかなり高いため,網羅的な解析はできません.
DTRAM では仕様そのものの解析より,
DTRAM では,リソースとチャンネルを使って仕様とアーキテクチャを記述していきます.
- DTRAM におけるリソースとは,システム外部から見えるデータのことです.Web サービスにおいて URL でアクセスされるリソースとほぼ同じものと考えて差し支えありません.DTRAM においてもリソースは階層構造を持つことができます.
+ DTRAM におけるリソースとは,システムの外部から見えるデータのことです.Web サービスにおいて URL でアクセスされるリソースとほぼ同じものと考えて差し支えありません.DTRAM においてもリソースは階層構造を持つことができます.
チャンネルはリソースとリソースの間の通信路です.システム外部からの入力はイベントチャンネルと呼ばれる特殊なチャンネルによって受け付けられます.
- リソースはチャンネルからメッセージを受け取ると状態遷移を行います.そのため,リソースは状態を持ちます.宣言型言語とは違って,状態が変わるたびに別のリソースが生成されることもありません.すなわち DTRAM では,時間経過を扱うことができます.
+ リソースはチャンネルからメッセージを受け取ると状態遷移を行います.そのため,リソースは状態を持ちます.宣言型の記述とは違って,状態が変わるたびに別のリソースが生成されることもありません.すなわち DTRAM では,時間経過を扱うことができます.
それでは,具体的に DTRAM の記述を見ていきましょう.
DTRAM では,チャンネル単位で仕様を記述していきます.たとえばリソースに対する操作毎に,イベントチャンネルを定義していきます.ここでは,初期化操作用のイベントチャンネルを Init,add 操作用のイベントチャンネルを Add,del 操作用のイベントチャンネルを Del とします.
-
+ DTRAM には,メインメソッドやメインスレッドに相当するものはなく,いずれかのイベントチャンネルが外部からのメッセージを受信するたびに状態遷移を行い,状態遷移後は次のメッセージが外部から入力されるまで何もせず待機します.リソースについては次に説明します.
DTRAM では,Web サービスと同様に階層化されたリソースを扱うことができます.リソースは状態を持ち,その状態を変更することができます.アドレス帳の仕様は次のような階層化されたリソースで表すこととします. @@ -87,11 +88,14 @@
メッセージを受け取ったリソースは状態遷移を行います.各リソースの状態遷移は状態遷移関数によって定義されます.
- たとえば,Add チャンネルでメッセージを受け取った book.addr リソースの状態遷移は,状態遷移関数 book.addr(pre_addr: によって定義されています.
- 状態遷移関数の関数名にはリソース名をそのまま用います.状態遷移関数の第1引数は遷移前の状態,第2引数は受け取るメッセージ,式の右辺は遷移後の状態を表しています.
+ たとえば,Add チャンネルでメッセージを受け取った book.addr リソースの状態遷移は,状態遷移関数
+
book.addr(pre_addr:+ によって定義されています.Map , add(name:Str , addr:Str )) = insert(pre_addr, name, addr)
book.addr が関数名に相当します.状態遷移関数の関数名にはリソース名をそのまま用います.book.addr は,2つの引数を受け取っています.DTRAMでは,状態遷移関数の第1引数は遷移前の状態,第2引数は受け取るメッセージ,式の右辺は遷移後の状態を表しています.add(name, addr) を受け取った book.addr リソースが,状態を pre_addr から insert(pre_addr, name, addr) に変化させることが示されています.insert() 関数は,第1引数に渡された写像(対応表)に対し,第2引数と第3引数の対応を追加した結果得られる写像を返す関数です.
- したがって,上の式の右辺は,遷移前の状態 prev_addr に,メッセージ add() の引数で渡された name と addr の対応を追加したものが遷移後の状態になることを示しています.prev_addr に対して,メッセージ add() の引数で渡された name と addr の対応を追加した写像が遷移後の状態になることを示しています.: の直後に変数の型を記述することができます.型推論によって型がわかる場合には,型を省略することもできます.状態の型が,List ,Map ,Json であるリソースは子リソースを持つことができます.
@@ -114,7 +118,7 @@
- DTRAM でも実行を可視化することができます.Alloy とは異なり,DTRAM では仮想実行をインタラクティブに進めていきます.まず,システムの初期状態を可視化したものが以下の図です, + DTRAM でも実行を可視化することができます.Alloy とは異なり,DTRAM ではツールを用いてインタラクティブに仮想実行を進めていきます.まず,システムの初期状態を可視化したものが以下の図です,


- リソースに送信できるメッセージを選択する画面が表示されるので,init を選択します. + リソースに送信するメッセージの種類を選択する画面が表示されるので,init を選択します.

- 次にリソースに送信するメッセージを入力します.ここでは,init("Suzuki") を入力します.
+ 次にリソースに送信するメッセージの内容を入力します.ここでは,init("Suzuki") を入力します.


- book.addr リソースの子リソースとして,book.addr.Satou リソースが追加されたことが分かります.
+ book.addr リソースの子リソースとして,book.addr.Satou リソースが追加されたことが分かります.
+ また,book.addr.Satou リソースの状態が,"Tokyo" になっていることも分かります.
さらに,book.addr リソースをダブルクリックして,add("Tanaka", "Osaka") というメッセージを送ります.
@@ -160,7 +165,7 @@

- book.addr リソースの子リソースとして,さらに book.addr.Tanaka リソースが追加されます.
+ book.addr リソースの子リソースとして,さらに book.addr.Tanaka リソースが追加され,その状態は "Osaka" になっています.
次に,book.addr リソースをダブルクリックして, del("Satou") というメッセージを送ります.
@@ -182,7 +187,7 @@