»Prologue« je programski jezik oziroma osnova umetne inteligence. Logično programiranje. Osnove jezika Prolog Kje se uporablja prolog?

Zakaj je neverjeten? Znam nekaj deset jezikov in ni mi problem naučiti se še enega novega, samo ne vidim več potrebe.

Prolog je edinstven. Je edini jezik, ki predstavlja paradigmo deklarativnega programiranja; to je jezik, ki ima na stotine različnih izvedb, a se še vedno imenujejo Prolog, imenu pa dodajajo samo predpone in pripone; je živ jezik, v katerem že več kot 20 let ni prišlo do bistvenih sprememb; To je verjetno edini programski jezik, ki je tako priljubljen in nima uporabe v pravem programiranju. Zakaj Prolog?

Prolog je edinstven po naravi, nastal je po srečnem naključju (skrivnostna zgradba sveta). Nekoč v 60. letih prejšnjega stoletja se je teorija avtomatskega dokazovanja izrekov zelo hitro razvijala in Robinson je predlagal algoritem ločljivosti, ki je omogočil dokazovanje katerega koli pravega izreka (izpeljavo iz aksiomov) v končnem času (za katerega ni znan). Kot se je kasneje izkazalo, je to najboljša rešitev splošnega problema, izrek je nemogoče dokazati v omejenem številu operacij. Preprosto povedano, algoritem je prehod (običajno neskončnega) grafa v širino. Seveda je predvidljivost delovanja algoritma praktično enaka 0, zato to absolutno ni primerno za programski jezik. In v tistem trenutku je Kalmarow našel briljantno zožitev problema, zahvaljujoč kateri je bil dokaz nekaterih teoremov videti kot proceduralna izvedba programa. Treba je omeniti, da je razred dokazljivih izrekov precej širok in zelo dobro uporaben za razred programabilnih problemov. Tako je leta 1972 nastal Prolog.

V tem članku bom poskušal govoriti o Prologu kot orodju za reševanje splošnih logičnih problemov. Ta tema bo zanimiva za tiste, ki že poznajo sintakso Prologa in jo želijo razumeti od znotraj, pa tudi za tiste, ki absolutno ne poznajo sintakse jezika, vendar želijo razumeti njegovo "ljubico", ne da bi porabili dodaten čas učenje skladenjskih struktur.


Glavna značilnost Prologa je, da ga je lahko brati, a zelo težko pisati, kar se bistveno razlikuje od vseh mainstream jezikov, ki pravijo, da je pisanje postalo še lažje, še en korak in lahko pišete na tablico, vlečete delujočih modulov, kot so prijatelji v storitvi Google+, vsi vemo, da zaradi tega močno trpi kakovost same kode. Zdi se, da je vsaka vrstica jasna, toda kako sistem deluje, ne razumejo niti razvijalci, kot pravijo v Hindustanu. Zdi se mi, da v vseh knjigah o poučevanju Prologa naredijo isto napako, začnejo zgodbo o dejstvih, odnosih, poizvedbah in človek razvije odnos do jezika kot ekspertnega sistema ali podatkovne baze. Veliko bolj pomembno je, da se naučiš pravilno brati programe in jih tako prebereš na desetine :)

Kako pravilno brati uvodne programe

Branje programov je zelo enostavno, saj ima jezik zelo malo posebnih simbolov in ključnih besed in se zlahka prevedejo v naravni jezik. Glavna napaka programerja je, da si želi takoj predstavljati, kako program deluje, in ne prebrati, kaj program opisuje, zato se mi zdi, da je veliko lažje trenirati nezamegljene možgane navadnega človeka kot programerja.
Koncepti
V jeziku obstajata 2 koncepta predikatov(pogoji) in predmetov(so tudi spremenljivke in izrazi). Predikati izražajo določen pogoj, na primer zeleni predmet ali praštevilo; naravno je, da imajo pogoji vhodne parametre. Na primer zeleni_predmet(predmet), praštevilo(število). Število parametrov v predikatu določa arnost predikata. Predmeti- so termini, konstante in spremenljivke. Konstante- to so številke in nizi, spremenljivke- izražajo neznan predmet, po možnosti tistega, ki ga iščejo, in so označene kot črte z velik pisma. Za zdaj pustimo pogoje in razmislimo o najpreprostejšem programu.
Program
Program je niz pravil obrazca Če je pogoj1 in pogoj2 in... potem je pogoj resničen. Formalno so ta pravila združena z IN, vendar je nemogoče dobiti protislovje, saj v Prologu ni logične negacije in je v vezniku To lahko prisoten samo en predikat (pogoj).

A:- B_1, B_2. Pravilo % se glasi: Če sta B_1 in B_2, potem A
liho_prime(število) :- pra(število), liho(število).
% Če je "Število" pra in liho, potem je "Število" liho_pra

