Alloy で偶発的な故障をモデル化することは可能ですか?
たとえば、現在、さまざまな時間ステップでデータを隣接グラフに渡す接続グラフがあります。私がやろうとしているのは、モデルがリンクをランダムに強制終了できるようにする方法を見つけ出し、そうすることで、その目標を達成することです (すべてのノードのデータ状態がオンに設定されていることを確認する)。
open util/ordering[Time]
enum Datum{Off, On} // A simple representation of the state of each node
sig Time{state:Node->one Datum} // at each time we have a network state
abstract sig Node{
neighbours:set Node
}
fact {
neighbours = ~neighbours -- symmetric
no iden & neighbours -- no loops
all n : Node | Node in n.*neighbours -- connected
-- all n : Node | (Node - n) in n.neighbours -- comp. connected
}
fact start{// At the start exactly one node has the datum
one n:Node|first.state[n]=On
}
fact simple_change{ // in one time step all neighbours of On nodes become on
all t:Time-last |
let t_on = t.state.On |
next[t].state.On = t_on+t_on.neighbours
}
run {} for 5 Time, 10 Node
私がモデリングしようとしているソフトウェアは、不確実性を扱っています。基本的に、ノード間のリンクが失敗する可能性があり、ソフトウェアは別のパスに沿って再ルーティングします。私が Alloy でやりたいと思っていることは、リンクが特定のタイムステップで (できればランダムに) '死ぬ' ための機能を持たせることです。最上位の事実として、私はグラフを完全に接続する機能を持っているため、リンクが停止した場合、別のリンクがたるみを拾う可能性があります (simple_change が Datum の状態を On に切り替えるため)。接続されているすべてのネイバー)。
編集:
それで、提案されたとおりに実行したところ、次のエラーが発生しました。
隣人とノードがまだ設定されていると思っていたので、混乱していますか?
これが私の更新されたコードです:
open util/ordering[Time]
open util/relation
enum Datum{Off, On} // A simple representation of the state of each node
sig Time{
neighbours : Node->Node,
state:Node->one Datum // at each time we have a network state
}{
symmetric[neighbours, Node]
}
abstract sig Node{
neighbours:set Node
}
fact {
neighbours = ~neighbours -- symmetric
no iden & neighbours -- no loops
-- all n : Node | (Node - n) in n.neighbours -- comp. connected
all n : Node | Node in n.*neighbours -- connected
}
// At the start exactly one node has the datum
fact start{
one n:Node|first.state[n]=On
}
// in one time step all neighbours of On nodes become on
fact simple_change{
all t:Time-last |
let t_on = t.state.On |
next[t].state.On = t_on+t_on.neighbours
all t:Time-last | next[t].neighbours in t.neighbours
all t:Time-last | lone t.neighbours - next[t].neighbours
}
run {} for 10 Time, 3 Node