Noțiuni generale
Programare declarativă
O paradigmă de programare în care controlul fluxului de execuție este lăsat la latitudinea implementării limbajului, spre deosebire de programarea imperativă în care programul constă dintr-un șir de
instrucțiuni ce transmit sistemului ce se va executa pas cu pas.
http://en.wikipedia.org/wiki/Declarative_programming
Programare logică
O paradigmă de programare declarativă bazată pe logică. A rezolva o problemă utilizând programarea logică implică descrierea domeniului problemei sub forma unei mulțimi de propoziții (formule) și interogarea sa.
http://en.wikipedia.org/wiki/Logic_programming
Prolog
Cel mai cunoscut limbaj de programare logică este Prolog. Numele provine de la PROgramming in LOGic.
Programarea în Prolog constă din a construi o bază de cunoștințe, și a o interoga. Baza de cunoștințe este asemănătoare cu o bază de date, însă pe lângă date conține și reguli.
http://en.wikipedia.org/wiki/Prolog
SWI-Prolog
Una din cele mai populare implementări de Prolog, foarte activ dezvoltată și utilizată atât în mediul academic, cât și în producție.
http://www.swi-prolog.org/
Utilizarea SWI-Prolog
Când se deschide SWI-Prolog pe Windows este afișată o consolă, denumită și top level.
Creați un nou program Prolog, denumit lab1:
În acest editor vom construi baza de cunoștințe:
Introduceți următorul program, ce descrie predicatul indian/1:
indian(curry).
indian(dahl).
indian(tandoori).
indian(kurma).
Un predicat este identificat unic prin numele și aritatea sa, notat astfel: nume_predicat/aritate.
Editorul va evidenția folosind syntax highlighting cele patru clauze ale predicatului indian/1. Culoarea roșie a numelui predicatului semnifică faptul că acesta nu este utilizat.
O clauză (en. clause) care este de forma „nume_predicat(argumente).” se numește faptă (en. fact).
O regulă este de forma „nume_predicat(argumente) :- predicat1, predicat2, ... .” Operatorul :- se citește dacă (en. if), partea din stânga sa se numește cap (en. head), iar partea din dreapta corp (en. body).
Atenție! Întotdeauna o clauză se termină cu punct. În cazul în care acesta lipsește editorul ne va atenționa:
Adăugați la începutul programului această regulă:
likes(sam,Food) :- indian(Food), mild(Food).
Utilizați tasta TAB pentru a obține indentarea corectă a predicatului. Observați că am scris câte un predicat pe linie, inclusiv in corpul regulii.
Observații:
1. am utilizat predicatul indian în regula likes înainte de apariția sa în program 2. predicatul mild/1, care nu este definit, apare marcat cu roșu
Adăugați la finalul programului clauzele predicatului mild/1:
mild(dahl).
mild(tandoori).
mild(kurma).
Observați actualizarea culorilor în editor:
În continuare vom compila baza de cunoștințe:
Compilarea va conduce la încărcarea informațiilor în memoria mașinii virtuale a SWI-Prolog. Această operațiune se mai numeste și consultare (en. consult).
În urma compilării veți observa un mesaj de confirmare în bara de stare a editorului:
De asemenea în consolă veți observa un mesaj similar:
Acum putem interoga programul scris anterior:
Consola are ca prompter simbolul ?-, care semnifică faptul că așteaptă o interogare. În exemplele care urmează se va include acest prompt pentru a marca interogările, însă acesta nu este necesar a fi tastat.
Rezultatul unei interogări va fi adevărat sau fals.
Rulați următoarele interogări:
?- indian(kurma).
?- indian(sarmale).
?- mild(curry).
Prolog va utiliza baza de cunoștințe pentru a verifica adevărul afirmațiilor date ca interogare. Dacă găsește informațiile necesare demonstrării răspunsul va fi adevărat, altfel va fi fals. Acest mod de funcționare se numește ipoteza universului închis.
O interogare poate fi făcută cu mai mult de un singur predicat. De exemplu:
?- indian(tandoori), mild(tandoori).
?- indian(curry), mild(curry).
Operatorul virgulă are în Prolog semnificația de AND logic.
Să utilizăm acum și predicatul likes/2 pentru interogare:
?- likes(sam, dahl).
În definiția predicatului likes/2 observați că Food este scris cu literă mare, în schimb restul simbolurilor cu literă mică. Prin convenție, dacă numele unui simbol începe cu literă mare este o variabila, altfel este constantă.
Putem utiliza variabile și pentru interogări:
?- indian(X).
După rularea interogării de mai sus SWI-Prolog așteaptă:
Implicit Prolog va oferi prima soluție găsită. Pentru a obține mai multe soluții la interogare apăsați tasta
„;”, a cărei semnificatie este OR logic.