Kot lahko vidite, ima ime spremenljivke obseg - to je pravilo. Matematično pravilno, pravilo zveni: za katero koli spremenljivko - "Število", če je pra in liho, potem je prime_odd. Podobno ga lahko preoblikujemo na naslednji način: Če obstaja »število«, ki je liho in praštevilo, potem je liho_prime. Zato je ime spremenljivke zelo pomembno! Če na levi strani (pred:-) zamenjamo Število s Število2, bo pravilo spremenilo svoj pomen: Za katero koli Število2 in Število, če je Število pra in liho, potem je Število2 preprosto liho. Izkazalo se je, da so vsa števila pra-liha! To je najpogostejša napaka v Prologu.

A:- B_1, B_2. Pravilo % se glasi: Če B_1 in B_2, potem A odd_prime(Number) :- prime(Number), odd(Number). % Če je "Število" pra in liho, potem je "Število" liho_pra

Primer - popolna števila
popolno_število(N) :- število(N), vsota_deliteljev_brez_števila(N, VsotaDeliteljev), enako (Vsota_deliteljev, H). popolno_število(1). enako (predmet, predmet). vsota_deliteljev_brez_števila(1, 1). vsota_deliteljev_brez_števila(število, vsota) :- število_prejšnje(število, prejšnje), vsota_deliteljev_števila_na_število(število, vsota, prejšnje). vsota_številskih_deliteljev_na_število(število, 1, 1). vsota_števil_deliteljev_na_število(število, vsota, delitelj) :- deljeno_z(število, delitelj), število_prejšnje(deljenec, prejšnji), vsota_števil_deliteljev_na_število(število, vsotaprejšnja, prejšnja), seštej(vsotaprejšnja, delitelj, vsota). vsota_števil_deliteljev_na_število(število, vsota, delitelj) :- ni_deljivo_z(število, delitelj), število_prejšnji(delitelj, prejšnji), vsota_števil_deliteljev_na_število(število, vsota, prejšnji).

Najprej formalno preberimo, kaj pravila pomenijo:

  1. Če je »H« število in je za »H« in »SumDivisors« izpolnjen pogoj sum_divisors_without_number, z drugimi besedami, SumDivisors je vsota deliteljev števila »H«, »H« pa je enako »SumDivisors« , potem je "H" popolno število.
  2. 1 je popolno število. Pravila morda nimajo pogojev, v tem primeru se imenujejo dejstva.
  3. Vsak predmet "O" je enak "O". Načeloma obstaja standardni predikat "=", vendar ga lahko popolnoma nadomestite s svojim.
  4. Dejstvo, da je vsota_deliteljev_brez_števila 1 enaka 1.
  5. Če je vsota deliteljev "Število" do prejšnjega števila "Število" enaka "Vsoti", potem je to vsota_deliteljev_brez_števila. Tako se izrazi, da je vsota deliteljev X manjša ali enaka Y, ker je X deljiv z X, zato vzamemo Y = X - 1.
  6. Nato 3 predikati določajo vsoto števila deliteljev, manjšega ali enakega Y (Delitelj), 1. primer Y je enak 1, 2. primer Število je deljivo z Y, nato vsota_deliteljev (X, Y) = vsota_deliteljev (X, Y- 1) + Y in 3. primer Število ni deljivo z Y, potem je vsota_deliteljev(X, Y) = vsota_deliteljev(X, Y-1).
Program je kot niz definicij
Obstaja še en način branja teh pravil, manj matematičen in bolj naraven, ki temelji na "definicijah". Opazite lahko, da v Prologu vsa pravila na levi (v takratnem delu) vsebujejo le en pogoj, ki je v bistvu “definicija” tega pogoja.
Na primer, 1. pravilo je definicija popolnih števil. "H" je popolno število, kadar je "H" število in je vsota deliteljev "H" enaka "H". Enaki predikati so razvrščeni po imenu z uporabo pogoja »ali«. To pomeni, da lahko definiciji dodate: "H" je popolno število, ko ... ali ko je "H" 1.

Ta metoda branja se pogosto uporablja, saj omogoča združevanje predikatov v homogene skupine in pomaga razumeti, v kakšnem vrstnem redu tolmač odvija predikate, da bi
preveriti resničnost kakšne izjave. Na primer, očitno je, da če predikat nima ene same definicije, potem je z njim nemogoče dokazati resničnost izjave. V primeru št. 1 predikat "deljeno z" nima definicije.

Zanimivo dejstvo je, da v Prologu ni zank, ni dodeljevanja spremenljivk, ni deklaracij tipov, in če se spomnimo še na izraze in izrezovanje, postane jezik algoritemsko popoln.

Termalne kopeli
Termalne kopeli imajo rekurzivno definicijo kot poimenovano zbirko predmetov. Izraz = "ime" (objekt, predmet, ...), primer oseba ("Ime", "Priimek"), "+" (1, 2), oseba (naslov ("Neki naslov"), priimek ("Priimek"), telefon ("Telefon")). Če termin obravnavamo kot matematični pojem, potem je izraz funkcija ali natančneje funktor, to pomeni, da “+”(1, 2) pomeni, da obstaja objekt, ki je enak 1+2. To nikakor ne pomeni, da je 1+2 = 3; v Prologu ta izraz ne drži, tako kot v skupini ostankov po modulu 2 3 sploh ne obstaja. Spet z matematičnega vidika so spremenljivke povezane z besedo Za vse in če v stavku beseda obstaja, potem se za ta namen uporabi izraz (funktor). Za katero koli število obstaja faktorsko število: factorial(X, fact(X)).

