Sunteți pe pagina 1din 17

Machine Translated by Google

Programare bazată pe reguli


Anul 3, semestrul 2

Clauze de corn
Sisteme deductive
Motor de inferență PROLOG
Tăieri și recursivitate PROLOG
Machine Translated by Google

Logica propozițională
Sintaxa logicii propoziționale: puteți demonstra o formulă bine formată : (p r) ca o consecință a
unui set de formule F: (p r) (r q) folosind proprietăți/reguli implicite (raționamentul deductiv):
F

Semantica logicii propoziționale: puteți demonstra că o formulă bine formată este ADEVĂRAT dacă un
set de F de formule este ADEVĂRAT: F . Acest lucru ar putea să nu fie echivalent cu F !

Dacă sistemul logic este sănătos , atunci putem spune că dacă F atunci F . Dacă sistemul logic
este complet , atunci putem spune că dacă F atunci F .
Machine Translated by Google

teoremele Gödel
Prima teoremă de completitudine: Dacă o formulă este validă din punct de vedere logic, atunci există o deducție finită (o demonstrație
formală) a formulei. Aceasta înseamnă că putem rezolva orice este în timp exponențial (problema SAT).

Demonstrarea faptului că puteți demonstra validitatea unei formule (verificați valoarea de adevăr a unei formule pentru un model - atribuirea
de valori pentru variabile - în tabelul de adevăr) în timp polinomial v-ar face cel mai faimos student al facultății noastre vreodată. Fiecare
problemă poate fi descrisă ca o formulă, verificarea răspunsului corect se poate face în timp polinomial (probleme P). Dacă acest răspuns
poate fi demonstrat și (dedus din datele disponibile) în timp polinomial, atunci P=NP (vezi cursul de inteligență artificială 2).

Prima teoremă de incompletitudine: Orice sistem formal consistent F în cadrul căruia poate fi efectuată o anumită cantitate de aritmetică
elementară este incomplet; adică, există afirmații ale limbajului lui F care nu pot fi nici dovedite, nici infirmate în F. Astfel, niciun sistem
deductiv (util) de lume deschisă nu este complet. Exemplu: „Această afirmație este falsă”.

Există o modalitate de a folosi logica de ordinul întâi pentru regulile de inferență pentru a construi un motor de deducție, formule bine formate
pentru a modela o bază de cunoștințe și pentru a obține totuși un sistem complet? Programarea logica necesita un sistem sunet si
complet, altfel sunt doar CLIPS.
Machine Translated by Google

Clauzele corn (I)


O formulă care utilizează cel mult un simbol nenegat (pozitiv): r ¬p Aproape
fiecare WFF poate fi scris ca o clauză Horn. r ¬p este o rescrie a lui p r Aproape, dar nu
toate: ((p q) (p q)) q

O clauză definită este o clauză Horn cu exact un simbol pozitiv.


Un obiectiv este o clauză Horn cu toate simbolurile negate.

Clauzele definite sunt reguli în PROLOG. (¬p1 ¬p2 ¬p3 ... ¬pn q)
Obiectivele sunt interogări în PROLOG. (¬p1 ¬p2 ¬p3 ... ¬pn )
Atomii (simbolurile) sunt fapte în PROLOG. (p)
Machine Translated by Google

Clauzele corn (II)


p1 p2 p3 ... pn q este echivalent cu ¬p1 ¬p2 ¬p3 ... ¬pn q care este un definit
clauză

Pentru a demonstra că o regulă este adevărată (poate fi aplicată), ¬p1 ¬p2 ¬p3 ... ¬pn q se citește astfel: Dacă
nici ¬p1, nici ¬p2, nici ¬p3, nici … nici ¬pn sunt adevărate, q trebuie să fie adevărată. Dacă cel puțin un ¬p este
adevărat, q nu poate fi dovedit adevărat (poate să nu fie adevărat).

Prin urmare, ¬p1 ¬p2 ¬p3 ... ¬pn este satisfăcută (regula poate fi aplicată) numai dacă niciuna dintre verificări nu
reușește, deci niciunul din p1 , p2 , p3 ,... pn nu poate fi găsit ( afirmat) ca fals.
Machine Translated by Google

