3

宣言型プログラミングに関して、私がその概念をどれだけよく理解しているかを確認するために質問があります。私には、Javaで数独パズルソルバーを「宣言型の方法」で作成する必要があるという課題があります。それが何を意味するのかを調べてみると、プログラムは、方法を指定するのではなく、何をしなければならないかを説明するような方法で作成する必要があるというあいまいな定義がたくさん見つかりました。周りを見回すと、誰かがリストでそれを説明している、具体的にはリストの奇数をフィルタリングしているという興味深い例を見つけました。

命令型(関数と呼ばれる):

List resultList = new List()
foreach element in startlist
    do if element % 2 == 1
        do add element to resultList
        od
    od
return returnList

宣言型(呼び出しコンテキスト):

newList = startList.filter(num -> num%2 ==1)

したがって、宣言型では、保持する要素が指定されますが、リストの作成方法は指定されません。これは、リストのAPIに抽象化されています。

私の簡単な質問は次のとおりです。このアプローチは、アルゴリズムがそこに移動されるため、リストのライブラリが宣言型ではないことを意味しませんか?その場合、「宣言型」という用語は、このライブラリを呼び出すプログラムの部分に適用されます。したがって、プログラムが100%宣言型であるのは不可能ではありません。(もちろん)どこかで、物事がどのように行われるかを指定するアルゴリズムが必要になるからです。私がここで間違っている場合は、これが宣言型の概念の理解の中心になるので、私を訂正してください。

いずれにせよ、私は数独ソルバーを自分のライブラリー(「宣言型」関数プログラミングスタイルにラップされたすべての「命令型」ロジックを含む)と、数独ソルバーを解決するために実行する必要のある手順の仕様を組み合わせて作成することを考えていました。数独、これらのライブラリへの呼び出しとして。また、ソルバークラスをさらに「宣言型」にするために、Javaで関数を引数として渡す方法のラッパーとしてコマンドパターンを使用できると考えていました。私はすでにこれを試し、関数を持つコマンドを使用して、リストから要素を引数として取得し、要素が結果リストから保持または破棄される場合はtrueまたはfalseを返すという行に沿って何かを試しnewList = startList.filter(new OddNumberCommand())ましOddNumberCommandexecute

とにかく、これは私の心が回転する方法であり、私が正しい道を進んでいるか間違った道を進んでいるかを確認するために、この概念をよりよく理解している他の人の助けに頼りたいと思いました。宣言型プログラミングの適切な使用法を学ぶことができるように、私がどこが間違っているのか、そして私の推論の何が正しいのかを教えてください。

ありがとう

4

2 に答える 2

5

コメント提供者が言ったように、あなたの例は宣言型プログラミングよりも関数型プログラミングですが、2つはいくつかの点で似ています。実際の宣言型プログラミングでは、より結果を重視することになります。つまり、リストを独自に変換するのではなく、リスト内の興味深い要素をどう処理するかを指定することになります。Jessのようなルールエンジンは、宣言型プログラミングシステムの例です(免責事項、私はJessの作者です)。

あなたの1つの簡単な質問に答えるために:はい。すべての機能的または宣言型プログラミングシステムには、プログラムが実行されている実際のコンピューターに実装する必要のあるランタイムシステムが含まれます。実際のコンピューターは常に必須のフォンノイマン型マシンであるため、そのランタイムシステムは必須に作成する必要があります。したがって、これはプログラムとハードウェアの間の抽象化の追加レイヤーです。

于 2012-04-22T11:15:54.383 に答える
1

宣言型プログラミングの定義から:

宣言型言語の特徴:

  1. 入力データの構成要素に関して関係が直接指定されるシステムに基づく計算モデル。
  2. 計算方法ではなく、計算対象を指定する関係を記述する一連の定義または方程式で構成されます。
  3. 変数の非破壊的な割り当て。
  4. 使用されるデータ構造の明示的な表現。
  5. 実行の順序は重要ではありません(副作用はありません)。
  6. 式/定義は値として使用できます。
  7. プログラマーはもはや制御に責任がありません。

宣言型プログラムは、制御(目的の目標を達成する方法)ではなく、ロジック(目的の目標または結果)を定義します。宣言型言語は、目標指向または目標駆動型であると言います。

数独の場合、クラス間のコントラクトとしてインターフェースを使用することがポイントだと思います。このようにして、モデルを壊すことなく実装を変更できます。

于 2012-04-22T11:11:41.693 に答える