臎呜的な遞択

以前の蚘事  en で、1982幎にファンファヌリンギングの䞋で​​開始され、1992幎に論理プログラミングを取り入れお撀回された、第5䞖代の日本のコンピュヌタヌシステムプロゞェクトの歎史に぀いお話したした。 この䞭で、より明癜なLispではなく、第5䞖代システムの蚀語ずしおPrologがどのように遞ばれたかに぀いおお話したす。 特定の蚀語の支持者を圢成できる人々の珟象に興味がありたす。 この蚘事で説明できるずいいのですが。



甚語に぀いお。 論理プログラミングは、論理文を䜿甚しお手順ずデヌタを衚し、受け取ったステヌトメントに基づいお蚈算を実行する方法です。 Prologは、これら2぀のアむデアに基づいたプログラミング蚀語です。 蚀語ず方法の䞡方が、第5䞖代システムで䞻芁な圹割を果たしたした。



1981幎、プロゞェクトを開いた䌚議で、フチは論理プログラミングを䞻なプログラミング方法論ず呌びたした。 1992幎の決勝戊で、叀川は1976幎に東京の電気技術研究所ETL埌に第5䞖代システムプロゞェクトを立ち䞊げたのチヌムがLispで豊富な経隓を持ち、プロロヌグは圌女にはたったくなじみがなかったこずを思い出した。 1976幎、これは党員に圓おはたりたした。マルセむナ以倖では、プロロヌグに぀いお知っおいたのは2、3の研究所だけでした。



974は1974幎に川厎[7]の蚘事を読んだ埌、論理プログラミング[1]に興味を持ちたした。おそらく、1976幎にスタンフォヌド研究所を蚪れたずきに叀川がPrologを怜玢するようになりたした。マルセむナの倖。 1974幎、デビッドH.D. りォヌレンぱディンバラにコピヌを取りたした。 そしお1976幎に、ハリヌ・バロヌぱディンバラからコピヌをスタンフォヌド研究所に持ち蟌みたした。 りォヌレン[1]は、 「ハリヌは自分でシステムを起動できず、叀川のコピヌを枡したした」ず語りたした。 1976幎に東京ETLで、叀川ず他の数人の研究者がPrologの実隓を開始したした。 米囜はプロロヌグりむルスの媒介ずしお行動し、感染自䜓を回避したした。



ETLでの仕事の結果ずしお、叀川はいく぀かのプロロヌグデヌタベヌスむンデックス䜜成プログラムを実蚌したした。 明らかに、肯定的な結果により、ETLはDavid H.D.からDEC-10のプロロヌグの実装を取埗するこずができたした。 りォヌレン。 叀川は次のように曞いた[2] 

DEC-10 PrologでRubik's Cubeアセンブリプログラムを䜜成したしたが、効率的で、比范的短時間玄20秒で問題を解決したした。 このタむプの゚キスパヌトシステムでは、意思決定メカニズムは、Prologの末尟再垰を䜿甚しお効果的に実装されたす。 この実隓の埌、プロロヌグは知識凊理蚀語であるず確信したした。



プロロヌグの歎史に぀いおは、アラン・コルメロアずフィリップ・ロッセルの「プロロヌグの誕生」 [3]に目を向けたした 。 最初のステップは1971幎に゚クスマルセむナ倧孊のColmeroer率いるグルヌプによっお行われたした。 自然蚀語の凊理専甚に䜿甚されるいく぀かの予備バヌゞョンを䜜成した埌、1973幎に「最終バヌゞョン」が䜜成されたした。 川厎の圱響で、文の論理は蚀語になり、特定の圢匏の文が手続きを呌び出すためのメカニズムずしお機胜したした。 このバヌゞョンは最初の「プロロヌグ」ず呌ばれ、自然蚀語凊理以倖のタスクに䜿甚されたした。 1974幎初頭、マルセむナぞのノァレンの蚪問の埌、プロロヌグのコピヌが゚ディンバラに行きたした。 ゚ゞンバラからペヌロッパのいく぀かの機関ブダペスト、ルヌベン、リスボンずカナダに急速に広がりたした。



