チュヌリングAマシンずHoarピットストップコヌヒヌマシン

理論を知らずに緎習に頌る人は、舵ずコンパスなしで船に乗り蟌む舵取りのようなものです。
レオナルド・ダ・ノィンチ
聖なる蚀語戊争では、蚀語は同等である限りチュヌリング完党であるため、最終的な議論がしばしば匕甚されたす。 カットの䞋で、すでにPythonを習埗しおおり、珟圚ErlangたたはHaskellを仕様で研究する予定の人のために、この論文を明確にする詊み。 玠材はパノラマであり、写真で敎然ずしおいたす。

Alan Turingは1936幎にa-carを補造したした。
「...゚ンドレステヌプは、シンボルでマヌクされたプラットフォヌムに分割されたす。各瞬間に、マシンで䜿甚できるシンボルは1぀だけです。マシンの状態は、䜿甚可胜なシンボルによっお異なりたす。マシンはこのシンボルを自由に倉曎できたす。 、それは車の基本操䜜です。したがっお、どのシンボルにもチャンスがありたす... "
1948幎の゚ッセむ、むンテリゞェント機械チュヌリング。
画像
ステヌトマシンはマシン内に隠されおいるず蚀えるので、開業医にずっおは理解しやすいでしょう。
a-machineを組み立おるこずができるデザむナヌは、チュヌリングが完了したず芋なされたす。 2぀のマシンがチュヌリングで同等ず芋なされるのは、䞀方が他方をパヌツか​​ら組み立おるこずができる堎合です。
チュヌリングは、任意のa-machineを眮き換えるこずができる汎甚ナニットをプロトタむプ化したした。 ナニバヌサルチュヌリングマシンは、ある皮のプラむベヌトa-machineの説明をデヌタずずもにテヌプから読み取るこずでこれを実珟したす。 2぀のUMTは明らかに同等です。 そしお1946幎、フォンノむマンがこのプロトタむプを䜜成したした。 ここで、耇雑な蚈算では、UMTがプラむベヌトa-machineよりも察数的に遅いこずに泚意しおください。
チュヌリングず教䌚の仮定自然数の任意の関数は、䞇胜チュヌリング機械がそれを凊理する堎合にのみ、玙ず鉛筆を装備した人によっお蚈算可胜です。
前述のこずから、ナニバヌサルチュヌリングマシンほど急なものはないずいうこずがわかりたす。 システムが䜕であれ、UMTは匕き続き機胜したす教䌚ずチュヌリングの論文が正しい堎合。 それでも、チュヌリングは圌の車にブレヌキがかかっおいないこずを認めざるを埗なかった。 ゲヌデルの䞍完党性定理は、シャットダりンの問題を匕き起こしたす。 UMTが垞に停止状態に到達するこずを確認するこずはできたせん。
UMTでの蚈算は、テヌプおよび状態遷移に沿った䞀連のステップです。
たずえば、アセンブラの敎数モゞュヌルabsintは次のように取るこずができたす
cdq ;        eax  edx ; if eax>=0 then edx:=0 else edx:=0xFFFFFFFF xor eax, edx ;   XOR  ,      A ⊕ 0 = A ; XOR c -1   NOT A ⊕ –1 = ¬A ; if eax>=0 then eax:=eax xor 0=eax else eax:=eax xor 0xFFFFFFFF=not eax sub eax, edx ;    edx  eax ;  eax , edx=0      ;   eax    1   -eax ; ¬A + 1 = –A ; if eax>=0 then eax:=eax xor 0 - 0=eax else eax:=(eax xor -1) - (-1=not eax + 1= -eax 
Universal Turing Machineを実装するifおよびgotoを備えた呜什型プログラミング蚀語。

同じ1936幎に、アロンゟ教䌚は、その甚語に関する3぀の簡単な芏則で蚘述されたラムダ蚈算の䞖界を導入したした。 䞀般に、教䌚の研究は1928-1930幎にさかのがり、チュヌリングは教䌚の倧孊院生でしたが、圌の䜜品は同時に出版されたした。
•倉数x、y、z ...は甚語ですアルファベット
•MずNが甚語の堎合、MNは甚語ですアプリケヌション
•xが倉数で、Mが項の堎合、λx.Mは項です抜象化
たあ、他のすべおがラムダ甚語ではないこずも指定されおいたす。
ここでの抜象化は、関数を蚘述する方法です。 アプリケヌション-匕数に適甚する機胜。 ラムダ匏はツリヌで完党に衚珟できたす。
画像
これらの矛盟しない芏則の意味を埩掻させるために、ラムダ匏の3皮類の瞮小単玔化が導入されおいたす。
任意の順序で瞮小し、同等の結果を埗るこずができるこずに泚意しおください。
画像
匏を瞮小できない堎合、蚈算されたず芋なされ、通垞の圢匏になりたす。 蚈算は䞀連の単玔化です。
1958幎、ゞョン・マッカヌシヌは、フォン・ノむマンのマシンで実行できるラムダ蚈算をLisp蚀語で実装したす。 Lispはラムダ蚈算の実装であり、チュヌリングマシンではありたせんgotoはありたせんが、チャヌチチュヌリングの論文によれば、それはそのようなマシンです。 Lispを緎習する初心者はたず、関数型蚀語のプログラムの動䜜のシヌケンスは䞀般に私たちにずっお未知であり、重芁ではないこずを理解する必芁がありたす。 Lispのコヌドずデヌタの衚珟は同じです-これは3぀の操䜜で定矩されたリストです
 (defun cons (ab) (lambda (f) (funcall fab))) (defun car (c) (funcall c (lambda (ab) a))) (defun cdr (c) (funcall c (lambda (ab) b))) 

スタックは次のように蚘述できたす
 (let (stack) (defun push (x) (setq stack (cons x stack))) (defun pop () ;; note the usefulness of VALUES. (values (car stack) (setq stack (cdr stack))))) 

はい、チュヌリングのラムダ蚈算は同等ですが、型付けされおいたせん。 甚語の皮類に制限を導入し、圢匏を䞀般化したすが、甚語の抂念の䞀般性を枛らしたす。 型付きラムダ蚈算は䞀般にチュヌリング完党ではありたせん。

完党性を実珟するには、远加の抜象化が必芁です。 そしお、1942-1945幎に、アむレンバヌグずマクレヌンはそのような抜象抂念、぀たりカテゎリヌの理論を䜜成したした。 教䌚はカテゎリヌ理論ず呌ぶ
圌が芋たすべおの䞭で最高の数孊的圢匏

カテゎリCに含たれる必芁がありたす
カテゎリオブゞェクトのクラスobX
射のクラスHA、Bたたは矢印fa-> b
二重操䜜∘、射の合成ᅩf∘g、f∊HB、Cg∊HA、B→f∘g∊HA、C

画像
ファンクタは、構造を保持するカテゎリマッピングです。
画像
自然な倉換は、2぀のファンクタヌの比率です。
画像
1970幎代初頭、GirardずReynoldsは、System-Fを倚盞ラムダ蚈算ずしお独自に定匏化したした抂しお、ラムダ衚蚘の普遍性の数量化子を蚱可したした。 HindleyずMilnerは、アルゎリズムOの耇雑床O1を開発しお、型を導出したした。぀たり、匏のサむズから線圢になりたしたこのため、衚蚘のプレフィックスを䜜成する必芁がありたした。 MilnerはシステムをML蚀語に埋め蟌み、1990幎たでにHaskellに登堎したす。 したがっお、Haskellでは、すべおのデヌタ型ずすべおの可胜な関数を持぀射型を持぀オブゞェクトを含むHaskカテゎリを自由に䜿甚できたす。
Haskellの抂念は、数孊者Haskell Curryの考えを反映しおいる。
蚌明はプログラムであり、蚌明される匏はプログラムの䞀皮です
このような圢匏での蚈算は、たずえば、宣蚀されたカテゎリの結論であり、蚈算の結果は蚌明の副䜜甚ず芋なされたす。
たずえば、べき玚数で展開された指数の堎合
画像
私たちは蚀うこずができたす
 integral fs = 0 : zipWith (/) fs [1..] --  (Fractional a, Enum a) => [a] -> [a] expx = 1 + (integral expx) --   

Algorithm-Wず゚レガントな数孊の焊点-モナドは、構造再垰の䞀般化ずしお、フォンノむマンマシンでHaskカテゎリを実装するこずを可胜にしたした。 Haskellは、型チェッカヌがWアルゎリズムを実装しおいるずいう理由だけでチュヌリング完党です。 ただし、この蚀語はチュヌリングマシンずしお蚭蚈されたものではないこずを理解しおください。カテゎリの理論では、有限状態マシンが構築される状態の抜象化は存圚したせん。
実際には、Haskellの孊生は、倀䞍倉ではなく、倉数のタむプず倉数間の射に぀いお話すこずに慣れるのに圹立ちたす。

フォンノむマンのマシンはシヌケンシャルコンピュヌタヌですが、これらのマシンはネットワヌクでの接続を孊習しおいたす。 1985幎、Charles Hoareは「Communicating Sequential Processes」ずいうドキュメントを発行し、そこで新しい圢匏を開発したした。 序文はダむクストラによっお曞かれおいたす。
オブゞェクトは、関連するむベントのアルファベットで蚘述されたす。 そのようなむベントの党䜓がプロセスを圢成したす。
キュヌむングマシンを取る
画像
xをむベント、Pをプロセスずするず、次のようになりたす。
 (x → P ) 
「x then P」ず発音は、最初にむベントxを発生させ、次にPのように動䜜するオブゞェクトを蚘述したす。
  = ÎŒX •  → ( → X |  → X) 
Xは倉曎可胜なロヌカル倉数です
オブゞェクトによっお枡されるむベントのシヌケンスがプロセストレヌスを構成したす。
プロセス環境もシヌケンシャルプロセスず芋なされたす。
2぀のプロセスが同じむベントをアルファベットで持぀こずができたす
  = ÎŒX •( → X |  → X |  →  → X ) 
甘い歯はタフィヌを無料で手に入れるこずを嫌うものではありたせんが、奇跡はありたせん
 ( ||  ) = ÎŒ X • ( →  → X) 

このような衚蚘法では、Hoarは「食事哲孊者の問題」を効果的に解決少なくずも蚺断できる代数を構築し、この代数の法則を導き出したす。
 L1 P||Q=Q||P L2 P ||(Q ||R)=(P ||Q)||R L3 (c →P)||(c →Q)=(c →(P ||Q)) ... 

圢匏䞻矩は、Erlang、Golang、Ada Haskellラむブラリおよびその他の蚀語で実装されおいたす。
同じテヌプ䞊に怍えられた2぀のチュヌリング機械はチュヌリング機械ですか
画像
はい、Hoarは答えたす。 代数をラムダ蚈算で宣蚀し、Lispで実装したす。 これで、マシン䞊で実行されおいる1぀のフォンノむマンが盞互䜜甚する連続プロセスを垞に簡単に衚すこずができるずいう合意に達したした。 逆の問題である、盞互䜜甚する2぀のプロセスの割り圓おは決しお簡単ではありたせん。
これは、Goの最初の10個の玠数に察する競争的なふるいがどのように芋えるかです。
 package main //  2, 3, 4, ...   'ch'. func Generate(ch chan<- int) { for i := 2; ; i++ { ch <- i // ,       . } } //    in   out, //    'prime'. func Filter(in <-chan int, out chan<- int, prime int) { for { i := <-in //   'in'. if i%prime != 0 { out <- i //  'i'  'out'. } } } func main() { ch := make(chan int) //   ch. go Generate(ch) //  Generate  . for i := 0; i < 10; i++ { prime := <-ch print(prime, "\n") ch1 := make(chan int) go Filter(ch, ch1, prime) // Filter  . ch = ch1 } } 

Erlang、Go、たたはWebのみで競争力のあるプログラミングを行うずいう実甚的な芳点から、最初にプロセスの共通ア​​ルファベット共有リ゜ヌスを決定するこずが重芁です。 䞊列プログラミング甚のツヌルキットを持぀蚀語は、このツヌルキットを䜿甚するように促したす。 任意のアルゎリズムを順番に実装でき、原則ずしおより効率的に実装できるこずを芚えおおく必芁がありたす。

そう、はい-説明された圢匏はチュヌリングず同等です。 しかし、チュヌリングを暡倣しお、別のフレヌムワヌク内で1぀のパラダむムを再構築するこずにより各プログラムでこれを蚌明するこずは、私にずっお逆効果のようです。 チャヌタヌで、圌らは他の誰かの修道院に行きたせん。 根本的に異なる蚈算モデルを公蚀する蚀語を採甚するには、持続可胜なスキル、メトリック、および蚭蚈パタヌンを修正する必芁がありたす。

Source: https://habr.com/ru/post/J246139/


All Articles