Constraint-Logic Programmingを読んでいると、SQL プログラミングとの明らかな関係に気付かずにはいられません。SQL は実際の「制約ロジック プログラミング」の例ですか?
2 に答える
それらは高いレベルから非常に似ています。どちらも反復型ではなく、宣言型またはセットベースです (つまり、必要なものを要求します。個々の項目を 1 つずつループして処理することはありません)。
CLP は SQL でモデル化できますが、問題に対するより良い解決策を見つけるケースです。SQL は、既に明示的に定義されている特定のデータ セットで答えを見つけるのに適しています。CLP は、大まかに定義されているか、場合によっては完全に定義されていないドメインで答えを見つけるのに適しています。
例として。SQL を使用して 100 万から 1000 万までのすべての偶数を返したい場合は、選択するすべての数値がリストされたテーブル (既存のデータ セット) が必要になります。CLP を使用すると、バウンド (10M) だけが必要になりますが、すべてのレコードを明示的に作成する必要はありません。
内部的に CLP エンジン (CSP 問題) は、制約を推測して高速化することもできます。SQL では、これらのルールを理解し、明示的に記述する必要があります。たとえば、SQL が A=B および B=C の場所にある場合、CLP エンジンは A=C であると判断し、それを使用して SQL が実行できない場所でより高速に実行することができます。同様に、実行時間を最適化するためにドメインを推測することもできます (偶数が返されないことがわかっている場合、CLP はそれらを考慮から除外します - SQL は引き続きそれらを考慮しますが、「解決策」としては返しません)。
お役に立てば幸いです。必要に応じて、より技術的な情報を入手できます。覚えておくべき重要な点は、2 つは似ていますが、どちらを使用するかは問題のモデルによって異なるということです。「これらは私の変数であり、これらがどのように相互に関係しているか、有効な解決策を教えてください」と言える場合は、CLP が良い候補です。「私の変数があり、これらが詳細です。適合する既存のデータのサブセットを返してください」と言える場合は、SQL の方が適しています。
完全な答えはありませんが、DatalogとDLVを見ると面白いかもしれません。それらはおそらく、論理プログラミング(CLPではない)とSQLの間の「ミッシングリンク」であり、物事をより明確に理解するのに役立ちます。
これはCLPよりもLPに関するものなので、何かを見逃した可能性があります。そうであれば、申し訳ありません。