Reguli de inferență asupra clauzelor Horn

OK, acum ce?

Două reguli de inferență sunt solide și complete asupra clauzelor Horn:


• Rezoluție:
A B, ¬B C
A C
• Modus ponens:
B A, B
A
Aceste două reguli de inferență sunt baza motorului de inferență PROLOG. Atâta timp cât A, B și C
sunt clauze Horn și interogarea poate fi dedusă prin aplicarea rezoluției unitare și a modus
ponens, acea deducere este validă din punct de vedere logic și sistemul este solid și complet.
Machine Translated by Google

deducere SLD
Rezoluția clauzelor SLD (Selective Linear Definite) este principala metodă de inferență din PROLOG, o adaptare a
rezoluției unitare specifică clauzelor Horn.

muritor(X) :- om(X).
uman (socrate).

?- muritor(Cine).
Cine=socrate
da

De ce?
Deoarece uman(X) muritor(X) este echivalent cu muritorul(X) ¬uman(X) . Dar știm și că uman (socrate). Daca X
este unificat cu socrate (și trebuie să fie pentru a deduce ceva din ambele afirmații), atunci știm că
muritor(socrate)¬uman(socrate) uman (socrate). Deoarece ¬human(socrates)human(socrates) este fals, aceasta înseamnă
că mortal(socrates) este adevărat.
Machine Translated by Google

Deducere backchain
Acesta este algoritmul real rulat de motorul de inferență PROLOG (echivalentul RETE pentru CLIPS). Acesta este un algoritm de înlănțuire înapoi,
spre deosebire de înlănțuirea înainte în CLIPS.

Rezolvați (q1 ,q2 ,q3 ,...,qn ) {


\\lista de interogări (obiective)

dacă n=0 returnează TRUE;


\\dacă nu mai rămâne nicio interogare de verificat opriți cu TRUE
altfel
pentru fiecare k în KB
\\pentru fiecare regulă din KB descrisă ca o clauză Horn definită
dacă (k=(q1 ,¬p1 , ¬p2 , ¬p3 ,...,¬pm ) ) și cu primul gol pe partea stângă și fiecare fapt (k=q1 )

(Rezolvare(p1 , p2 ,...,pm ,q2 ,q3 ,...,qn )) returnează


ADEVĂRAT; endfor; \\adăugați condițiile acelei reguli la lista de obiective care trebuie

returnează dovedite și apelați recursiv această funcție pentru toate obiectivele cu


excepția primului
FALSE;
}
Machine Translated by Google

p(X)

Motorul PROLOG la lucru 1 3

1. p(a). 2. ADEVĂRAT
q(X),r(X) u(x)
p(X) :- q(X), r(X). 3. p(X) :- u(X). 4. X=a
q(X) :- s(X).
4 10
5. r(a). 6. r(b). ADEVĂRAT
s(X),r(X)
X=d
7. s(a). 8. s(b). 7 9
8

9. s(c).
r(a) r(b) r(c)
10. u(d).
5
6 5,6
a-p(X).
ADEVĂRAT
FALS
X=a ADEVĂRAT

X=b
Machine Translated by Google

Să vedem că funcționează
strămoș(X,Y) :- copil_al(X,Y). strămoș(X,Z) :-
strămoș(Y,Z), copil_al(X,Y).

Sau

strămoș(X,Z) :- strămoș(Y,Z), copil_al(X,Y). strămoș(X,Y) :-


copil_al(X,Y).

Încercați ambele pentru a vedea cum ordinea influențează motorul de inferență.


Pentru a vedea toate recursiunile utilizați:

?- urmă, scop.
Machine Translated by Google

Motorul de inferență PROLOG


Dacă KB nu are reguli de inferență aplicabile pentru setul de obiective de intrare, algoritmul nu se va opri niciodată. De ce? Deoarece
deducția trebuie să fie solidă și nu poate afirma nicio cunoaștere, nu poate dovedi de fapt - presupunerea lumii deschise.
CU toate acestea: PROLOG de fapt nu face acest lucru, adoptă „negația ca eșec”, ceea ce înseamnă că se va opri cu FALS dacă nu mai
poate fi aplicată nicio inferență și scopul nu a fost dovedit - presupunerea lumii închise.

