Contacte

Introducere în limbajul de programare logic Prologue. Limbajul de programare logic Prolog Utilizarea prolog în mediul c

Prelegerea este dedicată rezolvării problemelor folosind un grafic de spațiu de stare. Spațiul de stări este descris sub forma unui set de stări - vârfuri grafice, un set de tranziții de la stare la stare - arce grafice, un set de stări inițiale și un set de stări finale. Soluția problemei este reprezentată ca o cale pe graficul spațiului de stări care conectează starea inițială de starea finală. Dacă spațiul de stare al problemei este mic, atunci toate soluțiile optime vor fi găsite folosind căutarea în profunzime. În problemele cu un spațiu mare de stări, o singură soluție optimă va fi calculată prin căutarea pe lățimea întâi. Rezolvatorii universali sunt aplicați problemelor. Statele în diferite sarcini pot aparține unor domenii diferite. Pentru a reține cele mai bune soluții găsite, se folosește o „variabilă variabilă” varM. Compilatorul însuși găsește tipurile necesare. Visual Prolog versiunea 7.5, nepublicată încă. Publicarea sa este planificată pentru 2014, dar data exactă nu este încă cunoscută. Visual Prolog 7.4 este acum disponibil pentru toată lumea.

Timp de multe milenii, umanitatea acumulează, procesează și transmite cunoștințe. În aceste scopuri, se inventează constant mijloace noi și se îmbunătățesc cele vechi: vorbirea, scrisul, poșta, telegraful, telefonul etc. Apariția computerelor a jucat un rol major în tehnologia de procesare a cunoștințelor.

În octombrie 1981, Ministerul japonez al Comerțului Internațional și Industriei a anunțat crearea unei organizații de cercetare - Institutul pentru Centrul de Cercetare pentru Tehnologia Calculatoarelor de Noua Generație. Scopul acestui proiect a fost de a crea sisteme de procesare a informațiilor bazate pe cunoștințe. S-a presupus că aceste sisteme ar oferi ușurință de gestionare datorită capacității de a comunica cu utilizatorii folosind limbajul natural. Aceste sisteme trebuiau să fie auto-învățate, să folosească cunoștințele acumulate în memorie pentru a rezolva diverse tipuri de probleme, să ofere utilizatorilor sfaturi de specialitate, iar utilizatorului nu i se cerea să fie specialist în informatică. Se presupunea că o persoană ar putea folosi un computer de generația a cincea la fel de ușor ca orice aparat electric de uz casnic, cum ar fi un televizor, un magnetofon și un aspirator. La scurt timp după cel japonez, au început proiecte americane și europene.

Apariția unor astfel de sisteme ar putea schimba tehnologia prin utilizarea bazelor de cunoștințe și a sistemelor expert. Esența principală a tranziției calitative la a cincea generație de calculatoare a fost trecerea de la procesarea datelor la procesarea cunoștințelor. Japonezii au sperat că vor fi capabili să nu adapteze gândirea umană la principiile funcționării computerului, ci să aducă funcționarea computerului mai aproape de modul în care gândește o persoană, îndepărtându-se în același timp de arhitectura computerelor von Neumann. În 1991, s-a planificat crearea primului prototip de computere de generația a cincea.

Acum este clar că obiectivele stabilite nu au fost niciodată pe deplin atinse, dar acest proiect a servit drept imbold pentru dezvoltarea unei noi runde de cercetare în domeniul inteligenței artificiale și a provocat o explozie de interes pentru programarea logică. Deoarece arhitectura tradițională von Neumann nu era potrivită pentru implementare eficientă, au fost create calculatoare specializate de programare logică PSI și PIM.

Următoarea a fost aleasă ca principală metodologie de dezvoltare a software-ului pentru proiectul informatic de generația a cincea: programare logica, al cărui reprezentant proeminent este limbajul Prolog. Se pare că în prezent Prolog rămâne cel mai popular limbaj de inteligență artificială în Japonia și Europa (în SUA, în mod tradițional, este mai răspândit un alt limbaj de inteligență artificială - limbajul funcțional de programare Lisp).

Denumirea limbii „Prolog” provine din cuvinte PROGRAMARE LOGICA(PROGRAMARE în LOGIQUE în franceză și PROGRAMARE în LOGIC în engleză).

