26

Scala や Haskell に見られるようなパターン マッチングと Prolog に見られる統合との違いは理解できたと思いますが、Prolog に対する私の誤解は大きいです。一方では解決でき、他方では解決できないいくつかの単純な問題は何ですか? ありがとうございました

4

4 に答える 4

32

簡単に言うと、パターン マッチングは一方向であり、統合は双方向です。つまり、Prolog では、右側 (照合される側) にバインドされていない変数を含めることができます。たとえば、2 つのバインドされていない変数Xとがある場合Y、これはうまく機能します。

X = Y,
X = 5,
%% Y = 5 now as well

Erlang (Prolog に近い構文でパターン マッチングを使用する) では、次の行X = Yはエラーを生成します: variable 'Y' is unbound. Xバインドされていなくても問題ないことに注意してください。これは、パターン マッチであると想定されています。

これは、部分的に定義された値を処理する場合に役立ちます。非常に良い例は差分リストです。

これは、複数のモードで Prolog 述語を使用できるようにするものでもあります。たとえば、Scala/Haskell/Erlang では、1) find A ++ B、2) 方程式をA ++ X == B解く、または 3)X ++ A == B与えられたリストの方程式を解く、AおよびB3 つの別個の関数を記述する必要があります。Prolog では、これらすべてのジョブ (およびそれ以上のジョブ) が 1 つの述語によって実行されます。

于 2010-12-14T17:52:39.980 に答える
1

次の Scala は、最初のケース ブランチで変数を 2 回宣言しようとするため、コンパイルに失敗しますx

(1, 1) match{
   case (x, x) => println("equals")
   case _      => println("not equals")
}

Scala がパターン マッチングの代わりに統合を使用した場合、これは成功し、"equals" を出力します。

(1, 2) match{
   case (x, x) => println("equals")
   case _      => println("not equals")
}

「等しくない」と出力します。これは、変数xを と の両方1にバインドしようとすると、統合が失敗するためです2

于 2010-12-14T18:10:07.370 に答える