Sunteți pe pagina 1din 105

Programare logică

Curs 1: Introducere

Mircea Marin

Marin Programare logică


Aspecte organizatorice

B Curs: Mircea Marin


Laboratoare: Isabela Drămnesc
pagina web (curs):
http://web.info.uvt.ro/˜mmarin/lectures/LP
email: mmarin@info.uvt.ro
B Materialele de curs vor fi postate pe pagina web.
B Evaluare:
1 examen scris final (50% din notă)
Probe de laborator (50% din notă). Participarea la probele
de laborator este obligatorie.

Marin Programare logică


Scopul şi planul cursului

Scopul cursului:
Răspunsuri la următoarele întrebări:
1 Care sunt caracteristicile programării logice?
2 Ce se poate face cu programarea logică?
Învăţarea practicilor de programare în P ROLOG.
Aplicaţii specifice.
Planul cursului:
B Prezentarea limbajului de programare P ROLOG
B P ROLOG şi logica cu predicate de ordinul I
B Aplicaţii: recursivitate, prelucrarea listelor, mecanisme
specifice (tăiere, backtracking), etc.

Marin Programare logică


Ce este programarea logică?

Stil de programare în care


Program = colecţie de reguli logice şi fapte care reprezintă
baza de cunoştinţe a programatorului.
Rularea unui program = găsirea de răspunsuri la întrebări
puse de programator, prin raţionament logic bazat be
cunoştinţele din program.

Marin Programare logică


Ce este programarea logică?

Stil de programare în care


Program = colecţie de reguli logice şi fapte care reprezintă
baza de cunoştinţe a programatorului.
Rularea unui program = găsirea de răspunsuri la întrebări
puse de programator, prin raţionament logic bazat be
cunoştinţele din program.
B Programatorul trebuie să ştie programare logică:
codificarea cunoştinţelor ca reguli şi fapte în P ROLOG
codificarea întrebărilor în P ROLOG

Marin Programare logică


Ce este programarea logică?

Stil de programare în care


Program = colecţie de reguli logice şi fapte care reprezintă
baza de cunoştinţe a programatorului.
Rularea unui program = găsirea de răspunsuri la întrebări
puse de programator, prin raţionament logic bazat be
cunoştinţele din program.
B Programatorul trebuie să ştie programare logică:
codificarea cunoştinţelor ca reguli şi fapte în P ROLOG
codificarea întrebărilor în P ROLOG
B Interpretorul (sau compilatorul) P ROLOG ştie să răspundă
la întrebările puse de utilizator.

Marin Programare logică


Caracteristici ale programării logice
Comparaţie: Programare declarativă contra Programare procedurală

Programarea logică este un stil de programare declarativă:

Programatorul trebuie să programeze ceea ce ştie.


Cum se găseşte răspunsul la întrebări cade în sarcina
interpretorului P ROLOG.
P ROLOG foloseşte o strategie de căutare a tuturor
răspunsurilor la întrebări, bazat pe raţionament logic
(rezoluţie SLD)
În programarea procedurală:
Programatorul trebuie să programeze cum se găseşte
soluţia la o problemă.

Marin Programare logică


Fapte

Faptele sunt afirmaţii despre proprietăţile obiectelor şi relaţiile


existente între ele.
Fapte de tip proprietate(obiect):
Coco este papagal: papagal(coco).
Oricine (X) este muritor: muritor(X).
Fapte care exprimă relaţii între obiect:
Mihai o iubeşte pe Maria: iubeste(mihai,maria).
Oricine (X) este egal cu sine însuşi: egal(X,X).

Marin Programare logică


Reguli
O regulă, în limbaj natural, este o frază de forma:
Dacă ipoteza1 şi . . . şi ipotezan atunci concluzie.
⇔ concluzie dacă ipoteza1 şi . . . şi ipotezan .
regula corespunzătoare în P ROLOG este expresia

concluzie :- ipoteza1 , . . . , ipotezan .

unde ipoteza1 , . . . , ipotezan , concluzie sunt atomi.

Marin Programare logică


Reguli
O regulă, în limbaj natural, este o frază de forma:
Dacă ipoteza1 şi . . . şi ipotezan atunci concluzie.
⇔ concluzie dacă ipoteza1 şi . . . şi ipotezan .
regula corespunzătoare în P ROLOG este expresia

concluzie :- ipoteza1 , . . . , ipotezan .

unde ipoteza1 , . . . , ipotezan , concluzie sunt atomi.

Exemplu
În limbaj natural (lb. română) În P ROLOG
Dacă X este bun şi X cunoaşte pe iubeste(X , Y ):-
Y şi Y este frumoasă atunci X o bun(X ), cunoaste(X , Y ),
iubeşte pe Y . frumoasa(Y ).
Orice papagal este muritor. muritor(X ):-papagal(X).
(Dacă X este papagal atunci X este
muritor.)

Marin Programare logică


Întrebări

În limbaj natural (lb. română) În P ROLOG


Este Coco papagal? ?-papagal(coco).
Cine este muritor? ?-muritor(X).
(Pentru ce valoare a lui X este X
muritor?)
În general, rezolvarea unei probleme se face punând
întrebări
"Este adevărat că ...?"
"Pentru ce valori ale necunoscutelor ... are loc ...?"
Programatorul nu trebuie să ştie cum se află răspunsul la
întrebare. Găsirea răspunsurilor cade în sarcina
interpretorului Prolog.

Marin Programare logică