Prolog se bazează pe o astfel de ramură a logicii matematice ca calculul predicatului. Mai precis, baza sa este procedura de demonstrare a teoremelor metoda de rezoluție Pentru Clauze de corn. Următoarea prelegere va fi dedicată acestui subiect.

În istoria apariției și dezvoltării limbajului Prolog se pot distinge următoarele etape.

În 1965, în lucrarea „O logică orientată pe mașină bazată pe principiul rezoluției”, publicată în numărul al 12-lea al Journal of the ACM, J. Robinson a prezentat o metodă pentru găsirea automată a demonstrațiilor teoremelor în calculul predicatelor de ordinul întâi, numită " principiul rezoluției„. Această lucrare poate fi citită în traducere: Robinson J. Machine-oriented logic based on principiul rezoluției// Colecție cibernetică. - Vol. 7 (1970). De altfel, ideea acestei metode a fost propusă de Herbrand în 1931, când încă nu existau computere (Herbrand, „Une methode de demonstration”, These, Paris, 1931). Robinson a modificat această metodă, astfel încât să devină potrivită pentru utilizarea automată, pe computer și, în plus, a dezvoltat un algoritm eficient de unificare care stă la baza metodei sale.

În 1973, „grupul de inteligență artificială” condus de Alain Colmeroe a creat un program la Universitatea din Marsilia menit să demonstreze teoreme. Acest program a fost folosit pentru a construi sisteme de procesare a textului în limbaj natural. Programul de demonstrare a teoremei se numea Prolog (din Programmation en Logique). A servit drept prototip pentru Prologue. Legenda spune că autorul acestui nume a fost soția lui Alan Colmeroe. Programul a fost scris în Fortran și a rulat destul de încet.

Lucrarea lui Robert Kowalski a fost de mare importanță pentru dezvoltarea programării logice. Logica predicatelor Cum limbaj de programare„(Kowalski R. Predicate Logic as Programming Language. IFIP Congress, 1974), în care a arătat că pentru a obține eficiență, trebuie să se limiteze la utilizarea unui set. Clauze de corn. Apropo, se știe că Kowalski și Colmeroe au lucrat împreună într-o vară.

În 1976, Kowalski, împreună cu colegul său Maarten van Emden, a propus două abordări ale citirii textelor programelor logice: procedurală și declarativă. Aceste abordări vor fi discutate în a treia prelegere.

În 1977, în Edinburgh, Warren și Pereira au creat un compilator Prolog foarte eficient pentru computerul DEC-10, care a servit drept prototip pentru multe implementări ulterioare ale Prolog. Interesant,

Funcţional;

Procedural;

Orientat pe obiecte;

Declarativ (relațional).

Programul scris în limbaj funcțional, exprimă un algoritm de rezolvare a unei probleme în ceea ce privește valorile pe care funcțiile le returnează. Astfel, un program reprezintă un set de funcții, fiecare dintre acestea returnând o singură valoare de un anumit tip. Lucrarea programului (algoritmul pentru rezolvarea problemei) este un apel secvenţial de funcţii. Limbile funcționale includ C.

Programul scris în limbaj procedural, exprimă un algoritm de rezolvare a unei probleme în termeni de acțiuni (proceduri) care trebuie efectuate. Diferența dintre o procedură și o funcție este că o procedură poate returna orice număr de valori, inclusiv niciuna. Astfel, operarea programului este un apel secvenţial de proceduri. Limbile procedurale includ Pascal, Basic etc. Trebuie remarcat faptul că în orice limbaj procedural este posibil să se definească și să utilizeze funcții, iar într-un limbaj funcțional - proceduri (funcții care nu returnează valori - de obicei definite cu modificatorul void).

Programul scris în limbaj orientat pe obiecte, este un set de obiecte care interacționează între ele prin trimiterea de mesaje. Fiecare obiect este caracterizat printr-o componentă informațională (un set de atribute) și o componentă comportamentală (un set de evenimente și metode). Munca programului este un schimb secvenţial de mesaje (metode de apelare) între obiecte. Limbile orientate pe obiecte includ Object Pascal, Visual Basic, C++, Java etc. De remarcat că orice limbaj orientat pe obiecte are posibilitatea de programare procedurală.

