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

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

3
間に差がある
私は現在ラムダ計算を学んでいて、ラムダ項を書くことの次の2つの異なる種類について疑問に思っていました。 λ X 、Y。x yλxy.xy\lambda xy.xy λ X 。λ yの。x yλx.λy.xy\lambda x.\lambda y.xy 意味やベータ削減を適用する方法に違いはありますか、それとも同じことを表現する2つの方法だけですか? 特にペア作成のこの定義は私に不思議に思いました: ペア =λ X 、Y。λ P 。p x yλxy.λp.pxy\lambda xy.\lambda p.pxy

2
普遍的/既存の定量化?
タイプの普遍的かつ実存的な定量化の目的を理解するのに苦労しています。私は、構造の計算に基づいておもちゃの言語を書いて遊んでいます。理解を深めるために、モルトとヘンクについて読んでいます。 CoCにラムダとフォーラルの両方の抽象化がある理由がわかりません。 (∀ X :A 。B )(λ X :A 。B )(λバツ:あ。B)(\lambda x:A . B) (∀ X :A 。B )(∀バツ:あ。B)(\forall x:A . B) ラムダは、型が手動で渡されるシステムではすべてを包括しているようです。つまり、次のこと (∀ X :* 。λ A :X 。)(∀バツ:∗。λa:バツ。a)(\forall x : *. \lambda a : x. a) と置き換えることができます (λ X :* 。λ A :X 。)(λバツ:∗。λa:バツ。a)(\lambda x : *. \lambda …

1
ML型推論の指数コストの簡潔な例
OCamlのような関数型言語での型推論のコストは非常に高くなる可能性があることに私の注意が向けられました。各式について、対応する型の長さが式の長さに対して指数関数的であるような一連の式があるという主張です。 以下のシーケンスを考案しました。私の質問は次のとおりです。同じ型を実現する、より簡潔な式のシーケンスを知っていますか? # fun a -> a;; - : 'a -> 'a = <fun> # fun b a -> b a;; - : ('a -> 'b) -> 'a -> 'b = <fun> # fun c b a -> c b (b a);; - : (('a -> 'b) -> 'b -> …

2
SK2微積分は完全な基礎ですか?K2は反転Kコンビネーターですか?
具体的には、私は新しい定義されている場合K2K2K_2として K2= λ X 。(λ Y。y)K2=λx.(λy.y)K_2 = \lambda x. (\lambda y. y) の代わりに K= λ X 。(λ Y。x )K=λx.(λy.x)K = \lambda x. (\lambda y. x) だろう{ S、K2、私}{S,K2,I}\{S, K_2,I\} -calculus競合ベースであること? 私の推測は「いいえ」ですSSS、私II、およびK2K2K_2コンビネーターから通常のKコンビネーターを構築することができないように思えるだけですが、従うアルゴリズムがなく、優れているわけでもありません。これらのコンビネータから物事を作ることに関する直感。 あなたが定義できるように思える K2= K私K2=KIK_2 = K I 定期的に{ S、K、(私)}{S,K,(I)}\{S, K, (I)\} -calculus、私は実際の導出を取得することから逆方向に動作しませんでしたKKKの面でK2K2K_2、残りを。 機能的に完全ではなかったことを証明する私の試みは、使用するコンビネーターに関係なく、行き止まり(以前に見た機能)に到達したことを示すために、これらのコンビネーターから達成可能なすべての機能を徹底的に構築することを本質的に試みました。これは必ずしも機能的に不完全なコンビネーターのセットに当てはまるわけではないことを認識しています(たとえば、KKKコンビネーター自体が適用された場合、それ自体が行き止まりになることはありません)。私はいつでもSSSコンビネーターを使用して、私が最終的に行き止まりであると思ったものをこっそり抜け出すことができたので、このアプローチの実現可能性についてはもはや確信が持てません。 StackOverflowでこの質問をしましたが、ここに投稿するように勧められました。私はその投稿についていくつかのコメントを受け取りましたが、それらを正しく理解したかどうかはわかりません。 おまけ:完全な根拠ではない場合でも、結果の言語はチューリング完全ですか?

2
ベータ拡張の合流点
してみましょう→β→β\to_\betaなるββ\betaで-reduction λλ\lambda -calculus。ββ\beta展開←β←β\leftarrow_\betaをt ′ ← βで定義t』←βt⟺t →βt』t′←βt⟺t→βt′t'\leftarrow_\beta t \iff t\to_\beta t'。 ある←β←β\leftarrow_\beta合流?言い換えれば、我々はすべてのためのことを持っていますl 、d、rl,d,rl,d,r、場合l →∗βd←∗βrl→β∗d←β∗rl \to_\beta^* d\leftarrow_\beta^* r、そこに存在するあなたuuようにl ←∗βu →∗βrl←β∗u→β∗rl\leftarrow_\beta^* u \to_\beta^* r? キーワード:上向き合流、逆さCRプロパティ 現地合流(すなわち場合:私は弱い性質を調べることで開始l →βd←βrl→βd←βrl \to_\beta d\leftarrow_\beta r、そしてl ←∗βu →∗βrl←β∗u→β∗rl\leftarrow_\beta^* u \to_\beta^* r)。これが真実であったとしても、ββ\beta展開が終了しないので合流を意味するわけではありませんが、障害を理解するのに役立つと思いました。 (トップ)の両方の減少がトップレベルである場合には、仮説になる(λ X1。b1)a1→ b1[ a1/ x1] = b2[ a2/ x2] ← (λ X2。b2)a2(λx1.b1)a1→b1[a1/x1]=b2[a2/x2]←(λx2.b2)a2(\lambda x_1.b_1)a_1\rightarrow b_1[a_1/x_1]=b_2[a_2/x_2]\leftarrow (\lambda x_2.b_2)a_2。最大αα\alpha -renamingを、私たちはその想定することができバツ1≠ …

1
自己型は帰納的構造の計算を時代遅れにしますか?
自己型は、言語がスコットエンコーディングでエンコードされた代数的データ型を表現できるようにする、構造の計算[1]の拡張です。Scott Encodingは、でパターンマッチングする機能を提供しますO(1)。これは、CCに帰納的定義を含める主な動機の1つです。しかし、自己型ははるかに単純でエレガントな基本理論を実現し、一見すると強力なようです。 セルフタイプは、理論的な観点から、CICを時代遅れにしますか、それとも、CICがSelf Tyesに関して有利であるいくつかの側面がありますか? [1] http://staff.computing.dundee.ac.uk/pengfu/document/talks/mvd-2012.pdf

2
ラムダ計算の組み合わせ解釈
Peter Selingerによれば、ラムダ計算は代数的です(PDF)。この記事の早い段階で彼は言う: ラムダ計算の組み合わせ解釈は、ルールを満たさないため不完全であることが知られています。解釈では、は意味しません(Barendregt、1984)。ξξξλ X 。M = λ X 。NM=NM=NM = Nλx.M=λx.Nλx.M=λx.N\lambda x.M = \lambda x.N 質問: ここでどのような同等性を意味しますか? この同等性の定義を前提として、その意味の反例は何ですか?

2
Hindley-Milner型システムのみを使用してリストを定義する
Hindley-Milner型推論システムが機能し、再帰的レッツ(リンクされたコードではない)もサポートする小さなラムダ計算コンパイラーに取り組んでいます。これは、チューリングを完全にするのに十分であることを理解しています。 問題は、リストをサポートする方法がわからない、またはすでにリストをサポートしているかどうかわからないこと、そしてそれらをエンコードする方法を見つける必要があることだけです。型システムに新しいルールを追加する必要なく、それらを定義できるようにしたいと思います。 私はリストの考えることができる最も簡単な方法xのいずれかであるものとしてあるnull(または空のリスト)、またはANの両方が含まペアxとのリストをx。しかし、これを行うには、ペアとorを定義できる必要があります。 このようにペアを定義できるようです: pair = λabf.fab first = λp.p(λab.a) second = λp.p(λab.b) 以来pairタイプを持つことになりa -> (b -> ((a -> (b -> x)) -> x))、通過した後、と言うintとstring、それはタイプで何かを得たい(int -> (string -> x)) -> xのペアの表現であろう、intとstring。ここで私が気になるのは、それがペアを表す場合、なぜそれが論理的に等価ではなく、命題を意味しないのint and stringかということです。ただし、と同等(((int and string) -> x) -> x)です。まるで、関数のパラメーターとして製品タイプしか持てないかのようです。この答えこの問題に対処しているようですが、彼が使用する記号の意味がわかりません。また、これが製品タイプを実際にエンコードしない場合、上記のペアの定義では実行できなかった製品タイプで実行できることはありますか(同じ方法でnタプルも定義できると考えて)?そうでない場合、これは含意のみを使用して(AFAIK)結合を表現できないという事実と矛盾しませんか? また、合計タイプはどうですか?関数タイプのみを使用してなんとかしてエンコードできますか?もしそうなら、これはリストを定義するのに十分でしょうか?それとも、タイプシステムを拡張せずにリストを定義する他の方法はありますか?そうでない場合、できる限りシンプルにしたい場合、どのような変更を加える必要がありますか? 私はコンピュータープログラマーですが、コンピューターサイエンティストでも数学者でもないので、数学の表記を読むのはかなり苦手です。 編集: これまでに実装したものの技術的な名前はわかりませんが、基本的には、上でリンクしたコードのみです。これは、アプリケーション、抽象化、変数のルールを使用する制約生成アルゴリズムですHinley-Milnerアルゴリズムから、次に主要な型を取得する統合アルゴリズムから。例えば、式は\a.aタイプが得られるa -> a、と表現は、\a.(a a)チェックエラーが発生したスローされます。これに加えて、letルールはありませんが、次の疑似コードのような再帰的なグローバル関数を定義できる同じ効果を持つように見える関数があります。 GetTypeOfGlobalFunction(term, globalScope, nameOfFunction) { // …

3
匿名ラムダ関数(関数型プログラミング)
匿名(ラムダ)関数とは何ですか?関数型プログラミング言語における無名関数の正式な定義は何ですか? 簡単に言うと、scheme / lispでプログラミングしているとき、匿名(ラムダ)関数は識別子にバインドされていない関数だと思います。 ラムダ関数について正式に言えるのはそれだけですか?この単純な定義に追加できる詳細があると思います。詳しく説明していただき、ありがとうございます。

1
教会の数字を含むラムダ計算の評価
教会の数字 がλs のように見えることを理解しています。λ Z 。s(... n回...)。何よりも「機能よりも、この手段適用されたファンクション回」。cんcnc_nλ sの。λ Z。sλs.λz.s\lambda s. \lambda z. ss n zszszs\;zsssんnnzzz 関数の可能な定義は次のとおりです:。身体を見ると、その機能の背後にある論理がわかります。しかし、評価を開始すると、行き詰まります。例を挙げて説明します。TはiがmはE 、S = λ M 。λ nは。λ sの。メートルトンの私のメートルe stimes\mathtt{times}トンの私のメートルE S =λM。λnは。λsの。メートル(ns )times=λm.λn.λs.m(ns)\mathtt{times} = \lambda m. \lambda n. \lambda s. m \; (n\; s) (λ M 。λ N 。λ S 。M(nS ))(λ S 。λ Z。ssz)(λ S 。λ …

5
ラムダ計算ジェネレータ
他にこの質問をする場所がわからないので、ここがいい場所だといいのですが。 ラムダ計算ジェネレータを作成することが可能かどうか知りたいだけです。基本的に、無限の時間を与えられて、可能なあらゆるラムダ計算関数を生成するループ。(文字列の形のように)。 ラムダ計算は非常に単純であり、その表記にいくつかの要素しかないため、最も単純な組み合わせから始めて、その表記要素のすべての可能な組み合わせを生成し、それによってすべての可能なラムダを生成することは可能かもしれないと考えました微積分関数。 もちろん、ラムダ計算についてはほとんど何も知らないので、これが本当に可能かどうかはわかりません。 それは...ですか?もしそうなら、私が想像したようにそれはかなり簡単ですか、それとも技術的には可能ですが、実際には不可能であるほど難しいですか? PS。私はベータ削減関数について話しているのではなく、すべてのラムダ計算関数のすべての有効な表記について話しているだけです。

1
関数型プログラミング言語の実装に関するアルゴリズムの複雑さの分析
今日、アルゴリズム分析は計算モデルに基づいて異なることを学びました。それは私が考えも聞いたこともないものです。 User @chiが私に与えた、それをさらに説明する例は次のとおりです。 たとえば、タスクを考えてみましょう: がx iを返し ます。RAM では 、配列アクセスが一定時間であるため、これはO (1 )で解決できます。TMを使用して、入力全体をスキャンする必要があるため、O (n )です。(i,x1,…,xn)(i,x1,…,xn)(i,x_1 ,…,x_n )xixix_iO(1)O(1)O(1)O(n)O(n)O(n) これは、関数型言語について不思議に思います。私の理解から、「関数型言語はラムダ計算に密接に関連しています」(ここでの Yuval Filmusのコメントから)。では、関数型言語がラムダ計算に基づいているが、RAMベースのマシンで実行されている場合、純粋に関数型のデータ構造と言語を使用して実装されたアルゴリズムで複雑さ分析を実行する適切な方法は何ですか? 私は純粋に機能的なデータ構造を読む機会がありませんでしたが、件名についてWikipediaのページを確認しました。データ構造のいくつかは、従来の配列を次のものに置き換えているようです。 「配列は、純粋に機能的な実装を認めるマップまたはランダムアクセスリストに置き換えることができますが、アクセスと更新の時間は対数です。」 その場合、計算モデルは異なりますよね?

2
ラムダ計算を研究に関連させるものは何ですか?
私は来年の秋にコンピュータサイエンスの学部課程を始めていますが、関数型プログラミングのコンテキストでのλ計算については本当に理解できません。私はこれを完全に誤解しているかもしれませんが、スタンフォード哲学百科事典のこの定義に基づくと、これは関数のもう1つの表記法です。 それは場合であることだけで、なぜそれが計算アルゴリズムの実行時に通常の関数表記上λ計算を使用するのが有利ですか?

1
λ-calculus:関数のメモリ表現で最も効率的なものは何ですか?
関数エンコード(チャーチ/スコット)と従来エンコード(アセンブラ/ C)のデータ構造のパフォーマンスを比較したいと思います。 しかし、その前に、メモリ内の関数表現がどれほど効率的/であるかを知る必要があります。もちろん、関数は部分的に適用することもできます(別名、クロージャ)。 現在の一般的な関数型言語(Haskell、ML)のエンコードアルゴリズムの使用と、達成可能な最も効率的なアルゴリズムの両方に興味があります。 ボーナスポイント:マップが(ネイティブ整数にエンコードされた整数を機能するようなエンコーディングありshort、intCでなどで)。可能ですか? パフォーマンスに基づいて効率を評価します。言い換えれば、エンコーディングが効率的であるほど、関数型データ構造を使用した計算のパフォーマンスへの影響は少なくなります。

1
スーパーユニバースとは?
私はこのよく知られている論文をType TheoryのUniversesで読んでいます。最初Setωはアグダと似たようなものを期待していましたが、もっと一般的なものであることがわかりました。それは、単純な帰納的再帰型からバインダーへの宇宙構築を一般化しているようです(やΣと同様)。私が聞きたい主な質問は、その背後にある意図は何ですか?ΠΠ\PiΣΣ\Sigma 以下は、通常のTarskiスタイルのユニバースを定義するいくつかのイドリスコードです。 mutual public export data U : (level : Nat) -> Type where GroundU : Ground -> U level BinderU : Binder -> (a : U level) -> (b : (x : T {level} a) -> U level) -> U level UnivU : U (S level) LiftU : …

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