Guarded Command Language

From Wikipedia, the free encyclopedia

Guarded Command LanguageGCL)とは、エドガー・ダイクストラ述語変換意味論向けに定義した言語である[1]

構文

ガード付きコマンドはGCLの最重要要素である。ガード付きコマンドは名前の通り、ガードが付いている。ガードは一種の命題であり、その文を実行する前に真でなければならない。文の実行前に、そのガードは真であると仮定される。また、ガードが偽であった場合、その文は実行されない。ガード付きコマンドを使うことで、プログラムがその仕様に適合していることを証明することが容易になる。ガード付きコマンドの本体(実行すべき文)がガード付きコマンドになっていることが多い。

ガード付きコマンドは、 という形式のであり、ここで

  • は、ガードと呼ばれる命題である。
  • は文である。

なら、ガード付きコマンドは単に と記述される。

意味論

計算の流れで が出てくると、それを評価する。

  • が真なら を実行する。
  • が偽なら、コンテキストに従って次にすべきことを決定する。

Skip と Abort

Skip と Abort は非常に単純だがガード付きコマンドと同様に重要な要素である。Abort は未定義命令であり、何もしない。Abort は完了することさえ保証されていない。プログラムが何らかの証明の定式化であるとすれば、Abort は証明の失敗に対応する。Skip は空の命令であり、何もしない。文法上、文が必要とされるが、プログラマが状態を変更したくない場合、プログラム内で使われる。

構文

  • Skip
  • Abort

意味論

  • Skip: 何もしない
  • Abort: 何もしない

代入

代入文は変数に値を代入する。

構文

ここで

  • v はプログラムの変数(群)
  • E は対応する変数と同じデータ型の式

連結

代入文はセミコロン(;)を間に書いて、並べて記述される。

条件文: if

選択(一般に、条件文とかif文と呼ばれる)はガード付きコマンドのリストであり、そのうちの1つの文が選択実行される。複数のガードが真である場合、実行する文はランダムまたは非決定的に選択される。どのガードも真でない場合、結果は未定義である。少なくとも1つのガードが真でなければならないので、空文の Skip を使うことが多い。

構文

意味論

  • どのガードも真でない場合: Abort と同じ
  • 1つの だけが真の場合、 を実行
  • がいずれも真の場合、任意の (ただし )を実行

単純な例

以下のような擬似コードを考える:

if a < b then c := True
else c := False

GCL ではこれが以下のようになる:

スキップを使用した例

擬似コード:

if error = True then x := 0

GCLの場合:

2つ目のガードを省いた場合、error = False なら、結果は Abort となる。

複数のガードが真の場合

a = b の場合、max の新たな値として a または b が選ばれるが、結果は同じである。しかし、実装によっては、一方がもう一方より性能的に有利だったり容易だったりする場合もある。プログラマから見れば違いはないので、いかようにも実装してよい。

繰り返し: do

応用

参考文献

Related Articles

Wikiwand AI