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

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

1
バインディングを持つ言語で用語のアルファ同等性を決定するためのアルゴリズム
次のような変数バインディングを使用する言語のアルファ同値関係に興味があります。 t := x:y 'x belong to y' | bot 'False' | t -> t 'implication' | Ax.t 'forall x, t' または純粋なラムダ計算: t := x 'variable' | (t t) 'application ' | Lx.t 'abstraction: \x -> t' 言語の2つの用語がアルファ相当であるかどうかを判断できるアルゴリズムを探しています。公開されたリファレンスも大歓迎です。私は、Haskellのように、標準的な再帰型として用語のデータ表現を想定しています。 newtype Var = Var Int data Term = Belong Var Var | …

1
ラムダ計算におけるニュートラル/ノーマル形式の直感的な説明
副次表現としてベータredexを含まない通常の用語と他の用語を区別することは可能です data WithBound a = Var | Other a data Normal a = Neutral (Neutral a) | Abstract (Normal (WithBound a)) data Neutral a = Variable a | Apply (Neutral a) (Normal a) このプロパティが保持される理由について、直感的な説明はありますか?十分に長く見た後、どうやら完全に自明であるかもしれませんが、現時点ではすぐにはわかりません。

1
等式タイプ別名J公理の消去規則
私はラムダ計算のインタープリターを実装していますが、今度は等式タイプを追加したいと思います。それの導入ルールは簡単ですが、除去ルールは私にはかなりあいまいです。この stackoverflowスレッドを見つけましたが、J公理を1文だけで説明しています。どのように直感的に理解できますか?

2
NOTの2つのラムダ式の同等性
論理NOT関数の2つの異なるラムダ式を見てきました。 それらの1つは、そのパラメーターを定数にtrue、false内部的に逆の順序で適用します。 NOT=λx.xfalsetrue=λx.x(λt.λf.f)(λt.λf.t)NOT=λx.xfalsetrue=λx.x(λt.λf.f)(λt.λf.t)NOT \;\;=\;\; \lambda x.\; x \; \mbox{false}\; \mbox{true} \;\;=\;\; \lambda x. \; x \; (\lambda t.\lambda f.f) \; (\lambda t. \lambda f. t ) もう1つは、返された関数に外部的に渡す代わりに、さらに2つのパラメーターをキャプチャし、逆の順序でをそれらに適用します。xxx NOT=λx.λt.λf.xftNOT=λx.λt.λf.xftNOT \;\;=\;\; \lambda x. \; \lambda t.\lambda f.xft そのうちもう1つは少しシンプルに見えます(また、バイナリでエンコードすると簡単です)。 だから私の質問はこれです: これらの表現の一方からもう一方に私を連れて行くことができる変換はありますか? それらは「拡張的に」同等である、つまり、どちらも同じ結果を生成することがわかります。しかし、アルファ変換、ベータ変換、エータ変換などの代数変換によって、どういうわけかそれを「証明」したいと思います。残念ながら、この場合これらのどれも私を助けることができません:Alphaは単に名前を変更するためのものです。ベータは関数呼び出しに対してのみ機能しますが、実際に何かを呼び出すまで、これらのすべての式では関数本体(ただし、式全体ではありません)で自由であるため、ここで削減できる関数呼び出しはありません。最も近いのはetaです。これは、拡張等価性と転送パラメーターに関連していますが、パラメーターが逆になっている場合、単純な転送ではなくなり、etaはここでは適用されないようです。xバツxNOT 不足している変換ルールはありますか? (まあ、私は彼らが特別な理由から2つのギリシャ文字をスキップするだけではないでしょうね?) PS:この質問は実際にはモデル1です。拡張機能は同等であるように見えるが、既知の簡約規則に関しては完全に異なるいくつかの異なる形式を持つ他の関数には他にも多くの定義があるためです。私はこの問題の最も単純な例を選びました。 編集: 私が知りたいことをより明確にするために、ここにnot関数の両方のバージョンの削減ステップを示す図があります:http : //sasq.comyr.com/Stuff/Lambda/Not.png ご覧のとおり、どちらも実際には両方とも同じ結果になります(@Jonathan Gallagherが下で言っていたこととは対照的です)。これは、私がすでに知っていることです。それらは合流であり、したがって、Church-Rosserと同等です。しかし、私が知らないのは、ある形式をnot別の形式に変換できる変換ルール(アルファ、ベータ、イータに類似)があるかどうかです。これにより、少なくとも他のいくつかの関数(ここではこれらの2つよりも複雑)も同等であるかどうかを確認できます。これは、可能な答えが2つ以上になる場合は難しい場合があります。私は別のものに1つの内包的定義を変換する可能性がありますいくつかの変換規則があるかどう私が知りたいときは、2つの関数は既に拡張的に同等です(つまり、同じパラメーターに対して同じ結果が得られます)。または、拡張機能が同等であるかどうかがわからない場合でも、何らかの方法で他の関数に変換できる場合は、その方が良いでしょう。