Ceea ce este comun tuturor categoriilor de limbi enumerate este că programul descrie ce trebuie făcut și cum se rezolvă problema, de exemplu. este descrisă succesiunea rezolvării problemei.

Programul scris în limbaj declarativ, este o descriere a domeniului subiectului printr-un set de relații (relația engleză) între obiecte (entități) și formularea scopului (sarcina) care trebuie rezolvată. Spre deosebire de limbile enumerate mai sus, un astfel de program nu descrie în mod explicit secvența de acțiuni necesare pentru a rezolva o problemă. De regulă, procedura de găsire a unei soluții se realizează automat folosind aparatul matematic sau logic adecvat care stă la baza limbajului și este implementat în interpretul său specific 1 (compilatorul 2). Limbajele declarative includ Prolog, SQL etc. Astfel, avantajul incontestabil al limbajelor declarative este concentrarea atenției dezvoltatorului asupra a ceea ce trebuie făcut, și nu cum.

O altă clasificare a limbajelor de programare se bazează pe stilul de programare :

- imperativ– un program este o secvență de instrucțiuni (comenzi executate de un computer), cu ajutorul cărora programatorul trebuie să explice computerului cum să rezolvi o problemă(limbaje de programare funcționale, procedurale și orientate pe obiecte);

- declarativ– un program este un set de enunțuri care descriu un domeniu sau o situație curentă, cu ajutorul cărora programatorul trebuie să descrie, ce trebuie rezolvat (găsește)– sistemul de programare imperativ va căuta o soluție.

Există o clasificare binecunoscută a limbajelor de programare în funcție de apropierea lor fie de mașină, fie de limbajul uman natural. Cele care sunt mai aproape de computer sunt denumite limbaje de nivel scăzut (Assembler), iar cele care sunt mai apropiate de oameni sunt numite limbaje de nivel înalt (Basic, Pascal, Java etc.). În acest sens, limbile declarative pot fi numite limbi super-înalte sau de cel mai înalt nivel, deoarece sunt foarte apropiate de limbajul uman și de gândirea umană.

În 1965, în „O logică orientată pe mașină bazată pe principiul rezoluției”, 3 publicat în numărul al 12-lea al Journal of the ACM, J. Robinson a prezentat o metodă de căutare automată a demonstrațiilor teoremelor în calculul predicatelor de ordinul întâi, numită „principiul rezoluției”. De altfel, ideea acestei metode a fost propusă de Herbrand în 1931, când încă nu existau computere (Herbrand, „Une methode de demonstration”, These, Paris, 1931). Robinson a modificat această metodă astfel încât să devină potrivită pentru utilizarea automată (calculator) și a dezvoltat un algoritm eficient de unificare care stă la baza metodei sale.

Ideea de a folosi logica ca limbaj de programare a apărut la începutul anilor 1970. Primii cercetători care au dezvoltat această idee au fost Robert Kowalski din Edinburgh (bază teoretică, lucrări 1971 și 1974), Maarten van Emden din Edinburgh (sistem de demonstrație experimentală) și Alain Colmeroe Colmerauer) din Marsilia (realizare, 1973). În 1973, un „grup de inteligență artificială” condus de Alain Colmeroe a creat un program la Universitatea din Marsilia menit să demonstreze teoreme. Acest program a fost folosit pentru a construi sisteme de procesare a textului în limbaj natural. Programul de demonstrare a teoremei a fost numit Prolog (PROgrammation en LOGique franceză) și a servit ca prototip al lui Prolog. Există legende că autorul acestui nume ar fi soția lui Alain Colmeroe. Programul a fost scris în Fortran și a rulat destul de încet.

Popularizarea Prolog a fost mult facilitată de:

O implementare eficientă (interpret/compilator) a acestui limbaj pentru computerul DEC-10 de către David D.H. Warren din Edinburgh în 1977 a servit drept prototip pentru multe implementări ulterioare ale Prolog. Interesant este că compilatorul a fost scris chiar în Prolog. Această implementare a Prolog, cunoscută sub numele de „versiunea Edinburgh”, a devenit efectiv primul și singurul standard al limbii;

