ラムダ計算における未知の関数の関数方程式を解く


14

ラムダ計算の未知の関数の関数方程式を解く技術はありますか?

私はそのように拡張的に定義されたアイデンティティ関数を持っていると仮定します:

バツ=バツ

(つまり、その関数の予想される振る舞いの方程式を書き留めることによって)そして、その関数の内包的な式を取得するために、代数変換を行うによってそれを解決したい:

=λバツバツ

これは、関数がどのように期待どおりに動作するか(つまり、ラムダ計算でどのように実装するか)を示しています。

もちろん、アイデンティティ関数は単なる例として使用されます。このような方程式を解くより一般的な方法に興味があります。特に、次の要件を満たす関数を見つけたいと思います。B

BfλバツM=λバツfM

それは、「注入」は、所与の関数であり、所与ラムダ関数にλ X M の「ボディ」の前にMのでこと、おそらくは離れてそれを取って、新しいものを構築することによって、(いくつかの任意のラムダ式です)関数fが適用されるパラメーターになりました。fλバツMMf

回答:


13

これは既知の問題で、Higher Order Unificationとして知られています。

残念ながら、この問題は一般的に決定できません。Miller's Pattern Fragmentとして知られる決定可能なフラグメントがあります。特に、メタ変数やパターンマッチングを使用した依存型プログラムの型チェックで広く使用されています。このフラグメントは、統一変数が個別のバインドされたプログラム変数にのみ適用される場所です。

このホワイトペーパーでは、高階統合がどのように機能するかについての優れたチュートリアルを提供し、(比較的)簡単な実装について説明します。

残念ながら、関数がこのパターンフラグメントに該当するようには見えません。そうは言っても、私が見ているのは、関数の合成とかなり似ています。次の関数はあなたの財産を満たしますか?

B=λf g x .f (g x)

我々は持っています:

  • B f (λx.M)
  • によって α -equivalence=B f (λy.[y/x]M)α
  • =λx.f ((λy.[y/x]M)x)
  • =λx.f ([x/y][y/x]M)
  • =λx.f M

1
うん、それのように思える:)面白いことは、私はほとんど解決策が、いくつかの理由から、私は呼び出すことを考えていること頂けれ表現めちゃくちゃに、何かにすると「それを実行」します:Q私は逃したものですが変数を外部でバインドされた別の変数に置き換えることができること。(λx.M
バーバラクワーク

1
論文へのリンクもありがとう。チェックアウトします。他の人にもチャンスを与えるために、数日以内にあなたの答えを受け入れます。
バーバラクワーク

3
この高次の統一ですか?質問は、単純に型付けされたラムダ計算ではなく、型付けされていないラムダ計算に関するようです。
ピーターテイラー

2

恒等関数の方程式に関して、私は部分的な答えがあると思います:

Ix=x

私たちは、の公式見つけることによってそれを解決したい形のものであろう、λ P M 、いくつかの未知の表現とMの体などを。元の方程式のIに置き換えてみましょう。I(λp.M)MI

(λp.M)x=x

次に、左側のに関数を適用します。x

M[p/x]=x

しかし、ここには何がありますか?:>この方程式は、その中のpのすべての出現をxで置き換えた後、探している式式であり、その後は右側のように見えるはずだと言っています:)つまり、関数we探していたのは:Mpx

I=(λx.x)

もちろん正しい答えです:)


同じ方法を試して、コンビネータの式を見つけましょう。私たちは、自分自身に適用されると、自分自身に適用される自分自身を生成するような方法で動作することを望んでいます。ω

ωω=ωω

今のための式見つけましょう形式であるλ X M 、いくつかの未知の発現のためのMを。これを方程式に代入すると:ω(λx.M)M

(λx.M)ω=ωω

左側のパラメーターに適用すると、の式が得られます。M

M[x/ω]=ωω

これは、すべての発生置き換えた後と言う中にMω、それは生産ωをxMωなので、置換前の元の式 M xであるべきだと推定できます。ωωMなので、探していた関数は次のようになります。xx

ω=(λx.xx)

確かにそうです:)


しかし、右側がすでに探している形になっていたからといって、とても簡単になるかもしれないと感じています。


M [ x / ω ] = ωからのアルゴリズム的な方法はありますか に対して ω = λ X M[x/ω]=ωωω=(λx.xx)

これら2つの単純な場合–はい、あります。単に置換を逆にします。しかし、私が言ったように、これらのケースは純粋な「運」でうまくいくかもしれません:右側はすでに必要な形になっています。より複雑な例をいくつか試してみたところ、うまくいきませんでした。しかし、それは私が探しているものです:アルゴリズムの方法のために。
バーバラクワーク

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