Cum să nu distrugi un proiect Prolog: 4 greșeli fatale
Cele patru greșeli fatale în programarea cu Prolog
Prologul atrage mulți dezvoltatori prin abordarea sa diferită de la majoritatea limbajelor. În loc să scrii pași, scrii reguli. Această idee pare simplă la început, dar puține greșeli pot distruge rapid un program. Iată patru probleme frecvente care apar în codul Prolog.
Soluții pierdute din cauza cut-ului
Când folosești operatorul cut (!), forțezi Prologul să nu mai caute alte soluții. Pare o optimizare utilă, dar devine periculos când codul tău trebuie să răspundă la interogări generale.
% Greșeală: cut-ul limitează rezultatele
factorial(0, 1) :- !.
factorial(N, F) :-
N > 0,
N1 is N - 1,
factorial(N1, F1),
F is N * F1.
Dacă ceri toate valorile posibile pentru N și F, primești doar prima soluție. Restul dispar. Soluția este să folosești constrângeri precum dif/2 sau predicate meta, care păstrează flexibilitatea codului.
Modificarea bazei de date la runtime
Mulți începători descoperă assertz/1 și retract/1. Aceste predicate permit modificarea programului în timpul execuției. Dar când state-ul se schimbă în fundal, codul devine greu de înțeles și de testat.
Problema apare când ordinele de execuție diferit. Rezultatele depind de lucruri invizibile. Cel mai bun lucru este să treci starea explicit prin argumente, în loc să o modifici global.
Logica amestecată cu afișarea
Un alt obicei prost este să amesteci calculul cu afișarea rezultatelor. Când un predicat face ambele lucruri, nu poți testa logică pură. Datele nu mai sunt accesibile ca termeni Prolog.
% Greșeală: afișarea în interiorul logicii
solve_and_print :-
solution(S),
format("The solution is: ~q~n", [S]).
În schimb, separă preocupările. Scrie un predicat care găsește soluțiile. Apoi lasă nivelul superior să se ocupe de afișare. În acest mod, codul devine mai testabil și mai reutilizabil.
Folosirea constructelor vechi
Prologul a evoluat în ultimii ani. Mulți dezvoltatori încă folosesc is/2 sau >/>2 pentru calcule. Aceste predicate cer ca argumentele să fie deja calculate. Nu mai respectă spiritul declarativ al lui Prolog.
Dezavantajul este că codul devine greu de înțeles. Modernizarea la CLP(FD) face codul mai clar și mai general.