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

13
型なしラムダ計算のインタープリターを作成する
課題は、型付けされていないラムダ計算のインタプリタをできるだけ少ない文字で記述することです。型なしラムダ計算を次のように定義します。 構文 次の3種類の式があります。 ラムダ式は、フォームがあるいかなる法的な変数名となる可能性が法的表現を。ここはパラメータと呼ばれ、関数本体と呼ばれます。(λ x. e)xexe 簡単にするために、x現在スコープ内にあるのと同じ名前の変数があってはならないという制限を追加します。変数は、その名の間に表示されたときに範囲にあることが始まり(λと.し、対応するの範囲であることを停止します)。 関数適用の形式は(f a)where fおよびaareの正規表現です。ここfは関数とa呼ばれ、引数と呼ばれます。 変数は、フォームがある法的な変数名です。xx 意味論 関数は、関数本体内のパラメーターの各オカレンスを引数で置き換えることにより適用されます。より正式フォームの発現((λ x. e) a)、x変数名、eおよびa式に表現、評価する(又は減少)しているの各発生を交換した結果であるに有します。e'e'xea 正規形は、それ以上評価できない式です。 挑戦 あなたの使命は、それを受け入れることを選択した場合、自由変数を含まない型なしラムダ計算の入力を入力として受け取り、その出力として式の正規形(またはそれに一致する式)を生成するインタープリターを書くことです。式に正規形がないか、有効な式でない場合、動作は未定義です。 文字数が最小のソリューションが優先されます。 いくつかのメモ: 入力は、stdinまたはコマンドライン引数として指定されたファイル名から読み取ることができます(両方ではなく、どちらか一方のみを実装する必要があります)。出力は標準出力に送られます。 または、入力を文字列として受け取り、出力を文字列として返す関数を定義できます。 非ASCII文字に問題がある場合は、\λの代わりにバックスラッシュ()文字を使用できます。 バイトではなく文字数をカウントするため、ソースファイルがUnicodeとしてエンコードされている場合でも、λは1文字としてカウントされます。 有効な変数名は1つ以上の小文字、つまりaとzの間の文字で構成されます(英数字名、大文字、または非ラテン文字をサポートする必要はありません-もちろん、そうすることでソリューションが無効になることはありません)。 この課題に関する限り、オプションの括弧はありません。各ラムダ式と各関数アプリケーションは、ちょうど1組の括弧で囲まれます。変数名は括弧で囲まれません。 書き込みなどの糖衣構文(λ x y. e)のためには(λ x. (λ y. e))、サポートする必要はありません。 関数を評価するために100を超える再帰の深さが必要な場合、動作は未定義です。これは、すべての言語で最適化せずに実装するのに十分なほど低く、ほとんどの式を実行できるほど十分に大きい必要があります。 また、無入力の開始時と終了時または前にスペースすなわち、その間隔は例のようになりますと仮定しないかもしれないλか、.1つだけ空白の後.と関数とその引数の間と後λ。 サンプルの入力と出力 入力: ((λ x. x) (λ y. (λ z. z))) 出力: (λ y. …

22
再帰的な文字列置換
タスク 3つの文字列を指定してA, B, C、Binの各インスタンスがでA再帰的に置換された出力文字列を生成するプログラムまたは関数を記述しCます。再帰的に置換とは、各ステップで重複しないBinのすべてのインスタンスA(左から右に貪欲に選択)がに含まれなくなるCまで置換を繰り返すことを意味BしAます。 入出力 I / Oにはデフォルトのメソッドを使用できます。 文字列には、印刷可能なASCII文字のみが含まれます(また、それらのいずれかが含まれることもあります)。 B一方で、空の文字列になることはありませんAし、Cかもしれません。 文字列はプレーンテキストとみなされます。たとえば、扱うことはできません B。、正規表現パターンとして。 入力の一部の組み合わせは終了しません。これらの場合、プログラムは何でもできます。 テストケース これらは次の形式です。 A/B/C\nOutput Hello, world!/world!/PPCG Hello, PPCG Uppercase is up/up/down Uppercase is down ababababa/aba/ccc cccbcccba delete/e/{empty string} dlt {empty string}/no/effect {empty string} llllrrrr/lr/rl rrrrllll +-+-+-+/+-+/+ + ababababa/aba/bada badabbadbada abaaba/aba/ab abb ((())())())/()/{empty string} ) 終了しない例: grow/ow/oow loop/lo/lo
25 code-golf  string  substitution  code-golf  math  code-golf  string  set-theory  code-golf  code-golf  compile-time  code-golf  kolmogorov-complexity  binary  code-golf  sequence  cops-and-robbers  code-golf  subsequence  card-games  code-golf  sequence  primes  code-golf  code-golf  number  graphical-output  music  code-golf  ascii-art  code-golf  string  lambda-calculus  code-golf  string  code-generation  code-golf  unicode  code-golf  math  combinatorics  code-golf  balanced-string  code-golf  sequence  cops-and-robbers  code-golf  sequence  cops-and-robbers  code-challenge  fastest-code  chess  code-golf  math  graphical-output  code-golf  string  hello-world  animation  code-golf  number  arithmetic  code-golf  integer  code-golf  code-golf  combinatorics  code-golf  kolmogorov-complexity  graphical-output  code-golf  string  code-golf  code-golf  game  code-golf  math  combinatorics  code-golf  ascii-art  popularity-contest  random  code-golf  arithmetic  number-theory  integer  code-golf  tips  underload  code-golf  math  sequence  primes  code-golf  math  path-finding  code-golf  ascii-art  primes  code-golf  kolmogorov-complexity  alphabet 

