Scala や Haskell に見られるようなパターン マッチングと Prolog に見られる統合との違いは理解できたと思いますが、Prolog に対する私の誤解は大きいです。一方では解決でき、他方では解決できないいくつかの単純な問題は何ですか? ありがとうございました
4 に答える
簡単に言うと、パターン マッチングは一方向であり、統合は双方向です。つまり、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
およびB
3 つの別個の関数を記述する必要があります。Prolog では、これらすべてのジョブ (およびそれ以上のジョブ) が 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
。