タグ付けされた質問 「lambda-calculus」

λ-calculusは、関数定義、関数適用、および再帰の正式なシステムであり、関数型プログラミングの数学的基礎を形成します。

7
ラムダ計算は抽象的に見えませんでした。そして、私はそれのポイントを見ることができません
根本的な質問: ラムダ計算は、中学校の代数で一般に学んだ基本的な関数のプロパティと表記法ではできないことを私たちに何をしますか? まず、ラムダ計算の文脈で抽象とはどういう意味ですか?抽象という言葉の私の理解は、概念の概念的な要約である機械から離婚したものです。 ただし、ラムダ関数は、関数名を廃止することにより、特定のレベルの抽象化を防ぎます。例えば: f(x) = x + 2 h(x, y) = x + 5 y しかし、これらの機能の仕組みを定義しなくても、その構成について簡単に話すことができます。例えば: 1. h(x, y) . f(x) . f(x) . h(x, y) or 2. h . f . f . h 必要に応じて引数を含めることも、完全に抽象化して何が起きているのかを概観することもできます。そして、それらをすぐに単一の機能に減らすことができます。構成2を見てみましょう。強調に応じて、学生の詳細なレイヤーを書くことができます。 g = h . f . f . h g(x, y) = h(x, …

3
プログラミング言語理論の勉強
私は最近、(機能的な)プログラミング言語の側面を理解し、証明することに非常に興味を持ちました。 しかし、さらに深く掘り下げていくと、計算、カテゴリー理論、および表示的意味論のようなものは、適切な説明なしに理解するのが少し難しいです。λλ\lambda 私はSICP(非常に啓発的な本)を読みましたが、関数型プログラミングの理論をさらに深く掘り下げたいと思っています。関数型プログラミング言語の理論を一から議論する本/ブログ/サイト/あなたの名前はありますか?

2
ラムダ計算における未知の関数の関数方程式を解く
ラムダ計算の未知の関数の関数方程式を解く技術はありますか? 私はそのように拡張的に定義されたアイデンティティ関数を持っていると仮定します: Ix=x私バツ=バツI x = x (つまり、その関数の予想される振る舞いの方程式を書き留めることによって)そして、その関数の内包的な式を取得するために、代数変換を行うによってそれを解決したい:I私I I=λx.x私=λバツ。バツI = \lambda x.x これは、関数がどのように期待どおりに動作するか(つまり、ラムダ計算でどのように実装するか)を示しています。 もちろん、アイデンティティ関数は単なる例として使用されます。このような方程式を解くより一般的な方法に興味があります。特に、次の要件を満たす関数を見つけたいと思います。BBB Bf(λx.M)=(λx.fM)Bf(λバツ。M)=(λバツ。fM)B\;f\;(\lambda x.M) = (\lambda x.f M) それは、「注入」は、所与の関数であり、所与ラムダ関数に(λ X 。M )の「ボディ」の前にMのでこと、おそらくは離れてそれを取って、新しいものを構築することによって、(いくつかの任意のラムダ式です)関数fが適用されるパラメーターになりました。fff(λx.M)(λバツ。M)(\lambda x.M)MMMfff

1
Hindley-Milnerアルゴリズムがt1-> t2のような型を生成しないのはなぜですか?
私が読んだヒンドリー-ミルナータイピングアルゴリズムの実装を書いている間、あなたは常に引数は、最終的なタイプを決定する原子の種類やタイプのいずれかを取得します、限り、すべての変数がバインドされると、それを見る、などt1 -> t1か(t1 -> t2) -> (t1 -> t2)ここでt1およびt2は型変数です。 私はあなたのような何かを取得したい方法を考えることはできませんt1 -> t2か、単にt1私が表現の実際の型を判別する方法がないので、アルゴリズムが壊れている意味するであろう理解し、。すべての変数がバインドされている限り、これらの「壊れた」タイプのような型を決して取得しないことをどのように確認しますか? 私はアルゴリズムが変数を持つ型を生成することを知っていますが、関数に引数を渡すと、これらは常に解決されますが、typeを持つ関数ではそうではありませんt1 -> t2。これが、アルゴリズムがそのような型を決して生成しないことを確認する方法を知りたい理由です。 (MLでこれらの「壊れた」型を取得できるようですが、ラムダ計算について質問しています。)


2
ラムダ計算の「適用順序」と「通常順序」
適用順序:関数自体を評価する前に、常に関数の引数を完全に評価します- (λx.x2(λx.(x+1) 2)))→(λx.x2(2+1))→ (λx.x2(3))→ 32 → 9(λx.x2(λx.(x+1) 2)))→(λx.x2(2+1))→ (λx.x2(3))→ 32 → 9(\lambda x. x^2(\lambda x.(x+1) \ \ 2))) \rightarrow (\lambda x. x^2(2+1))\rightarrow \ (\lambda x. x^2(3)) \rightarrow \ 3^2 \ \rightarrow \ 9 通常の順序:式はのように外側から縮小されます- (λx.x2(λx.(x+1) 2))→ (λx.(x+1) 2)2→ (2+1)2 →32 → 9(λx.x2(λx.(x+1) 2))→ (λx.(x+1) 2)2→ (2+1)2 →32 → 9(\lambda x.x^2 …


3
微積分とプログラミング言語の違いは何ですか?
私は微積分学と呼ばれるものとプログラミング言語と呼ばれるものについてかなり混乱していると思います。 私は、微積分はプログラムの等価性について推論するための正式なシステムであると考える傾向があり、言われたかもしれません。プログラムには、マシンによって指定された操作上のセマンティクスがあります。このようにして、言語Lの(正しい)計算LLLは、プログラムの等価性の証明方法です。 これは私にとって合理的な分割のように思えますが、これは一般に受け入れられている意味ですか?それとも間違っているのでしょうか? 関連して、なぜいくつかの操作上のセマンティクスは非決定的です(コンフルエントであると仮定します)?戦略の選択を自由にしておくことから何が得られますか? これらについて明確に説明していただければ幸いです。さらに具体的なリファレンス!ありがとう!

1
コンビネータ計算式で計算できる関数は何ですか?
コンビネーター式(SKベースで言う)は、コンビネーター計算式をコンビネーター計算式にマッピングする関数と考えることができます。つまり、式は関数として考えることができます。ここで、はSK基底の構文的に有効なすべての組み合わせ式のセットです。このマッピングは、入力を式に適用し、通常の形式に縮小して出力を取得することにより実行されます。X :L → L LバツXXバツ:L → LX:L→LX:L \to LLLL SK基底はチューリング完全であるため、からまでの計算可能な関数を実装するSK式が存在すると単純に考えるかもしれません。ただし、削減の結果は常に通常の形式になるため、これは明らかに当てはまりません。これは、通常の形式ではない出力を式が持つ方法がないことを意味します。L LバツXXLLLLLL その代わり、SK計算式はをマッピングするものと考えることができます。ここで、は通常の形式のSK式のセットです。計算可能なマップには、このマップを実装するSK式がありますか?または、この方法でコンビネータ計算式によって計算できる関数のセットにさらに制限がありますか?L ′ L ′ f :L ′ → L ′ XL′L′L'L′L′L'L′L′L'f:L′→ L′f:L′→L′f:L'\to L'バツバツX


3
純粋なラムダ計算のクイン
純粋なラムダ計算のクインの例をお願いします。グーグルで見つけることができなかったことに非常に驚いた。馬のページには、多くの「実際の」言語のクインがリストされていますが、ラムダ計算のクインはリストされていません。 もちろん、これはラムダ計算のクインによって私が意味することを定義することを意味します。(私は非常に具体的な何かを求めています。) Larkin and Stocks(2004)などのいくつかの場所では、「自己複製」式として引用されている次のように見えます:。これは、単一のベータ削減ステップの後、それ自体に還元され、なんとなく馬鹿げた感じを与えます。しかし、それは終了しないという点で非ウマのようなものです:さらなるベータ削減は同じ表現を生成し続けるので、通常の形式に決して縮小しません。私にとっては、クインはそれ自体を終了して出力するプログラムなので、そのプロパティを持つラムダ式が必要です。(λ X 。Xx )(λ X 。Xx )(λx.xx)(λx.xx)(\lambda x.x \; x)\;(\lambda x.x \; x) もちろん、redexesを含まない式はすでに通常の形式になっているため、終了して出力されます。しかし、それはあまりにも簡単です。だから、私はそれが重要な解決策を認めることを期待して、次の定義を提案します: 定義(仮):ラムダ計算のクインは、ような形式の式です (は特定のラムダ計算式を表します)なる、または、正常形に還元変数名の変更、下にそれと同等のものの任意の入力。(λ X 。A )(λx.A)(\lambda x . A)AAA((λ X 。A )y)((λx.A)y)((\lambda x . A)\,\, y)Y(λ X 。A )(λx.A)(\lambda x . A)yyy ラムダ計算が他の言語と同等のチューリングであるとすれば、これは可能だと思われますが、私のラムダ計算は錆びているので、例を考えることはできません。 参照 ジェームズ・ラーキンとフィル・ストックス。(2004)「ラムダ計算における自己複製式」情報技術の研究と実践の会議、26(1)、167-173。 http://epublications.bond.edu.au/infotech_pubs/158

2
高階関数は、関数型プログラミングにより強力な機能を提供しますか?
cstheory.SEについても同様の質問をしました。 Stackoverflowのこの回答によれば、非遅延純粋関数型プログラミング言語では複雑さを持つアルゴリズムがありますが、命令型プログラミングの同じアルゴリズムはです。FP言語に遅延を追加すると、アルゴリズムはます。Ω (n logn )Ω(nログ⁡n)\Omega(n \log n)Ω (n )Ω(n)\Omega(n)Ω (n )Ω(n)\Omega(n) 高階関数がある場合とない場合のFP言語を比較する同等の関係はありますか?まだチューリング完了ですか?もしそうなら、FPの高次の欠如は、言語の「強力」または効率を低下させますか?

2
ラムダ計算:コンテキストと評価コンテキストの違い
まず、以下のテキストにエラーが含まれている可能性があると言いたいので、質問の定式化の誤りをお気軽に指摘してください。 次の構文で用語が指定されているブール値とif文を含む型なしラムダ計算について考えてみましょう。 t ::= v | t t | if t t t | x v ::= \x.t | #t | #f この場合のコンテキストCは、次の構文に従って与えられます。 C ::= [-] | \x. C | C t | t C | if C t t | if t C t | if t t C …

4
誰かが、文脈依存の文法の単純ではあるがおもちゃではない例を与えることができますか?
文脈依存文法を理解しようとしています。 言語が好きな理由がわかります {ww∣w∈A∗}{ww∣w∈A∗}\{ww \mid w \in A^*\} {anbncn∣n∈N}{anbncn∣n∈N}\{a^n b^n c^n \mid n\in\mathbb{N}\} 文脈自由ではないが、型付けされていないラムダ計算に似た言語が文脈依存であるかどうかを知りたい。 シンプルだが、おもちゃではない例(上記のおもちゃの例を検討します)、いくつかの生産規則のために、たとえば記号の文字列の有無を伝えることができる文脈依存文法の例を見てみたい現在スコープ内にあります(たとえば、関数の本体を生成する場合)。 文脈依存文法は、未定義/未宣言/非バインド変数を構文上の(意味ではなく)エラーにするほど強力ですか?

1
何である
私は構造の計算とラムダキューブ内のその場所を見ています。 私が正しく理解していれば、立方体の各軸は、単純に型付けされた計算型を含む別の演算を追加するものと考えることができます。最初の軸は、型から用語への演算子、2番目の型から型への演算子、3番目の依存型付け、または用語から型への演算子を追加します。CoCには3つすべてがあります。λ→λ→\lambda_\to しかしながら、COCが用語の導入こと、および状態のP R O P :T Yのp個のEによって推論ルールが、それ以外は使用されません。私はそれが代名詞の命題に対するものであることを理解していますが、論理的な命題はそれに関して定義されていません。PR O PPropPropPr o p :Typ個の電子Prop:TypeProp : Type が何のためにあるか、どこに/いつ現れるか、そしてキューブの軸の観点から説明してください(実際にそうすることが可能な場合)。PR O PPropProp

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