1974幎から1977幎にかけお、数倚くの魅力的な実隓が行われ、マルセむナで始たった䜜業が続けられたした。 リスボンのヘルダヌ・コ゚ヌリョは、「プロロヌグのやり方」ずいう本のプログラムを集め始めたした。 1975幎、りォヌレンはDEC-10 PrologでPrologコンパむラの䜜成を開始したした。 1977幎に完成したずき、1973幎のマルセむナ通蚳で倧きな改善が達成されたこずが刀明したした。 りォヌレンず圌の同僚は、それをコンパむラLispず比范するこずを敢えおしたした。それは芞術䜜品ずしお完璧であり、興味深い結果を埗たした。 リストは、Lispの堎合よりも30〜50高速に反転されたした。 結果は驚くべきものだった、なぜなら リストは、他の甚語ず同様に論理甚語に倉換され、統䞀的に凊理されたす。 シンボルの埮分デヌタに䟝存は、Lispよりも1.1から2.6倍速く実行されたした。 1977幎、Lispは18歳、プロロヌグは6歳で、1971幎から1977幎たでの開発に取り組んだ人はほんの䞀握りでした。



次の䟋は、抂しお、圹に立たない。 それらは、プロロヌグの魅力的な性質を瀺すために遞ばれたす。



述語「move」のプログラムは、ムヌブX1、Y1、X2、Y2を蚘述するずきに、銬がセルX1、Y1からセルX2、Y2に移動できるこずを意味するずしたす。

適切なプログラムを持っおいる、あなたは尋ねるこずができたす

?- move (U,U,V,V).







これは、「1回の移動で銬がセルの1぀に斜めに行ける」こずを意味し、「いいえ」ずいう答えを埗るこずができたす。



尋ねられたずき

?- move(U,U,X,Y),move(X,Y,V,V).







「階士は2回の動きで斜めに動くこずができたす」ずいう意味で、必芁に応じおすべおの動きで「はい」ず答えたす。 次はプログラムです

move(X1,Y1,X2,Y2) :- diff1(X1,X2),diff2(Y1,Y2).

move(X1,Y1,X2,Y2) :- diff2(X1,X2),diff1(Y1,Y2).



% diff1(X,Y): X Y 1.

diff1(X,Y) :- succ(X,Y).

diff1(X,Y) :- succ(Y,X).



% diff2(X,Z): X Z 2.

diff2(X,Z) :- succ(X,Y),succ(Y,Z).

diff2(X,Z) :- succ(Z,Y),succ(Y,X).



% succ(X,Y): Y X.

succ(1,2). succ(2,3). succ(3,4). succ(4,5). succ(5,6). succ(6,7). succ(7,8).









別の䟋。 次のリストに含たれる27桁のセットがあるずしたす

[1,9,1,6,1,8,2,5,7,2,6,9,2,5,8,4,7,6,3,5,4,9,3,8,7,4,3]

[1,9,1,2,1,8,2,4,6,2,7,9,4,5,8,6,3,4,7,5,3,9,6,8,3,5,7]

[1,8,1,9,1,5,2,6,7,2,8,5,2,9,6,4,7,5,3,8,4,6,3,9,7,4,3]

[3,4,7,9,3,6,4,8,3,5,7,4,6,9,2,5,8,2,7,6,2,5,1,9,1,8,1]

[7,5,3,8,6,9,3,5,7,4,3,6,8,5,4,9,7,2,6,4,2,8,1,2,1,9,1]

[3,4,7,8,3,9,4,5,3,6,7,4,8,5,2,9,6,2,7,5,2,8,1,6,1,9,1]







各桁d = 1、..、9の条件では、3぀のdの出珟があり、dはdの䜍眮で互いに分離されおいたす。 これを解決するには、かなり耇雑なク゚リが必芁です

?-equals(List,

[_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_]),

sublist([9,_,_,_,_,_,_,_,_,_,9,_,_,_,_,_,_,_,_,_,9],List),

sublist([8,_,_,_,_,_,_,_,_,8,_,_,_,_,_,_,_,_,8],List),

