"Prolog" je programovací jazyk nebo základ umělé inteligence. Logické programování. Základy jazyka Prolog Kde se prolog používá?

Proč je úžasný? Umím pár desítek jazyků a není pro mě problém naučit se další nový, jen už nevidím potřebu.

Prolog je jedinečný. Je to jediný jazyk, který reprezentuje paradigma deklarativního programování; je to jazyk, který má stovky různých implementací, ale stále se nazývají Prolog, přičemž k názvu přidávají pouze předpony a přípony; je to živý jazyk, ve kterém za více než 20 let nedošlo k žádným významným změnám; Toto je pravděpodobně jediný programovací jazyk, který je tak populární a nemá žádné uplatnění v reálném programování. Proč Prolog?

Prolog je svou povahou jedinečný, objevil se díky šťastné náhodě (tajemná struktura světa). Kdysi v 60. letech se teorie automatického dokazování vět velmi rychle rozvíjela a Robinson navrhl rozlišovací algoritmus, který umožňoval dokázat jakoukoli pravdivou větu (odvozovat ji z axiomů) v konečném čase (pro který není známý). Jak se později ukázalo, je to nejlepší řešení obecného problému, dokázat větu v omezeném počtu operací je nemožné. Jednoduše řečeno, algoritmus je procházení (obecně nekonečného) grafu do šířky. Předvídatelnost operace algoritmu je samozřejmě prakticky rovna 0, takže to absolutně není vhodné pro programovací jazyk. A v tu chvíli Kalmarow našel brilantní zúžení problému, díky kterému důkaz některých vět vypadal jako procedurální provedení programu. Stojí za zmínku, že třída dokazatelných vět je poměrně široká a velmi dobře použitelná na třídu programovatelných problémů. Tak vznikl v roce 1972 Prolog.

V tomto článku se pokusím hovořit o Prologu jako o nástroji pro řešení obecných logických problémů. Toto téma bude zajímat ty, kteří již znají syntaxi Prologu a chtějí jí porozumět zevnitř, stejně jako ty, kteří absolutně neznají syntaxi jazyka, ale chtějí porozumět jeho „šmrnc“, aniž by trávili čas navíc učení syntaktických struktur.


Hlavním rysem Prologu je, že se dá snadno číst, ale velmi obtížně psát, což se zásadně liší od všech běžných jazyků, které říkají, že psaní se stalo ještě jednodušší, ještě jeden krok a můžete psát na tabletu, přetahováním pracovní moduly jako přátelé na Google+ , všichni víme, že tím velmi trpí kvalita samotného kódu. Zdá se, že každý řádek je jasný, ale to, jak systém funguje, je nepochopitelné i pro vývojáře, jak se říká v Hindustanu. Zdá se mi, že ve všech knihách o výuce Prologu dělají stejnou chybu, začínají příběh o faktech, vztazích, otázkách a člověk si k jazyku vypěstuje vztah jako k Expertnímu systému nebo Databázi. Mnohem důležitější je naučit se správně číst programy a číst jich tak desítky :)

Jak správně číst prologové programy

Čtení programů je velmi snadné, protože jazyk má velmi málo speciálních symbolů a klíčových slov a lze je snadno přeložit do přirozeného jazyka. Hlavní chybou programátora je, že si chce hned představit, jak program funguje, a ne číst, co program popisuje, takže se mi zdá, že je mnohem jednodušší trénovat nezakalený mozek běžného člověka než programátora.
Koncepty
V jazyce jsou 2 pojmy predikáty(podmínky) a objektů(jsou to také proměnné a termíny). Predikáty vyjadřují určitou podmínku, například zelený objekt nebo prvočíslo, je přirozené, že podmínky mají vstupní parametry. Například zelený_objekt (objekt), prvočíslo (číslo). Počet parametrů v predikátu určuje aritu predikátu. Objekty- jsou členy, konstanty a proměnné. Konstanty- to jsou čísla a řetězce, proměnné- vyjadřují neznámý předmět, případně hledaný, a jsou označeny jako čáry s velký písmena. Ponechme prozatím podmínky a uvažujme o nejjednodušším programu.
Program
Program je sada pravidel formuláře Pokud podmínka1 a podmínka2 a... pak je podmínka pravdivá. Formálně jsou tato pravidla kombinována pomocí AND, ale nelze získat rozpor, protože v Prologu neexistuje žádná logická negace a ve spojce That může být přítomen pouze jeden predikát (podmínka).

A: B_1, B_2. Pravidlo % zní takto: Pokud B_1 a B_2, pak A
liché_prvo(číslo) :- prvočíslo(číslo), liché(číslo).
% Je-li "Číslo" prvočíslo a liché, potom "Číslo" je liché_prvo