Dezvoltarea unei versiuni pentru computere personale de către Clark și McCabe (Marea Britanie) în 1980;

Proiect japonez de creare a calculatoarelor de generația V. La sfârșitul anului 1978, Ministerul Comerțului Exterior și Industriei (MFTI) al Japoniei a încredințat dezvoltarea unui proiect de calculatoare inteligente Institutului de Tehnologia Calculatoarelor din Tokyo (ICOT) 4, special creat în acest scop. Inima acestor computere nu trebuia să fie un procesor aritmetic, ci unul special optimizat pentru a lucra cu programe de tip Prologue.

În 1995, a fost publicat standardul oficial ISO 5 /IEC 6 al limbajului Prolog (ISO/IEC 13211-1 „Tehnologia informației - Limbaje de programare - Prolog - Partea 1: Nucle general" - „Tehnologii informaționale. Limbaje de programare. Prolog . Partea 1. Nucleul general").

Astăzi există destul de multe implementări ale Prolog. Cele mai cunoscute dintre ele sunt următoarele: BinProlog, AMZI-Prolog, Arity Prolog, CProlog, Micro Prolog, MProlog, Prolog-2, Quintus Prolog, SICTUS Prolog, Silogic iis Workbench, Strawberry Prolog, SWI-Prolog, Turbo Prolog (PDC) Prolog, Visual Prolog), UNSW Prolog etc. În țara noastră, au fost dezvoltate versiuni de Prolog precum Prolog-D (S. Grigoriev), Actor Prolog (A. Morozov) și Flang (A. Mantsivoda, V. Petukhin) .

5. Definiți conceptele: "", "", "".

9. Ce se înțelege prin „ ” și „ ” din listă?

Apariția Prologului s-a datorat dezvoltării logicii, matematicii și programării. Acesta din urmă a jucat cel mai important rol. Specialiștii în logică și matematică au încercat să pună programarea pe „calea cea bună”, dar dezvoltarea tehnologiei informației a arătat un rezultat complet diferit.

Programarea imperativă pragmatică s-a dovedit a fi mai promițătoare. „Prolog” a reușit ca limbaj de programare, dar nu a devenit baza pentru inteligența artificială.

Programare clasică vs logică

O persoană ia decizii dificile în mod logic și rezonabil. Aproape fără să se gândească, o persoană acționează cu înțelepciune. Dacă nu ținem cont de deciziile care necesită colectarea de informații, analizarea acestora și calcule complexe, atunci orice rezultat este rapid, precis și rezonabil.

Acest fapt a oferit întotdeauna un motiv iluzoriu de a considera crearea unui instrument de luare a deciziilor ca fiind o chestiune simplă. Odată cu apariția Prologului, se părea că problema inteligenței artificiale era o chestiune de tehnologie, iar Homo sapiens a venit cu trei legi ale roboticii. Cu toate acestea, inteligența artificială a rămas o fantomă, iar cele trei legi ale roboticii s-au dovedit a fi dintr-un basm - „fă asta, nu știu ce”.

Programarea în sensul clasic al cuvântului (se folosesc adesea termenii „procedural”, „imperativ” sau „funcțional”) a dezvoltat și a depășit cu succes „vremurile tulburi” din anii 80-90, când existau nenumărate limbaje de programare.

Lupta demonstrativă dintre „Pascal” și „Si” a durat mult și a fost brutală, dar s-a încheiat neutru și liniștit. Ceea ce rămâne este ideea unui limbaj de programare bun și câteva implementări de succes ale acestuia.

Acest lucru nu înseamnă că Prolog ca limbaj de programare nu a evoluat. Dar nu și-a atins obiectivele declarate. Astăzi nu putem doar să spunem, ci și să justificăm: „Prologul” este un limbaj academic pentru:

  • obiective de invatare;
  • logica predicatului;
  • matematică;
  • aplicare restrânsă.

Este îndoielnic că această afirmație poate fi respinsă. Inteligența artificială nu este doar folosită pe scară largă, ci și un eveniment foarte grav care schimbă radical structura socială și imaginea lumii.

Programarea în limbajul Prolog pentru inteligența artificială nu a avut loc: de mai bine de patruzeci de ani de istorie a limbajului, nu a existat un singur eveniment radical nou care să fie relevant pentru conștiința publică, care să indice contrariul.

