Documente Academic
Documente Profesional
Documente Cultură
Orele de laborator:
Prelegeri:
Luni
14.20 - 15.40 (203/4a)
15.55 - 17.15 (206/4a)
Mari
Vineri
15.55 - 17.15
17.30 - 18.50
(203/4a)
(203/4a)
15.55 - 17.15
17.30 - 18.50
(206/4a)
(206/4a)
Joi
Curs 1
Introducere in Prolog
Una din principalele idei ale programarii logice este aceea c un
algoritm este constituit din doua elemente disjuncte: logic i control.
Componenta logica corespunde definitiei problemei ce trebuie
solutionata, n timp ce componenta control stabileste cum poate fi
obinuta soluia. n limbajul Prolog un programator trebuie sa descrie
numai componenta logica a unui algoritm (s specifice problema ce
trebuie soluionata), lsnd controlul executarii sa fie exercitat de
sistemul de programare logica utilizat. Astfel limbajul logic poate fi
conceput simultan ca limbaj de descriere, specificare formala a
problemei i ca un limbaj de programare a calculatoarelor.
Limbajul Prolog este doar un caz particular de abordare a programarii
logice.
Limbajul Prolog ( PROgrammation en LOGique) a fost creat la
Marsilia la inceputul anilor 70, inventatorii" fiind Alain Colmeraurer
si Philippe Roussel.
1. Este
Mediul de programare
TP
Lansarea: > prolog
Meniul principal:
Files, Edit, Run,
Compile, Options, Setup
Ferestrele din TP :
Editor, Dialog, Message,
Trace
Activarea meniului Files:
Alt+F
Editarea:
Alt+E
Lansarea:
Alt+R
Tipurile de date
Sectiunea de domenii este la fel ca in celelalte limbaje de programare.
Domeniile de baza sunt:
char
integer
real
string
symbol
Tipurile de date
- real - daca notam prin "D" o cifra (digit), atunci un numar real poate avea una din
formele:
DDDDDDD
DDDDDDD.DDDDDDD
[+|-]DDDDD[.]DDDDDDD[e[+|-]DDD]
Numerele "reale" din acest domeniu sunt din intervalul [10^{-307},10^{308}] reunit
cu [-10^{308},-10^{-307}];
Tipurile de date
Exemple.
char:
A, a, 5,!, +
symbol: x1, X1, ion, Prolog, Turbo Prolog
string:
x1, X1, ion, Prolog, Turbo Prolog, Ada, +
integer: 5, -35, 0
real:
5.0, -2.5, 2.6e+4
Pentru datele de tipul symbol spre deosebire de tipul string, se creeaz
un tabel care se pstreaz n memoria intern i deci cutarea este mai
rapid.
Termenii in Prolog
Termenii in Prolog
Termeni
Simpli
Structurai
Constante
Variabile
Atomi
Numere
Termenii in Prolog
Un termen structurat se defineste de functorul su, componentele sale i
arietatea sa (numrul de componente). Considerm un exemplu.
autor(grigore,vieru)
Functorul este autor, arietatea 2. Componentele unui termen structurat
poate fi la rndul lor termeni structurai.
cartea(mama_graiul,autor(grigore,vieru))
Un termen structurat poate fi reprezentat sub forma unui arbore a crui
rdcin e simbolul funcional (functorul), numrul de descendeni ai
rdcinii fiind arietatea (numrul de componente ale termenului
structurat), ordonarea descendenilor corespunde ordonrii
componentelor. Dac o component este un termen structurat, ea se
descompune n acelai mod.
Termenii in Prolog
cartea
mama_graiul
autor
grigore
vieru
Constantele: atomi
Constantele definesc obiecte specifice, particulare, sau relaii
particulare. Exist dou tipuri de constante: atomi i numere.
Atomii sunt constante simbolice care ncep, de obicei, cu o liter i pot
conine litere, cifre i caracterul _. Exist i alte caractere ce pot forma
atomi speciali, care au o semnificaie aparte n limbaj.
Atomii pot desemna:
obiecte constante care sunt argumentele predicatelor, de exemplu atomii
mihai i maria n faptul parinte(mihai, maria);
predicate Prolog sunt:
definite de utilizator
predefinite n sistem;
atomi speciali, de exemplu atomii :- i ?- ;
diverse reguli de construcie sintactic a atomilor depind de implementare.
Unificarea
Unificarea este procesul de 'potrivire' a doua predicate prin asignarea de
valori unor variabile astfel incat cele doua predicate sa devina identice.
Caracteristicile principale ale unificarii in Turbo Prolog:
a) Cand Prolog-ul incearca sa satisfaca un scop, cauta o potrivire incepand
cu prima clauza a programului.
b) Cand se face un nou apel, cautarea unei potriviri incepe intotdeauna de
la inceputul programului.
c) Cand un apel a gasit o potrivire, spunem ca a reusit si se va incerca
satisfacerea urmatorului subscop.
d) Daca o variabila se leaga la o valoare intr-o clauza, singurul mod in
care se poate dezlega este prin backtracking.
Backtracking-ul
- La satisfacerea unei conjunctii de scopuri in Prolog, se incearca
satisfacerea fiecarui scop pe rand, de la stanga la dreapta. Prima
satisfacere a unui scop determina plasarea unui marcaj in baza de
cunostinte in dreptul faptului sau regulii care a determinat satisfacerea
scopului.
- Daca un scop nu poate fi satisfacut (esueaza), sistemul Prolog se intoarce
si incearca resatisfacerea scopului din stanga, pornind cautarea in baza de
cunostinte de la marcaj in jos. inainte de resatisfacerea unui scop se
elimina toate instantierile de variabile determinate de ultima satisfacere a
acestuia. Daca cel mai din stanga scop din conjunctia de scopuri nu poate
fi satisfacut, intreaga conjunctie de scopuri esueaza.
- Aceasta comportare a sistemului Prolog in care se incearca in mod repetat
satisfacerea si resatisfacerea scopurilor din conjunctiile de scopuri se
numeste backtracking.
Backtracking-ul
Unificarea
Termen1
Termen2
Unificarea
Ion
ion
da
Ion
petru
nu
12
12 da
12 12.0
nu
'Liviu Rebreanu'
'Liviu Rebreanu'
da
'Liviu Rebreanu'
scriitor
nu
plus
nu
I2
3*4
nu
Termen1
Termen2
Unificarea
autor(grigore,vieru)
autor(grigore,vieru)
da
autor(grigore,vieru)
nume(grigore,vieru)
nu
autor(grigore,vieru)
autor(grigore,vieru,1935)
nu
3+4
4+3
nu
3*4
*(3,4)
da
Backtracking-ul
Backtracking-ul
S examinm cum sistemul stabilete rspunsul pentru ultima interogare
(goal). Pentru ca predicatul acelasi_parinte(X,Y) s fie adevrat e necesar ca
predicatele parinte(P,X) i parinte(P,Y) s fie adevrate. De la nceput se
suprapun predicatele acelasi_parinte(suzana,Z) din goal cu
acelasi_parinte(X,Z) din clauz (regul). n rezultat X se concretizeaz cu
"suzana", iar variabila Y se leag cu variabila Z . La urmtorul pas se
ncearc s se concretizeze parinte(P,X) pentru X="suzana" cu baza de
cunotine i P se concretizeaz cu "maria". La urmtorul pas se ncearc
concretizarea parinte(P,Y) pentru P="maria" i se reuete pentru
Y="dan". Se obine prima soluie: Z="dan". Deci s-a reuit unificarea
formulei din goal cu o regul. Dac goal din fereastra de dialog conine
variabile, atunci sistemul caut toate soluiile. n rezultat predicatul
parinte(maria,Y) se suprapune cu faptul parinte(maria,suzana) i obinem a
doua soluie: Y="suzana".
% este satisfcut
% eueaz
% reuete
% eueaz
Operatorul
Operandul2
Rezultatul
ntreg
+, -, *
ntreg
ntreg
real
+, -, *
ntreg
real
ntreg
+, -, *
real
real
real
+, -, *
real
real
real
ntreg
div
ntreg
ntreg
ntreg
Tipul operaiilor
operaiilor
ntreg aritmetice
mod
ntreg
n!=1*1*2*3*4* *n=(n-1)!*n
factorial(3,3)
stiva
V=U*3
V=2*3
factorial(2,U)
factorial(2,2)
U=>U2
stiva
N2
V2
M2
U=2
U=U2*2
factorial(1,1)
factorial(1,U2)
U=>U3
stiva
N3
V3
M3
U2
U2=1*1
U2=U3*1
factorial(0,1)
factorial(0,U3)
U3=1
factorial(0, 1):-!.
factorial(N, V) :N>1,M=N-1,
factorial(M,U),V=U*N.
U3
U2
U2
< N, V >
Intrri. Ieiri
Predicate de intrare:
readln(String)
% Citete o linie de text, terminat cu Enter.
readint(Integer)
readchar(Char)
readreal(Real)
Aici am utilizat un mod de descriere a operanzilor pe care l vom utiliza i
pe parcurs. n paranteze am indicat, c argumentul este o variabil
(primul caracter este o majuscul) i tipul ei.
Cu operatorul write putem afia orice tip de obiecte. Formatul general:
write(arg1, arg2, , argn)
Argumentele sunt obiecte. Operatorul poate fi folosit att n reguli ct i n
goal.
Ieiri
Exemplu.
Goal: muritor(X),write(X)
sau
Goal: muritor(X),write("muritor:",X),nl
unde nl este un operator de ieire i are semnificaia \n din alte limbaje.
Se citete linie nou (newline).
Ieiri
Predicatul writef este analog lui write, n plus are un format conform
cruia are loc afiarea. Formatul general este:
writef(<format>, arg1, arg2, ..., argn)
<format> este un ir de caractere n care se specific formatul pentru
fiecare argument. Acest ir trebuie s conin ati specificatori de
format, ci argumeni sunt indicai. Specificatorul formatului are forma
general:
%[-] m.pw
unde:
- determin alinierea la stnga (implicit la dreapta)
m este numrul maxim de poziii
p
este numrul maxim de poziii pentru partea zecimal
w poate fi:
f real n zecimal fixat,
e real n notaie exponenial,
g real scurt (implicit)
s string sau symbol
w poate fi omis.
Ieiri
Exemplu.
Fie X=1.0, Y=3.37, Z=4.5
writef("Sunt numere %1 si %4.1, precum si %-10e",X,Y,Z).
Rezultatul va fi:
Sunt numere 1 si 3.4, precum si 4.5e+00
Bibliografie