1
ラムダ計算における自由および拘束
Slonnegerの「Syntax and Semantics of Programming Languages」の一部を以下に示します。 変数は、同じラムダ式内でバインドされ、フリーの両方で発生する可能性があります。たとえば、λx.yλy.yxでは、最初のyがフリーで、他の2つはバインドされています。 自由変数は、λxの直後のyであると想定しています。バインドされたyはλy.yで、直感的に把握できます。したがって、((λx.yλy.yx)a)b)は(yλy.ya)b)に減少し、次にbbaに減少しますか?これがどのようになってきたのか誰かが説明できますか?結局、それは式bです。誰かがおそらくバインドされた変数と自由変数のより多くの例を提供できますか?

2
行列乗算プログラムの入れ子ループの不変式
Hoareロジックを使用して2つの行列を乗算するためのプログラムの正確性を証明することについて、卒業論文を作成しています。これを行うには、このプログラムの入れ子ループの不変式を生成する必要があります。 for i = 1:n for j = 1:n for k = 1:n C(i,j) = A(i,k)*B(k,j) + C(i,j); end end end 私は最初に内部ループの不変式を見つけようとしましたが、今までは本当のものを見つけることができません。上記のプログラムの不変式を見つけるのを手伝ってくれる人はいますか?
7 algorithms  loop-invariants  correctness-proof  formal-languages  regular-languages  pumping-lemma  logic  logic  programming-languages  lambda-calculus  term-rewriting  operational-semantics  complexity-theory  time-complexity  computability  proof-techniques  reductions  digital-preservation  distributed-systems  storage  algorithms  dynamic-programming  check-my-algorithm  reference-request  cryptography  quantum-computing  formal-languages  regular-languages  context-free  formal-grammars  algorithms  graphs  network-flow  algorithms  data-structures  randomized-algorithms  lists  computability  proof-techniques  undecidability  terminology  distributed-systems  parallel-computing  artificial-intelligence  heuristics  search-problem  algorithms  computational-geometry  algorithm-analysis  asymptotics  recurrence-relation  mathematical-analysis  master-theorem  algorithms  algorithm-analysis  runtime-analysis  computability  reductions  turing-machines  formal-languages  context-free 

1
IFの削減ルール?
私はSimon Peyton Jonesの「関数型プログラミング言語の実装」を通じて作業しており、20ページで次のように表示されます。 IF TRUE((λp.p)3)↔IF TRUE 3(β赤あたり)(1) ↔(λx.IFTRUE 3 x)(η赤あたり)(2) ↔(λx.3)(3) ステップ1から2は、η変換として説明されます。しかし、2から3までは、「最後のステップはIFの削減ルールである」と述べています。この削減ルールが何であるかわかりません。

1
なぜラムダ抽象化が型なしラムダ計算の値である唯一の項なのですか?
「型なしラムダ計算の唯一の値はラムダ抽象化である」と私は混乱しています。 他の用語が値ではないのはなぜですか?ラムダ抽象化が値であることはどういう意味ですか?最初に頭に浮かんだのは、おそらくラムダ抽象化が唯一可能な正規形であるということでしたが、これはもちろん本当ではありません。例えば(λ X 。x )y→ y(λバツ。バツ)y→y(\lambda x.\; x)\;y \to y。 誰かが私を啓発できますか?
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.