Realitatea obiectivă este aceasta: nu supraviețuiește atât cel mai puternic, ci mai degrabă ceea ce este solicitat și relevant.

„Prolog” este un limbaj de programare declarativ

Este bine să ai un instrument pentru a descrie fapte și reguli, dar ce rost are? Faptele și regulile se potrivesc perfect într-o bază de date obișnuită. Un programator clasic calificat oferă utilizatorului un dialog interactiv, iar acesta din urmă îi rezolvă problemele.

Dacă este necesar, programatorul rafinează dialogul, iar utilizatorul completează baza de date cu fapte și reguli. O opțiune absolut funcțională și testată de zeci de ani pentru implementarea unei mase de probleme deja rezolvate și rezolvabile.

O prezentare declarativă a faptelor și regulilor în orice implementare a limbajului de programare Prolog este o convenție, o încercare de a oficializa realitatea în starea sa intelectuală. Programarea convențională nu atinge intelectul. Programarea clasică se mulțumește cu postul: descrierea și prelucrarea datelor. Există o mulțime de probleme aici, dar există o mulțime de soluții geniale care funcționează.

„Prolog” ca limbaj de programare sunt faptele:

  • mama (Maria, Natasha); - Maria - mama Natașei;
  • tată (Evgeniy, Marina); - Evgeniy este tatăl Marinei.

Aici, un fapt este imediat peste bord: „Maria” și „Marina” sunt nume diferite. Nimic nu te împiedică să adaugi faptul:

  • tată (Eugene, Maria); - Evgeniy este tatăl Mariei.

Aceste descrieri dau viață regulilor:

  • părinte(x,y)<- папа (x, y);
  • părinte(x,y)<- мама (x, y);

Dar nu ne permit să concluzionam că tatăl este tatăl Marinei, iar Marina este mama Mariei. Această problemă poate fi rezolvată, puteți adăuga încă o regulă, adăugați încă un fapt. Dar câte dintre aceste acțiuni ar trebui întreprinse într-o situație reală?

De fapt, „Prolog” ca limbaj de programare este un exemplu de declarație de fapte și reguli, dar nu logica cu care este obișnuită conștiința unui programator clasic. „Prolog” se poziționează ca un limbaj logic predicat, dar puteți învăța programarea în el doar prin exemple și descrieri de exemplu de la dezvoltatorii unei implementări specifice a limbajului.

Familia Prolog

Franța este considerată locul de naștere al Prologului, iar 1973 este anul nașterii. Interesul pentru limbă a fost reînnoit periodic, dar a diminuat cu o stabilitate de invidiat. Motto-ul limbajului: „Logica predicatelor este elementară! Acesta este un mod de a explica cum funcționează gândirea” - și a rămas motto-ul.

Orice implementare a limbajului de programare Prolog a urmat strict logica predicatelor, dar a inclus întotdeauna ideile clasice de programare procedurală. Este mai corect să spunem „imperativ”, deoarece acest termen este folosit cu mai multă formalitate decât procedural, funcțional, orientat pe obiect sau altele.

Orice programare se referă la date și la prelucrarea acestora. Constructele limbajului trebuie să descrie cât mai exact problema care se rezolvă, motiv pentru care toate implementările cunoscute ale Prolog: Turbo Prolog, Win Prolog, SWI Prolog, GNU Prolog, Visual Prolog și altele conțin, pe lângă constructele declarative, expresii imperative obișnuite.

Se crede că familia Prologue este dezvoltată în organizații academice și de cercetare și, prin urmare, poate fi vorbită doar ca un limbaj comun într-un sens conceptual. Cu toate acestea, însuși faptul că conceptul de „Prolog” este viu și în curs de dezvoltare poate fi luat în considerare: acest limbaj are un domeniu de aplicare și este solicitat într-o anumită gamă de sarcini.

Baza inteligenței artificiale

Interesul pentru inteligența artificială nu a scăzut niciodată, ei încep să vorbească despre asta atunci când apare următoarea ocazie, dar Prolog nu a fost niciodată asociat cu inteligența artificială mai mult decât un limbaj de programare clasic obișnuit.