S programskega vidika je izraze mogoče razložiti veliko preprosteje: izraz je objekt z nizom atributov, atributi so lahko drugi izrazi ali konstante ali spremenljivke (to je nedefinirano). Glavna razlika je v tem, da so vsi predmeti v Prologu nespremenljivi, to pomeni, da v njih ne morete spremeniti atributov, vendar obstaja posebno stanje - spremenljivka.

Primer – aritmetika celih števil
nat(0). nat(število(število)) :- nat(število). plus(0, število, število). plus(število(N1), N2, število(Res)) :- plus(N1, N2, Res). pomnoži (0, število, 0). pomnoži (število (Ch1), Ch2, Res2) :- pomnoži (Ch1, Ch2, Res), plus (Res, Ch2, Res2).
  1. Opredelitev lastnosti nat (naravno število). 0 je naravno število, če je število naravno, potem obstaja predmetno število (število), ki je prav tako naravno število. Matematično izraz "število" izraža funkcijo +1; s programskega vidika je "število" rekurzivna podatkovna struktura, tukaj so njeni elementi: število (0), število (število (0)), število (število (število(0))).
  2. Razmerje plus je 0 + število = število. Če je Ch1 + Ch2 = Res, potem (Ch1+1) + Ch2 = (Res+1).
  3. Razmerje za množenje je 0 * število = 0. Če je Ch1 * Ch2 = Res in Res + Ch2 = Res2, potem je (Ch1+1) * Ch2 = Res2.
Očitno so te izjave resnične za običajno aritmetiko, toda zakaj potem nismo vključili istih očitnih, kot je število + 0 = število. Odgovor je preprost: odvečnost je po kateri koli definiciji zelo slaba. Da, to lahko pomaga pri izračunih, neke vrste prezgodnja optimizacija, vendar so stranski učinki lahko protislovja v definicijah, dvoumen izpis izjave in zankanje tolmača.

Kako Prolog razume predikate in kako dokazuje izjave

Seveda branje programov pomaga pridobiti občutek za stil Prolog, vendar ne pojasni, zakaj in kako se te definicije lahko uporabljajo. Zgoraj navedenih primerov ni mogoče imenovati polnopravni program, ker ni dovolj vstopne točke. Vstopna točka v Prolog je poizvedba, podobna poizvedbi po bazi podatkov SQL ali podobna klicu glavne funkcije v funkcionalnem programiranju. Primeri poizvedb: nat(Number) - poišči naravno število, plus(0, 0, Result) - poišči rezultat seštevanja 0 in 0 v spremenljivki Rezultat, nat(0) - preveri, ali je 0 naravno število itd. .

Rezultatov poizvedb seveda ni težko predvideti iz logičnih premislekov, vendar je izjemno pomembno razumeti, kako jih je program pridobil. Navsezadnje Prolog ni črna skrinjica, ampak programski jezik in za razliko od podatkovne baze, kjer je zgrajen načrt SQL in se lahko poizvedba izvede različno v različnih podatkovnih bazah, ima Prolog zelo specifičen vrstni red izvajanja. Dejstvo je, da v Bazi popolnoma vemo, kakšen odgovor želimo dobiti na podlagi podatkov v tabeli, žal pa je ob pogledu na Prolog programa precej težko reči, kateri stavki so logično izpeljivi, zato je veliko lažje razumeti, kako deluje tolmač Prolog.

Poglejmo primer zahteve plus(0, 0, rezultat) :
1. Najdemo ujemanje (neke vrste ujemanje vzorcev, ločljivost) te zahteve z levo stranjo enega od pravil. Za to poizvedbo plus(0, število, število). Povežimo vse argumente poizvedbe s pravilom enega za drugim in dobimo: 0 = 0, 0 = število, rezultat = število. Te enačbe vključujejo 2 spremenljivki (število in rezultat), pri njunem reševanju dobimo, da je število = rezultat = 0. Ker to pravilo nima pogojev, smo prejeli odgovor na zastavljeno vprašanje. Odgovor: da in rezultat = 0.

Prošnja nat (število) :
1. Prvo ujemanje s pravilom, pravilom nat(0), najdemo s korespondenčnim reševanjem enačb, z drugimi besedami, z iskanjem ločljivosti dobimo Število = 0. Odgovor: da in Število = 0.

