16

Scalaのマッチ/ケース機能でサポートされているようなパターンマッチングが実際にはPrologのようなロジック言語から借用されていることをどこかで読みました。

Scalaを使用して、連結グラフの問題などの問題をエレガントに解決できますか?例:https ://web.archive.org/web/20100214144956/https://www.csupomona.edu/~jrfisher/www/prolog_tutorial/2_15.html

4

11 に答える 11

12

いいえ、ロジックエンジンを実際に作成しない限り、それはできません。これでは、目的全体が無効になります。

さらに、多くの理由から、パターン マッチング自体はこれにはまったく適していません。たとえば、基本的なクエリ自体を考えてみましょう: path(1, 5, P). Scala のパターン マッチングでは、1、5、および P が出力です。出力を生成するために使用できる入力を提供することはできません。

Prolog では、1 と 5 が固定されていると仮定すると、P はどのような値をとることができるでしょうか? これが、パターン マッチングのしくみです。

編集: Scala 2.10 では、パターン マッチングが for-comprehensions のような中間操作にコンパイルされ、デフォルトの変換がさらに最適化されます。ただし、パターン マッチングを処理する独自のクラスを定義することは可能であり、プロローグ ログインの実装に使用されているのを見てきましたが、リンクが見つかりません。

于 2010-04-17T20:28:22.570 に答える
6

Haskellと関数型プログラミング言語はScalaの直接のインスピレーションの源です。これらの言語から継承されたアプリケーションの1つは、ドメイン固有言語(DSL)の開発です。Haskellには論理プログラミング(Prolog)用のDSLがかなりあります。そのようなDSLライブラリをScalaに移植することは、まだ行われていなければ、かなり可能であるはずです。

于 2010-09-22T08:17:04.550 に答える
5

関数型プログラミングと論理型プログラミングがそれほど離れていないことの詳細については、http://kanren.sourceforge.net/を参照してください。ストリーム構造は、2 つのパラダイムがどのように組み合わされるかを理解するための鍵です。標準関数をストリーム/ロジック形式に「持ち上げる」ことにより、Prolog によく似た問題解決動作を示すことができます。

パーサー・コンビネーターも検討する必要があります。適切なコンビネータを配置すると、効率的な Prolog のような解決機能が可能になります。

于 2010-05-12T19:32:53.470 に答える
5

あなたの質問に対する伝統的な答えは、すべてが値であると仮定する言語では論理変数を直接モデル化できないことを概説するでしょう。

ただし、論理変数を機能構造にマップするための比較的新しいアプローチがあります。具体的なケースでは、Prolog に近い論理言語である Curryが Haskell に翻訳されています。このアプローチで非常に珍しいのは、論理変数が遅延でモデル化されていることです。詳細については、KiCS2: Curry から Haskell への新しいコンパイラ を参照してください。たぶんlazy val、この目的のために使用される可能性があります。

于 2013-02-07T20:05:46.807 に答える
5

私は遅れていることを知っていますが、re: kanren を検索すると、これが見つかりました [リンク切れ] これもあります: http://code.google.com/p/scalalogic/

私はそのトピックを調査しているだけで、それについて非常にぼんやりとしか理解していませんが、リンクはとにかく興味深いかもしれません.

于 2010-09-20T21:37:14.817 に答える
4

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 機能を使用しています。

  • 高階関数、マップ、フォールド、ケース クラスなど。
  • コンビネーターパーサー - 「貧乏人の DCG」
  • リスト、配列、シーケンスなどの間の Scala のエレガントな暗黙的な変換。
  • Scala の任意の長さの整数と小数 (Java とは対照的に、自然な構文を使用)
  • Scala の """...""" 文字列 - 正規表現用および Prolog コードを Scala クラスに直接埋め込むため
  • ファイル操作などを反復子として表示する、Scala で使用可能ないくつかの IO 抽象化 - Styla の派生元である Java ベースのカーネル Prolog の元の Fluents に自然に一致します。

(テキスト: http://groups.google.com/group/comp.lang.prolog/browse_thread/thread/4cd835d2c82fce02/505688d4b0be5528から引用)

于 2012-05-30T23:20:37.940 に答える
3

Scala はロジック プログラミング言語ではありませんが、Scala でロジック プログラミング用の DSL を定義できます。Scala は関数型プログラミングから多くの概念を借用していることに注意してください。関数型スタイルで使用することができ、使用する必要があります。関数型プログラミングと論理型プログラミングはどちらも宣言型ですが、大きく異なります。詳しくはこちらをご覧ください

于 2010-04-17T21:01:18.960 に答える
1

パターン マッチング自体は、変数を統合しないため、ロジック プログラミングには直接役立ちません。

于 2012-05-30T22:55:38.610 に答える
1

また、scampi (Scala の制約プログラミング ソルバー) も参照できます: https://bitbucket.org/pschaus/scampi/wiki/Home Jacop CP Solver には scala API もあります。

于 2012-05-31T07:03:05.027 に答える