La sfârșitul anilor 80 a existat un proiect intelectual real, relevant și popular „Mașina inventatoare”. A existat o încercare reală de a folosi Prolog pentru a oficializa o bază uriașă de cunoștințe practice (date) despre invenții, legi fizice, chimice și alte legi.

Rezultatul nu a fost atins prea multe fapte și reguli trebuiau scrise în Prolog ca limbaj de programare, care erau de natură imperativă banală. Între timp, o mulțime de produse software de succes au fost implementate în paralel în limbi obișnuite.

La începutul anilor 90, a fost implementat cu succes un proiect al unui sistem intelectual real care a simulat comportamentul unui copil sub 3 ani pe un computer din UE! Opțiunea de a folosi Prolog nici nu a fost luată în considerare.

Acest sistem intelectual nu numai că „a dat seama” ce sunt mama și tata și cum se deosebea Maria de Marina, ci și, fără prea mult efort, a sărit în mod independent de la cunoștințele dobândite cu privire la aceste probleme la mingi și diferențele lor de la cuburi, la culorile obiecte și... (!) la matematica elementară: operațiile aritmetice simple s-au dovedit a fi în limitele capacităților ei bazate pe cunoștințele dobândite prin rezolvarea unor probleme complet diferite.

Nu se poate spune că programarea clasică este înaintea Prologului în ceea ce privește stăpânirea teritoriului inteligenței artificiale, dar dă rezultate reale.

În ceea ce privește inteligența ca sarcină, se pare că întrebarea aici nu se află în limbaj, ci în ideea de implementare. Dacă asamblatorul din 1991 ar putea „deveni baza” pentru un sistem inteligent de inteligență situațională, atunci problema nu constă în mod clar în limbajul de implementare, ci în idee.

În Prolog, obținem o soluție la o problemă prin derivare logică din principii cunoscute anterior. De obicei, un program Prolog nu este o secvență de acțiuni - este un set de fapte cu reguli care oferă concluzii bazate pe aceste fapte. Prin urmare, Prolog este cunoscut ca limbaj declarativ.

Prolog include un mecanism de inferență care se bazează pe potrivirea modelelor. Prin selectarea răspunsurilor la întrebări, acesta preia informațiile stocate (cunoscute). Prolog încearcă să testeze adevărul unei ipoteze (cu alte cuvinte, să răspundă la o întrebare) cerând informații despre care se știe deja că sunt adevărate. Cunoștințele prolog despre lume sunt un set limitat de fapte (și reguli) specificate în program.

Una dintre cele mai importante caracteristici ale Prolog este că, pe lângă găsirea logică a răspunsurilor la întrebările pe care le puneți, poate să se ocupe de alternative și să găsească toate soluțiile posibile. În loc să lucreze pur și simplu de la începutul unui program până la sfârșit, Prolog poate să se întoarcă și să se uite la mai multe „căi” pentru a rezolva toate părțile unei probleme.

Logica predicatelor a fost dezvoltată pentru a traduce principiile gândirii logice într-o formă scrisă cât mai ușor posibil. Prolog profită de sintaxa logică pentru a dezvolta un limbaj de programare. În logica predicatului, mai întâi elimini toate cuvintele neesențiale din propozițiile tale. Apoi transformi aceste propoziții punând pe primul loc relația, urmată de obiectele grupate. Ulterior, obiectele devin argumente între care se stabilește această relație. Ca exemplu în tabel. sunt prezentate propoziții, transformate în conformitate cu sintaxa logicii predicatelor.

Tabelul 1. Sintaxa logicii predicatelor

2. Fapte

În Prolog ei descriu obiecte (obiecte) Și relaţie (relaţii), apoi descrie reguli (reguli) pentru care aceste relații sunt adevărate. De exemplu, o propoziție

Bill iubește câinii. (Billlikesdogs.)

stabilește relația dintre obiectele Bill și câini (Bill și câini); această relație este like-uri. Mai jos este o regulă care determină când propoziția „Bill iubește câinii” este adevărată:

Bill iubește câinii, atâta timp cât câinii sunt buni. (Bill îi plac câinii dacă câinii sunt drăguți.)