De la limbaj natural la Prolog
În acest curs vom pune accent pe traducerea corectă a
cunoştinţelor dintr-un limbaj natural în limbajul Prolog.
Adesea, vom reformula mai întâi afirmaţiile din limbajul
natural, pentru a le traduce mai uşor în P ROLOG.

Exemplu
În limbaj natural:
Studenţii silitori au note bune. ⇔ Dacă X este student şi X
este silitor atunci X are note bune ⇔ X are note bune dacă
X este student şi X este silitor.
În limbaj artificial (P ROLOG):

note(X , bune):-student(X ), silitor(X ).

R EMARC Ă : În P ROLOG, :- este „dacă" iar virgula dintre ipoteze


(,) este „şi".
Marin Programare logică
Programarea logică: Istoric

Kowalski (anii ’70) observă că o formulă logică

S1 ∧ . . . ∧ Sn → S

poate avea 2 semnificaţii:


semnificaţie logică: Dacă S1 şi . . . şi Sn sunt fiecare adevărate
atunci şi S este adevărată.
semnificaţie procedurală de forma "S dacă S1 şi . . . şi Sn " care
poate fi interpretată astfel: pentru a afla dacă procedura S este
adevărată trebuiesc executate recursiv procedurile S1 , . . . , Sn
pentru a determina dacă sunt adevărate.
În P ROLOG, formula devine o regulă

S:-S1 , . . . , Sn .

cu antetul (sau capul) regulii S, şi corpul S1 , . . . , Sn .

Marin Programare logică


Programarea logică
Istoric (continuare)

Universitatea din Marsilia (Colmerauer, anii ’70): apare


limbajul P ROLOG("Programmation et Logique".)
P ROLOG s-a impus ca cel mai important limbaj de
programare logică
⇒ numeroase implementări (interpretoare & compilatoare)

Marin Programare logică


Rezolvarea de probleme cu P ROLOG

Se declară fapte despre obiecte şi relaţiile dintre ele.

Marin Programare logică


Rezolvarea de probleme cu P ROLOG

Se declară fapte despre obiecte şi relaţiile dintre ele.


Se definesc reguli despre obiecte şi relaţiile lor.

Marin Programare logică


Rezolvarea de probleme cu P ROLOG

Se declară fapte despre obiecte şi relaţiile dintre ele.


Se definesc reguli despre obiecte şi relaţiile lor.
Se pun întrebări despre obiecte şi relaţiile dintre ele.

Marin Programare logică


Rezolvarea de probleme cu P ROLOG

Se declară fapte despre obiecte şi relaţiile dintre ele.


Se definesc reguli despre obiecte şi relaţiile lor.
Se pun întrebări despre obiecte şi relaţiile dintre ele.
Programarea în P ROLOG este o conversaţie cu interpretorul de
P ROLOG. Rezolvarea de probleme în acest fel necesită
modelarea problemei folosind noţiunile programării logice:
fapte.
reguli.
întrebări.

Program = fapte + reguli .


| {z }
bază de cunoştinţe

Marin Programare logică


Fapte

Enunţarea unui fapt în P ROLOG

predicat(obiect1 , . . . , obiectn ).
| {z }
argumente

De exemplu
are(andrei, carte).
Numele relaţiilor (predicatelor) încep cu literă mică.
P ROLOG foloseşte mai ales notaţia prefix (dar sunt si
excepţii).
Un fapt se încheie cu “.” (punct).
Programatorul alege numele predicatelor şi trebuie să ştie
cum le interpretează.
De ex., are(andrei, carte). înseamnă că Andrei are o carte.

Marin Programare logică


Exemple de fapte

Aurul este preţios.


pretios(aur).
Ioana este femeie.
femeie(ioana).
Ion este tatăl Mariei.
tata(ion, maria).
Andrei are o carte.
are(carte, andrei).
Observaţii
Programatorul trebuie să stabilească înţelesul numelor de
obiecte şi predicate folosite în scrierea faptelor.
De exemplu: are(X,Y) înseamnă X are Y, şi nu
înseamnă Y are X.
Ordinea argumentelor contează!

Marin Programare logică


Întrebări

Exemplu de întrebare în P ROLOG

?- are(andrei, carte).
(Are Andrei o carte?)

Marin Programare logică


Întrebări

Exemplu de întrebare în P ROLOG

?- are(andrei, carte).
(Are Andrei o carte?)
P ROLOG caută în baza de cunoştinţe fapte care se
potrivesc (se unifică) cu întrebarea.

Marin Programare logică


Întrebări

Exemplu de întrebare în P ROLOG

?- are(andrei, carte).
(Are Andrei o carte?)
P ROLOG caută în baza de cunoştinţe fapte care se
potrivesc (se unifică) cu întrebarea.
Răspunsul este true dacă
predicatul este acelaşi
argumentele sunt aceleaşi

Marin Programare logică


Întrebări

Exemplu de întrebare în P ROLOG

?- are(andrei, carte).
(Are Andrei o carte?)
P ROLOG caută în baza de cunoştinţe fapte care se
potrivesc (se unifică) cu întrebarea.
Răspunsul este true dacă
predicatul este acelaşi
argumentele sunt aceleaşi
Altfel, răspunsul este false

Marin Programare logică


Întrebări

Exemplu de întrebare în P ROLOG

?- are(andrei, carte).
(Are Andrei o carte?)
P ROLOG caută în baza de cunoştinţe fapte care se
potrivesc (se unifică) cu întrebarea.
Răspunsul este true dacă
predicatul este acelaşi
argumentele sunt aceleaşi
Altfel, răspunsul este false
Numai ce este în baza de cunoştinţe se consideră adevărat.