De asemenea, motorul de inferență PROLOG nu efectuează verificări de producere (nu verifică dacă o variabilă este
unificată cu un câmp/formula în care apare). De exemplu,

?- X=f(X)
ADEVĂRAT

X=f(**)

ceea ce este fals. Rezultatul ar trebui să fie fals, dar din moment ce inferențe pot fi încă aplicate și scopul nu a fost dovedit (astfel
„negația ca eșec” nu funcționează), pentru a evita bucle infinite, PROLOG marchează soluția ca **. Aceasta este problema principală
cu dovezi PROLOG și trebuie gestionat cu atenție: https://core.ac.uk/download/pdf/82595056.pdf
Machine Translated by Google

PROLOG tăieturi
p :- q1 ,…, qk , !, qk+1, …, qn .

?- A.

Încearcă să verifice A unificându-l cu p și testând q1 ,…, qk , !, qk+1, …, qn . Dacă q1 ,…, qk sunt satisfăcute
(până la !), unificarea este blocată la p. Nu se fac alte ramuri posibile în algoritmul backchain (nu se va întoarce la
recursiuni alternative). Verificările de după! sunt efectuate normal.

De exemplu, dacă înlocuim linia 2 din exemplul anterior cu p(X) :- q(X),!, r(X), atunci este furnizat doar primul răspuns
găsit în acea ramură. După ce unifică X cu un, ajunge ! și nu mai verifică alte alternative pentru unificare în q(X).

Se recomandă utilizarea cu grijă a tăieturii. Poate face motorul de inferență mult mai rapid, dar omite unele ramuri care
ar putea avea rezultatul așteptat.
Machine Translated by Google

Liste PROLOG (I)


Pentru a utiliza liste, adăugați elemente între paranteze:

[1,2,3,4]

Definiți sublistele între paranteze:

[(1,2),(3,4)] este o matrice cu două linii și două coloane

Lungimea unei liste:

dimensiune([],0).
dimensiune([H|T],N+1) :- dimensiune(T,N).

a- mărime ([1,2,3,4],N).
Machine Translated by Google

Liste PROLOG (II)


Lista de membru:

membru (X,[X|_]).
membru(X,[_|T]) :- membru(X,T).

?- membru (2,[1,2,3,4]).

Inversați o listă:

rev(Lista, inversat) :- rev(Lista, [], inversat). rev([], inversat, inversat).


rev([Cap|Coada], Odihnă, inversat) :-
rev(Coada, [Cap|Odihnă], inversat).

a- rev([1,2,3,4],R).
Machine Translated by Google

Liste PROLOG (III)


Sortarea unei liste cu (un fel de) sortare cu bule:

bsort(X,Y) :- perm(X,Y), sortat(Y). sortat([]). sortat([_X|


[]]). sortat([X|[Y|
Z]]) :- X @=< Y, sortat([Y|
Z]). permanent([],[]). perm([X|Y],[U|V]) :- șterge(U,[X|Y],Z),
perm(Z,V).
șterge(X,[X|Y],Y). șterge(X,[Y|Z],[Y|W]) :- șterge(X,Z,W).

?- bsort([1,5,4,2],S).

X @=< Y este adevărat numai dacă X<Y


Machine Translated by Google

negație PROLOG
nu(X=Y)

Cele de mai sus sunt adevărate numai dacă X=Y nu poate fi dovedit, nu dacă X=Y este în mod explicit fals.

Alternativă: X\+Y

Alternativă pentru diferența de valori unificate:

nu este egal(X, Y)

Amintiți-vă că PROLOG folosește „negație ca eșec”, acest lucru poate cauza probleme la verificarea negativelor!
Machine Translated by Google

Săptămâna viitoare

Obiective încorporate

Grafice

bune practici PROLOG

Exemple de probleme

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