În Prolog, se numește o relație între obiecte fapt(fapt). În limbajul natural, o relație se stabilește într-o propoziție. În logica predicatului folosită de Prolog, o relație corespunde unei simple fraze (fapt) constând din numele relației și un obiect sau obiecte cuprinse între paranteze. Ca si propunerea faptul se termină cu un punct (.) .

Mai jos sunt câteva propoziții în limbaj natural cu relația „aprecie”:

Bill o iubește pe Cindy. (Bill îi place Cindy)

Cindy îl iubește pe Bill. (Cindy ii place Bill)

Bill iubește câinii. (Bill îi plac câinii)

Acum să rescriem aceleași fapte folosind sintaxa Prolog:

place (bill, cindy).

place (cindy, bill).

place (factură, câini).

Faptele, pe lângă relații, pot exprima și proprietăți. Deci, de exemplu, propozițiile în limbaj natural „Kermitisgreen” și „Caitlinisgirl” din Prolog, care exprimă aceleași proprietăți, arată astfel:

3. Predicate

O relație în Prolog se numește predicat. Argumente- acestea sunt obiecte care sunt legate prin această relație; de fapt

place (bill, cindy).

relația de like-uri este predicatul, iar obiectele bill și cindy sunt argumentele.

Exemple de predicate cu numere diferite de argumente:

pred(întreg, simbol)

persoana (ultimul, primul, sexul)

ziua de naștere (prenume, prenume, data)

Exemplul arată că predicatele nu pot avea deloc argumente.

4. Reguli

Regulile vă permit să deduceți un fapt din alte fapte. Cu alte cuvinte, putem spune asta regula - este o concluzie despre care se știe că este adevărată dacă una sau mai multe alte concluzii sau fapte găsite sunt adevărate. Mai jos sunt regulile corespunzătoare conexiunii „Like”:

Cindy iubește tot ce iubește Bill. (Cindy îi place tot ce îi place lui Bill)

Caitlin iubește totul verde. (Caitlin ii place tot ce este verde)

Folosind aceste reguli, puteți, din faptele anterioare, să găsiți câteva lucruri care le plac lui Cindy și Caitlin:

Cindy o iubește pe Cindy. (Cindy ii place Cindy)

Caitlin îl iubește pe Kermit. (Caitlin ii place Kermit)

Pentru a traduce aceste reguli în Prolog, trebuie să modificați ușor sintaxa:

îi place (cindy, Ceva): - îi place (factura, Ceva). ilikes(caitlin, Ceva):- verde (Ceva) .

Simbolul: - are semnificația „dacă”, și servește la separarea celor două părți ale regulii: capul și corpul. O regulă poate fi văzută și ca o procedură. Cu alte cuvinte, regulile

îi place (cindy, Ceva): - îi place (factura, Ceva).

place (caitlin, Something):- verde (Ceva).

Rău: „Pentru a dovedi că Cindy iubește ceva, dovedește că lui Bill îi place" Și " Pentru a dovedi că Caitlin iubește ceva, demonstrează că este ceva verde.”. Din acest punct de vedere „procedural”, regulile pot „cere” lui Prolog să facă alte lucruri decât să dovedească fapte, cum ar fi să imprime ceva.

5. Cereri (Goluri)

După ce ați descris mai multe fapte în Prolog, puteți pune întrebări despre relațiile dintre ele. Se numeste cerere(interogare) Sisteme de limbaj Prolog. Puteți adresa lui Prolog aceleași întrebări pe care v-am putea adresa noi despre aceste relații. Pe baza faptelor și regulilor cunoscute anterior, puteți răspunde la întrebări despre aceste relații, așa cum poate face Prolog. În limbaj natural întrebăm: Face Factură ca Cindy ? (Bill o iubește pe Cindy?) Conform regulilor lui Prolog, întrebăm:

place (bill, cindy).

La primirea unei astfel de solicitări, Prolog va răspunde:

pentru că Prolog are un fapt care să dovedească că este așa. Pentru a complica puțin întrebarea, puteți întreba în limbaj natural: Ce face Factură ca ? (Ce îi place lui Bill?) Conform regulilor lui Prolog, întrebăm:

aprecieri (factura, ce).

