プロロヌグは玠晎らしいプログラミング蚀語です

-なんで圌はすごいの 私は数十の蚀語を知っおいたすが、別の新しい蚀語を孊ぶこずは問題ではありたせん。必芁性が芋えないだけです。



プロロヌグはナニヌクです。 これは、宣蚀型プログラミングパラダむムを衚す唯䞀の蚀語です。 それは䜕癟もの異なる実装を持぀蚀語ですが、それらは䟝然ずしおPrologず呌ばれ、名前に接頭蟞ず接尟蟞のみを远加したす。 それは、20幎以䞊にわたっお倧きな倉化が生じおいない生きた蚀語です。 これはおそらく、実際のプログラミングでは圹に立たない唯䞀の人気のあるプログラミング蚀語です。 なぜプロロヌグなのか



プロロヌグは本質的にナニヌクで、幞せな偶然 䞖界の神秘的な構造 のために珟れたした。 か぀お、60幎代に、定理の自動蚌明の理論は非垞に急速に発展し、ロビン゜ンは、有限の時間既知ではないで有効な定理公理に由来するを蚌明できる解決アルゎリズムを提案したした。 埌で刀明したように、これは䞀般的な問題に察する最善の解決策であり、限られた数の操䜜で定理を蚌明するこずは䞍可胜です。 簡単な蚀葉で蚀えば、アルゎリズムは、幅のバむパス䞀般的な堎合グラフであり、もちろん、プログラミング蚀語のアルゎリズムの予枬可胜性はほが0です。これは絶察に適切ではありたせん。 そしおその瞬間、カルマルヌは問題の芋事な狭たりを発芋したした。そのおかげで、いく぀かの定理の蚌明はプログラムの手続き実行のように芋えたした。 蚌明される定理のクラスは非垞に広く、プログラム可胜な問題のクラスに非垞によく適甚できるこずは泚目に倀したす。 これが、1972幎のPrologの登堎です。



この蚘事では、䞀般的な論理的な問題を解決するためのツヌルずしおのPrologに぀いおお話したす。 このトピックは、Prolog構文を既に所有しおおり、内郚から理解したい人や、蚀語構文をたったく知らないが、構文構築の勉匷に時間をかけずに「ハむラむト」を理解したい人にずっお興味深いものです。





Prologの䞻な機胜は読みやすいこずですが、曞くのは非垞に困難です。これは、すべおの䞻流蚀語ずは根本的に異なり、さらに簡単になり、Google +で友達ずしお䜜業モゞュヌルをドラッグしお曞くこずができたす 、これにより、コヌドの品質が非垞に䜎䞋するこずをすべお知っおいたす。 すべおの行が理解できるように芋えたすが、システムが理解を超えおどのように機胜するかは、開発者にずっおも、圌らが蚀うように、信じられないほどでした。 すべおのPrologトレヌニングブックは、事実、関係、芁求に関するストヌリヌを開始するずきに同じ間違いを犯し、人ぱキスパヌトシステムたたはデヌタベヌスずしお蚀語ずの関係を開発するようです。 プログラムの読み方を孊び、そのように数十人で読むこずが非垞に重芁です:)



プロロヌグプログラムを正しく読む方法



蚀語には特殊文字ずキヌワヌドがほずんどなく、自然蚀語に簡単に翻蚳されるため、プログラムの読み取りは非垞に簡単です。 プログラマヌの䞻な間違いは、プログラムがどのように機胜するかをすぐに想像したいずいうこずであり、プログラムの説明を読んでいないため、普通の人の霧の脳を蚓緎するこずはプログラマヌよりもはるかに簡単です。



コンセプト


この蚀語には、 述語 条件ずオブゞェクト 倉数ず甚語もありたす の2぀の抂念がありたす。 述語は条件を衚したす。たずえば、オブゞェクトが緑たたは玠数である堎合、条件に入力パラメヌタヌがあるこずは自然です。 たずえば、 green_objectObject 、 prime_numberNumber 。 述語に含たれるパラメヌタヌの数。これは、述語のアリティです。 オブゞェクトは、甚語、定数、倉数です。 定数 -これらは数字ず文字列、 倉数です -未知のオブゞェクトを衚し、おそらく怜玢され、倧文字の文字列ずしお指定されたす。 今のずころ条件をそのたたにしお、最も単玔なプログラムを怜蚎しおください。



プログラム


プログラムは、 If condition1 and condition2 and ...ずいう圢匏の䞀連のルヌルです。条件はtrueです。 正匏には、これらのルヌルはANDを介しお結合されたすが、Prologには論理吊定がなく、Toリンクには述語条件が1぀しか存圚しないため、矛盟を取埗するこずはできたせん。



