1

ウィキでこれら2つの概念の定義を読みましたが、違いはまだ明らかではありません。誰かが例といくつかの簡単な説明を与えることができますか?

4

1 に答える 1

5

宣言型の仕様は、出力を入力に関連付ける制約のある操作または関数を記述します。出力を計算するためのレシピを提供するのではなく、出力が正しいことを確認するためのルールを提供します。たとえば、配列aと値eを取り、eに一致する配列の要素のインデックスを返す関数について考えてみます。宣言型の仕様は、まさに次のように述べています。

    function index (a, e)
      returns i such that a[i] = e

対照的に、操作仕様はコードのように見えます。たとえば、インデックスをループしてiを見つけます。宣言型の仕様は多くの場合非決定論的であることに注意してください。この場合、eがeの複数の要素と一致する場合、有効なiの値がいくつかあります(仕様ではどちらを返すかは指定されていません)。これは強力な機能です。また、宣言型の仕様は完全ではないことがよくあります。たとえば、ここでは、仕様はそのようなiが存在することを前提としています(一部の言語では、これを明示的にするための前提条件を追加します)。

宣言型の仕様をサポートするには、言語は通常、論理演算子(特に接続詞)と数量詞を提供する必要があります。

モデルベースの言語は、標準の数学的構造(集合や関係など)を使用して状態を記述する言語です。AlloyとZはどちらもモデルベースです。対照的に、代数言語(OBJやLarchなど)は、方程式を使用して状態を暗黙的に記述します。たとえば、セットに要素を挿入する操作を指定するには、代数言語で次のように記述します。

    member(insert(s,e),x) = (e = x) or member(s,x)

つまり、eをsに挿入した後、その要素を挿入したばかりの場合(eはxに等しい)、または以前に存在していた場合(xはsのメンバー)、要素xはセットのメンバーになります。対照的に、ZやAlloyのような言語では、次のように記述します。

    insert (s, e)
      s' = s U {e}

セットの新しい値(s')を古い値(s)に関連付ける制約があります。

宣言型のモデルベースの仕様の多くの例については、http://alloy.mit.eduにあるAlloyの資料、または私の著書SoftwareAbstractionsを参照してください。また、本のWebサイトhttp://softwareabstractions.orgで入手できる本の付録の例を通じて、モデルベースの宣言型言語間の比較を確認することもできます。

于 2012-08-28T13:43:54.160 に答える