Documente Academic
Documente Profesional
Documente Cultură
Programare Logica Curs 1 Introducere PDF
Programare Logica Curs 1 Introducere PDF
Curs 1: Introducere
Mircea Marin
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.
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.)
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):
S1 ∧ . . . ∧ Sn → S
S:-S1 , . . . , Sn .
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.
?- are(andrei, carte).
(Are Andrei o carte?)
?- are(andrei, carte).
(Are Andrei o carte?)
P ROLOG caută în baza de cunoştinţe fapte care se
potrivesc (se unifică) cu întrebarea.
?- 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
?- 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
?- 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.
?- 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.
?- 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ă.
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).
Bază de cunoştinţe:
place(maria, mancare).
place(maria, vin).
place(ion, vin).
place(ion, maria).
Întrebare:
?- place(maria, X), place(ion, X).
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?
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.
place(maria, mancare).
place(maria, vin).
place(ion, vin).
place(ion, maria).
X= mancare
place(maria, mancare).
place(maria, vin).
place(ion, vin).
place(ion, maria).
X
X= mancare
place(maria, mancare).
place(maria, vin).
place(ion, vin).
place(ion, maria).
X
X= mancare
place(maria, mancare).
place(maria, vin).
place(ion, vin).
place(ion, maria).
X= mancare
X
place(maria, mancare).
place(maria, vin).
place(ion, vin).
place(ion, maria).
X= mancare
place(maria, mancare).
X
place(maria, vin).
place(ion, vin).
place(ion, maria).
place(maria, mancare).
X= vin
place(maria, vin).
place(ion, vin).
place(ion, maria).
place(maria, mancare).
X= vin
place(maria, vin).
place(ion, vin).
place(ion, maria).
X
place(maria, mancare).
X= vin
place(maria, vin).
place(ion, vin).
place(ion, maria).
ye
s
place(maria, mancare).
X= vin
place(maria, vin).
place(ion, vin).
place(ion, maria).
X = vin
place(maria, mancare).
X
X= vin
place(maria, vin).
place(ion, vin).
place(ion, maria).
X = vin
place(maria, mancare).
place(maria, vin).
X place(ion, vin).
place(ion, maria).
X = vin
place(maria, mancare).
place(maria, vin).
place(ion, vin).
X place(ion, maria).
X = vin
Exemplu
place(ion, X) :-
place(X,vin).
place(ion, X) :-
femeie(X), place(X, dans).
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 ."
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).
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 ."?
Regulă:
sister(X,Y) :- female(X),
parents(X,M,F),
parents(Y,M,F).
Întrebare:
sister(alice,edward).
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.
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).
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).
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).
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).
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).
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).
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).
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).
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).
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).
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).
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).
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).
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).
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).
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).
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).
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).
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).
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).
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).
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).
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).
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).
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).
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).
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).
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).
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).
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).
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).
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).
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).
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).
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.
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?
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).