Prošnja plus(rezultat, 0, število(0)) :
1. Poiščite rešitev s pravilom plus(0, število, število): rezultat = 0, 0 = število, število(0) = število, toda (!) število = 0 = število(0) - ni mogoče, ker je 0 isto število (0). Zato iščemo rešitev z naslednjim pravilom.
2. Poiščite ločljivost s pravilom plus(število(N1), N2, število(Res)), dobimo število(N1) = rezultat, N2 = 0, število(Res) = število(0), torej Res = 0 Ta pravila, obstajajo pogoji, ki jih moramo preveriti ob upoštevanju rezultatov ločljivosti (vrednosti spremenljivk), plus(Ch1, Ch2, Res) -> plus(Ch1, 0, 0). Zapomnimo si vrednost spremenljivk na skladu in ustvarimo novo zahtevo plus (H1, 0, 0)
3*. Z reševanjem poizvedbe plus(Х1, 0, 0) najdemo resolucijo s plus(0, Število, Število) in dobimo Х1 = 0 in Število = 0.
4. Po skladu se vrnemo k prejšnjim spremenljivkam Rezultat = število(N1) = število(0). Odgovor je bil najden številka (0). V skladu s tem je prologni stroj zdaj rešil enačbo X + 0 = 1.

Kompetentno sestavljanje pravil v jeziku Prolog je zelo težka stvar, a če jih sestavite kompaktno, lahko dobite ne le neposredne odgovore in rešitve, ampak tudi obratne.

Primer zahteve plus (število, število, število) : odgovor je da, število = 0.

Primer zahteve plus (0, 0, 0) : odgovor je ne, v prvem poskusu niso izpolnjeni vsi sklepi.

Primer zahteve plus (število, število, število (število)) : Odgovor je pritrdilen, število = 1. Reševanje enačbe X + X = X + 1.

Poskusite izpisati za multiply(Number, number(0), number(0)), to bo zahtevalo dvakratno potiskanje spremenljivk na sklad in izračun nove poizvedbe. Bistvo stroja Prolog je, da lahko zavržete 1. rezultat, nato pa se Prolog vrne v prejšnje stanje in nadaljuje z izračunom. Na primer zahteva nat (število) , bo najprej uporabil 1. pravilo in izpisal 0, nato pa uporabil 2. pravilo + 1. pravilo in izpisal število (0), lahko ponovite in dobite neskončno zaporedje vseh naravnih števil. Še en primer, zahteva plus (število, število (0), število 2) , bo ustvaril zaporedje vseh parov rešitev enačbe X + 1 = Y.

Zaključek

Na žalost mi razumna velikost teme ni omogočila, da bi se približal glavni temi, namreč reševanju kompleksnih logičnih problemov v Prologu, ne da bi imel strategijo za njihovo reševanje. Veliki kosi kode Prolog lahko prestrašijo ne le začetnike, ampak celo izkušene programerje. Namen tega članka je pokazati, da lahko programi Prolog preprosto brati v naravnem jeziku, in izvede preprost tolmač.
Glavna značilnost Prologa je, da ni črna skrinjica ali knjižnica, ki rešuje zapletene logične probleme; v Mathematico lahko vnesete algebraično enačbo in ta bo dala rešitev, vendar zaporedje izvedenih korakov ni znano. Prolog ne more rešiti splošnih logičnih problemov (manjka mu logični "ali" in "negacija"), sicer bi bil njegov rezultat nedeterminističen kot linearna ločljivost. Prolog je zlata sredina med preprostim tolmačem in strojem za dokazovanje izrekov; premik v katero koli smer vodi do izgube ene od lastnosti.

V naslednjem članku bi rad govoril o tem, kako se rešujejo težave z razvrščanjem, o zaporedju transfuzij, gospodični Manners in drugih dobro znanih logičnih problemih. Za tiste, ki se počutijo nezadovoljne, želim ponuditi naslednja naloga (prva oseba, ki reši nagrado):
Napišite predikat, ki bi ustvaril neskončno zaporedje naravnih števil, začenši s 3. To bi morala biti standardna števila v Prologu, operacije na katerih se izvajajo z uporabo predikata is: X je 3 + 1 => X=4.

Dolga tisočletja je človeštvo nabiralo, obdelovalo in prenašalo znanje. V te namene se nenehno izumljajo nova sredstva in izboljšujejo stara: govor, pisanje, pošta, telegraf, telefon itd. V tehnologiji obdelave znanja je pomembno vlogo odigral pojav računalnikov.

Oktobra 1981 je japonsko ministrstvo za mednarodno trgovino in industrijo objavilo ustanovitev raziskovalne organizacije - Inštituta za raziskovalno središče nove generacije računalniške tehnologije. Cilj tega projekta je bil ustvariti na znanju temelječe sisteme za obdelavo informacij. Predpostavljalo se je, da bodo ti sistemi zagotavljali enostavnost upravljanja zaradi zmožnosti komuniciranja z uporabniki z uporabo naravnega jezika. Ti sistemi naj bi bili samoučeči, uporabljali bi znanje, nakopičeno v pomnilniku, za reševanje najrazličnejših problemov, uporabnikom bi dajali strokovne nasvete, uporabnik pa naj ne bi bil specialist za računalništvo. Predpostavljalo se je, da bo oseba lahko uporabljala računalnik pete generacije tako enostavno kot kateri koli gospodinjski električni aparat, kot so TV, magnetofon in sesalnik. Kmalu za japonskim so se začeli ameriški in evropski projekti.