Jak vidíte, název proměnné má rozsah – toto je pravidlo. Matematicky správně zní pravidlo: pro jakoukoli proměnnou - „Číslo“, pokud je prvočíslo a liché, pak je prvočíslo_liché. Podobně jej lze přeformulovat následovně: Pokud existuje „Číslo“, které je liché a prvočíslo, pak je to liché_prvočíslo. Proto je název proměnné velmi důležitý! Pokud na levé straně (před:-) nahradíme Číslo za Číslo2, pak pravidlo změní svůj význam: Pro libovolné Číslo2 a Číslo, je-li Číslo prvočíslo a liché, pak Číslo2 je jednoduše liché. Ukazuje se, že všechna čísla jsou prvočíslo_liché! Toto je nejčastější chyba v Prologu.

A: B_1, B_2. Pravidlo % zní takto: Pokud B_1 a B_2, pak A liché_prvo(číslo) :- prime(číslo), liché(číslo). % Je-li "Číslo" prvočíslo a liché, potom "Číslo" je liché_prvo

Příklad - dokonalá čísla
dokonalé_číslo(N) :- číslo(N), součet_dělitelů_bez_čísla(N, SoučetDivisorů), rovno (Součet_dělitelů, H). dokonalé_číslo(1). rovná se (Objekt, Objekt). součet_dělitelů_bez_čísla(1, 1). součet_dělitelů_bez_čísla(číslo, součet) :- počet_předchozí(číslo, Předchozí), součet_dělitelů_čísla_k_číslu(číslo, Součet, Předchozí). součet_číslo_dělitelů_k_číslu(číslo, 1, 1). součet_číslo_dělitelů_k_číslu(číslo, Součet, Dělitel) :- děleno_by(číslo, Dělitel), číslo_předchozí(Dělitel, Předchozí), součet_číslo_dělitelů_k_číslu(číslo, SoučetPřed., Předchozí), přidat(Předchozí, Dělitel, Součet). součet_číslo_dělitelů_k_číslu(číslo, součet, dělitel) :- nedělitelný_by(číslo, dělitel), předchozí číslo (dělitel, předchozí), součet_číslo_dělitelů_k_číslu (číslo, součet, předchozí).

Nejprve si formálně přečteme, co pravidla znamenají:

  1. Pokud „H“ je číslo a pro „H“ a „SumDivisors“ je splněna podmínka sum_divisors_without_number, jinými slovy, SumDivisors je součet dělitelů čísla „H“ a „H“ se rovná „SumDivisors“ , pak „H“ je dokonalé číslo.
  2. 1 je dokonalé číslo. Pravidla nemusí mít podmínky, v takovém případě se nazývají fakta.
  3. Každý objekt "O" se rovná "O". V zásadě existuje standardní predikát "=", ale můžete ho zcela nahradit svým vlastním.
  4. Skutečnost, že součet_dělitelů_bez_čísla 1 je roven 1.
  5. Pokud je součet dělitelů "Číslo" až po předchozí číslo "Číslo" roven "Součet", pak se jedná o součet_dělitelů_bez_čísla. Je tedy vyjádřeno, že součet dělitelů X je menší nebo roven Y, protože X je dělitelné X, takže vezmeme Y = X - 1.
  6. Dále 3 predikáty určují součet dělitelů číslo menší nebo rovno Y (Divisor), 1. případ Y je roven 1, 2. případ Číslo je dělitelné Y, pak součet_dělitelů(X, Y) = součet_dělitelů(X, Y- 1) + Y a 3. pád Číslo není dělitelné Y, pak součet_dělitelů(X, Y) = součet_dělitelů(X, Y-1).
Program je jako soubor definic
Existuje druhý způsob, jak číst tato pravidla, méně matematický a přirozenější, založený na „definicích“. Můžete si všimnout, že v Prologu všechna pravidla vlevo (v tehdejší části) obsahují pouze jednu podmínku, která je v podstatě „definicí“ této podmínky.
Například 1. pravidlo je definice dokonalých čísel. "H" je dokonalé číslo, když "H" je číslo a součet dělitelů "H" se rovná "H". Identické predikáty jsou seskupeny podle názvu pomocí podmínky „nebo“. To znamená, že k definici můžete přidat: „H“ je dokonalé číslo, když..., nebo když „H“ je 1.

Tato metoda čtení je široce používaná, protože umožňuje spojovat predikáty do homogenních skupin a pomáhá pochopit, v jakém pořadí tlumočník odvíjí predikáty, aby
ověřit pravdivost některého tvrzení. Například je zřejmé, že pokud predikát nemá jedinou definici, pak je nemožné s ním dokázat pravdivost výroku. V příkladu č. 1 nemá predikát „děleno“ žádnou definici.

Zajímavým faktem je, že v Prologu nejsou žádné smyčky, žádná přiřazení proměnných, žádné deklarace typu, a pokud si pamatujeme i termíny a ořez, jazyk se stává algoritmicky úplným.