A :- B_1, B_2. % : B_1 B_2, A

_() :- (), ().

% "" - , "" - _









ご芧のずおり、倉数の名前にはスコヌプがありたす-これがルヌルです。 数孊的には、ルヌルが聞こえたす。任意の倉数-「数倀」に぀いお、それが単玔で奇劙な堎合、それはsimple_ oddです。 同様に、これを蚀い換えるこずができたす。「Number」が奇数で単玔な堎合、それはodd_simpleです。 したがっお、倉数の名前は非垞に重芁です 巊偎前-でNumberをNumber2に眮き換えるず、ルヌルの意味が倉わりたす。Number2ずNumberに぀いお、Numberが玠数で奇数の堎合、Number2は単玔な奇数です。 すべおの数字は単玔な奇数です これは、Prologの最も䞀般的な間違いです。



 A :- B_1, B_2. %    :  B_1  B_2,  A _() :- (), (). %  "" -   ,  "" - _
      
      









A :- B_1, B_2. % : B_1 B_2, A _() :- (), (). % "" - , "" - _













䟋-完党な数字


 _() :- (), ___(, ), (, ). _(1). (, ). ___(1, 1). ___(, ) :- _(, ), ____(, , ). ____(, 1, 1). ____(, , ) :- _(, ), _(, ), ____(, , ), (, , ). ____(, , ) :- __(, ), _(, ), ____(, , ).
      
      









_() :- (), ___(, ), (, ). _(1). (, ). ___(1, 1). ___(, ) :- _(, ), ____(, , ). ____(, 1, 1). ____(, , ) :- _(, ), _(, ), ____(, , ), (, , ). ____(, , ) :- __(, ), _(, ), ____(, , ).













最初に、芏則の意味を正匏に読みたす。

  1. 「H」が数倀であり、「H」および「Sum of Dividers」の堎合、条件はsum_divisers_without_numberです。぀たり、Sum of Divisorsは数倀「H」の陀算噚の合蚈であり、「H」は「Sum of Divisors」に等しいため、「Ch」は完党な数倀です。
  2. 1は完党な数です。 ルヌルには条件がない堎合があり、その堎合はルヌルず呌ばれたす。
  3. すべおのオブゞェクト「O」は「O」に等しい。 原則ずしお、暙準的な述語「=」がありたすが、完党に独自の述語に眮き換えるこずができたす。
  4. sum_deleters_ without_number 1の事実は1です。
  5. 仕切りの「数」の前の数「数」に察する合蚈が「合蚈」に等しい堎合、これは、数を陀いた仕切りの合蚈です。 したがっお、XをXで陀算するため、Xの玄数の合蚈はY以䞋です。したがっお、Y = X-1になりたす。
  6. 次に、3぀の述語が陀数の合蚈を決定したす。数倀はY分呚噚以䞋、1番目のケヌスYは1、2番目の堎合は数倀をYで陀算し、陀算噚の合蚈X、Y=陀算噚の合蚈X、Y-1+ Y 、および3番目のケヌスでは、数倀はYで割り切れたせん。次に、sum_of陀算噚X、Y= sum_of陀算噚X、Y-1。




プログラム-定矩のセットずしお


「定矩」に基づいお、これらの芏則を読み取るための2番目の方法がありたす。 プロロヌグでは、巊偎のすべおのルヌル䞀郚に含たれる条件は1぀のみであり、本質的にはこの条件の「定矩」であるこずがわかりたす。

たずえば、最初のルヌルは完党数の定矩です。 「H」が数であり、「H」の玄数の合蚈が「H」に等しい堎合、「H」は完党な数です。 同䞀の述語は、名前によっおグルヌプ化され、「たたは」条件によっお結合されたす。 ぀たり、定矩に远加できたす。「H」は、..たたは「H」が1のずきに完党な数です。



この読み取り方法は、述語を同皮のグルヌプに結合でき、むンタヌプリタヌが述語を巻き戻す順序を理解するのに圹立぀ため、広く䜿甚されおいたす

声明の真実を怜蚌する。 たずえば、述語に定矩がない堎合、それを䜿甚しお文の真理を蚌明するこずは䞍可胜であるこずは明らかです。 䟋1では、述語「divides_on」には定矩がありたせん。



興味深い事実は、Prologにはルヌプ、倉数の割り圓お、型宣蚀がなく、甚語ずクリッピングを思い出せば、蚀語はアルゎリズム的に完党になるずいうこずです。



芏玄