Pojav takih sistemov bi lahko spremenil tehnologijo z uporabo baz znanja in ekspertnih sistemov. Glavno bistvo kvalitativnega prehoda na peto generacijo računalnikov je bil prehod od obdelave podatkov k obdelavi znanja. Japonci so upali, da jim ne bo uspelo človeškega razmišljanja prilagoditi principom delovanja računalnikov, ampak delovanje računalnika približati načinu človekovega razmišljanja, hkrati pa se oddaljiti od von Neumannove arhitekture računalnikov. Leta 1991 je bilo načrtovano ustvariti prvi prototip računalnikov pete generacije.

Zdaj je jasno, da zastavljeni cilji nikoli niso bili v celoti doseženi, je pa ta projekt spodbudil razvoj novega kroga raziskav na področju umetne inteligence in povzročil eksplozijo zanimanja za logično programiranje. Ker tradicionalna von Neumannova arhitektura ni bila primerna za učinkovito implementacijo, so nastali specializirani logični programski računalniki PSI in PIM.

Za glavno metodologijo razvoja programske opreme za računalniški projekt pete generacije je bila izbrana naslednja: logično programiranje, katerega vidni predstavnik je jezik Prolog. Zdi se, da trenutno Prolog ostaja najbolj priljubljen jezik umetne inteligence na Japonskem in v Evropi (v ZDA je tradicionalno bolj razširjen drug jezik umetne inteligence - funkcionalni programski jezik Lisp).

Ime jezika "Prolog" izhaja iz besed LOGIČNO PROGRAMIRANJE(PROgrammation en LOGique v francoščini in PROgramming in LOGic v angleščini).

Prolog temelji na veji matematične logike, kot je predikatni račun. Natančneje, njegova osnova je postopek dokazovanja izrekov metoda razrešitve Za Rogove klavzule. Naslednje predavanje bo posvečeno tej temi.

V zgodovini nastanka in razvoja jezika Prolog lahko ločimo naslednje stopnje.

Leta 1965 je J. Robinson v prispevku "A machine oriented logic based on the resolution principle", objavljenem v 12. številki Journal of the ACM, predstavil metodo za samodejno iskanje dokazov izrekov v predikatnem računu prvega reda, imenovano " načelo razrešitve". To delo lahko preberete v prevodu: Robinson J. Strojno usmerjena logika, ki temelji na načelo resolucije// Kibernetska zbirka. - Vol. 7 (1970). Pravzaprav je idejo za to metodo predlagal Herbrand leta 1931, ko še ni bilo računalnikov (Herbrand, “Une methode de demonstration”, These, Pariz, 1931). Robinson je to metodo spremenil tako, da je postala primerna za samodejno, računalniško uporabo, poleg tega pa je razvil učinkovit algoritem poenotenja, ki je osnova njegove metode.

Leta 1973 je "skupina umetne inteligence", ki jo je vodil Alain Colmeroe, ustvarila program na Univerzi v Marseillu, namenjen dokazovanju teoremov. Ta program je bil uporabljen za izdelavo sistemov za obdelavo besedil v naravnem jeziku. Program za dokazovanje izrekov se je imenoval Prolog (iz Programmation en Logique). Služil je kot prototip za Prologue. Legenda pravi, da je bila avtorica tega imena žena Alana Colmeroeja. Program je bil napisan v fortranu in je deloval precej počasi.

Delo Roberta Kowalskega je bilo zelo pomembno za razvoj logičnega programiranja. Predikatna logika kako programski jezik"(Kowalski R. Predikatna logika kot programski jezik. Kongres IFIP, 1974), v katerem je pokazal, da se je treba za dosego učinkovitosti omejiti na uporabo nabora Rogove klavzule. Mimogrede, znano je, da sta Kowalski in Colmeroe delala skupaj eno poletje.

Leta 1976 je Kowalski skupaj s kolegom Maartenom van Emdenom predlagal dva pristopa k branju besedil logičnih programov: proceduralni in deklarativni. O teh pristopih bomo govorili v tretjem predavanju.

Leta 1977 sta Warren in Pereira v Edinburghu ustvarila zelo učinkovit prevajalnik Prolog za računalnik DEC-10, ki je služil kot prototip za mnoge poznejše izvedbe Prologa. zanimivo,