Termální lázně
Termální lázně mají rekurzivní definici jako pojmenovanou kolekci objektů. Termín = "jméno" (objekt, objekt, ...), příklad osoba("Jméno", "Příjmení"), "+"(1, 2), osoba(adresa("Nějaká adresa"), příjmení ("Příjmení"), telefon ("Telefon")). Pokud termín považujeme za matematický pojem, pak je termín funkcí, přesněji funktorem, tedy „+“(1, 2) znamená, že existuje objekt, který je roven 1+2. To vůbec neznamená, že 1+2 = 3, v Prologu tento výraz neplatí, stejně jako ve skupině zbytků modulo 2, tam 3 vůbec neexistuje. Opět z matematického hlediska jsou Proměnné spojeny slovem For All, a pokud ve výroku slovo existuje, pak se pro tento účel používá termín (funktor). Pro libovolné číslo existuje faktoriál: faktoriál(X, fakt(X)).

Z programátorského hlediska lze termíny vysvětlit mnohem jednodušeji: termín je objekt s množinou atributů, atributy mohou být jiné termíny nebo konstanty či proměnné (tedy nedefinované). Hlavní rozdíl je v tom, že všechny objekty v Prologu jsou neměnné, to znamená, že v nich nemůžete měnit atributy, ale existuje speciální stav - proměnná.

Příklad - Integer Aritmetic
nat(0). nat(číslo(číslo)) :- nat(číslo). plus(0, číslo, číslo). plus(číslo(N1), N2, číslo(Res)) :- plus(N1, N2, Res). multiply(0, Number, 0). multiply(number(Ch1), Ch2, Res2) :- multiply(Ch1, Ch2, Res), plus(Res, Ch2, Res2).
  1. Definice vlastnosti nat (přirozené číslo). 0 je přirozené číslo, pokud je Číslo přirozené, pak existuje číslo objektu (Number), které je také přirozeným číslem. Matematicky výraz „číslo“ vyjadřuje funkci +1, z programátorského hlediska je „číslo“ rekurzivní datová struktura, zde jsou její prvky: číslo(0), číslo(číslo(0)), číslo(číslo (číslo(0))).
  2. Poměr plus je 0 + číslo = číslo. Jestliže Ch1 + Ch2 = Res, pak (Ch1+1) + Ch2 = (Res+1).
  3. Poměr k násobení je 0 * Číslo = 0. Jestliže Ch1 * Ch2 = Res a Res + Ch2 = Res2, pak (Ch1+1) * Ch2 = Res2.
Je zřejmé, že tato tvrzení platí pro běžnou aritmetiku, ale proč jsme nezahrnuli stejná zjevná tvrzení jako Číslo + 0 = Číslo. Odpověď je jednoduchá: redundance je podle jakékoli definice velmi špatná. Ano, to může pomoci výpočtům, jakási předčasná optimalizace, ale vedlejšími efekty mohou být rozpory v definicích, nejednoznačný výstup příkazu a zacyklení interpretu.

Jak Prolog chápe predikáty a jak dokazuje tvrzení

Čtecí programy samozřejmě pomáhají získat cit pro styl Prolog, ale není z nich jasné, proč a jak lze tyto definice použít. Výše uvedené příklady nelze nazvat plnohodnotným programem, protože není dostatek vstupních bodů. Vstupním bodem do Prologu je dotaz, analogický dotazu na SQL databázi nebo analogický volání hlavní funkce ve funkcionálním programování. Příklady dotazů: nat(Číslo) - najděte přirozené číslo, plus(0, 0, Výsledek) - najděte výsledek sečtení 0 a 0 v proměnné Výsledek, nat(0) - zkontrolujte, zda je 0 přirozené číslo atd. .

Výsledky dotazů samozřejmě není těžké předvídat z logických úvah, ale je nesmírně důležité pochopit, jak je program získal. Prolog totiž není černá skříňka, ale programovací jazyk, a na rozdíl od databáze, kde je sestaven plán SQL a dotaz lze na různých Databázích provádět různě, má Prolog velmi specifické pořadí provádění. Faktem je, že v Databázi zcela víme, jakou odpověď chceme získat na základě údajů v tabulce, bohužel při pohledu do Prologu programu je poměrně obtížné říci, které příkazy jsou logicky odvoditelné, takže je mnohem jednodušší abyste pochopili, jak funguje interpret Prolog.

Podívejme se na příklad žádosti plus(0, 0, výsledek) :
1. Najdeme shodu (jakýsi vzor-matching, rozlišení) tohoto požadavku s levou částí jednoho z pravidel. Pro tento dotaz plus(0, číslo, číslo). Porovnejme všechny argumenty dotazu s pravidlem jeden po druhém a získáme: 0 = 0, 0 = číslo, výsledek = číslo. Tyto rovnice zahrnují 2 proměnné (Číslo a Výsledek), jejichž řešením dostaneme, že Číslo = Výsledek = 0. Protože toto pravidlo nemá žádné podmínky, dostali jsme odpověď na položenou otázku. Odpověď: ano a výsledek = 0.