Marin Programare logică


Întrebări

Exemplu de întrebare în P ROLOG

?- are(andrei, carte).
(Are Andrei o carte?)
P ROLOG caută în baza de cunoştinţe fapte care se
potrivesc (se unifică) cu întrebarea.
Răspunsul este true dacă
predicatul este acelaşi
argumentele sunt aceleaşi
Altfel, răspunsul este false
Numai ce este în baza de cunoştinţe se consideră adevărat.
false nu este acelaşi lucru cu fals!
false înseamnă mai degrabă nu ştiu.

Marin Programare logică


Variabile

Variabilă = înlocuitor al unui obiect care satisface o relaţie.


Exemplu de întrebare cu variabilă

?- place(ion, X).

se interpretează astfel:
Care sunt obiectele X care îi plac lui Ion?
P ROLOG urmează sa determine valorile lui X pentru care
întrebarea este true.
Convenţie: în P ROLOG variabilele încep cu LITERE MARI.
În P ROLOG o variabilă poate fi
instanţiată: variabila are un obiect ca valoare
neinstanţiată: încă nu se ştie o valoare pentru variabilă.

Marin Programare logică


Exemplu de întrebare cu variabile

Se consideră baza de cunoştinţe cu următoarele fapte:


place(ion,maria).
place(ion,flori).
place(paul,maria).
La întrebarea
?-place(ion, X).
P ROLOG răspunde
X = flori
şi va aştepa instrucţiuni.

Marin Programare logică


Calculul răspunsului în P ROLOG

P ROLOG caută în baza de cunoştinţe un fapt ce se


potriveşte cu întrebarea
când se găseşte o potrivire, aceasta este marcată
dacă utilizatorul apasă Enter, căutarea se încheie
dacă utilizatorul apasă ";" şi apoi Enter, P ROLOG caută o
nouă potrivire, începând cu ultimul loc marcat, şi cu
variabilele din întrebare neinstanţiate.
În exemplul de mai sus, apăsând ";" urmat de Enter va
determina P ROLOG să răspundă:
X = maria .
false
Când nu mai sunt în baza de cunoştinţe fapte ce să se
potrivească, P ROLOG răspunde false

Marin Programare logică


Întrebări mai complexe
Conjuncţii

Se consideră programul următor:


place(maria, mancare).
place(maria, vin).
place(ion, vin).
place(ion, maria).
şi întrebarea
?- place(ion, maria), place(maria, ion).

Marin Programare logică


Întrebări mai complexe
Conjuncţii

Se consideră programul următor:


place(maria, mancare).
place(maria, vin).
place(ion, vin).
place(ion, maria).
şi întrebarea
?- place(ion, maria), place(maria, ion).
În general, o întrebare
?- fapt1 , . . . , faptn .
se citeşte fapt1 şi . . . şi faptn ? În acest caz:
Îi place lui Ion de Maria şi îi place Mariei de Ion?

Marin Programare logică


Întrebări mai complexe (continuare)
Conjuncţii

Bază de cunoştinţe:
place(maria, mancare).
place(maria, vin).
place(ion, vin).
place(ion, maria).
Întrebare:
?- place(ion, maria), place(maria, ion).
P ROLOG va răspunde false : caută toate faptele din
întrebare, unul după altul (toate trebuiesc satisfăcute, altfel
interogarea va eşua, iar răspunsul va fi false).

Marin Programare logică


Întrebări mai complexe (continuare)
Conjuncţii

Bază de cunoştinţe:
place(maria, mancare).
place(maria, vin).
place(ion, vin).
place(ion, maria).
Întrebare:
?- place(maria, X), place(ion, X).

Marin Programare logică


Întrebări mai complexe (continuare)
Conjuncţii

Bază de cunoştinţe:
place(maria, mancare).
place(maria, vin).
place(ion, vin).
place(ion, maria).
Întrebare:
?- place(maria, X), place(ion, X).

Întrebarea este: Există un obiect X care îi place şi lui Ion şi
Mariei?

Marin Programare logică


Întrebări mai complexe (continuare)
Conjuncţii

Bază de cunoştinţe:
place(maria, mancare).
place(maria, vin).
place(ion, vin).
place(ion, maria).
Întrebare:
?- place(maria, X), place(ion, X).

Întrebarea este: Există un obiect X care îi place şi lui Ion şi
Mariei?
P ROLOG încearcă să satisfacă primul obiectiv (prima parte
a întrebării); dacă reuşeşte, pune un marcaj pe el şi apoi
încearcă să satisfacă al doilea obiectiv, plasând un marcaj
în caz de succes.

Marin Programare logică


Conjuncţii şi backracking (revenire)

?- place(maria, X), place(ion, X).

place(maria, mancare).
place(maria, vin).
place(ion, vin).
place(ion, maria).

Marin Programare logică


Conjuncţii şi backracking (revenire)

?- place(maria, X), place(ion, X).

X= mancare
place(maria, mancare).
place(maria, vin).
place(ion, vin).
place(ion, maria).

Marin Programare logică


Conjuncţii şi backracking (revenire)

?- place(maria, X), place(ion, X).

X
X= mancare
place(maria, mancare).
place(maria, vin).
place(ion, vin).
place(ion, maria).

Marin Programare logică


Conjuncţii şi backracking (revenire)

?- place(maria, X), place(ion, X).

