Mecanismul tăierii și retragerii prologului

Abilitatea de a emite mai multe soluții

O caracteristică distinctivă a ProLog este că atunci când căutați soluții pe PROLOG, este dată o listă completă de valori adecvate. Prin urmare, în ProLog, un predicat poate fi reprezentat de un întreg set de reguli, fiecare dintre acestea putând da un răspuns. Un exemplu. Să prezentăm următoarea descriere a predicatului "number_more":







Apoi solverul ProLog

Va da răspunsuri: Mai mult = 5, 8.

Cu alte cuvinte, conform regulilor din predicat "number_more" decât numărul 4 există două numere 5 și 8. Se observă că setul de reguli funcționează ca o structură de ramură a cazului în limbi algoritmice. Predicțiile care pot produce mai multe valori se numesc nedefinite (nedeterminate). Predica că produce o singură valoare se numește determ. În plus față de predicatele nedeterminate din ProLog, mecanismul de incertitudine este încă folosit. Un exemplu.

Apoi solverul ProLog

Răspunsul este: Ce = apartament, copii

Rollback (Backtracking)

Acum introducem conceptul de rollback (Backtracking). Rollback este o încercare a ProLog pentru a găsi următoarea soluție la problemă. Renunțarea este cauzată de o eșec la un moment dat al programului, ceea ce îl face pe PROLOG să încerce să găsească următoarea soluție. Revocarea merge până la punctul în care este posibilă calcularea unei alte soluții. În acest caz, toate variabilele asociate care sunt conectate sub punctul în care este posibilă o altă soluție sunt eliberate. Când apelați soluția ProLog, procesul de revocare este creat de PROLOG însuși pentru a returna toate valorile de decizie. Un exemplu.

Clipping (Cut)

Acum introducem conceptul de tăiere. O trunchiere în ProLog este un mecanism care interzice căutarea regulilor acestui predicat sub regula actuală și interzice mecanismul de returnare. Trunchierea este indicată de semnul "!". Un exemplu. Dacă rescriem predicatul anterior "number_ball" ca:

Apoi solverul ProLog

Va returna răspunsul: Mai mult = 5.

Acest lucru se datorează faptului că, în fiecare regulă a predicatului, după verificarea pentru mai mult, operatorul de tip "!" Vine înăuntru, ceea ce împiedică lansarea ulterioară a PROLOG-ului și căutarea altor opțiuni de răspuns.

Un exemplu de utilizare a mecanismului de revenire și de tăiere.

Mecanismul de revenire și de tăiere poate fi văzut în exemplul următor. Să presupunem că avem o listă de valori în care să găsim o anumită valoare și să dăm valoarea înaintea ei. Deoarece ProLog este o limbă logică, sarcina este rezolvată prin crearea unui set de reguli:







La sortarea listei, dacă elementul curent nu este valoarea dorită, atunci facem o forță bruta mai departe.

Când sortați lista, dacă elementul curent este valoarea dorită, opriți căutarea și reveniți la elementul anterior.

Dacă regulile anterioare nu au funcționat, reveniți la elementul curent ca valoare anterioară.

Descrierea din predicatul limbajului PROLOG care execută aceste reguli va fi:

Știind că în prologul, puteți utiliza ordinea regulilor ca o modalitate de a eluda regulile secvenței de selecție și de a cunoaște mecanismul de acțiune al tăieturi, este posibil să se rearanja regulile 1 și 2 locuri și debifa pentru o nepotrivire. Atunci obținem următoarea descriere a predicatului:

Descrierea rezultată constă în trei reguli și efectuează următoarele acțiuni. Prima regulă compară elementul curent cu valoarea dorită, iar dacă acestea sunt egale, atunci există un) predicat de tăiere reguli în aval de la participarea la căutare, b) cauzată de eșec, care duce la o oprire recursivitatii. A doua regulă enumeră toate elementele listei, numindu-se ea însăși, adică se numește recursiune. În acest caz, de regulă, la recursivitate apel nu trunchiere, iar dacă recurență de apel va eșua, apoi trece de control pentru a exclude predicatul dispuse mai jos. Dacă apelul de recurs este reușit, atunci se apela tăierea ("!") Și apoi se apelează ieșirea din predicat. A treia regulă emite un element curent ca valoarea anterioară, care se confruntă cu valoarea dorită, provoacă ieșirea decupajul și predicatul. Acțiunea predicatului este ilustrată printr-un exemplu. Să dăm soluția ProLog:

PROLOG face primul apel predicat:

  • Regula 1 nu funcționează: 3 nu este egală cu 1. Mergeți la a doua regulă:
  • Regula 2 cauzează recursiunea pentru a găsi valoarea predeterminată (3, [2,4,3,5,2], Anterior):
  • Regula 1 nu funcționează: 3 nu este egal cu 2. Mergeți la a doua regulă:
  • Regula 2 determină recursul pentru a găsi valoarea predeterminată (3, [4,3,5,2], Anterioară):
  • Regula 1 nu funcționează: 3 nu este egală cu 4. Mergeți la a doua regulă:
  • Regula 2 solicită recursiunea: find_pr_value (3, [3,5,2], Anterior):
  • Prima regulă va funcționa: 3 = 3. și este executat: tăierea regulilor predicate este mai mică și eșecul. Care duce la o ieșire din recurs cu rezultatul eșecului.
  • Continuarea regulii 2. Nerespectarea apelului recursiv cu lista [3,5,2] duce la eșecul celei de-a doua reguli la acest nivel. ProLog trece la a treia regulă.
  • Regula 3. Aici lista = [4,3,5,2]. Există acțiuni: Anterior este unificat cu 4, ieșire cu tăiere de alte soluții posibile.
  • Continuarea regulii 2. Recursia returnează o valoare de succes Înapoi = 4. Există o ieșire cu tăierea altor soluții posibile.
  • Continuarea regulii 2. Recursia returnează o valoare de succes Înapoi = 4. Există o ieșire cu tăierea altor soluții posibile.
  • Continuarea regulii 2. Recursia returnează o valoare de succes Înapoi = 4. Există o ieșire cu tăierea altor soluții posibile.

Răspundeți ProLog Înapoi = 4.

Acum, să vedem ce se întâmplă dacă eliminăm tăierea din a doua regulă:

ProLog va produce deja mai multe rezultate:

Acest lucru devine posibil, deoarece mecanismul de revenire ProLog este activat și în a doua regulă este posibil să se dea un răspuns la fiecare etapă a recursiunii.







Articole similare

Trimiteți-le prietenilor: