Laborator 1 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. Prolog http://en.wikipedia.org/wiki/logic_programming 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. SWI-Prolog http://en.wikipedia.org/wiki/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. Exercițiu Construiți o bază de cunoștințe și realizați interogări pe ea.