Documente Academic
Documente Profesional
Documente Cultură
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 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
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
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.
p(X)
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
?- urmă, scop.
Machine Translated by Google
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
[1,2,3,4]
dimensiune([],0).
dimensiune([H|T],N+1) :- dimensiune(T,N).
a- mărime ([1,2,3,4],N).
Machine Translated by Google
membru (X,[X|_]).
membru(X,[_|T]) :- membru(X,T).
?- membru (2,[1,2,3,4]).
Inversați o listă:
a- rev([1,2,3,4],R).
Machine Translated by Google
?- bsort([1,5,4,2],S).
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
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
Exemple de probleme