Predavanje je namenjeno reševanju problemov s prostorskim grafom stanj. Prostor stanj je opisan v obliki množice stanj - vozlišč grafa, množice prehodov iz stanja v stanje - lokov grafa, množice začetnih stanj in množice končnih stanj. Rešitev problema je predstavljena kot pot na grafu prostora stanj, ki povezuje začetno stanje s končnim stanjem. Če je prostor stanj problema majhen, bodo vse optimalne rešitve najdene z iskanjem najprej v globino. Pri problemih z velikim prostorom stanj bo z iskanjem v širino izračunana le ena optimalna rešitev. Univerzalni reševalci se uporabljajo za probleme. Stanja v različnih nalogah lahko pripadajo različnim domenam. Za zapomnitev najboljših najdenih rešitev se uporablja "spremenljiva spremenljivka" varM. Prevajalnik sam najde potrebne vrste. Visual Prolog različica 7.5, še ni objavljena. Njen izid je predviden za leto 2014, a točen datum še ni znan. Visual Prolog 7.4 je zdaj na voljo vsem.

Pojav Prologa je bil posledica razvoja logike, matematike in programiranja. Slednja je imela najpomembnejšo vlogo. Strokovnjaki za logiko in matematiko so skušali programiranje usmeriti na »pravo pot«, vendar je razvoj informacijske tehnologije pokazal povsem drugačen rezultat.

Pragmatično nujno programiranje se je izkazalo za bolj obetavno. »Prolog« je sicer uspel kot programski jezik, ni pa postal osnova za umetno inteligenco.

Klasično programiranje proti logiki

Oseba sprejema težke odločitve logično in razumno. Skoraj brez razmišljanja človek ravna modro. Če ne upoštevamo odločitev, ki zahtevajo zbiranje informacij, njihovo analizo in zapletene izračune, potem je vsak rezultat hiter, točen in razumen.

To dejstvo je vedno dajalo iluzoren razlog, da je bilo oblikovanje orodja za odločanje preprosto. S prihodom Prologuea se je zdelo, da je vprašanje umetne inteligence stvar tehnologije, in Homo sapiens se je domislil treh zakonov robotike. Vendar je umetna inteligenca ostala duh, trije zakoni robotike pa so se izkazali kot iz pravljice - "naredi to, ne vem kaj."

Programiranje v klasičnem pomenu besede (pogosto se uporabljajo izrazi "proceduralno", "imperativno" ali "funkcionalno") se je razvilo in uspešno prebrodilo "težavne čase" 80-90-ih, ko je bilo nešteto programskih jezikov.

Demonstracijski boj med "Pascalom" in "Si" je trajal dolgo in je bil brutalen, vendar se je končal nevtralno in tiho. Kar ostane, je ideja o dobrem programskem jeziku in nekaj uspešnih implementacij le-tega.

To ne pomeni, da se Prolog kot programski jezik ni razvil. Vendar zastavljenih ciljev ni dosegel. Danes lahko ne le rečemo, ampak tudi utemeljimo: »Prolog« je akademski jezik za:

  • Učni cilji;
  • predikatna logika;
  • matematika;
  • ozka uporaba.

Dvomljivo je, da je to trditev mogoče ovreči. Umetna inteligenca ni le široko uporabljena, ampak tudi zelo resen dogodek, ki korenito spreminja družbeno strukturo in sliko sveta.

Programiranja v jeziku Prolog za umetno inteligenco ni bilo: v več kot štiridesetletni zgodovini jezika ni bilo niti enega radikalno novega dogodka, ki bi bil pomemben za javno zavest, kar kaže na nasprotno.

Objektivna realnost je taka: ne preživi toliko najmočnejši, temveč tisto, kar je iskano in relevantno.

"Prolog" je deklarativni programski jezik

Imeti orodje za opisovanje dejstev in pravil je dobro, ampak kaj je smisel? Dejstva in pravila se popolnoma prilegajo običajni bazi podatkov. Usposobljen klasični programer poskrbi za interaktivni dialog z uporabnikom, ta pa rešuje njegove težave.

Po potrebi programer izpopolni dialog, uporabnik pa dopolni bazo dejstev in pravil. Absolutno delujoča in desetletja preizkušena možnost za izvajanje množice že rešenih in rešljivih problemov.

Deklarativna predstavitev dejstev in pravil v kateri koli implementaciji programskega jezika Prolog je konvencija, poskus formalizacije realnosti v njenem intelektualnem stanju. Konvencionalno programiranje se ne dotika intelekta. Klasično programiranje se zadovolji s položajem: opis in obdelava podatkov. Tukaj je veliko težav, vendar obstaja veliko briljantnih rešitev, ki delujejo.

"Prolog" kot programski jezik so dejstva:

  • mati (Marija, Nataša); - Maria - Natašina mati;
  • oče (Evgeniy, Marina); - Evgeniy je Marinin oče.

Tukaj je dejstvo takoj čez mejo: "Maria" in "Marina" sta različni imeni. Nič vam ne preprečuje, da dodate dejstvo:

  • oče (Eugene, Maria); - Evgeniy je Marijin oče.

Ti opisi dajejo življenje pravilom:

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

Vendar nam ne omogočajo sklepa, da je oče Marinin oče, Marina pa Marijina mama. Ta problem je mogoče rešiti; lahko dodate še eno pravilo, dodate še eno dejstvo. Toda koliko teh dejanj bi bilo treba izvesti v resnični situaciji?