sublist([7,_,_,_,_,_,_,_,7,_,_,_,_,_,_,_,7],List),

sublist([6,_,_,_,_,_,_,6,_,_,_,_,_,_,6],List),

sublist([5,_,_,_,_,_,5,_,_,_,_,_,5],List),

sublist([4,_,_,_,_,4,_,_,_,_,4],List),

sublist([3,_,_,_,3,_,_,_,3],List),

sublist([2,_,_,2,_,_,2],List),

sublist([1,_,1,_,1],List).







ただし、プログラム自䜓は非垞に小さく、䞀般的な述語のみが含たれおいたす。

% sublist(X,Y) X Y



sublist([],List).

sublist([X|Xs],[X|Ys]) :- append(Xs,_,Ys).

sublist(List,[Y|Ys]) :- sublist(List,Ys).



append([],Y,Y).

append([U|X],Y,[U|Z]) :- append(X,Y,Z).



equals(X,X).







プロロヌグの初期の歎史は、私にずっお非垞に興味深いようです。れロから6幎のほんの数人がそれを゚レガントで匷力で効果的な蚀語に発展させたした。 Lispの初期の歎史はそれほど面癜くありたせん。 1950幎代、マッカヌシヌは顧問プロゞェクトに蚀語を遞択したした。 候補者は、IBMのBacusチヌムによっお開発されたIPL-V NewwellずSimonおよびFortranコンパむラヌでした。 IPLには、リストで衚される柔軟なデヌタ構造ずいう利点がありたした。 䞀方、McCarthyは、その反埩メカニズムのためにFortranが奜きでした。 そこで圌は、リストの操䜜をサポヌトするFortranコンパむラヌのバヌゞョンであるFLPLFortranリスト凊理蚀語-Fortranリスト凊理蚀語を䜜成するための実隓を開始したした。 Fortranでのナヌザヌ定矩関数のサポヌトは、文曞化されおいない実装時間の長いプロパティであり、関数本䜓は1行に制限されおいたこずを思い出しおください。 圓然のこずながら、マッカヌシヌは自分のリスト凊理蚀語で䜜業を始めたした。 1958幎11月、通蚳はすでにMITで働いおいたした。 すぐに、珟圚Lispずしお知られおいる蚀語に進化したした。これは、プロゞェクトの説明の䜜業の副䜜甚でした。



この蚀語の特城の1぀は、その普遍性でした。぀たり、原則ずしお蚈算されるすべおを蚈算するこずは可胜でしょうか。 ナニバヌサルチュヌリングマシンのプログラムがデモンストレヌションずしお䜿甚されたした。 倚くの人々は、マッカヌシヌが再垰関数の理論から普遍的な関数を奜んだずいう事実が奜きです。 それたでは、この理論は自然数のセット内でのみ䜿甚されおいたした。 McCarthyは、セットの自然さは制限ではなく、列挙されたセットで機胜するこずを指摘したした。 これらすべおが、シンボリック匏S匏䞊の関数の汎甚関数に぀ながりたした。



汎甚関数は、匕数ずしお関数の説明ずその匕数の説明を取りたした。 その結果、圌女は匕数で関数を実行した結果を返したした。 このような関数を䜜成するには、関数定矩の構文を倉曎する必芁がありたした。 デヌタを䜿甚しお説明する必芁がありたしたが、珟圚はS匏です。

... EVALに぀いお説明し、それに぀いお公開した埌、Steve Russellは、なぜEVALをプログラムしお通蚳を䜜成しないのかず尋ねたした。 理論ず実践を混同しないでください。EVALは蚈算ではなく読み取りのためです。 しかし、圌は続けお通蚳をしたした。 圌は私の蚘事のEVALを704行のマシンコヌドにコンパむルし、バグを修正し、Lispむンタヌプリタヌに぀いお実際にそれを䌝えたした。 䞀般的に、その瞬間から、Lispは私たちが今日知っおいる圢匏、S匏の圢匏1974幎のMcCarthyずの䌚話である「The Lisp Story」の転写のStoyan [5]によっお匷調された圢匏を獲埗した。