4
SKIコンパイラーの最適化
SKIの計算は、ラムダ式を使用していないラムダ計算の変種です。代わりに、アプリケーションとコンビネータS、K、およびIのみが使用されます。この課題では、あなたの仕事は、SKI用語をβ標準形のラムダ用語に翻訳することです。 入力仕様 入力は、次のテキスト表現のSKI用語です。オプションの末尾の改行を受け取ることを選択できます。入力は、文字で構成されS、K、I、(、及び)で(ABNF形式で)次の文法を満たすsterm開始記号です。 sterm = sterm combinator ; application sterm = combinator ; sterm = '(' sterm ')' ; grouping combinator = 'S' | 'K' | 'I' ; primitives 出力仕様 出力は、次のテキスト表現の自由変数のないラムダ項です。オプションの末尾の改行を出力することもできます。出力はlterm、開始記号であるABNF形式の次の文法を満たします。 lterm = lterm operand ; application lterm = ALPHA '.' lterm ; lambda lterm = operand operand = '(' …

1
λ式をSK式に変換
λ計算、又はラムダ計算は、匿名関数に基づいて、論理システムです。たとえば、これはλ式です。 λf.(λx.xx)(λx.f(xx)) ただし、この課題のために、表記を簡略化します。 に変更λします\(入力しやすくするため):\f.(\x.xx)(\x.f(xx)) .我々はそれをドロップすることができますので、ラムダヘッダーのは、不要です。\f(\xxx)(\xf(xx)) 使用Unlambdaとスタイルのプレフィックス表記を`(これを行う方法の完全な説明については、参照ではなく2つの関数を書くよりもアプリケーションのためのラムダ計算表記間の変換を):\f`\x`xx\x`f`xx これは最も複雑な代替です。各変数を、その変数が属するラムダヘッダーに対してどれだけ深くネストされているかに基づいて、括弧内の数字で置き換えます(つまり、0ベースのDe Bruijnインデックスを使用します)。たとえば、\xx(恒等関数)では、式を変数から最後までトラバースするときに遭遇する最初の(0から始まる)ヘッダーに属するためx、本文のはに置き換えられ[0]ます。\x\y``\x`xxxyに変換され\x\y``\x`[0][0][1][0]ます。ヘッダーに変数をドロップして、を残すことができます\\``\`[0][0][1][0]。 組み合わせ論理は、基本的にλ計算から作成されたチューリングターピットです(まあ、実際は最初に来ましたが、ここでは無関係です)。 「組み合わせロジックはラムダ計算の変形と見なすことができ、ラムダ式(機能の抽象化を表す)は限定されたコンビネータのセット、バインドされた変数が存在しないプリミティブ関数に置き換えられます。」1 組み合わせロジックの最も一般的なタイプはSKコンビネーター計算で、次のプリミティブを使用します。 K = λx.λy.x S = λx.λy.λz.xz(yz) コンビネータI = λx.xが追加されることもありますが、SKK(または実際SKxにはx)と同等であるため、冗長Iです。 必要なのは、λ計算の任意の式をエンコードできるようにするためのK、S、およびアプリケーションだけです。例として、関数λf.(λx.xx)(λx.f(xx))から組み合わせロジックへの変換を次に示します。 λf.(λx.xx)(λx.f(xx)) = S(K(λx.xx))(λf.λx.f(xx)) λx.f(xx) = S(Kf)(S(SKK)(SKK)) λf.λx.f(xx) = λf.S(Kf)(S(SKK)(SKK)) λf.S(Sf)(S(SKK)(SKK)) = S(λf.S(Sf))(K(S(SKK)(SKK))) λf.S(Sf) = S(KS)S λf.λx.f(xx) = S(S(KS)S)(K(S(SKK)(SKK))) λx.xx = S(SKK)(SKK) λf.(λx.xx)(λx.f(xx)) = S(K(S(SKK)(SKK)))(S(S(KS)S)(K(S(SKK)(SKK)))) プレフィックス表記を使用しているため、これは```S`K``S``SKK``SKK``S``S`KSS`K``SKK`です。 1出典:ウィキペディア チャレンジ 今までに、あなたはおそらく何であるかを推測しました:有効なλ式(上記の表記法)を入力および出力(または返す)としてSKコンビネーター計算で書き直されたプログラムを書く。これを書き換える方法は無限にあることに注意してください。無限の方法のいずれかを出力するだけです。 これはcode-golfであるため、最短の有効な送信(バイト単位で測定)が優先されます。 …