甚語には、オブゞェクトの名前付きコレクションずしお再垰的な定矩がありたす。 甚語= 'name'オブゞェクト、オブゞェクト、...、サンプルperson 'Name'、 'Surname'、 '+'1、2、personaddress 'Some address'、surname 'Last name '、phone' Phone ' 。 甚語を数孊的抂念ずみなす堎合、甚語は関数、たたはファンクタヌ、぀たり「+」1、2-1 + 2に等しいオブゞェクトが存圚するこずを意味したす。 これは絶察に、Prologで1 + 2 = 3を意味するわけではありたせん。2を法ずする残基のグルヌプのように、この匏は正しくありたせん。3はたったく存圚したせん。 繰り返したすが、数孊的な芳点から、倉数はFor Everyoneずいう単語で接続されおおり、ステヌトメントが単語の存圚を必芁ずする堎合は、この目的で甚語ファンクタヌが䜿甚されたす。 任意の数に぀いお、階乗数がありたす。-階乗X、ファクトX。



プログラミングの芳点から芋るず、甚語はもっず簡単に説明できたす。甚語は属性のセットを持぀オブゞェクトであり、属性は他の甚語たたは定数たたは倉数぀たり、定矩されおいないです。 䞻な違いは、Prologのすべおのオブゞェクトは䞍倉であるずいうこずです。぀たり、それらの属性を倉曎するこずはできたせんが、特別な状態-倉数がありたす。



䟋-敎数挔算


  (0). (()) :- (). (0, , ). ((1), 2, ()) :- (1, 2, ). (0, , 0). ((1), 2, 2) :- (1, 2, ), (, 2, 2).
      
      









(0). (()) :- (). (0, , ). ((1), 2, ()) :- (1, 2, ). (0, , 0). ((1), 2, 2) :- (1, 2, ), (, 2, 2).











  1. nat自然数のプロパティの決定。 0は自然数です。Numberが自然の堎合、オブゞェクト番号Numberがあり、これも自然です。 数孊的には、「数倀」ずいう甚語は関数+1を衚したす。プログラミングの芳点から、「数倀」は再垰的なデヌタ構造です。その芁玠は次のずおりです。数倀0、数倀数倀0、数倀数倀数倀0。
  2. 比率のプラスは0 +数倀=数倀です。 Ch1 + Ch2 = Resの堎合、Ch1 + 1+ Ch2 =Res + 1。
  3. 比率が乗算されたす-0 *数=0。R1* R2 = ResおよびRes + R2 = Res2の堎合、R1 + 1* R2 = Res2。


明らかに、これらのステヌトメントは通垞の算術挔算に圓おはたりたすが、なぜNumber + 0 = Numberず同じ明癜なステヌトメントを含めなかったのですか。 答えは簡単です。冗長性はどの定矩でも非垞に悪いです。 はい、それは蚈算、䞀皮の時期尚早な最適化に圹立ちたすが、副䜜甚は定矩の矛盟、ステヌトメントの曖昧な結論、むンタヌプリタヌのルヌプになる可胜性がありたす。



Prologが述語をどのように理解し、どのようにステヌトメントを蚌明するか



もちろん、プログラムを読むこずは、Prologスタむルを感じるのに圹立ちたすが、これらの定矩を䜿甚できる理由ず方法を明確にしたせん。 十分な゚ントリポむントがないため、䞊蚘の䟋のような本栌的なプログラムを呌び出すこずはできたせん。 Prologぞの゚ントリポむントは、ク゚リ、SQLデヌタベヌスぞのク゚リの類䌌物、たたは関数型プログラミングのメむン関数の呌び出しの類䌌物です。 ク゚リの䟋nat数倀-自然数の怜玢、プラス0、0、結果-倉数Resultに0ず0を远加した結果の怜玢、nat0-0が自然数かどうかの確認など



もちろん、論理的な理由でク゚リ結果を予枬するこずは難しくありたせんが、プログラムがそれを受け取った方法を理解するこずは非垞に重芁です。 それでも、Prologはブラックボックスではなくプログラミング蚀語であり、SQLプランが構築され、ク゚リを異なるデヌタベヌスで異なる方法で実行できるデヌタベヌスずは異なり、Prologには非垞に具䜓的な実行順序がありたす。 実際、デヌタベヌスでは、テヌブル内のデヌタに基づいおどの回答を取埗したいかがよくわかっおいたす。残念ながら、Prologプログラムを芋るず、どのステヌトメントが論理的に掚論されおいるかを蚀うのは難しいため、Prologむンタヌプリタヌの仕組みを理解するのははるかに簡単です。



䟋のク゚リplus0、0、Resultを考えおください

1.ルヌルの巊郚分ずこのリク゚ストの䞀臎パタヌンマッチングの䞀皮、解決を芋぀けたす。 このリク゚ストの堎合、プラス0、数倀、数倀。 すべおのリク゚スト匕数をルヌルず1぀ず぀関連付けお取埗したす0 = 0、0 =数倀、結果=数倀。 これらの方皋匏には2぀の倉数数倀ず結果が関係しおおり、それらを解くず、数倀=結果= 0になりたす。このルヌルには条件がないため、質問に察する答えが埗られたした。 回答はい、結果= 0。



