tag:crieit.net,2005:https://crieit.net/tags/SKI%E3%82%B3%E3%83%B3%E3%83%93%E3%83%8D%E3%83%BC%E3%82%BF%E3%83%BC%E8%A8%88%E7%AE%97/feed
「SKIコンビネーター計算」の記事 - Crieit
Crieitでタグ「SKIコンビネーター計算」に投稿された最近の記事
2022-12-17T01:03:37+09:00
https://crieit.net/tags/SKI%E3%82%B3%E3%83%B3%E3%83%93%E3%83%8D%E3%83%BC%E3%82%BF%E3%83%BC%E8%A8%88%E7%AE%97/feed
tag:crieit.net,2005:PublicArticle/18335
2022-12-16T23:34:07+09:00
2022-12-17T01:03:37+09:00
https://crieit.net/posts/SKI
SKIコンビネーター計算<導入偏> ツイートまとめ
<p><a target="_blank" rel="nofollow noopener" href="https://twitter.com/muzudho1/status/1603739785415495680?s=20&t=XLplLsYZbyCB81DUA7PWPw">https://twitter.com/muzudho1/status/1603739785415495680?s=20&t=XLplLsYZbyCB81DUA7PWPw</a></p>
<pre><code class="plaintext">#プログラミング
SKI コンビネーター計算の話をする。ヒマなので😪💤💤
コンビネーターという言葉をまず聞かない( ̄ー ̄)
コンビネーションはまだ聞くだろ( ̄ー ̄) 3 C 3 なら 1 ( ̄ー ̄)
何か関係あんの? というと 似たようなもので 違うもの( ̄ー ̄)
</code></pre>
<pre><code class="plaintext">仮に 卵 という字の右側に 卵 が並ぶと、2つ合わせて 鶏 になるというルールがあるとしよう( ̄ー ̄)
卵
が1個なら永遠に卵だが、
卵卵
なら、
鶏
になる( ̄ー ̄)
</code></pre>
<pre><code class="plaintext">卵草卵卵
なら、左端の卵の右隣に草がきている( ̄ー ̄)
その場合のルールは定めていないので
計算終了( ̄ー ̄)
右に2つの卵が並んでいるが、
それを先に計算するようなルールは無いので
計算しない( ̄ー ̄)
</code></pre>
<pre><code class="plaintext">じゃあ 卵の右隣に草が来たら 2つ合わせて1つの卵にしようぜ?
というようなルールを作ったら どうなるか( ̄ー ̄)?
卵草卵卵
は、
卵卵卵
になるな( ̄ー ̄)
</code></pre>
<pre><code class="plaintext">すると まだ計算は続行できそうだ( ̄ー ̄)
卵卵卵
なら、
鶏卵
になるな( ̄ー ̄)
鶏の右隣に卵が並んだときの計算は定義されていないので、
これで計算は終了だぜ( ̄ー ̄)
</code></pre>
<pre><code class="plaintext">じゃあ 鶏の右隣に卵が来たら 2つ合わせて 草にしようぜ?
というルールを追加してみよう( ̄ー ̄)
鶏卵
なら、
草
になるな( ゚ー゚) 草の右隣が無いときの計算ルールは定義されていないので、計算はこれで終了だぜ( ゚ー゚)
</code></pre>
<pre><code class="plaintext">すると、
卵草卵卵
は、最終的には
草
になるわけだぜ( ゚ー゚)
このとき、登場した 卵、草、鶏を
卵コンビネーター、
草コンビネーター、
鶏コンビネーター
という( ゚ー゚)
</code></pre>
<pre><code class="plaintext">モイセイ・シェインフィンケリという おっさん が、
こういうことを最初にやっていて、
Sコンビネーター
Kコンビネーター
Iコンビネーター
の計算ルールを定義した( ゚ー゚)
</code></pre>
<pre><code class="plaintext">だが お前らは アルファベットを見ると眠くなって寝てしまうので
S、K、I 以外の話をする( ゚ー゚)
</code></pre>
<pre><code class="plaintext">例えば、計算ルールの定義を
次のように書くとしよう
鶏 ← 卵卵
これは、卵の隣に卵が並んだら、2つ合わせて 1つの鶏になる
ということを表した書き方と、ここで勝手に決めた( ゚ー゚)
</code></pre>
<pre><code class="plaintext">ここで、現代風に 補助線を引くとしよう( ゚ー゚)
鶏 ← 卵卵
は、
鶏 ← 卵(卵)
という風に、卵の右隣の1個を丸カッコで囲む( ゚ー゚)
これは現代で言う 関数 の、祖先にあたる( ゚ー゚)
</code></pre>
<pre><code class="plaintext">じゃあ、 卵が関数名なら、
卵(卵)
卵関数の 丸カッコの引数の中に また卵という関数名 が入ってるの おかしいじゃないか、という人もいるかも知れない
関数の引数に 関数名を入れていいのか?
良いのだ( ゚ー゚)
これを現代で言うと 関数も第一級のオブジェクト という( ゚ー゚)
</code></pre>
<pre><code class="plaintext">計算は左から始めるというのを 左結合 という
卵草卵卵
に補助線を引くと
<span>{</span><span>{</span>{卵草}卵}卵}
で、内側の波カッコから計算する( ゚ー゚)
</code></pre>
<pre><code class="plaintext"><span>{</span><span>{</span>{卵草}卵}卵}
を、現代の関数風に書くと以下のようになる( ゚ー゚)
卵(草)(卵)(卵)
何も嬉しくないやんけ! と思うかも知れないが
補助線の引き方の一例だ( ゚ー゚)
</code></pre>
<pre><code class="plaintext">こんな話 もう眠い と思うやつが
1学級40人のうち40人だと
計算機科学は発展しないが、
毎年 全国に1人居れば 十分すぎると思う( ̄ー ̄)
そのようなレベルの話をするやつ
よほど ヒマ人( ̄ー ̄)
</code></pre>
<pre><code class="plaintext">次に 皿コンビネーター を新しく定義してみよう
卵 ← 皿(草草)
皿の右隣に 草が2つ並んでいると
3つ合わせて 1つの卵 になる
という計算ルールも許容する( ゚ー゚)
補助線を外すと
卵 ← 皿草草
</code></pre>
<pre><code class="plaintext">じゃあ
皿草草草皿草草皿草草
は、
卵草皿草草皿草草
だな( ゚ー゚)
</code></pre>
<pre><code class="plaintext">計算の優先順位を指定できるように、 波カッコを許容しよう( ゚ー゚)
{皿草草}草{皿草草}{皿草草}
は
卵草卵卵
だ( ゚ー゚)
</code></pre>
<pre><code class="plaintext">ここで 後先考えず 適当に
草 ← 草皿
と定義しよう( ゚ー゚)
すると
皿草草草 は 卵草
草皿草草 は 草草草
のように1文字ずれるだけで結果は異なる( ゚ー゚)
</code></pre>
<pre><code class="plaintext">計算が途中ですぐ止まってしまうの
面白くないだろ
じゃあ、なるべく面白い計算ルール何か無いの?
で 一番ええ感じ のルールが
SKIコンビネーター計算
というわけだ( ゚ー゚)
これに ハスケル・カリー という おっさんが はまっていたらしい( ゚ー゚)
</code></pre>
<pre><code class="plaintext">導入は書いたので あとは 勝手に調べろだぜ 寝る😪💤💤
</code></pre>
<p><a target="_blank" rel="nofollow noopener" href="https://twitter.com/muzudho1/status/1603765257096527872?s=20&t=WGyqSu2YgVEw1ujKdxj4GQ">https://twitter.com/muzudho1/status/1603765257096527872?s=20&t=WGyqSu2YgVEw1ujKdxj4GQ</a></p>
<pre><code class="plaintext">計算していて面白い、
そんな計算ルールは 突き詰めると
チューリング完全
な特徴を備える( ̄ー ̄)
そして SKIコンビネーター計算は
チューリング完全 な計算の中でも
特に簡単なやつ と言われる( ̄ー ̄)
では、チューリング完全とは何だろうか( ̄ー ̄)?
</code></pre>
<pre><code class="plaintext">計算は 大雑把にいって、次の2つのどちらかだ( ̄ー ̄)
開始して、いつか止まる
開始して、永遠に止まらない
どちらも計算。
これは ハードウェアの電源を抜くと止まるという話しではなく、
計算を続けても、その計算は終わりがないという話だ( ̄ー ̄)
</code></pre>
<pre><code class="plaintext">簡単なのは 割り算( ̄ー ̄)
例えば 100÷5 は 20
これは筆算が止まっている
例えば 100÷3 は 33.3333333
これは計算が止まらない
いい加減なところで強制終了させる指定があるはずだ( ̄ー ̄)
このどちらも計算だ( ̄ー ̄)
</code></pre>
<pre><code class="plaintext">で、特に重要なのが
100÷3=33.33333333
を計算している途中で 何をしているのかというと、
÷3、÷3、÷3、 ということを永遠にしている。
これは 計算可能 の重要なところだ。
では、それ以外のケースは何だろうか( ̄ー ̄)
つまり 計算不能 とは何か( ̄ー ̄)
</code></pre>
<pre><code class="plaintext">例えば
式を鉛筆で書いている途中で ルールで定義されていない書き方が登場したというような 不備 とか、
解釈次第で どっちとも言えるケースがあり
人によって答えが変わる 不定 とか、
そういうのがあると 計算不能だ( ゚ー゚)
</code></pre>
<pre><code class="plaintext">逆説的に言うと
コンピューターにできるようなことは 計算可能だ
というか実際は
人間は頭が良すぎて、ルール上不備があることでも独自解釈して 自分の裁量で、あるいは裁量を超えてでも やってしまう( ゚ー゚) これが、計算不能だ( ゚ー゚)
</code></pre>
<pre><code class="plaintext">なんも頭を使わなくても 解釈に ぶれ も生じず せっせと動けるようなものを 計算可能 と呼んでいる( ゚ー゚)
</code></pre>
<pre><code class="plaintext">特に、
計算した結果を使って、
また次の計算ができる
これを次のように言い替える。
状態1
計算した結果は、状態2だ
状態2
計算した結果は、状態3だ( ゚ー゚)
</code></pre>
<pre><code class="plaintext">これを まとめて言うと
状態n
計算した結果は、状態n+1だ
変数便利だ( ゚ー゚) これだと自然数の数え上げだよな( ゚ー゚)
</code></pre>
<pre><code class="plaintext">その、
n+1
のとこを どんなけ 色々書けるか、
というぐらいの違いが 計算可能 の言いたいことと言える( ゚ー゚)
</code></pre>
<pre><code class="plaintext">SKIコンビネーター計算は、
その n+1 の換わりに、
3種類の演算方法を 定義 しただけだ( ゚ー゚)
それを説明するのに こんなけかかった( ゚ー゚)
</code></pre>
<pre><code class="plaintext">誰も聞いてない 寝よ😪💤💤
</code></pre>
むずでょ