This shows you the differences between two versions of the page.
|
pp:23:laboratoare:prolog:intro [2023/05/02 14:12] bot.pp |
pp:23:laboratoare:prolog:intro [2023/05/10 07:30] (current) alexandru.bala [Tipuri de date] |
||
|---|---|---|---|
| Line 53: | Line 53: | ||
| ===== Sintaxă și semantică ===== | ===== Sintaxă și semantică ===== | ||
| - | Programele scrise în Prolog descriu relații exprimitate prin clauze. Există două tipuri de clauze: | + | Programele scrise în Prolog descriu relații exprimate prin clauze. Există două tipuri de clauze: |
| * axiome sau fapte (en. //facts//) | * axiome sau fapte (en. //facts//) | ||
| Line 93: | Line 93: | ||
| ==== Termeni ==== | ==== Termeni ==== | ||
| - | În Prolog orice valoare se numește [[https://www.swi-prolog.org/pldoc/man?section=glossary#gloss:term|termen]]. Tipuri simpli de termeni: constante, sau mai bine zis //atomi// simbolici, întregi, numere în virgulă mobilă sau termeni compuși. | + | În Prolog orice valoare se numește [[https://www.swi-prolog.org/pldoc/man?section=glossary#gloss:term|termen]]. Tipuri simpli de termeni: |
| - | Cuvântul [[https://www.swi-prolog.org/pldoc/man?section=glossary#gloss:structure|structură]] este un sinonim pentru termenul [[https://www.swi-prolog.org/pldoc/man?section=glossary#gloss:compound|compus]]. | + | * Constante textuale, sau mai bine zis //atomi//<code> |
| + | nume, ion, popescu | ||
| - | <code> | + | </code> |
| + | * Numere întregi/numere în virgulă mobilă | ||
| + | * Variabile (vom detalia mai departe)<code> | ||
| + | ?- om(X). | ||
| + | X = socrate. | ||
| + | |||
| + | </code> | ||
| + | * Termeni [[https://www.swi-prolog.org/pldoc/man?section=glossary#gloss:compound|compuși]].<code> | ||
| % exemplu structură | % exemplu structură | ||
| client(nume(ion, popescu), carte(aventuri, 2002)). | client(nume(ion, popescu), carte(aventuri, 2002)). | ||
| </code> | </code> | ||
| - | Puteți considera momentan că sintactic singura diferență este că predicatele nu sunt transmise ca argumente, aceasta fiind o [[https://stackoverflow.com/questions/28972038/prolog-structurecomplex-term-vs-predicate-i-dont-really-get-the-difference|discuție]] mai subtilă ce ține de reprezentarea internă a implementării. | ||
| - | Consultați **[[https://www.swi-prolog.org/pldoc/man?section=glossary|glosarul]]** pentru orice detalii suplimentare. | + | Cuvântul [[https://www.swi-prolog.org/pldoc/man?section=glossary#gloss:structure|structură]] este un sinonim pentru termenul compus. |
| + | |||
| + | Puteți considera momentan că singura diferență, sintactică, este că predicatele nu sunt transmise ca argumente, aceasta fiind o [[https://stackoverflow.com/questions/28972038/prolog-structurecomplex-term-vs-predicate-i-dont-really-get-the-difference|discuție]] mai subtilă ce ține de reprezentarea internă a implementării. | ||
| + | |||
| + | Consultați [[https://www.swi-prolog.org/pldoc/man?section=glossary|**glosarul**]] pentru orice detalii suplimentare. | ||
| ==== Scopuri și variabile ==== | ==== Scopuri și variabile ==== | ||
| Line 110: | Line 121: | ||
| Când rulăm interogări despre termeni și relațiile dintre ei spunem informal că demonstrăm sau obținem informații pornind de la "baza noastră de date" (de la axiome, de la fapte). | Când rulăm interogări despre termeni și relațiile dintre ei spunem informal că demonstrăm sau obținem informații pornind de la "baza noastră de date" (de la axiome, de la fapte). | ||
| - | Calcul se face prin încercarea de a satisface[^1] //scopuri// (en. //goals//). | + | Calcul se face prin încercarea de a satisface [^1] //scopuri// (en. //goals//). |
| **OBSERVAȚIE**: Când am interogat dacă Socrate este muritor, procesul de execuție a returnat ''%%false%%'' deoarece **nu** se putea satisface acest scop. Nu înseamnă că el este nemuritor. Aceasta este //ipoteza lumii închise// -- orice nu poate fi demonstrat ca adevărat va fi considerat fals. | **OBSERVAȚIE**: Când am interogat dacă Socrate este muritor, procesul de execuție a returnat ''%%false%%'' deoarece **nu** se putea satisface acest scop. Nu înseamnă că el este nemuritor. Aceasta este //ipoteza lumii închise// -- orice nu poate fi demonstrat ca adevărat va fi considerat fals. | ||
| Line 128: | Line 139: | ||
| Observați că în a doua interogare am făcut primul nostru calcul util, folosind o variabilă, ''%%X%%''. Argumentul nu mai este o valoare particulară, ci sistemul de execuție încearcă **legarea** ei la diferite constante sau atomi. Prin convenție numele variabilelor (''%%X%%'') începe cu literă mare iar numele atomilor (''%%leulDinNemeea%%'', ''%%rhesus%%'') începe cu literă mică. | Observați că în a doua interogare am făcut primul nostru calcul util, folosind o variabilă, ''%%X%%''. Argumentul nu mai este o valoare particulară, ci sistemul de execuție încearcă **legarea** ei la diferite constante sau atomi. Prin convenție numele variabilelor (''%%X%%'') începe cu literă mare iar numele atomilor (''%%leulDinNemeea%%'', ''%%rhesus%%'') începe cu literă mică. | ||
| - | Așa cum v-ați obișnuit de la Haskell, și Prolog permite folosirea de variablie [[https://www.swi-prolog.org/pldoc/man?section=glossary#gloss:anonymous|anonime]], ''%%_%%''. Multiple folosiri ale lui ''%%_%%'' nu se leagă la același termen. | + | Așa cum v-ați obișnuit de la Haskell, și Prolog permite folosirea de variabile [[https://www.swi-prolog.org/pldoc/man?section=glossary#gloss:anonymous|anonime]], ''%%_%%''. Multiple folosiri ale lui ''%%_%%'' nu se leagă la același termen. |
| <code> | <code> | ||
| Line 134: | Line 145: | ||
| X = rhesus, | X = rhesus, | ||
| Y = tracia. | Y = tracia. | ||
| + | |||
| + | ?- muritor(X), rege(X, _, _). | ||
| + | X = rhesus. | ||
| </code> | </code> | ||
| Line 202: | Line 216: | ||
| </code> | </code> | ||
| - | Deci mai întâi încearcă demonstrarea primei reguli pentru predicatul ''%%muritor%%'' și eșuează. Prima premisă din a doua regulă este adevărată (''%%viu(X)%%''). Observăm că **eșecul demonstrației** scopului ''%%zeu(hercule)%%'' determină adevărată a doua premisă (''%%\+ zeu(X)%%''). Cele două premise fiind puse în conjuncție, considerăm că Hercule este muritor. | + | Observăm că mai întâi încearcă demonstrarea primei reguli pentru predicatul ''%%muritor%%'' și eșuează. Prima premisă din a doua regulă este adevărată (''%%viu(X)%%''). Observăm că **eșecul demonstrației** scopului ''%%zeu(hercule)%%'' determină adevărată a doua premisă (''%%\+ zeu(X)%%''). Cele două premise fiind puse în conjuncție, considerăm că Hercule este muritor. |
| === Negația ca eșec în demonstrație === | === Negația ca eșec în demonstrație === | ||
| Line 248: | Line 262: | ||
| // verificarea celei de-a doua condiții se efectuază doar dacă se trece de prima | // verificarea celei de-a doua condiții se efectuază doar dacă se trece de prima | ||
| if (ptr != NULL && ptr->field != ILLEGAL_VALUE) { | if (ptr != NULL && ptr->field != ILLEGAL_VALUE) { | ||
| - | // do something usefull | + | // do something useful |
| } | } | ||
| Line 384: | Line 398: | ||
| </code> | </code> | ||
| - | ==== Tiprui de date ==== | + | ==== Tipuri de date ==== |
| Am discutat până acum de: | Am discutat până acum de: | ||
| Line 404: | Line 418: | ||
| === Șiruri === | === Șiruri === | ||
| - | O secvență de caractere înscrisă între ''%%"%%''. | + | O secvență de caractere (un [[https://www.swi-prolog.org/pldoc/man?section=string|string]]) va fi înscrisă între ghilimele (''%%"%%''). |
| <code> | <code> | ||
| - | ?- X= "abc", string(X), writeln(X). | + | ?- X = "abc", string(X), writeln(X). |
| abc | abc | ||
| X = "abc". | X = "abc". | ||
| Line 426: | Line 440: | ||
| <HTML><li></HTML>''%%Arg2%%'' va fi neinstanțiat atunci când se va încerca satisfacerea predicatului. | <HTML><li></HTML>''%%Arg2%%'' va fi neinstanțiat atunci când se va încerca satisfacerea predicatului. | ||
| <HTML><ul></HTML> | <HTML><ul></HTML> | ||
| - | <HTML><li></HTML>Dacă predicatul este satisfăcut, ''%%Arg2%%'' va fa fi instanțiat la finalul evaluării.<HTML></li></HTML> | + | <HTML><li></HTML>Dacă predicatul este satisfăcut, ''%%Arg2%%'' va fi instanțiat la finalul evaluării.<HTML></li></HTML> |
| <HTML><li></HTML>Dacă ''%%Arg2%%'' este deja instanțiat la evaluarea predicatului, evaluarea poate servi la verificarea corectitudinii argumentului în raport cu semnificația predicatului. | <HTML><li></HTML>Dacă ''%%Arg2%%'' este deja instanțiat la evaluarea predicatului, evaluarea poate servi la verificarea corectitudinii argumentului în raport cu semnificația predicatului. | ||
| <HTML><ul></HTML> | <HTML><ul></HTML> | ||
| - | <HTML><li></HTML>Următorul exemplu, din laboratorele următore, îl folosește pe ''%%R%%'' ca o intrare, și pe ''%%N%%'' ca o ieșire.<HTML></li></HTML><HTML></ul></HTML> | + | <HTML><li></HTML>Următorul exemplu, din laboratoarele următoare, îl folosește pe ''%%R%%'' ca intrare, și pe ''%%N%%'' ca o ieșire.<HTML></li></HTML><HTML></ul></HTML> |
| <code> | <code> | ||
| Line 453: | Line 467: | ||
| * [[https://github.com/cs-pub-ro/PP-laboratoare/raw/master/prolog/intro/prolog-cheatsheet-1.pdf|Cheatsheet]] | * [[https://github.com/cs-pub-ro/PP-laboratoare/raw/master/prolog/intro/prolog-cheatsheet-1.pdf|Cheatsheet]] | ||
| * [[https://ocw.cs.pub.ro/courses/_media/pp/23/laboratoare/prolog/intro-schelet.zip|Schelet]] | * [[https://ocw.cs.pub.ro/courses/_media/pp/23/laboratoare/prolog/intro-schelet.zip|Schelet]] | ||
| - | * [[https://ocw.cs.pub.ro/courses/_media/pp/23/laboratoare/prolog/intro-solutie.zip|Soluții]] | + | * [[https://ocw.cs.pub.ro/courses/_media/pp/23/laboratoare/prolog/intro-solutii.zip|Soluții]] |
| ===== Referințe ===== | ===== Referințe ===== | ||