X
X= mancare
place(maria, mancare).
place(maria, vin).
place(ion, vin).
place(ion, maria).

Marin Programare logică


Conjuncţii şi backracking (revenire)

?- place(maria, X), place(ion, X).

X= mancare

X
place(maria, mancare).
place(maria, vin).
place(ion, vin).
place(ion, maria).

Marin Programare logică


Conjuncţii şi backracking (revenire)

?- place(maria, X), place(ion, X).

X= mancare
place(maria, mancare).

X
place(maria, vin).
place(ion, vin).
place(ion, maria).

Marin Programare logică


Conjuncţii şi backracking (revenire)

?- place(maria, X), place(ion, X).

place(maria, mancare).
X= vin
place(maria, vin).
place(ion, vin).
place(ion, maria).

Marin Programare logică


Conjuncţii şi backracking (revenire)

?- place(maria, X), place(ion, X).

place(maria, mancare).
X= vin
place(maria, vin).
place(ion, vin).
place(ion, maria).

Marin Programare logică


Conjuncţii şi backracking (revenire)

?- place(maria, X), place(ion, X).

X
place(maria, mancare).
X= vin
place(maria, vin).
place(ion, vin).
place(ion, maria).

Marin Programare logică


Conjuncţii şi backracking (revenire)

?- place(maria, X), place(ion, X).

ye
s
place(maria, mancare).
X= vin
place(maria, vin).
place(ion, vin).
place(ion, maria).
X = vin

Marin Programare logică


Conjuncţii şi backracking (revenire)

?- place(maria, X), place(ion, X).

place(maria, mancare).

X
X= vin
place(maria, vin).
place(ion, vin).
place(ion, maria).
X = vin

Marin Programare logică


Conjuncţii şi backracking (revenire)

?- place(maria, X), place(ion, X).

place(maria, mancare).
place(maria, vin).
X place(ion, vin).
place(ion, maria).
X = vin

Marin Programare logică


Conjuncţii şi backracking (revenire)

?- place(maria, X), place(ion, X).

place(maria, mancare).
place(maria, vin).
place(ion, vin).
X place(ion, maria).
X = vin

Marin Programare logică


Reguli
Cum putem programa faptul că "Lui Ion îi plac toţi
oamenii"?
place(ion,alex).
place(ion, bogdan).
place(ion, clara).
place(ion, dan).
...
Ar trebui enumerate toate persoanele în baza de
cunoştinţe → imposibil!

Marin Programare logică


Reguli
Cum putem programa faptul că "Lui Ion îi plac toţi
oamenii"?
place(ion,alex).
place(ion, bogdan).
place(ion, clara).
place(ion, dan).
...
Ar trebui enumerate toate persoanele în baza de
cunoştinţe → imposibil!
Folosim o variabilă:
place(ion, X).
înseamnă "Lui Ion îi place orice obiect X ."

Marin Programare logică


Reguli
Cum putem programa faptul că "Lui Ion îi plac toţi
oamenii"?
place(ion,alex).
place(ion, bogdan).
place(ion, clara).
place(ion, dan).
...
Ar trebui enumerate toate persoanele în baza de
cunoştinţe → imposibil!
Folosim o variabilă:
place(ion, X).
înseamnă "Lui Ion îi place orice obiect X ."
Mai trebuie precizat că lui Ion îi plac toţi X care sunt
persoane.

Marin Programare logică


Reguli
Cum putem programa faptul că "Lui Ion îi plac toţi
oamenii"?
place(ion,alex).
place(ion, bogdan).
place(ion, clara).
place(ion, dan).
...
Ar trebui enumerate toate persoanele în baza de
cunoştinţe → imposibil!
Folosim o variabilă:
place(ion, X).
înseamnă "Lui Ion îi place orice obiect X ."
Mai trebuie precizat că lui Ion îi plac toţi X care sunt
persoane.
Regulile sunt un mod de a preciza cum unele fapte depind
de alte fapte.
Marin Programare logică
Reguli ca definiţii

Regulile pot fi folosite pentru a specifica definiţii.

Marin Programare logică


Reguli ca definiţii

Regulile pot fi folosite pentru a specifica definiţii.


Exemple:

Marin Programare logică


Reguli ca definiţii

Regulile pot fi folosite pentru a specifica definiţii.


Exemple:
"X îi place lui Ion dacă X este om."

Marin Programare logică


Reguli ca definiţii

Regulile pot fi folosite pentru a specifica definiţii.


Exemple:
"X îi place lui Ion dacă X este om."
"X este pasăre dacă X este animal şi X zboară."

Marin Programare logică


Reguli ca definiţii

Regulile pot fi folosite pentru a specifica definiţii.


Exemple:
"X îi place lui Ion dacă X este om."
"X este pasăre dacă X este animal şi X zboară."
"X este sora lui Y dacă X este femeie şi X şi Y au aceiaşi
părinţi."

Marin Programare logică


Reguli ca definiţii

Regulile pot fi folosite pentru a specifica definiţii.


Exemple:
"X îi place lui Ion dacă X este om."
"X este pasăre dacă X este animal şi X zboară."
"X este sora lui Y dacă X este femeie şi X şi Y au aceiaşi
părinţi."
ATEN ŢIE: Noţiunea de definiţie de mai sus nu este identică cu
noţiunea de definiţie din logică!
O definiţie spune că ceva are loc dacăşi numai dacă
altceva (corpul definiţiei) are loc.
O regulă spune că un fapt A este adevărat dacă altceva
este adevărat. Însă faptul A ar putea fi adevărat şi în alte
situaţii‘.
“X este om dacă X este femeie.”
“X este om dacă X este bărbat.”
Marin Programare logică
Reguli în P ROLOG