リク゚ストnat番号 

1.ルヌルずの最初の䞀臎であるnat0ルヌルを芋぀け、察応関係で方皋匏を解く、぀たり解像床を芋぀けるず、Number = 0が埗られたす。答えyesおよびNumber = 0。



リク゚ストプラス結果、0、数倀0 

1.ルヌルプラス0、数倀、数倀で解決策を芋぀けたす結果= 0、0 =数倀、数倀0=数倀ですが、数倀= 0 =数倀0-0は数倀ず䞀臎するため䞍可胜です0。 そのため、次のルヌルで解決策を探しおいたす。

2.ルヌルプラス数倀R1、R2、数倀Resで解決策を芋぀け、数倀R1=結果、R2 = 0、数倀Res=数倀0、したがっおRes = 0を取埗したす。ルヌルでは、解決の結果倉数の倀、プラスP1、P2、Res->プラスP1、0、0を考慮しお、チェックする必芁がある条件がありたす。 スタック䞊の倉数の倀を蚘憶し、新しいリク゚ストにplus1、0、0を加えたものを䜜成したす

3 *。 プラスCh1、0、0リク゚ストを解くず、プラス0、数倀、数倀で解決策が芋぀かり、Ch1 = 0ず数倀= 0が埗られたす。

4.スタック䞊で前の倉数に戻りたす結果=数倀1=数倀0。 答えは芋぀かった番号0です。 したがっお、プロロヌグマシンは匏X + 0 = 1を解きたした。



Prolog蚀語でルヌルを適切にコンパむルするこずは非垞に耇雑ですが、それらをコンパクトに構成するず、盎接的な答えず解決策だけでなく、逆の解決策も埗られたす。



リク゚スト䟋Number、Number、Number yesず答え、Number = 0。



リク゚スト䟋plus0、0、0 応答なし。最初の詊行では、すべおの解決は実行されたせん。



リク゚スト䟋plusNumber、Number、NumberNumber yesず答え、Number =1。方皋匏X + X = X + 1を解く



乗算数倀、数倀0、数倀0の出力を描画しおみおください。これには、倉数をスタックに2回プッシュしお、新しいク゚リを蚈算する必芁がありたす。 マシンのプロロヌグの本質は、最初の結果を拒吊できるこずです。その埌、プロロヌグは前の状態に戻り、蚈算を続行したす。 たずえば、ク゚リnatNumber 、最初に1番目のルヌルを適甚しお0を䞎え、次に2番目のルヌル+ 1番目のルヌルを適甚しお数0を䞎えるず、すべおの自然数の無限シヌケンスを繰り返し取埗できたす。 別の䟋、ク゚リplusNumber、number0、Number2は、方皋匏X + 1 = Yに察するすべおの解のペアのシヌケンスを生成したす。



おわりに



残念ながら、トピックの合理的なサむズでは、メむントピック、぀たり、Prolog蚀語の耇雑な論理問題を解決するための戊略がなくおも、それらを解決するこずはできたせんでした。 Prologコヌドの倧きな塊は、初心者だけでなく、経隓豊富なプログラマヌさえも怖がらせるこずができたす。 この蚘事の目的は、Prologプログラムが簡単な方法で自然蚀語で読み取れるこず、および単玔なむンタヌプリタヌによっお実行されるこずを瀺すこずです。

Prologの䞻な機胜は、ブラックボックスや耇雑な論理問題を解決するラむブラリではありたせんMathematicaでは、代数方皋匏を入力しお解を求めるこずができたすが、ステップのシヌケンスは䞍明です。 プロロヌグは、䞀般的な論理的な問題を解決できたせん論理的な「たたは」および「吊定」はありたせん、そうでない堎合、その結論は線圢解像床ずしお非決定的です。 プロロヌグは、単玔な通蚳者ず定理を蚌明するための機械ずの間の黄金の平均であり、任意の方向ぞのシフトは特性の1぀を倱うこずに぀ながりたす。



次の蚘事では、゜ヌティングの問題がどのように解決されるか、茞血の流れ、ミス・マナヌ、その他のよく知られおいる論理的な問題に぀いおお話したいず思いたす。 䞍満を感じる人のために、私は次の問題を提䟛したいず思いたす 誰が最初に賞を解決したか 

3で始たる自然数の無限シヌケンスを生成する述語を蚘述したす。これらはPrologの暙準数であり、is述語を䜿甚しお実行される操䜜は次のずおりです。Xは3 + 1 => X = 4です。



All Articles