問題タブ [s-combinator]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
functional-programming - SKK と II がベータ版であることを証明するには、ラムダ計算
私はラムダ計算が初めてで、次のことを証明するのに苦労しています。
SKK と II はベータ版に相当します。
どこ
S = ラムダ xyz.xz(yz) K = ラムダ xy.x I = ラムダ xx
SKKを開いてベータ削減しようとしましたが、どこにも行きませんでした。S、Kを拡張せずにSKKをさらに削減できるとは思わないでください.
lambda - Erlang の S コンビネータ
私はラムダ計算を学び始めており、Erlang で I、S、K コンビネータを実装する必要があります。もちろん、S、K、I は次の略です。
S = λxyz.xz(yz) K = λxy.x I = λx.x
紙の上で I=SKK 変換を理解するのに問題はありません (ここで提示されているように: SKK と II がベータ版であることを証明するには、ラムダ計算です) が、関数型言語と高次関数に関しては理解できないようです。 ..
私はなんとか I と K を実行しました(モジュールで言ってみましょうtest
):
また、K x (K x) (SKK x = K x (K x)) の実行方法も知っています。
しかし、Sコンビネータを書くことはできません。私は試した:
それでも、SKK x を x に変換することはできません
私はこのように実行しようとします:
私は完全に迷っているので、助けていただければ幸いです。
haskell - ラムダ項から組み合わせ項への変換
ラムダと組み合わせ項を表すデータ型がいくつかあるとします。
ラムダ項の自由変数のリストを取得する関数もあります。
ラムダ項を組み合わせ項に変換するには、抽象的な排除規則が役立ちます。
1) T[x] => x
2) T[(E₁ E₂)] => (T[E₁] T[E₂])
3) T[λx.E] => (KT[E]) (E で x が自由に発生しない場合)
4) T[λx.x] => I
5) T[λx.λy.E] => T[λx.T[λy.E]] (x が E に自由に現れる場合)
6) T[λx.(E₁ E₂)] => (ST[λx.E₁] T[λx.E₂])
この定義は次の理由で有効ではありません5)
:
だから、私が今持っているものは次のとおりです。
私が欲しいのは(私がそれを正しく計算することを願っています):
質問:
ラムダ項と組み合わせ項が異なるタイプの表現を持っている場合、どの5)
ように定式化できますか?
lambda - ラムダ削減は SK = KI を証明します
こんにちは、これらのコンビネータ SK = KI の証明に問題があります
括弧 [] で囲まれた手順は、私が行っている手順を示しているだけです。たとえば、[λxy.x / x] in λyz.xz(yz) は、式 λyz.xz(yz) のすべての x を (λxy.x) に置き換えようとしていることを意味します。
私がこれまでに試したことはSKを減らすことであり、これを得ました:
そしてKIを減らすと、これが得られました:
2 つの答えは、私 (λyz.zz) と λy に等しくないように見えますが。λx.x 誰か私が何を間違えたのか説明してくれませんか? ありがとうございました。
haskell - Haskell の S コンビネータ
Sコンビネータのアナログは、標準関数のみを使用して (方程式で定義せずに)、ラムダ (無名関数) を使用せずに Haskell で表現できますか? のタイプであると期待してい(a -> b -> c) -> (a -> b) -> a -> c
ます。
たとえば、Kコンビネータの類似物はちょうどconst
です。
実際、私は\f x -> f x x
標準関数を使用して関数を表現しようとしていますが、最初から標準の非線形関数を考えることはできません(これは、その引数を複数回使用する関数です)。
lambda - フリップ ラムダを SKI 項に変換する
フリップのラムダを SKI コンビネータに変換するのに問題があります (意味があることを願っています)。これが私の変換です:
B、C、K、Wシステムで正しく理解すると、Cはフリップであり、SKI用語での定義は ですS (S (K (S (K S) K)) S) (K K)
。明らかに、私の答えは C コンビネータと同じではありません...変換に使用したルールは次のとおりです。
私は何が欠けていますか?
haskell - 単純型付けラムダ計算項 (SKK) を入力する方法
単純に型指定されたラムダ計算型チェッカーを実装しようとしています。サニティ テストを実行しているときに (SKK) と入力しようとすると、型チェッカーが次のエラーをスローします。
TypeMismatch {firstType = t -> t, secondType = t -> t -> t}
問題のある用語は明らかに(SKK)です
(\x:t -> t -> t.\y:t -> t.\z:t.x z (y z)) (\x:t.\y:t.x) (\\x:t.\y:t.x)
この Haskell コードをタイプチェックすると正常に動作するため、ポリモーフィズムの欠如から問題が発生すると思います。
しかし、私がタイプを特化した場合:
参考までに、私の型システムは次のように単純です。
data Type = T | TArr Type Type