Regulile în P ROLOG au un cap şi un corp.


Corpul regulii descrie condiţiile ce trebuiesc satisfăcute
pentru a satisface capul. În program area logică, aceste
condiţii se mai numesc şi obiective.

Exemplu
place(ion, X) :-
place(X,vin).
place(ion, X) :-
femeie(X), place(X, dans).

ATEN ŢIE ! Scopul unei variabile este regula în care aceasta


apare (reguli diferite nu au variabile în comun).

Marin Programare logică


Reguli în P ROLOG

Sintaxa unei reguli


cap corp
z }| { z }| {
predicat(arg1 , . . . , argn ) :- fapt1 , . . . , faptm .

delimitatori de fapte (şi)

delimitator de regulă (dacă)

Marin Programare logică


Exemplu
Familie regală

Predicate folosite:
male(X ): "X este bărbat."
female(Y ): "Y este femeie."
parents(X,Y,Z): "părinţii lui X sunt Y şi Z ."

Marin Programare logică


Exemplu
Familie regală

Predicate folosite:
male(X ): "X este bărbat."
female(Y ): "Y este femeie."
parents(X,Y,Z): "părinţii lui X sunt Y şi Z ."
Baza de cunoştinţe:
male(albert).
male(edward).
female(alice).
female(victoria).
parents(edward,victoria,albert).
parents(alice,victoria,albert).

Marin Programare logică


Exemplu
Familie regală

Predicate folosite:
male(X ): "X este bărbat."
female(Y ): "Y este femeie."
parents(X,Y,Z): "părinţii lui X sunt Y şi Z ."
Baza de cunoştinţe:
male(albert).
male(edward).
female(alice).
female(victoria).
parents(edward,victoria,albert).
parents(alice,victoria,albert).
Cum poate fi definit predicatul
sister(X , Y ): "X este sora lui Y ."?

Marin Programare logică


Exemplu (continuare)
Familie regală

Specificarea predicatului sister/2:


sister(X,Y) :-
female(X),
parents(X, M, F),
parents(Y, M, F).
Exemple de întrebări
?- sister(alice, edward).
?- sister(alice, X).
?- sister(X, edward).

Marin Programare logică


Întrebări despre surori

Regulă:
sister(X,Y) :- female(X),
parents(X,M,F),
parents(Y,M,F).
Întrebare:

sister(alice,edward).

Marin Programare logică


Întrebări despre surori

Regulă:
sister(X,Y) :- female(X),
parents(X,M,F),
parents(Y,M,F).
Întrebare:

sister(alice,edward).
Întrebarea (obiectivul) se potriveşte cu capul regulei, dacă
se instanţiază X cu alice şi Y cu edward.

Marin Programare logică


Întrebări despre surori

Regulă:
sister(X,Y) :- female(X),
parents(X,M,F),
parents(Y,M,F).
Întrebare:

sister(alice,edward).
Întrebarea (obiectivul) se potriveşte cu capul regulei, dacă
se instanţiază X cu alice şi Y cu edward.
Instanţa corpului devine noua întrebare (obiectiv):
female(alice),
parents(alice,M,F),
parents(edward,M,F).

Marin Programare logică


Este Alice sora lui Edward?

sister(alice,edward)

(1) male(albert).
(2) male(edward).
(3) female(alice).
(4) female(victoria).
(5) parents(edward,
victoria,
albert).
(6) parents(alice,
victoria,
albert).
(7) sister(X,Y):-
female(X),
parents(X,M,F),
parents(Y,M,F).

Marin Programare logică


Este Alice sora lui Edward?

sister(alice,edward)

(1) male(albert).
(2) male(edward).
(3) female(alice).
(4) female(victoria).
(5) parents(edward,
victoria,
albert).
(6) parents(alice,
victoria,
albert).
(7) sister(X,Y):-
female(X),
parents(X,M,F),
parents(Y,M,F).

Marin Programare logică


Este Alice sora lui Edward?

sister(alice,edward)

(1) male(albert).
(2) male(edward).
(3) female(alice).
(4) female(victoria).
(5) parents(edward,
victoria,
albert).
(6) parents(alice,
victoria,
albert).
(7) sister(X,Y):-
female(X),
parents(X,M,F),
parents(Y,M,F).

Marin Programare logică


Este Alice sora lui Edward?

sister(alice,edward)

(1) male(albert).
(2) male(edward).
(3) female(alice).
(4) female(victoria).
(5) parents(edward,
victoria,
albert).
(6) parents(alice,
victoria,
albert).
(7) sister(X0,Y0):-
female(X0),
parents(X0,M0,F0),
parents(Y0,M0,F0).

Marin Programare logică


Este Alice sora lui Edward?

sister(alice,edward)
X0=alice,
(1) male(albert). Y0=edward
(2) male(edward).
(3) female(alice).
(4) female(victoria).
(5) parents(edward,
victoria,
albert).
(6) parents(alice,
victoria,
albert).
(7) sister(X0,Y0):-
female(X0),
parents(X0,M0,F0),
parents(Y0,M0,F0).

Marin Programare logică


Este Alice sora lui Edward?

7 sister(alice,edward)
X0=alice,
(1) male(albert). Y0=edward
(2) male(edward).
(3) female(alice). female(alice),
(4) female(victoria). parents(alice,M0,F0),
(5) parents(edward, parents(edward,M0,F0).
victoria,
albert).
(6) parents(alice,
victoria,
albert).
(7) sister(X0,Y0):-
female(X0),
parents(X0,M0,F0),
parents(Y0,M0,F0).

Marin Programare logică


Este Alice sora lui Edward?

7 sister(alice,edward)
X0=alice,
(1) male(albert). Y0=edward
(2) male(edward).
(3) female(alice). female(alice),
(4) female(victoria). parents(alice,M0,F0),
(5) parents(edward, parents(edward,M0,F0).
victoria,
albert).
(6) parents(alice,
victoria,
albert).
(7) sister(X,Y):-
female(X),
parents(X,M,F),
parents(Y,M,F).

Marin Programare logică


Este Alice sora lui Edward?

7 sister(alice,edward)
X0=alice,
(1) male(albert). Y0=edward
(2) male(edward).
(3) female(alice). female(alice),
(4) female(victoria). parents(alice,M0,F0),
(5) parents(edward, parents(edward,M0,F0).
victoria,
albert).
(6) parents(alice,
victoria,
albert).
(7) sister(X,Y):-
female(X),
parents(X,M,F),
parents(Y,M,F).

Marin Programare logică


Este Alice sora lui Edward?

7 sister(alice,edward)
X0=alice,
(1) male(albert). Y0=edward
(2) male(edward).
(3) female(alice). female(alice),
(4) female(victoria). parents(alice,M0,F0),
(5) parents(edward, parents(edward,M0,F0).
victoria,
albert).
(6) parents(alice,
victoria,
albert).
(7) sister(X,Y):-
female(X),
parents(X,M,F),
parents(Y,M,F).

Marin Programare logică


Este Alice sora lui Edward?

7 sister(alice,edward)
X0=alice,
(1) male(albert). Y0=edward
(2) male(edward).
(3) female(alice). 3 female(alice),
(4) female(victoria). parents(alice,M0,F0),
(5) parents(edward, parents(edward,M0,F0).
victoria,
albert).
(6) parents(alice, parents(alice,M0,F0),
victoria, parents(edward,M0,F0).
albert).
(7) sister(X,Y):-
female(X),
parents(X,M,F),
parents(Y,M,F).

Marin Programare logică


Este Alice sora lui Edward?

7 sister(alice,edward)
X0=alice,
(1) male(albert). Y0=edward
(2) male(edward).
(3) female(alice). 3 female(alice),
(4) female(victoria). parents(alice,M0,F0),
(5) parents(edward, parents(edward,M0,F0).
victoria,
albert).
(6) parents(alice, parents(alice,M0,F0),
victoria, parents(edward,M0,F0).
albert).
(7) sister(X,Y):-
female(X),
parents(X,M,F),
parents(Y,M,F).

Marin Programare logică


Este Alice sora lui Edward?

7 sister(alice,edward)
X0=alice,
(1) male(albert). Y0=edward
(2) male(edward).
(3) female(alice). 3 female(alice),
(4) female(victoria). parents(alice,M0,F0),
(5) parents(edward, parents(edward,M0,F0).
victoria,
albert).
(6) parents(alice, parents(alice,M0,F0),
victoria, parents(edward,M0,F0).
albert).
(7) sister(X,Y):-
female(X),
parents(X,M,F),
parents(Y,M,F).

Marin Programare logică


Este Alice sora lui Edward?

7 sister(alice,edward)
X0=alice,
(1) male(albert). Y0=edward
(2) male(edward).
(3) female(alice). 3 female(alice),
(4) female(victoria). parents(alice,M0,F0),
(5) parents(edward, parents(edward,M0,F0).
victoria,
albert).
(6) parents(alice, parents(alice,M0,F0),
victoria, parents(edward,M0,F0).
albert). M0=victoria,
(7) sister(X,Y):- F0=albert
female(X),
parents(X,M,F),
parents(Y,M,F).

Marin Programare logică


Este Alice sora lui Edward?

7 sister(alice,edward)
X0=alice,
(1) male(albert). Y0=edward
(2) male(edward).
(3) female(alice). 3 female(alice),
(4) female(victoria). parents(alice,M0,F0),
(5) parents(edward, parents(edward,M0,F0).
victoria,
albert).
(6) parents(alice, 6 parents(alice,M0,F0),
victoria, parents(edward,M0,F0).
albert). M0=victoria,
(7) sister(X,Y):- F0=albert
female(X),
parents(X,M,F), parents(edward,victoria,albert).
parents(Y,M,F).

Marin Programare logică


Este Alice sora lui Edward?

7 sister(alice,edward)
X0=alice,
(1) male(albert). Y0=edward
(2) male(edward).
(3) female(alice). 3 female(alice),
(4) female(victoria). parents(alice,M0,F0),
(5) parents(edward, parents(edward,M0,F0).
victoria,
albert).
(6) parents(alice, 6 parents(alice,M0,F0),
victoria, parents(edward,M0,F0).
albert). M0=victoria,
(7) sister(X,Y):- F0=albert
female(X),
parents(X,M,F), parents(edward,victoria,albert).
parents(Y,M,F).

Marin Programare logică


Este Alice sora lui Edward?

7 sister(alice,edward)
X0=alice,
(1) male(albert). Y0=edward
(2) male(edward).
(3) female(alice). 3 female(alice),
(4) female(victoria). parents(alice,M0,F0),
(5) parents(edward, parents(edward,M0,F0).
victoria,
albert).
(6) parents(alice, 6 parents(alice,M0,F0),
victoria, parents(edward,M0,F0).
albert). M0=victoria,
(7) sister(X,Y):- F0=albert
female(X),
parents(X,M,F), 5 parents(edward,victoria,albert).
parents(Y,M,F).

Marin Programare logică


Este Alice sora lui Edward?

7 sister(alice,edward)
X0=alice,
(1) male(albert). Y0=edward
(2) male(edward).
(3) female(alice). 3 female(alice),
(4) female(victoria). parents(alice,M0,F0),
(5) parents(edward, parents(edward,M0,F0).
victoria,
albert).
(6) parents(alice, 6 parents(alice,M0,F0),
victoria, parents(edward,M0,F0).
albert). M0=victoria,
(7) sister(X,Y):- F0=albert
female(X),
parents(X,M,F), 5 parents(edward,victoria,albert).
parents(Y,M,F).

Marin Programare logică


Sora cui este Alice?

sister(alice,X)

(1) male(albert).
(2) male(edward).
(3) female(alice).
(4) female(victoria).
(5) parents(edward,
victoria,
albert).
(6) parents(alice,
victoria,
albert).
(7) sister(X,Y):-
female(X),
parents(X,M,F),
parents(Y,M,F).

Marin Programare logică


Sora cui este Alice?

sister(alice,X)

(1) male(albert).
(2) male(edward).
(3) female(alice).
(4) female(victoria).
(5) parents(edward,
victoria,
albert).
(6) parents(alice,
victoria,
albert).
(7) sister(X,Y):-
female(X),
parents(X,M,F),
parents(Y,M,F).

Marin Programare logică


Sora cui este Alice?

sister(alice,X)

(1) male(albert).
(2) male(edward).
(3) female(alice).
(4) female(victoria).
(5) parents(edward,
victoria,
albert).
(6) parents(alice,
victoria,
albert).
(7) sister(X,Y):-
female(X),
parents(X,M,F),
parents(Y,M,F).

Marin Programare logică


Sora cui este Alice?

sister(alice,X)

(1) male(albert).
(2) male(edward).
(3) female(alice).
(4) female(victoria).
(5) parents(edward,
victoria,
albert).
(6) parents(alice,
victoria,
albert).
(7) sister(X0,Y0):-
female(X0),
parents(X0,M0,F0),
parents(Y0,M0,F0).

Marin Programare logică


Sora cui este Alice?

sister(alice,X)
X0=alice,
Y0=X
(1) male(albert).
(2) male(edward).
(3) female(alice).
(4) female(victoria).
(5) parents(edward,
victoria,
albert).
(6) parents(alice,
victoria,
albert).
(7) sister(X0,Y0):-
female(X0),
parents(X0,M0,F0),
parents(Y0,M0,F0).

Marin Programare logică


Sora cui este Alice?

7 sister(alice,X)
X0=alice,
Y0=X
(1) male(albert).
(2) male(edward). female(alice),
(3) female(alice). parents(alice,M0,F0),
(4) female(victoria). parents(X,M0,F0).
(5) parents(edward,
victoria,
albert).
(6) parents(alice,
victoria,
albert).
(7) sister(X0,Y0):-
female(X0),
parents(X0,M0,F0),
parents(Y0,M0,F0).

Marin Programare logică


Sora cui este Alice?

7 sister(alice,X)
X0=alice,
Y0=X
(1) male(albert).
(2) male(edward). female(alice),
(3) female(alice). parents(alice,M0,F0),
(4) female(victoria). parents(X,M0,F0).
(5) parents(edward,
victoria,
albert).
(6) parents(alice,
victoria,
albert).
(7) sister(X,Y):-
female(X),
parents(X,M,F),
parents(Y,M,F).

Marin Programare logică


Sora cui este Alice?

7 sister(alice,X)
X0=alice,
Y0=X
(1) male(albert).
(2) male(edward). female(alice),
(3) female(alice). parents(alice,M0,F0),
(4) female(victoria). parents(X,M0,F0).
(5) parents(edward,
victoria,
albert).
(6) parents(alice,
victoria,
albert).
(7) sister(X,Y):-
female(X),
parents(X,M,F),
parents(Y,M,F).

Marin Programare logică


Sora cui este Alice?

7 sister(alice,X)
X0=alice,
Y0=X
(1) male(albert).
(2) male(edward). female(alice),
(3) female(alice). parents(alice,M0,F0),
(4) female(victoria). parents(X,M0,F0).
(5) parents(edward,
victoria,
albert).
(6) parents(alice,
victoria,
albert).
(7) sister(X,Y):-
female(X),
parents(X,M,F),
parents(Y,M,F).

Marin Programare logică


Sora cui este Alice?

7 sister(alice,X)
X0=alice,
Y0=X
(1) male(albert).
(2) male(edward). 3 female(alice),
(3) female(alice). parents(alice,M0,F0),
(4) female(victoria). parents(X,M0,F0).
(5) parents(edward,
victoria,
albert). parents(alice,M0,F0),
(6) parents(alice, parents(X,M0,F0).
victoria,
albert).
(7) sister(X,Y):-
female(X),
parents(X,M,F),
parents(Y,M,F).

Marin Programare logică


Sora cui este Alice?

7 sister(alice,X)
X0=alice,
Y0=X
(1) male(albert).
(2) male(edward). 3 female(alice),
(3) female(alice). parents(alice,M0,F0),
(4) female(victoria). parents(X,M0,F0).
(5) parents(edward,
victoria,
albert). parents(alice,M0,F0),
(6) parents(alice, parents(X,M0,F0).
victoria,
albert).
(7) sister(X,Y):-
female(X),
parents(X,M,F),
parents(Y,M,F).

Marin Programare logică


Sora cui este Alice?

7 sister(alice,X)
X0=alice,
Y0=X
(1) male(albert).
(2) male(edward). 3 female(alice),
(3) female(alice). parents(alice,M0,F0),
(4) female(victoria). parents(X,M0,F0).
(5) parents(edward,
victoria,
albert). parents(alice,M0,F0),
(6) parents(alice, parents(X,M0,F0).
victoria,
albert).
(7) sister(X,Y):-
female(X),
parents(X,M,F),
parents(Y,M,F).

Marin Programare logică


Sora cui este Alice?

7 sister(alice,X)
X0=alice,
Y0=X
(1) male(albert).
(2) male(edward). 3 female(alice),
(3) female(alice). parents(alice,M0,F0),
(4) female(victoria). parents(X,M0,F0).
(5) parents(edward,
victoria,
albert). parents(alice,M0,F0),
(6) parents(alice, parents(X,M0,F0).
victoria,
albert). M0=victoria
F0=albert
(7) sister(X,Y):-
female(X),
parents(X,M,F),
parents(Y,M,F).

Marin Programare logică


Sora cui este Alice?

7 sister(alice,X)
X0=alice,
Y0=X
(1) male(albert).
(2) male(edward). 3 female(alice),
(3) female(alice). parents(alice,M0,F0),
(4) female(victoria). parents(X,M0,F0).
(5) parents(edward,
victoria,
albert). 6 parents(alice,M0,F0),
(6) parents(alice, parents(X,M0,F0).
victoria,
albert). M0=victoria
F0=albert
(7) sister(X,Y):-
female(X), parents(X,victoria,albert).
parents(X,M,F),
parents(Y,M,F).

Marin Programare logică


Sora cui este Alice?

7 sister(alice,X)
X0=alice,
Y0=X
(1) male(albert).
(2) male(edward). 3 female(alice),
(3) female(alice). parents(alice,M0,F0),
(4) female(victoria). parents(X,M0,F0).
(5) parents(edward,
victoria,
albert). 6 parents(alice,M0,F0),
(6) parents(alice, parents(X,M0,F0).
victoria,
albert). M0=victoria
F0=albert
(7) sister(X,Y):-
female(X), parents(X,victoria,albert).
parents(X,M,F),
parents(Y,M,F).

Marin Programare logică


Sora cui este Alice?

7 sister(alice,X)
X0=alice,
Y0=X
(1) male(albert).
(2) male(edward). 3 female(alice),
(3) female(alice). parents(alice,M0,F0),
(4) female(victoria). parents(X,M0,F0).
(5) parents(edward,
victoria,
albert). 6 parents(alice,M0,F0),
(6) parents(alice, parents(X,M0,F0).
victoria,
albert). M0=victoria
F0=albert
(7) sister(X,Y):-
female(X), 5 parents(X,victoria,albert).
parents(X,M,F),
X=edward
parents(Y,M,F).

Marin Programare logică


Sora cui este Alice?

7 sister(alice,X)
X0=alice,
Y0=X
(1) male(albert).
(2) male(edward). 3 female(alice),
(3) female(alice). parents(alice,M0,F0),
(4) female(victoria). parents(X,M0,F0).
(5) parents(edward,
victoria,
albert). 6 parents(alice,M0,F0),
(6) parents(alice, parents(X,M0,F0).
victoria,
albert). M0=victoria
F0=albert
(7) sister(X,Y):-
female(X), 5 parents(X,victoria,albert).
parents(X,M,F),
X=edward
parents(Y,M,F).


Răspuns: X = edward.

Marin Programare logică


Exerciţiu: hoţi

Predicate folosite:
thief(X ): "X este hoţ."
likes(X , Y ): "Lui X îi place Y ."
may_steal(X , Y ): "X ar putea fura Y ."
Ştim că:
1 X ar putea fura Y dacă X este hoţ şi lui X îi place Y .
2 John e hoţ.
3 Lui Mary îi place mâncarea.
4 Lui Mary îi place vinul.
5 Lui John îi place X dacă lui X îi place vinul.
Întrebare: Ce ar putea fura John?

Marin Programare logică


Exerciţiu: hoţi (continuare)
Programarea problemei în P ROLOG

Baza de cunoştinţe:
thief(john).
likes(mary, food).
likes(mary, wine).
likes(john, X ) :- likes(X , wine).
may_steal (X , Y ):-
thief(X ), likes(X , Y ).
Întrebare:
?- may_steal(john,X).

Marin Programare logică


Concluzie

În acest curs au fost prezentate principalele noţiuni de


programare logică
fapte, conjuncţii de fapte, variabile logice
reguli
exemple care ilustrează
Cum se programează în P ROLOG
Cum răspunde P ROLOG la întrebările puse de utilizator.

Marin Programare logică


Bibliografie, exerciţii

Cursul presupune familiarizarea cu programarea în SWI


P ROLOG.
Toate detaliile despre SWIProlog pot fi găsite la
http://www.swi-prolog.org.
Instalaţi SWI-Prolog şi încercaţi exemplele prezentate.
Bibliografie: Capitolul 1 + secţiunea de exerciţii din
[Clocksin and Mellish, 2003].

Marin Programare logică

S-ar putea să vă placă și