8
逆挿入ソート
目的 挿入ソートの動きから、元のスクランブルリストを生成しますするします。元のリストからすべての数字を持っているだろう0にN-1(包括的)N入力の大きさです。 入力 リストをソートするために必要な移動を含むリスト。各値は、元の(スクランブルされた)番号によって正しい位置に移動するスロットの量を表します。このプロセスは左から右であることに注意してください。入力リストの (0からインデックス付けされた)位置の値は、両端の値を含みます。 無効な入力を処理する必要はありません。この場合、どのような動作も許容されます(クラッシュ、無限ループなど)。i0i 出力 スクランブルリスト 動きを生成するためのステップバイステップ Scrambled List | Moves to sort [4,0,2,1,3,5] | [0, , , , , ] #4 stay in place [4,0,2,1,3,5] | [0,1, , , , ] #0 is moved 1 slot to the left [0,4,2,1,3,5] | [0,1,1, , , ] #2 is …
19 code-golf  array-manipulation  code-golf  code-golf  animation  code-golf  restricted-source  code-golf  java  code-golf  decision-problem  graph-theory  code-golf  conversion  electrical-engineering  code-golf  ascii-art  code-golf  string  substitution  code-golf  math  code-golf  string  set-theory  code-golf  code-golf  compile-time  code-golf  kolmogorov-complexity  binary  code-golf  sequence  cops-and-robbers  code-golf  subsequence  card-games  code-golf  sequence  primes  code-golf  code-golf  number  graphical-output  music  code-golf  ascii-art  code-golf  string  lambda-calculus  code-golf  string  code-generation  code-golf  unicode  code-golf  math  combinatorics  code-golf  balanced-string  code-golf  sequence  cops-and-robbers  code-golf  sequence  cops-and-robbers  code-challenge  fastest-code  chess  code-golf  math  graphical-output  code-golf  string  hello-world  animation  code-golf  number  arithmetic  code-golf  integer  code-golf  code-golf  combinatorics  code-golf  kolmogorov-complexity  graphical-output  code-golf  string  code-golf  code-golf  game  code-golf  math  combinatorics  code-golf  ascii-art  popularity-contest  random  code-golf  arithmetic  number-theory  integer  code-golf  tips  underload  code-golf  math  sequence  primes  code-golf  math  path-finding  code-golf  ascii-art  primes  code-golf  kolmogorov-complexity  alphabet 

4
教会の数字を視覚化する
バックグラウンド λ計算の用語の視覚化 有名なラムダジャグラー(およびコードゴルファー)ジョントランプは、λ計算の用語の興味深い視覚化を考案しました。彼の言葉では: 抽象化(ラムダ)は水平線で表され、変数はバインディングラムダから下に伸びる垂直線で表され、アプリケーションは左端の変数を接続する水平リンクで表されます。 たとえば、ラムダ項λf.λx.f(f(f(fx)))は視覚化に対応します。 ------------------- | | | | ------------------- | | | | | | | | |---- | | |---- | |---- |---- | 上から下に読んでください: 最初の水平線は最初のλを表します。 それから降順の4本の線はfは、体内のます。 同様に、2番目の水平線は2番目のλを表し、それから降順の1本の新しい線はボディのxを表します。 右端のf線とx線は、アプリケーション(f x)を表す水平線で接続されています。 次のアプリケーションは(f(f x))などです。 教会の数字 教会の数字は、次のパターンに取って、λ計算における用語の特定のシーケンスです: 0 = λf. λx. x 1 = λf. λx. f x 2 = …

3
λ計算で数値のリストをソートする
純粋な型付けされていないラムダ計算に、教会でエンコードされた数値のリストに適用されると、昇順または降順で並べ替えられた数値を返す用語を記述します。教会のリストと番号は、通常のADTの折りたたみとしてエンコードする必要があります。 -- Usual ADTs for Lists and Nats (in Haskell, for example) data List a = Cons a (List a) | Nil data Nat a = Succ (Nat a) | Zero -- Their respective folds are the λ-calculus representation used on this challenge church_list = (λ c n . (c …
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.