diff --git a/courseA/IM_Alloy.html b/courseA/IM_Alloy.html index c70978b..1072f45 100644 --- a/courseA/IM_Alloy.html +++ b/courseA/IM_Alloy.html @@ -15,38 +15,39 @@
- ここでは,Alloyを用いて記述したInventoryManagementについて説明します.
- 以下にInventoryManagementのソースコードを示します.こちらを適宜参照しながらソースコードの理解を行ってください.
+ ここでは,Alloyを用いて記述したInventoryManagementの課題について説明します.
+ 以下にInventoryManagementのモデルを示します.こちらを適宜参照しながらモデルの理解を行ってください.
sig
:
- 以下のソースコードでは始めに,商品を識別するためのIDを表すItemId
と 商品名を表すName
を構造のない集合として宣言しています.
- 次に,商品全体を管理する倉庫を表しているInventory
は,itemDB
フィールドを持っています.
- このフィールドを定義している行では,itemDB
フィールドがItemId
から,
- 商品の情報を表すItem
との対応関係を参照していることを表しています.
- 最後のItem
では始めに,商品名を表すname
をItem
の要素と,Name
の要素の間の関係として定義しています.
- 次にある,在庫数を表すcount
では在庫数をInt
+ 以下のモデルでは始めに,商品を識別するためのIDを表す ItemId
と商品名を表す Name
を集合として宣言しています.
+ 次に,商品全体を管理する倉庫を表している Inventory
は, itemDB
フィールドを持っています.
+ このフィールドを定義している行では, itemDB
フィールドが ItemId
から,
+ 商品の情報を表す Item
との対応関係を参照していることを表しています.
+ 最後の Item
では始めに,商品名を表す name
を Item
の要素と, Name
の要素の間の関係として定義しています.
+ 次にある,在庫数を表す count
では在庫数を Int
pred
:
- 以下のソースコードで最初に記述されているinit
は,Inventory
の
- 構造を持ったits
初期化するという操作になっています.
- 次の,itemRegistraction
では初めて取り扱う商品を入荷する際に,
- 商品名と入荷数量をInventory
に登録するという操作になっています.
- その次にある,receivingOrShipping
では登録されている商品に対して
+ 以下のモデルで最初に記述されている init
は, Inventory
の
+ 構造を持った its
初期化するという操作になっています.
+ 次の, itemRegistraction
では初めて取り扱う商品を入荷する際に,
+ 商品名と入荷数量を Inventory
に登録するという操作になっています.
+ その次にある, receivingOrShipping
では登録されている商品に対して
入荷か出荷を行った際に起こる数量の変化の操作を表しています.
- 最後のexecute
では上記にて説明を行った,
- init
,itemRegistraction
,receivingOrShipping
を
+ 最後の execute
では上記にて説明を行った,
+ init
, itemRegistraction
, receivingOrShipping
を
上から順番に実行を進めるという操作になっています.
- そして,最後にあるrun
execute
を呼び出して実行を行っています.
- この実行の際に
という
+ そして,最後にある run
execute
を呼び出して実行を行っています.
+ この実行の際に
や -
の数字を扱うため,
+ 末尾に
という
Alloyで8bitの数字を扱うことができるようにするための記述を行っています.
sig ItemId, Name{}sig Inventory { - itemDB: ItemIdlone ->lone Item + itemDB: ItemIdlone ->lone Item }sig Item { - name : Name, - count:Int + name : Name, + count:Int }pred init[its: Inventory] { -no its.itemDB +no its.itemDB }pred itemRegistration[its, its': Inventory, itemId: ItemId, quantity:Int , n: Name] { -some it: Item | { +some it: Item | {no itemId2: ItemId | its.itemDB[itemId2] = it its'.itemDB = its.itemDB + itemId -> it it.name = n it.count = quantity - } + } }pred receivingOrShipping[its, its': Inventory, itemId: ItemId, quantity:Int ] { -some it': Item | { +some it': Item | {no itemId2: ItemId | its.itemDB[itemId2] = it' its'.itemDB = its.itemDB ++ itemId -> it' it'.name = its.itemDB[itemId].name it'.count = plus[its.itemDB[itemId].count, quantity] - } + } }pred execute[] { -some disj its, its', its'': Inventory, itemId: ItemId, n: Name | { +some disj its, its', its'': Inventory, itemId: ItemId, n: Name | { init[its] itemRegistration[its, its', itemId,100 , n] receivingOrShipping[its', its'', itemId, -50 ] - } + } }run executefor 2 but3 Inventory,8 Int @@ -104,29 +105,29 @@
-
Inventory
が,商品名を表すname
と在庫数を表すcount
の2つのフィールドを持っている, -Item
を管理するというモデルになっています. +Inventory
が,商品名を表すname
と在庫数を表すcount
の2つのフィールドを持っている, +Item
を管理するというモデルになっています.
-InventoryManagementの例題仕様について
+InventoryManagementの仮想実行について
- ここでは,InventoryManagementの例題仕様について説明します.InventoryManagementの例題仕様は次の通りです.
+ ここでは,InventoryManagementの仮想実行について説明します.InventoryManagementの仮想実行で用いるテストケースは次の通りです.
-
- Inventoryに新しく取り扱う商品を100個入荷します.
- お客様が商品を50個購入してくれたので,在庫数が50個に減少しました.
例題仕様の可視化:
+仮想実行の可視化:
- 先ほどの例題仕様で,実行時の状態を可視化したものを以下に示します.
+ 先ほどの仮想実行を可視化したものを以下に示します.
- 左下にあるInventory2($execute_its)は,始めに
init
が実行された時の状態になっているため, + 左下にあるInventory2($execute_its)は,始めにinit
が実行された時の状態になっているため, まだ何の商品(Item)も登録されていない状態になっています.
次に,1番上の段の左にあるInventory1($execute_its')はテストケースの1が行われた時の状態になっているため, 100個のItem1を入荷している状態になっています.
@@ -139,56 +140,56 @@ 課題概要- 本課題ではまず,上記にて説明を行ったInventoryManagementに,とある機能を追加した時のソースコードと可視化の図を + 本課題ではまず,上記にて説明を行ったInventoryManagementに,とある機能を追加した時のモデルと可視化の図を 実験参加者の皆様に見て頂きます.
- 次に,その2つを見てどの様な機能が追加されたのか,またどの様なシナリオになっているのかを + 次に,その2つを見てどの様な機能が追加されたのか,またどの様なテストケースになっているのかを 考えて頂き,以下のアンケートにお答えください.sig ItemId, Name{}sig Inventory { - itemDB: ItemIdlone ->lone Item + itemDB: ItemIdlone ->lone Item }sig Item { - name : Name, - count:Int + name : Name, + count:Int }pred init[its: Inventory] { -no its.itemDB +no its.itemDB }pred itemRegistration[its, its': Inventory, itemId: ItemId, quantity:Int , n: Name] { -some it: Item | { +some it: Item | {no itemId2: ItemId | its.itemDB[itemId2] = it its'.itemDB = its.itemDB + itemId -> it it.name = n - it.count = quantity - } + it.count = quantity + } }pred shippingOrReceiving[its, its': Inventory, itemId: ItemId, quantity:Int ] { plus[its.itemDB[itemId].count, quantity] <0 implies { -all itemId': ItemId | its'.itemDB[itemId'] = its.itemDB[itemId'] +all itemId': ItemId | its'.itemDB[itemId'] = its.itemDB[itemId'] }else { -some it': Item | { -no itemId2: ItemId | its.itemDB[itemId2] = it' - its'.itemDB = its.itemDB ++ itemId -> it' - it'.name = its.itemDB[itemId].name - it'.count = plus[its.itemDB[itemId].count, quantity] - } +some it': Item | { +no itemId2: ItemId | its.itemDB[itemId2] = it' + its'.itemDB = its.itemDB ++ itemId -> it' + it'.name = its.itemDB[itemId].name + it'.count = plus[its.itemDB[itemId].count, quantity] + } } }pred execute[] { -some disj its, its', its'', its''': Inventory, itemId: ItemId, n: Name | { - init[its] - itemRegistration[its, its', itemId,100 , n] - shippingOrReceiving[its', its'', itemId, -50 ] - shippingOrReceiving[its'', its''', itemId, -75 ] - } +some disj its, its', its'', its''': Inventory, itemId: ItemId, n: Name | { + init[its] + itemRegistration[its, its', itemId,100 , n] + shippingOrReceiving[its', its'', itemId, -50 ] + shippingOrReceiving[its'', its''', itemId, -75 ] + } }run executefor 2 but 4 Inventory,8 Int