技術資料 http://www2.toyo.ac.jp/~asahi/research/simulation/operation.html(09.10.01以後)
08.03.16 1st upload, 09.03.22 update, 09.08.20「0削除」,09.09.21 改訂

言語CASTでシミュレーション
Simcast09操作マニュアル

 この文書は,モデル理論アプローチによるシミュレーション開発実行環境Simcastで,シミュレーションシステムを開発するためのマニュアルです.

インストール方法

 このサイト「CAST言語でシミュレーション」のダウンロードページから,simcast.zipとextProlog(バージョン090820以降)をダウンロードし,そこの指示に従ってインストールしてください.結果として,simcastというディレクトリを作成し,そこですべての作業を行うことになります.

システム開発手順

 システムのイメージ → システムモデル → シミュレーションシステム
(モデル化)      (自動生成)

 Simcastは,状態機械,Moore型オートマトンおよび問題解決システム(Solver)のモデルをコンパイルし動かすことが可能です.

モデル作成方法

 個々のシステムモデル(ユーザモデル)はユーザがテキストエディタで作成し,ディレクトリsimcast内に保存します(拡張子は.set).ユーザモデルの実装構造は「原則的」には教科書と同じですが,SimcastではMoore型オートマトンでモデル化します.

 ディレクトリsimcast内でのオートマトンの実装構造【最小構成】
  //filename.set
  inputsequence()=As <-> As:=[...];
  initialstate()=c0 <-> c0:=(...);
  delta(c,a)=cc <-> cc:=(...);

 これは出力関数lambdaのないオートマトン(つまり状態機械)のユーザモデルの構造です.1行目はコメント文,2行目は入力系列,3行目は初期状態,4行目は状態遷移関数です.これが最小限必要なオートマトンモデルの実装構造です.上記の(...)のところに言語CASTで式を記述し,それぞれの関数を定義します.言語CASTそのものの解説は教科書第4章または本家HP「ダウンロード」ページの最終行から入手できます.

 もしも必要なら,次のようにオプションを加えることが可能です【最大構成】
  //filename.set
  func([...]);
  ユーザ定義関数の定義;
  preprocess() <-> (...);
  inputsequence()=As <-> As:=[...];
  times()=数値;
  initialstate()=c0 <-> c0:=(...);
  delta(c,a)=cc <-> cc:=(...);
  lambda(c)=b <-> b:=(...);
  ユーザ定義述語の定義;
  postprocess() <-> (...);

 それぞれ,funcはユーザ定義関数の宣言,timesは繰り返し入力の回数,lambdaは出力関数を表します.出力関数lambdaの引数はひとつだけです.preprocessとpostprocessは事前処理と事後処理を述語で定義します.これら5つは必要なときだけ記述します.この順序で書く必要はありませんが,「できるだけ,この順序で記述すること」を推奨しています.また,ユーザ定義の関数や述語はいくつでも加えることが可能です.
 さらに,複数のオートマトンが結合したシステムについては技術資料「基本:複合システムの分類とモデル」を参照のこと.ここでは述べていない問題解決システムの作成方法については教科書第5章を参照のこと.

timesを使ったモデル例

教科書では,

//simple1.set
inputsequence()=[1,1,1,1,1,1];
initialstate()=c0 <-> c0:=0;
delta(c,a)=cc <-> cc:=c+a;

を実行すると,a=1が6回入力されるので,状態が0から1ずつ加算されていき,6回繰り返します.最終的にはc=6に達します.すべての変化がDialogウインドウに表示されます(下図4).

 新しい述語times()を使うと,たとえば,

//simple2.set
inputsequence()=1;
times()=500;
initialstate()=c0 <-> c0:=0;
delta(c,a)=cc <-> cc:=c+a;

を実行すると,a=1が500回入力され,状態が0から500まで遷移します.また,

//simple3.set
inputsequence()="d";
times()=500;
initialstate()=c0 <-> c0:=0;
delta(c,a)=cc <-> myrandom(r), cc:=r;

を実行すると,単に時間を進めるためにダミーの"d"が500回入力されます.結果として,乱数が500回表示されます.つまり,「もしも times()が定義されていれば,inputsequence()の右辺の内容そのままを,times()で定義された回数だけ」繰り返して入力します.times()が定義されてなければ,inputsequenceは教科書どおりです.
 Macintosh(初代intel)で,上記simple3.setをコンパイル&実行したら,10万回(times()=100000)で,処理時間20秒でした.まあまあのシミュレーション実験ができるはずです.その他,このサイトにはいろいろなモデル例がありますので,渉猟してください.

実行方法

1)extProlog起動後の操作方法は,基本的に教科書と同じです.
 ディレクトリsimcastの中で,上記のようなシミュレーションモデルを作成し保存する(拡張子は.set).extPrologの実行ファイルxsheetを起動する(図1)と開発実行環境になるので,Dialogウインドウにモデルのファイル名を入力する(図2).するとモデルがコンパイルされ実行される(図3).作業はすべてディレクトリsimcastで行なってください.
2)出力表示が変わりました.最後に一括ではなく,実行中にそのときの状態や出力などが出力表示されます.また,昔あったMTABLEウインドウはSimcast09からは表示されなくなりました.
3)操作上のヒント
 最新9個のユーザ入力は記憶されています.矢印キー「↑」「↓」で入力ライン上に現れます.
直前に入力したファイル名を再表示し,それを修正し実行することなどができます.


図1 起動
 Unixのターミナルウインドウを開き,simcastディレクトリに移動し,xsheetを起動する.


図2 ファイル名入力
 Dialogウインドウにモデルのファイル名(simple1.set)を入力する.


図3 コンパイル
 コンパイルするため,まずモデルの種類を聞かれる.コンパイルに成功すれば,
 システム(simple1.p)が作成されるので,これを実行しようとする.


図4 システム実行
 システム実行開始時にトレースするかを聞かれるので,応じると
 システム実行途中の様子(入力A,状態C,もしあれば出力B)が表示される.
 トレースしない(n)と応じた場合は,最後まで状態遷移が繰り返されて終了する.
 トレースする(y)と応じた場合は,状態遷移1回ごとに停止するので,
 Unixターミナルウインドウ(図1)をクリックしてからリターンキーを押すと,次の状態遷移に移る.