Pravzaprav je »Prolog« kot programski jezik primer deklaracije dejstev in pravil, ne pa logike, na katero je navajena zavest klasičnega programerja. "Prolog" se postavlja kot predikatni logični jezik, vendar se lahko programiranja v njem naučite le s primeri in vzorčnimi opisi razvijalcev določene izvedbe jezika.

Družina Prologue

Francija velja za rojstni kraj Prologa, leto 1973 pa je leto rojstva. Zanimanje za jezik se je občasno obnavljalo, vendar je umirjalo z zavidljivo stabilnostjo. Moto jezika: »Predikatna logika je elementarna! To je način, kako razložiti, kako deluje razmišljanje« - in ostal je moto.

Vsaka implementacija programskega jezika Prolog je strogo sledila predikatni logiki, vendar je vedno vključevala klasične ideje proceduralnega programiranja. Pravilneje je reči "imperativ", saj se ta izraz uporablja bolj formalno kot proceduralno, funkcionalno, objektno usmerjeno ali drugo.

Pri vsakem programiranju gre za podatke in njihovo obdelavo. Jezikovni konstrukti morajo čim bolj natančno opisati problem, ki ga rešujemo, zato vse znane izvedbe Prologa: Turbo Prolog, Win Prolog, SWI Prolog, GNU Prolog, Visual Prolog in druge vsebujejo poleg deklarativnih konstruktov tudi navadne imperativne izraze.

Menijo, da je družina Prologue razvita v akademskih in raziskovalnih organizacijah in je zato o njej mogoče govoriti le kot o skupnem jeziku v konceptualnem smislu. Kljub temu je mogoče upoštevati dejstvo, da je koncept "Prolog" živ in se razvija: ta jezik ima obseg in je potreben v določenem obsegu nalog.

Osnova umetne inteligence

Zanimanje za umetno inteligenco ni nikoli usahnilo, o njej se le začne govoriti ob naslednji priložnosti, vendar Prolog nikoli ni bil bolj povezan z umetno inteligenco kot navaden klasičen programski jezik.

Konec 80-ih je bil pravi, relevanten in popularen intelektualni projekt "The Inventing Machine". Prišlo je do resničnega poskusa uporabe Prologa za formalizacijo ogromne praktične baze znanja (podatkov) o izumih, fizikalnih, kemijskih in drugih zakonih.

Rezultat ni bil dosežen, v Prologu kot programskem jeziku je bilo treba napisati preveč dejstev in pravil, ki so bila banalne imperativne narave. Medtem je bilo veliko uspešnih programskih izdelkov implementiranih vzporedno v običajnih jezikih.

V začetku 90-ih je bil uspešno implementiran projekt pravega intelektualnega sistema, ki je simuliral vedenje otroka, mlajšega od 3 let, na EU računalniku! Možnost uporabe Prologa sploh ni bila obravnavana.

Ta intelektualni sistem ni samo »ugotovil«, kaj sta mama in oče in v čem se Maria razlikuje od Marine, ampak je tudi brez posebnega truda samostojno skočil od pridobljenega znanja o teh vprašanjih do žog in njihovih razlik od kock do barv predmetov in ... (!) do elementarne matematike: preproste računske operacije so se izkazale za njene zmožnosti na podlagi znanja, pridobljenega z reševanjem povsem drugih problemov.

Ne moremo reči, da je klasično programiranje pred Prologom glede obvladovanja teritorija umetne inteligence, vendar daje realne rezultate.

Kar zadeva inteligenco kot nalogo, očitno tukaj vprašanje ni v jeziku, ampak v ideji izvajanja. Če bi asembler iz leta 1991 lahko "postal osnova" za inteligentni sistem situacijske inteligence, potem očitno vprašanje ni v implementacijskem jeziku, temveč v ideji.

Programski jezik Prolog je eden vodilnih logičnih programskih jezikov. Ustvaril ga je Alain Colmerauer v sedemdesetih letih prejšnjega stoletja. Šlo je za poskus izdelave programskega jezika za začetnike, ki bi omogočal izražanje logike, namesto da natančno določite, kaj želite doseči z navodili na računalniškem zaslonu.

Prolog se uporablja v številnih programih umetne inteligence, vendar sta njegova sintaksa in semantika zelo preprosti in jasni (prvotni namen je bil zagotoviti orodje za računalniško nepismene jezikoslovce). Ime Prolog je akronim za LOGIČNO PROGRAMIRANJE in je splošno znano pri poučevanju osnov programiranja.

Prolog temelji na predikatnem računu (natančneje na predikatnem računu prvega reda), vendar je omejen na Hornove formule. Programi Prolog so učinkoviti za dokazovanje izrekov v prvem približku. Osnovni koncepti združevanja, repne rekurzije in sledenja.

Vrste podatkov

Prolog ne uporablja tipov podatkov na način, ki smo ga vajeni v običajnih programskih jezikih. Namesto podatkovnih tipov lahko govorimo o leksikalnih elementih Prologa, kar je neobičajno pri programiranju za telebane.