Žádost nat (číslo) :
1. 1. shodu s pravidlem, pravidlem nat(0), najdeme tak, že rovnice vyřešíme korespondenčně, jinými slovy, nalezením rozlišení dostaneme Číslo = 0. Odpověď: ano a Číslo = 0.

Žádost plus(Výsledek, 0, číslo(0)) :
1. Najděte řešení pomocí pravidla plus(0, Číslo, Číslo): Výsledek = 0, 0 = Číslo, číslo(0) = Číslo, ale (!) Číslo = 0 = číslo(0) - není možné, protože 0 je stejné číslo (0). Proto hledáme řešení s následujícím pravidlem.
2. Najděte rozlišení pomocí pravidla plus(číslo(N1), Ch2, číslo(Res)), dostaneme číslo(N1) = Výsledek, Ch2 = 0, číslo(Res) = číslo(0), tedy Res = 0 Toto pravidlo, existují podmínky, které musíme zkontrolovat, s ohledem na výsledky rozlišení (proměnné hodnoty), plus(Ch1, Ch2, Res) -> plus(Ch1, 0, 0). Zapamatujeme si hodnotu proměnných v zásobníku a vytvoříme nový požadavek plus(H1; 0; 0)
3*. Řešením dotazu plus(Х1, 0, 0) najdeme rozlišení s plus(0, Číslo, Číslo) a dostaneme Х1 = 0 a Číslo = 0.
4. Vrátíme se podél zásobníku k předchozím proměnným Result = number(N1) = number(0). Odpověď byla nalezena číslo(0). V souladu s tím nyní prologový stroj vyřešil rovnici X + 0 = 1.

Kompetentně sestavit pravidla v jazyce Prolog je velmi náročná věc, ale pokud je poskládáte kompaktně, můžete získat nejen přímé odpovědi a řešení, ale i obrácená.

Příklad žádosti plus(číslo, číslo, číslo) : odpověď je ano, číslo = 0.

Příklad žádosti plus(0; 0; 0) : odpověď je ne, na první pokus nejsou všechna předsevzetí splněna.

Příklad žádosti plus(číslo, číslo, číslo(číslo)) : Odpověď je ano, Číslo = 1. Řešení rovnice X + X = X + 1.

Zkuste zadat výstup pro multiply(Number, number(0), number(0)), bude to vyžadovat 2x vložení proměnných do zásobníku a výpočet nového dotazu. Podstatou stroje Prolog je, že můžete zahodit 1. výsledek, poté se Prolog vrátí do předchozího stavu a pokračuje ve výpočtu. Například žádost nat (číslo) , nejprve použije 1. pravidlo a výstup 0, a poté použije 2. pravidlo + 1. pravidlo a vypíše číslo (0), můžete opakovat a získat nekonečnou posloupnost všech přirozených čísel. Další příklad, žádost plus(číslo, číslo(0), číslo2) , vytvoří posloupnost všech dvojic řešení rovnice X + 1 = Y.

Závěr

Přiměřená velikost tématu mi bohužel nedovolila přiblížit se k hlavnímu tématu, totiž řešení složitých logických problémů v Prologu, aniž bych měl strategii jejich řešení. Velké kusy kódu Prologu mohou vyděsit nejen začátečníky, ale i zkušené programátory. Účelem tohoto článku je ukázat, že programy Prolog mohou jednoduše číst v přirozeném jazyce, a provedené jednoduchým tlumočníkem.
Hlavním rysem Prologu je, že to není černá skříňka nebo knihovna, která řeší složité logické problémy, můžete do Mathematica zadat algebraickou rovnici a ta vygeneruje řešení, ale sekvence provedených kroků není známa. Prolog neumí řešit obecné logické problémy (chybí mu logické „nebo“ a „negace“), jinak by jeho výstup byl nedeterministický jako lineární rozlišení. Prolog je zlatá střední cesta mezi jednoduchým interpretem a strojem na dokazování teorémů, posun kterýmkoli směrem vede ke ztrátě jedné z vlastností.

V příštím článku bych chtěl mluvit o tom, jak se řeší problémy s řazením, o posloupnosti transfuzí, slečnách Manners a dalších známých logických problémech. Pro ty, kteří se cítí nespokojeni, chci nabídnout další úkol (první, kdo vyřeší cenu):
Napište predikát, což by generovalo nekonečnou posloupnost přirozených čísel počínaje 3. Mělo by se jednat o standardní čísla v Prologu, operace, na kterých se provádějí pomocí predikátu is: X je 3 + 1 => X=4.

Po mnoho tisíciletí lidstvo shromažďuje, zpracovává a předává znalosti. Pro tyto účely se neustále vymýšlejí nové prostředky a zdokonalují se staré: řeč, psaní, pošta, telegraf, telefon atd. Velkou roli v technologii zpracování znalostí sehrál nástup počítačů.

V říjnu 1981 oznámilo japonské ministerstvo mezinárodního obchodu a průmyslu vytvoření výzkumné organizace – Institutu pro výzkum počítačové technologie nové generace. Cílem tohoto projektu bylo vytvořit znalostní systémy pro zpracování informací. Předpokládalo se, že tyto systémy budou poskytovat snadnou správu díky schopnosti komunikovat s uživateli pomocí přirozeného jazyka. Tyto systémy měly být samoučící se, využívat znalosti nashromážděné v paměti k řešení různých druhů problémů, poskytovat uživatelům odborné rady a uživatel nemusel být odborníkem na informatiku. Předpokládalo se, že člověk bude moci používat počítač páté generace stejně snadno jako jakýkoli domácí elektrospotřebič, jako je televize, magnetofon a vysavač. Brzy po japonském se rozběhly americké a evropské projekty.

Vznik takových systémů by mohl změnit technologii pomocí znalostních bází a expertních systémů. Hlavní podstatou kvalitativního přechodu k páté generaci počítačů byl přechod od zpracování dat ke zpracování znalostí. Japonci doufali, že se jim podaří nepřizpůsobit lidské myšlení principům fungování počítače, ale přiblížit ovládání počítače způsobu myšlení člověka a zároveň se vzdálit von Neumannově architektuře počítačů. V roce 1991 bylo plánováno vytvoření prvního prototypu počítačů páté generace.

Nyní je jasné, že stanovených cílů nebylo nikdy plně dosaženo, ale tento projekt posloužil jako impuls pro rozvoj nového kola výzkumu v oblasti umělé inteligence a způsobil explozi zájmu o logické programování. Protože tradiční von Neumannova architektura nebyla vhodná pro efektivní implementaci, byly vytvořeny specializované logické programovací počítače PSI a PIM.

Jako hlavní metodika pro vývoj softwaru pro počítačový projekt páté generace byla vybrána následující: logické programování, jehož výrazným představitelem je jazyk Prolog. Zdá se, že v současnosti zůstává Prolog nejoblíbenějším jazykem umělé inteligence v Japonsku a Evropě (v USA je tradičně rozšířenější jiný jazyk umělé inteligence - funkcionální programovací jazyk Lisp).

Název jazyka "Prolog" pochází ze slov LOGICKÉ PROGRAMOVÁNÍ(PROgrammation en LOGique ve francouzštině a PROgramming in LOGic v angličtině).

Prolog je založen na takovém odvětví matematické logiky, jako je predikátový počet. Přesněji řečeno, jeho základem je postup při dokazování vět metoda rozlišení Pro Klauzule o rohu. Tomuto tématu bude věnována následující přednáška.

V historii vzniku a vývoje jazyka Prolog lze rozlišit následující etapy.

V roce 1965 J. Robinson v článku „A machine oriented logic based on the resolution princip“, publikovaném ve 12. čísle Journal of the ACM, představil metodu automatického hledání důkazů teorémů v predikátovém počtu prvního řádu, tzv. " princip rozlišení". Toto dílo lze číst v překladu: Robinson J. Strojově orientovaná logika založená na princip usnesení// Kybernetická sbírka. - Sv. 7 (1970). Ve skutečnosti nápad na tuto metodu navrhl Herbrand v roce 1931, kdy ještě nebyly počítače (Hebrrand, „Une methode demonstration“, These, Paris, 1931). Robinson tuto metodu upravil tak, aby se stala vhodnou pro automatické, počítačové použití, a navíc vyvinul účinný sjednocovací algoritmus, který tvoří základ jeho metody.

V roce 1973 vytvořila „skupina umělé inteligence“ vedená Alainem Colmeroem program na univerzitě v Marseille určený k dokazování teorémů. Tento program byl použit k vytvoření systémů zpracování textu v přirozeném jazyce. Program pro dokazování teorémů se jmenoval Prolog (z Programmation en Logique). Sloužil jako prototyp pro Prologue. Legenda praví, že autorkou tohoto jména byla manželka Alana Colmeroe. Program byl napsán ve Fortranu a běžel poměrně pomalu.

Práce Roberta Kowalského měla velký význam pro rozvoj logického programování. Predikátová logika Jak programovací jazyk(Kowalski R. Preddicate Logic as Programming Language. Kongres IFIP, 1974), ve kterém ukázal, že k dosažení efektivity se člověk musí omezit na použití množiny Klauzule o rohu. Mimochodem, je známo, že Kowalski a Colmeroe spolu pracovali během jednoho léta.

V roce 1976 Kowalski spolu se svým kolegou Maartenem van Emdenem navrhl dva přístupy ke čtení textů logických programů: procedurální a deklarativní. Tyto přístupy budou diskutovány ve třetí přednášce.

V roce 1977 v Edinburghu vytvořili Warren a Pereira velmi účinný kompilátor Prologu pro počítač DEC-10, který sloužil jako prototyp pro mnoho následných implementací Prologu. Zajímavě,

Přednáška je věnována řešení úloh pomocí stavového grafu. Stavový prostor je popsán ve formě množiny stavů - vrcholů grafu, množiny přechodů ze stavu do stavu - oblouků grafu, množiny počátečních stavů a ​​množiny konečných stavů. Řešení problému je znázorněno jako cesta na grafu stavového prostoru spojující počáteční stav s konečným stavem. Pokud je stavový prostor problému malý, pak budou všechna optimální řešení nalezena pomocí hledání do hloubky. V problémech s velkým stavovým prostorem bude pomocí prohledávání do šířky vypočítáno pouze jedno optimální řešení. Univerzální řešiče se aplikují na problémy. Stavy v různých úlohách mohou patřit do různých domén. Pro zapamatování nejlepších nalezených řešení se používá „variabilní proměnná“ varM. Kompilátor sám najde potřebné typy. Visual Prolog verze 7.5, dosud nezveřejněna. Její vydání je plánováno na rok 2014, ale přesné datum zatím není známo. Visual Prolog 7.4 je nyní k dispozici všem.

Vzhled Prologu byl způsoben rozvojem logiky, matematiky a programování. Poslední jmenovaný sehrál nejvýznamnější roli. Specialisté na logiku a matematiku se pokusili uvést programování na „správnou cestu“, ale vývoj informačních technologií ukázal zcela jiný výsledek.

Jako slibnější se ukázalo pragmatické imperativní programování. „Prolog“ uspěl jako programovací jazyk, ale nestal se základem umělé inteligence.

Klasické programování vs logika

Člověk dělá obtížná rozhodnutí logicky a rozumně. Téměř bez přemýšlení člověk jedná moudře. Pokud nebereme v úvahu rozhodnutí, která vyžadují shromažďování informací, jejich analýzu a složité výpočty, pak je jakýkoli výsledek rychlý, přesný a rozumný.

Tato skutečnost vždy dávala iluzorní důvod považovat vytvoření rozhodovacího nástroje za jednoduchou záležitost. S příchodem Prologue se zdálo, že otázka umělé inteligence je technologickou záležitostí a Homo sapiens přišel se třemi zákony robotiky. Umělá inteligence však zůstala duchem a tři zákony robotiky se ukázaly jako z pohádky – „udělej to, já nevím co“.

Programování v klasickém slova smyslu (často se používají termíny „procedurální“, „imperativní“ nebo „funkční“) se rozvinulo a úspěšně překonalo „neklidné časy“ 80.-90. let, kdy existovalo nespočet programovacích jazyků.

Demonstrační boj mezi „Pascalem“ a „Si“ trval dlouho a byl brutální, ale skončil neutrálně a tiše. Zůstává myšlenka dobrého programovacího jazyka a několik jeho úspěšných implementací.

To neznamená, že Prolog jako programovací jazyk se nevyvíjel. Stanovených cílů ale nedosáhl. Dnes můžeme nejen říci, ale také ospravedlnit: „Prolog“ je akademický jazyk pro:

  • Učební cíle;
  • predikátová logika;
  • matematika;
  • úzké uplatnění.

Je pochybné, že toto tvrzení lze vyvrátit. Umělá inteligence je nejen hojně využívaná, ale také velmi závažnou událostí, která radikálně mění sociální strukturu a obraz světa.

Programování v jazyce Prolog pro umělou inteligenci se nekonalo: za více než čtyřicet let historie jazyka nedošlo k jediné radikálně nové události, která by byla relevantní pro veřejné povědomí, což by naznačovalo opak.

Objektivní realita je taková: nepřežije ani tak nejsilnější, jako spíše to, co je žádané a relevantní.

"Prolog" je deklarativní programovací jazyk

Mít nástroj k popisu faktů a pravidel je dobré, ale jaký to má smysl? Fakta a pravidla dokonale zapadají do běžné databáze. Kvalifikovaný klasický programátor poskytuje uživateli interaktivní dialog a ten řeší jeho problémy.

V případě potřeby programátor zpřesní dialog a uživatel doplňuje databázi faktů a pravidel. Naprosto fungující a desetiletími prověřená možnost implementace množství již vyřešených a řešitelných problémů.

Deklarativní prezentace faktů a pravidel v jakékoli implementaci programovacího jazyka Prolog je konvence, pokus o formalizaci reality v jejím intelektuálním stavu. Konvenční programování se nedotýká intelektu. Klasické programování se spokojí s pozicí: popis a zpracování dat. Je zde spousta problémů, ale existuje spousta skvělých řešení, která fungují.

"Prolog" jako programovací jazyk jsou fakta:

  • matka (Maria, Natasha); - Maria - Natashina matka;
  • táta (Jevgenij, Marina); - Evgeniy je Marinin otec.

Zde je skutečnost okamžitě přes palubu: „Maria“ a „Marina“ jsou různá jména. Nic vám nebrání přidat skutečnost:

  • táta (Eugene, Maria); - Evgeniy je Mariin otec.

Tyto popisy oživují pravidla:

  • rodič(x,y)<- папа (x, y);
  • rodič(x,y)<- мама (x, y);

Neumožňují nám však dojít k závěru, že táta je Marinin otec a Marina je Mariina matka. Tento problém lze vyřešit, můžete přidat jedno další pravidlo, přidat ještě jeden fakt. Ale kolik z těchto akcí by mělo být provedeno v reálné situaci?

Ve skutečnosti je „Prolog“ jako programovací jazyk příkladem deklarace faktů a pravidel, nikoli však logiky, na kterou je vědomí klasického programátora zvyklé. "Prolog" se staví jako jazyk predikátové logiky, ale programování se v něm můžete naučit pouze prostřednictvím příkladů a ukázkových popisů od vývojářů konkrétní implementace jazyka.

Prologová rodina

Francie je považována za místo narození Prologu a rok 1973 je rokem narození. Zájem o jazyk se periodicky obnovoval, ale ustupoval se záviděníhodnou stabilitou. Motto jazyka: „Predikátová logika je elementární! To je způsob, jak vysvětlit, jak myšlení funguje“ – a zůstalo mottem.

Jakákoli implementace programovacího jazyka Prolog striktně dodržovala predikátovou logiku, ale vždy zahrnovala klasické myšlenky procedurálního programování. Je správnější říci „imperativ“, protože tento termín se používá více formálně než procedurální, funkční, objektově orientovaný nebo jiný.

Jakékoli programování je o datech a jejich zpracování. Jazykové konstrukce musí co nejpřesněji popisovat řešený problém, proto všechny známé implementace Prologu: Turbo Prolog, Win Prolog, SWI Prolog, GNU Prolog, Visual Prolog a další obsahují kromě deklarativních konstrukcí i běžné imperativní výrazy.

Předpokládá se, že rodina Prologue je vyvinuta v akademických a výzkumných organizacích, a proto o ní lze mluvit pouze jako o společném jazyce v koncepčním smyslu. Nicméně lze považovat samotnou skutečnost, že koncept „Prolog“ je živý a rozvíjející se: tento jazyk má rozsah a je v určitém rozsahu úkolů žádaný.

Základ umělé inteligence

Zájem o umělou inteligenci nikdy neopadl, jen se o ní začne mluvit, když nastane další příležitost, ale Prolog nikdy nebyl s umělou inteligencí spojován více než obyčejný klasický programovací jazyk.

Na konci 80. let vznikl skutečný, relevantní a populární intelektuální projekt „The Inventing Machine“. Byl zde skutečný pokus použít Prolog k formalizaci obrovské praktické znalostní báze (data) o vynálezech, fyzikálních, chemických a jiných zákonech.

Výsledek se nedostavil, v Prologu jako programovacím jazyku muselo být napsáno příliš mnoho faktů a pravidel, které měly banální imperativ. Mezitím bylo mnoho úspěšných softwarových produktů implementováno paralelně v běžných jazycích.

Počátkem 90. let byl úspěšně realizován projekt skutečného intelektuálního systému, který simuloval chování dítěte do 3 let na počítači EU! O možnosti použití Prologu se ani neuvažovalo.

Tento intelektuální systém nejenže „přišel na to, co je máma a táta, a čím se Maria liší od Mariny, ale také bez větší námahy nezávisle přeskočil od nabytých znalostí o těchto otázkách ke koulím a jejich odlišnostem od kostek, k barvám objektů a... (!) k elementární matematice: jednoduché aritmetické operace se ukázaly být v jejích možnostech na základě znalostí získaných řešením zcela jiných problémů.

Nedá se říci, že by klasické programování předstihlo Prolog, pokud jde o zvládnutí území umělé inteligence, ale dává reálné výsledky.

Co se týče inteligence jako úkolu, otázka zde zjevně nespočívá v jazyce, ale v myšlence implementace. Pokud by se assembler z roku 1991 mohl „stát základem“ pro inteligentní systém situační inteligence, pak problém zjevně nespočívá v implementačním jazyce, ale v myšlence.

Programovací jazyk Prolog je jedním z předních logických programovacích jazyků. V 70. letech jej vytvořil Alain Colmerauer. Byl to pokus vytvořit programovací jazyk pro začátečníky, který umožňuje vyjadřovat logiku spíše než pečlivě specifikovat, čeho chcete pomocí instrukcí na obrazovce počítače dosáhnout.

Prolog se používá v mnoha programech umělé inteligence, ale jeho syntaxe a sémantika jsou velmi jednoduché a jasné (původním účelem bylo poskytnout nástroj pro počítačově negramotné lingvisty). Název Prolog je zkratkou pro LOGICKÉ PROGRAMOVÁNÍ a je široce známý ve výuce základů programování.

Prolog je založen na predikátovém počtu (přesněji predikátovém počtu prvního řádu), ale omezuje se na Hornovy formule. Prolog programy jsou efektivní pro dokazování teorémů k první aproximaci. Základní pojmy spojení, rekurze ocasu a sledování.

Typy dat

Prolog nepoužívá datové typy způsobem, na který jsme zvyklí v běžných programovacích jazycích. Místo datových typů můžeme mluvit o lexikálních prvcích Prologu, což je v programování pro figuríny neobvyklé.

Konstantní text se zadává pomocí atomů. Atom je posloupnost písmen, čísel a podtržítka, která začíná malým písmenem. Obvykle, pokud se nejedná o alfanumerické atomy, je nutné je orámovat apostrofy (např. „+“ je atom, + je operátor).

Většina implementací Prologu nerozlišuje mezi reálnými a zlomkovými čísly.

Proměnné

Proměnné jsou identifikovány řetězcem skládajícím se z písmen, čísel a podtržítek, který začíná velkým písmenem. V prostředí Prologu není proměnná kontejner, který lze přiřadit (na rozdíl od procedurálních programovacích jazyků). Jeho chování se blíží modelu, který je podobný spojením.

Takzvané anonymní proměnné se zapisují jako jedno podtržítko (_).

Termíny jsou jediným způsobem, jak může Prolog reprezentovat komplexní data. Termín se skládá z hlavy, nazývané také funktor (což musí být atom) a parametrů (neomezeno na typy). Důležitý je počet parametrů, tzv. arity termínu. Termín je definován svou hlavou a aritou, obvykle se zapisuje jako funktor/arita.
Seznamy

Seznam není samostatný datový typ, protože je definován rekurzivní konstrukcí (s použitím termínu /2 "."):

Atom - prázdný seznam

Pro pohodlí programátora lze seznamy vytvářet a ničit různými způsoby.

Je-li L seznam a X prvek, pak "." (X, L) je členem seznamu. První prvek X následovaný obsahem kontextu L je syntakticky reprezentován jako.

Pro pohodlí programátora lze seznamy vytvářet a ničit různými způsoby.

Výpis položek:
Předmluva jednoho prvku:
Předběžných několik prvků:
Rozšíření termínu: "."(abc, "."(1, "."(f(x), "."(Y, "."(g(A,rst), ))))))

Řetězce se obvykle zapisují jako sekvence znaků v uvozovkách. Často jsou reprezentovány jako seznamy kódů znaků ASCII.

Programování v PROLOGu je velmi odlišné od práce s procedurálními jazyky. V Prologu pracujete s databázemi faktů a pravidel, můžete spouštět databázové dotazy. Základní jednotkou Prologu je predikát, který je definován jako pravdivý. Predikát se skládá z hlavy a řady argumentů. Například:

Zde je "kočka" hlavou a "tom" je argument. Zde je několik příkladů dotazů, které můžete spustit pomocí překladače Prolog na základě této skutečnosti:

Kočka (tom).
Ano.

Kočka (X).
X = tom;
Ne.

Predikáty jsou obvykle definovány k vyjádření skutečnosti, pomocí které program ví o světě. Ve většině případů vyžaduje použití predikátů určité konvence. Co z následujícího by tedy znamenalo, že Pat je Sallyin otec?

Otec (sally, pat).
otec (poplácat, křičet).

"otec" je v obou případech hlavou a "sally" a "pat" jsou argumenty. Nicméně v prvním případě je Sally na prvním místě v seznamu argumentů a Pat je na druhém místě a naopak. První případ je příklad definice v pořadí Verb Subject a Object, ale ve druhém příkladu je pořadí Verb Object Subject. Vzhledem k tomu, že Prolog nerozumí angličtině, jsou obě verze v pořádku, ale považuje se za dobrý programovací styl držet se jednoho stylu, který se nazývá konvence, při psaní jednoho programu, spíše než psát něco jako:

Otec (poplácat, sally). otec (Jessica, James).

Některé predikáty jsou zabudovány do jazyka a umožňují Prologu snížit dřinu každodenních činností (jako je vstup/výstup pomocí grafiky a další komunikace s operačním systémem). Například predikáty zápisu lze použít pro zobrazení takto:

Napište ("ahoj")

Na obrazovce se zobrazí slovo „Ahoj“.

Pravidla

Druhým typem příkazů v Prologu jsou pravidla. Příklad pravidla:

Světlo(zapnuto):- spínač (zapnuto).

":-" znamená "if", toto pravidlo znamená, že světlo (on) je pravdivé (on), pokud je přepínač (on) pravdivý (jinak, pokud je přepínač zapnutý, pak svítí). Pravidla mohou také používat proměnné; proměnné začínají velkým písmenem, zatímco konstanty začínají malými písmeny. Například,

Otec(X,Y):- rodič(X,Y),muž(Y).

To znamená: "pokud je někdo rodič a je to muž, pak je otcem." Příčiny a následky mohou být i v obráceném pořadí, takže to neodporuje běžné logice. Do sekce důsledků můžete umístit více predikátů jejich kombinací dohromady, například:

Což je ekvivalentní několika prohlášením:

A:-d. b:-d. c:-d.

Ale pokyny jako:

Což je ekvivalent „jestli c pak a nebo b“. To je způsobeno omezením vyplývajícím z Hornova vzorce.