倭マン's BLOG

くだらない日々の日記書いてます。 たまにプログラミング関連の記事書いてます。 書いてます。

反復条件あれこれ 其ノ壱

前回は反復条件の型を指定して、いろいろな反復条件を手軽に使えるようにしようとしたんでした。 今回は反復条件の型を具体的に考えてみます。

▲1つ注意(訂正)として、前回反復条件に指定できる値のことをパラメータといいましたが、以降ではプロパティと呼びます。 前回の最後の方で、シミュレーション設計図中の iteration-condition 要素の属性名を JavaBeans 風に書くといいましたが、JavaBeans ではこれらをプロパティと呼ぶからです。

単純な反復条件


まずは単純な型から。
count

これは指定回数だけ反復を繰り返すだけの反復条件です。 total プロパティで反復回数を指定します。

<iteration-condition type="count" total="《反復回数》"/>

class

これは自作の Java クラスを使用する反復条件です。 class 属性で自作クラスの名前を指定します。 前回にも言いましたが、type 属性と class 属性はプロパティに含めません

<iteration-condition type="class" class="《反復条件クラス名》"/>

null

これは反復を行わない反復条件です。 実際にこれを指定することはないでしょう。 シミュレーション設計図の iteration 要素下に iteration-condition 要素が指定されてないときは、null 型が指定された iteration-condition 要素があると見なします。

<iteration-condition type="null"/>

関係演算子による反復条件


次は観測量の値を反復条件に使用する場合です。 その代表的なものが関係演算を用いた条件判定でしょう。 関係演算とは、Java でいう「==, !=, <, <=, >, >=」といった演算です。 それぞれの演算子の説明は省きます。

上記の演算子を iteration-condition 要素の type 属性に書きます。 また、指定できるプロパティは評価に使用する観測量の名前基準値(bench-mark)です*1

<iteration-condition type="《演算子》" var="《観測量名》" bench-mark="《基準値》"/>

具体的な例を挙げると、「Position」という名前で、整数値をとる観測量があった場合、

<iteration-condition type="!=" var="Position" bench-mark="10"/>

と書くと「《Positionの値》 != 10」が満たされている間だけ反復を繰り返します。 属性の書かれている順番に関係なく、var 属性で指定される観測量の値が左辺、bench-mark 属性の値が右辺と解釈されます。 細かく言えば、関係演算子は(引数の型によって)以下の2つに分類されます:

関係の種類 演算子 引数の型
同値関係 ==, != 数値もしくはブール値(浮動小数点型は振る舞いは保証できません)
順序関係 <, <=, >, >= 数値

▲シミュレーション設計図は XML 形式なので、「<」は「&lt;」と書かなければなりません。 これは少々見難いので、<, <=, >, >= をそれぞれ lt, le, gt, ge と書いても良いことにします。

複雑な数式を用いた反復条件の評価は、別途拡張ライブラリなどを作って提供したいと思ってます。 当面、複雑な数式の評価が必要な場合は、自作の Java クラスを作ってください。

その他の反復条件


その他に考えている反復条件には以下のような物があります:

論理演算による反復条件
一言で言えば not, and, or, xor です。 次回説明予定。
観測値の範囲を指定する反復条件
これは関係演算による反復条件の一種ですが、ある観測量に対して最大値、最小値を指定して、値がその範囲内に入っている場合だけ反復を繰り返します。 これは関係演算と論理演算を組み合わせれば実現できます。
相互作用
反復を実行するか停止するかを、ユーザの入力によって判断します。 Media Player みたいな感じのスタンドアローン・アプリケーションを作れればなぁ〜

*1:bench-mark は benchMark と書いてもかまいません