Konstantno besedilo se vnese z atomi. Atom je zaporedje črk, številk in podčrtaja, ki se začne z malo črko. Običajno, če to niso alfanumerični atomi, jih je treba uokviriti z apostrofi (na primer "+" je atom, + je operator).

Večina implementacij Prologa ne razlikuje med realnimi in delnimi števili.

Spremenljivke

Spremenljivke so označene z nizom, sestavljenim iz črk, številk in podčrtajev, ki se začnejo z veliko črko. V okolju Prolog spremenljivka ni vsebnik, ki bi ga lahko dodelili (za razliko od proceduralnih programskih jezikov). Njegovo vedenje je bližje modelu, ki je podoben pridružitvam.

Tako imenovane anonimne spremenljivke so zapisane z enim podčrtajem (_).

Izrazi so edini način, s katerim lahko Prolog predstavlja kompleksne podatke. Izraz je sestavljen iz glave, imenovane tudi funktor (ki mora biti atom) in parametrov (ki niso omejeni na vrste). Pomembno je število parametrov, tako imenovane arnosti izraza. Izraz je definiran z glavo in arnostjo, običajno zapisano kot funktor/arnost.
Seznami

Seznam ni samostojen podatkovni tip, ker je definiran z rekurzivno konstrukcijo (z uporabo izraza /2 "."):

Atom - prazen seznam

Za udobje programerja je mogoče sezname sestaviti in uničiti na različne načine.

Če je L seznam in je X element, potem "." (X, L) je član seznama. Prvi element X, ki mu sledi vsebina konteksta L, je sintaktično predstavljen kot.

Za udobje programerja je mogoče sezname sestaviti in uničiti na različne načine.

Seznam predmetov:
Predgovor enega elementa:
Predhodnih več elementov:
Razširitev izraza: "."(abc, "."(1, "."(f(x), "."(Y, "."(g(A,prvi), )))))

Nizi so običajno zapisani kot zaporedje znakov znotraj narekovajev. Pogosto so predstavljeni kot seznami kod znakov ASCII.

Programiranje v PROLOGU se zelo razlikuje od dela s proceduralnimi jeziki. V Prologu delate z bazami podatkov dejstev in pravil, izvajate lahko poizvedbe po bazi podatkov. Osnovna enota Prologa je predikat, ki je definiran kot resničen. Predikat je sestavljen iz glave in številnih argumentov. Na primer:

Tukaj je "mačka" glava, "tom" pa argument. Tukaj je nekaj primerov poizvedb, ki jih lahko izvajate s prevajalnikom Prolog na podlagi tega dejstva:

Maček (tom).
ja

Mačka (X).
X = tom;
št.

Predikati so običajno definirani za izražanje dejstva, s katerim program ve o svetu. V večini primerov uporaba predikatov zahteva določene konvencije. Torej, kaj od naslednjega bi pomenilo, da je Pat Sallyin oče?

Oče (sally, Pat).
oče (pat, sally).

"oče" je v obeh primerih glava, "sally" in "pat" pa sta argumenta. Vendar je v prvem primeru Sally na prvem mestu na seznamu argumentov, Pat pa na drugem mestu in obratno. Prvi primer je primer definicije v vrstnem redu Glagolski subjekt in predmet, v drugem primeru pa je vrstni red Glagolski predmet Subjekt. Ker Prolog ne razume angleščine, sta obe različici v redu, vendar velja za dober stil programiranja, da se med pisanjem enega programa držimo enega sloga, imenovanega konvencija, namesto da bi morali napisati nekaj takega:

Oče (pat, sally). oče (jessica,james).

Določeni predikati so vgrajeni v jezik in Prologu omogočajo, da zmanjša naporne vsakodnevne dejavnosti (kot je vnos/izhod z uporabo grafike in druge komunikacije z operacijskim sistemom). Na primer, predikate pisanja lahko uporabite za prikaz, kot je ta:

Pišite ("zdravo")

Na zaslonu bo prikazana beseda "Hello".

Pravila

Druga vrsta stavkov v Prologu so pravila. Primer pravila:

Luč (prižgana): - stikalo (vklop).

":-" pomeni "če", to pravilo pomeni, da je lučka (vklopljena) resnična (vklopljena), če je stikalo (vklopljeno) resnično (drugače, če je stikalo vklopljeno, je luč). Pravila lahko uporabljajo tudi spremenljivke; spremenljivke se začnejo z veliko začetnico, konstante pa z malimi črkami. na primer

Oče (X, Y) :- starš (X, Y), moški (Y).

To pomeni, "če je nekdo starš in je moški, potem je oče." Vzroki in posledice so lahko tudi v obratnem vrstnem redu, tako da to ni v nasprotju z običajno logiko. V razdelek s posledicami lahko postavite več predikatov tako, da jih združite skupaj, na primer:

Kar je enakovredno več izjavam:

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

Toda navodila, kot so:

Kar je enakovredno "če c potem a ali b". To je posledica omejitve, ki jo nalaga Hornova formula.