Trebuie remarcat faptul că al doilea obiect - Ce - începe cu o literă mare, în timp ce primul obiect - factura - nu. Acest lucru se întâmplă deoarece factura este un obiect fix, un obiect constant este o cantitate cunoscută și Ce este o variabilă.

Variabile începe întotdeauna cu majuscule sau subliniere!

Prolog caută întotdeauna un răspuns la o interogare, începând cu primul fapt și iterează prin toate faptele până când nu mai există.. Când a fost întrebat ce îi place lui Bill, Prolog va răspunde:

Deci, așa cum știe el

place (bill, cindy).

îi place (factura, câinii).

Daca intrebam:

Ce îi place lui Cindy? (Ce îi place lui Cindy?)

îi place (cindy, ce).

atunci Prolog ar răspunde:

pentru că Prologue știe că Cindy îl iubește pe Bill și că Cindy iubește aceleași lucruri pe care Bill le iubește și că Bill îi iubește pe Cindy și câinii.

Am putea pune Prolog alte întrebări care i-ar putea fi puse unui om. Dar întrebări de genul „Ce fel de fată îi place lui Bill?” nu va obține o soluție, deoarece Prolog în acest caz nu cunoaște faptele despre fată și nu poate trage o concluzie pe baza unor date necunoscute: în acest exemplu, nu i-am dat lui Prolog nicio relație sau proprietate pentru a determina dacă există -obiecte. de fete.

6. Postarea de fapte, reguli și întrebări

Să presupunem că există următoarele fapte și reguli:

O mașină rapidă este drăguță. (Afastcarisfun).

O mașină mare este frumoasă. (O mașină mare este drăguță).

O mașină mică - practică. (O mașină mică este practică).

Lui Bill îi place o mașină dacă e drăguță. (Bill îi place o mașină dacă mașina este distractivă).

Examinând aceste fapte, puteți concluziona că lui Bill îi place o mașină rapidă. În cele mai multe cazuri, Prolog va ajunge la o soluție similară. Dacă nu ar exista informații despre mașinile rapide, nu ați putea deduce logic ce mașini îi plac lui Bill. Puteți face ghiciri despre ce tip de mașini ar putea fi dure, dar Prolog știe doar ce îi spuneți. Prologul nu face presupuneri.

Iată un exemplu care arată modul în care Prolog utilizează regulile pentru a răspunde la întrebări. Priviți faptele și regulile din această parte a programului ch02e01.pro:

îi place (ellen, tenis).

place (Ioan, fotbal).

place (rupt, baseball).

place (eric, înot).

place (notă, tenis).

likes (factura, Activitate):- likes (rupt, Activitate).

Ultima linie din program este regula. Această regulă corespunde unei propoziții în limbaj natural:

Lui Bill îi place activitatea dacă lui Tom îi place activitatea. (Bill îi place o activitate dacă lui Tom îi place acea activitate)

În această regulă, capul este likes (factura, Activitate) și corpul este likes (rupt, Activitate). Rețineți că în acest exemplu nu există date despre dragostea lui Bill pentru baseball. Pentru a afla dacă lui Bill îi place baseballul, ai putea să-l întrebi pe Prolog astfel:

place (factură, baseball).

Când încearcă să găsească o soluție la această interogare, Prolog va folosi regula:

Încărcați programul ch02e01.pro în mediul de dezvoltare vizuală VisualProlog și rulați-l cu utilitarul TestGoal .

place (simbol, simbol)

îi place (ellen, tenisul).

îi place (Ioan, fotbal).

place (rupt, baseball).

îi place (eric, înotul).

place (notă, tenis).

likes(factura,Activity):-likes(rupt, Activitate).

place (factură, baseball).

Utilitarul TestGoal va răspunde în fereastra aplicației:

Sistemul a folosit o regulă combinată

likes(factura, Activitate):- likes(rupt, Activitate).

place (rupt, baseball). pentru a rezolva că place (factura de lege, baseball).

Încercați, de asemenea, următoarea interogare în secțiunea GOAL:

place (factură, tenis).

Utilitarul Test Goal va răspunde:

deoarece:

· nu există dovezi că Bill iubește tenisul;

· Atitudinea lui Bill față de tenis nu poate fi dedusă logic folosind această regulă și faptele la îndemână.



Ți-a plăcut articolul? Împărtășește-l