Scalaのマッチ/ケース機能でサポートされているようなパターンマッチングが実際にはPrologのようなロジック言語から借用されていることをどこかで読みました。
Scalaを使用して、連結グラフの問題などの問題をエレガントに解決できますか?例:https ://web.archive.org/web/20100214144956/https://www.csupomona.edu/~jrfisher/www/prolog_tutorial/2_15.html
Scalaのマッチ/ケース機能でサポートされているようなパターンマッチングが実際にはPrologのようなロジック言語から借用されていることをどこかで読みました。
Scalaを使用して、連結グラフの問題などの問題をエレガントに解決できますか?例:https ://web.archive.org/web/20100214144956/https://www.csupomona.edu/~jrfisher/www/prolog_tutorial/2_15.html
いいえ、ロジックエンジンを実際に作成しない限り、それはできません。これでは、目的全体が無効になります。
さらに、多くの理由から、パターン マッチング自体はこれにはまったく適していません。たとえば、基本的なクエリ自体を考えてみましょう: path(1, 5, P)
. Scala のパターン マッチングでは、1、5、および P が出力です。出力を生成するために使用できる入力を提供することはできません。
Prolog では、1 と 5 が固定されていると仮定すると、P はどのような値をとることができるでしょうか? これが、パターン マッチングのしくみです。
編集: Scala 2.10 では、パターン マッチングが for-comprehensions のような中間操作にコンパイルされ、デフォルトの変換がさらに最適化されます。ただし、パターン マッチングを処理する独自のクラスを定義することは可能であり、プロローグ ログインの実装に使用されているのを見てきましたが、リンクが見つかりません。
Haskellと関数型プログラミング言語はScalaの直接のインスピレーションの源です。これらの言語から継承されたアプリケーションの1つは、ドメイン固有言語(DSL)の開発です。Haskellには論理プログラミング(Prolog)用のDSLがかなりあります。そのようなDSLライブラリをScalaに移植することは、まだ行われていなければ、かなり可能であるはずです。
関数型プログラミングと論理型プログラミングがそれほど離れていないことの詳細については、http://kanren.sourceforge.net/を参照してください。ストリーム構造は、2 つのパラダイムがどのように組み合わされるかを理解するための鍵です。標準関数をストリーム/ロジック形式に「持ち上げる」ことにより、Prolog によく似た問題解決動作を示すことができます。
パーサー・コンビネーターも検討する必要があります。適切なコンビネータを配置すると、効率的な Prolog のような解決機能が可能になります。
あなたの質問に対する伝統的な答えは、すべてが値であると仮定する言語では論理変数を直接モデル化できないことを概説するでしょう。
ただし、論理変数を機能構造にマップするための比較的新しいアプローチがあります。具体的なケースでは、Prolog に近い論理言語である Curryカレーが Haskell に翻訳されています。このアプローチで非常に珍しいのは、論理変数が遅延でモデル化されていることです。詳細については、KiCS2: Curry から Haskell への新しいコンパイラ を参照してください。たぶんlazy val
、この目的のために使用される可能性があります。
私は遅れていることを知っていますが、re: kanren を検索すると、これが見つかりました [リンク切れ] これもあります: http://code.google.com/p/scalalogic/
私はそのトピックを調査しているだけで、それについて非常にぼんやりとしか理解していませんが、リンクはとにかく興味深いかもしれません.
Styla は、Scala で書かれたかなり完全な Prolog インタープリターであり、Kernel Prolog から派生しています (Fluents: A Refactoring of Prolog for Uniform Reflection and Interoperation with External Objects in CL'2000 を参照)。
純粋にオープン ソース化された (Apache ライセンス) コードは、次の場所でホストされています。
http://code.google.com/p/styla/
また、シンプルさと拡張性を念頭に置いて設計されています。新しい Prolog 拡張機能や代替ロジック プログラミング言語を試している人に役立つことを願っています。
Styla は、Java では利用できないいくつかの Scala 機能を使用しています。
(テキスト: http://groups.google.com/group/comp.lang.prolog/browse_thread/thread/4cd835d2c82fce02/505688d4b0be5528から引用)
Scala はロジック プログラミング言語ではありませんが、Scala でロジック プログラミング用の DSL を定義できます。Scala は関数型プログラミングから多くの概念を借用していることに注意してください。関数型スタイルで使用することができ、使用する必要があります。関数型プログラミングと論理型プログラミングはどちらも宣言型ですが、大きく異なります。詳しくはこちらをご覧ください。
パターン マッチング自体は、変数を統合しないため、ロジック プログラミングには直接役立ちません。
また、scampi (Scala の制約プログラミング ソルバー) も参照できます: https://bitbucket.org/pschaus/scampi/wiki/Home Jacop CP Solver には scala API もあります。