McCarthyは圌の蚘事で、S-expressionの小さな操䜜セット、ATOM、EQ、CONS、CAR、CDRに぀いお説明したした。 それらに、圌は論理関数ずしおQUOTEずCONDを远加したした。 LABELずLAMBDAのステヌタスは非垞に興味深いものです。EVALはリストを曞き換えおリストにアトムずしお衚瀺するため、LABELずLAMBDAがプロセスで䜿甚されたす。



普遍的なマッカヌシヌ関数は、蚈算手法の゚レガントな公理化ず考えるこずができたす[8] 。 しかし、理論的な研究はLispになりたした。 汎甚関数により蚀語が倉曎され、デヌタだけでなく関数もリストになりたした。 ラッセルのむンスピレヌションずプログラマずしおの圌の胜力のおかげで、普遍的な機胜は通蚳になりたした。



なぜ人々がPrologに恋をするのかずいう質問に答えるために、私はいく぀かの䟋よりも良いものを思い぀きたせんでした。 Lispにはもっず良い方法がありたす。ナニバヌサルEVAL関数ずその分離䞍可胜なAPPLY関数を調べおください。 それらは、Lispの説明の最初にありたす。 これがポンツasinorum [9]です。研究を攟棄した人々は、たさにこの堎所でそれを攟棄したように思えたす。 橋を枡った埌、初心者は最埌たで旅を続け、Lispの支持者になりたす。



LispずPrologの矎埳の類䌌点は、垞に議論の察象ずなっおいたす。 LispでFortranプログラムを曞いおいる人や、テンプレヌトをサポヌトしたPascalなどのプロロヌグを䜿甚しおいる人の䜜成を無芖したす。 芁するに、マッカヌシヌが「ポルノ番組」ず呌んだものすべお[4]は無芖されるべきです。 この議論では、Zen蚀語の知識で曞かれたコヌドのみを怜蚎する䟡倀がありたす。 Zen Prologの説明は別の機䌚に残したす。 Lispの堎合、次のようになりたす。



珟代の芳点から、マッカヌシヌが行った䞻なこずは、仮想マシンの定矩です。 䞀般に、圌は思考実隓䞭に単に説明目的でそれを定矩したした。 したがっお、圌は論理的な芳点から可胜な限り単玔化する䜙裕がありたした。リストで動䜜する7぀のプリミティブのうちリストずS匏の違いは無芖、頭ず尟だけで構成されおいたす。 驚くべきこずに、これらはすべお、圓時実装できる蚀語に成長したした。 さらに興味深いのは、非垞に単玔な仮想マシンが䜕十幎にもわたっおメモリずプロセッサの速床を向䞊させおきたこずです。 この仮想マシンに基づいお、すべおのEVAL / APPLYむンタヌプリタヌが構築されたす。これは、Lisp入門コヌスで芋぀けるこずができたす。



初心者がZen of Lispを孊ぶずすぐに、基本的なむンタヌプリタヌの限られた機胜の拡匵ずしおプログラムを曞くこずは自然になりたす。 そしお、これらの7぀のプリミティブは埋もれおおらず、通蚳が終了するずすぐに芋えなくなりたす。 それどころか、それらはナヌザヌコヌドでは非垞に䞀般的です。 ギルバヌトは集合論の反察者に蚀った「誰も私たちにカントヌルによっお䜜られた楜園を去るこずを匷制しないだろう。」 LispersはMcCarthyによっお䜜成された楜園に関しお同じこずを経隓したす。



第5䞖代のプロゞェクトは、Lispを知っおおり、Prologを興味をそそる斬新さであるず認識する人々によっお開始されたした。 新䞖代のコンピュヌタヌのビゞョンたたはmi気楌は、論理蚈算ず䞊列性に基づいおいたため、意芋のバランスがPrologに移行したした。 もしそれが違っおいたら、第5䞖代システムの運呜はLispに䜕の圱響も及がさなかっただろうそれはすでに広たっおいた。 しかし歎史的に、Prologの脆匱で初期の垌望は、目暙を達成しなかった第5䞖代システムの厩壊ずずもに厩壊したした。



All Articles