用語の書き換えとパターンマッチングの違いは何ですか?


25

Lambda the Ultimateで応答なかったので、ここでもう一度試してください。たとえば、用語書き換えシステムは、記号計算を証明する自動定理で使用され、もちろん正式な文法を定義します。用語の書き換えに基づいたプログラミング言語はいくつかありますが、私が理解している限り、この概念はパターンマッチングとして知られています。関数型言語ではパターンマッチングがよく使用されます。バリー・ジェイはパターン計算と呼ばれる理論全体を作成しましたが、用語の書き換えについては簡単にしか言及していません。それらはすべて同じ基本的な考え方を指していると感じているので、用語の書き換えパターンマッチングを同義的に使用できますか?

回答:


26

これらの2つの概念を見る1つの方法は、パターンマッチングがコンストラクターでの差別化と用語の破壊(同時に、用語フラグメントの選択とローカル名付け)を安全、コンパクトかつ効率的に組み合わせるプログラミング言語の機能であると言うことです。パターンマッチングに関する研究は、通常、実装効率、たとえば、マッチングメカニズムが行う必要がある比較の数を最小限にする方法に焦点を当てています。

対照的に、用語の書き換えは、構文表現のサブターム(より正確には、変数のセット上の用語代数の要素)を他の用語に置き換える広範囲の(潜在的に非決定的な)方法を調査する計算の一般的なモデルです。用語書き換えシステムに関する研究は、通常、コンフルエンス、決定論、終了などの書き換えシステムの抽象的な特性に関するものであり、より具体的には、書き換えシステム上の代数演算によってそのような特性がどのように保存されるか、または保存されないか、つまり、これらの特性がどの程度合成されるかに関するものです。

lrC[lσ]C[rσ]C[]σ)、Haskell、OCaml、Scalaなどの現代言語のパターンマッチングでは、用語の「先頭」の書き換えのみが可能です。この制限は、Jayのパターン計算にも課せられていると思います。この制限の意味を説明しましょう。OCaml、Haskell、Scalaセンスのパターンマッチングでは、次のようなことは言えません

match M with
   | C[ x :: _ ]  -> printf "%i ...\n" x
   | C[ [] ] -> printf "[]"

C[.]ここは何ですか?これは、1つだけのコンテキストにわたる変数であると想定されています。しかし、OCaml、Haskell、Scalaなどの言語は、プログラマーに任意の(1つの穴のある)コンテキストに渡る変数を与えず、値に渡る変数のみを与えます。つまり、このような言語では、用語の任意の位置でパターンマッチを行うことはできません。パターンのルートから関心のある部分までのパスを常に指定する必要があります。複数の方法。たとえば、用語は2つの方法で(true, [9,7,4], "hello", 7)パターンC[7]に一致しますが、C[.] そのようなコンテキストの範囲を想定しています。


11

同義語と呼ぶのは正しいとは思いません。研究と実装の面でいくつかの重複があります。私はジェイの仕事にまったく精通していませんし、用語書き換えシステムにも少し精通しているだけなので、何かが足りないかもしれません。

一般に、パターンマッチングは次の問題を処理します。構造(ツリー、リスト、またはマルチセット)があり、構造がパターン(またはいくつかのパターンのいずれか)に一致するかどうかを確認します。用語の書き換えシステムでは、用語がパターンに一致するという事実は、その用語を別の用語に書き換えられることを意味しますが、同義語の書き換えではないため、この質問は確かに用語の書き換えに関連しています。(パターンマッチングの書き直しとしての定式化があるかもしれません:「用語を与えられたら、パターンに一致するようにそれを書き直せますか?」しかし私はこれを見なかった。)

関数型プログラミング言語でのパターンマッチングは、フォーカシングの観点から論理的な解釈があります(たとえば、クリシュナスワミの「パターンマッチングに焦点を当てる」を参照)。一方、用語書き換えシステムは、ほとんどの関数型プログラミング言語には存在しないいくつかの等式プロパティを法として一致することがよくあります(MLまたはHaskellのマルチセットとは一致しません)。ただし、関数型言語では、モジュロ等式プロパティのマッチングが存在すべきではないという根本的な理由はありません。


1
ご回答有難うございます。一般に、パターンマッチング用語の書き換えと同義ではありませんが、より基本的なものであることに同意します。しかし、計算能力を備えたシステムはパターンマッチングに基づいていると誰かが言った場合、計算能力を備えた用語書き換えシステムとの違いはわかりません。「論理的な解釈がある」と「いくつかの等式特性」の違いをさらに例示できますか?
ヤコブ

「計算能力を備えた用語書き換えシステムとの違いはわかりません」-これが何を意味するのか分かりません。Martinが言うように、用語の書き換えは計算の一般的なモデルであり、パターンマッチングは機能であり、計算のモデルではありません。
ロブ・シモンズ

「論理的な解釈がある」と「いくつかの等式特性」の違いをさらに例示できますか?-浅い違いはありません-それらは単に異なるプロパティ、リンゴとオレンジです。これら2つの間の実際の接続は、かなり深い研究の質問になると思います!深い推論でパン-alessio.guglielmi.name/res/cosを参照-おそらく意図されています。
ロブ・シモンズ

1

(これをコメントとして書きたいのですが、現時点ではできません。)

私が間違っている場合は修正してください、しかし、私が理解している限り、マーティン・バーガーが彼の優れた答え言ったこととは別に、パターンマッチングと用語書き換えのもう1つの違いは、パターンマッチングルールには固定された順序があります( Haskell's)、用語書き換えルールでは、必ずしもそうではありません。この機能は、予想されるように、ルールの動作(特に、終了)を検討する際に大きな違いを生む可能性があります(「Haskellの優しい紹介、バージョン98」、セクション4.2、または単に階乗「Haskellを学ぶ」の例)。

書き換え理論に精通している人は、そのことについてもっと言う必要があります(たとえば、タイピングはどのようにそのような比較に正確に適合しますか?)、しかし、書き換えという用語はパターンマッチング(少なくともHaskellのような言語で実装されている場合)、両方とも用語関連ルールを単に使用するデバイスとして(どちらかと言えば)見ることができる程度まで。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.