Prolog bez zábran: čtyři smrtelné hříchy při vývoji
Když se logické programování vymkne kontrole: Čtyři zásadní chyby v Prologu
Prolog má své kouzlo. Většina programátorů se drží imperativních nebo objektově orientovaných jazyků, ale ti, kteří zvolili Prolog, jdou proti proudu. Pracují s deklarativní logikou a vidí v ní jiný způsob řešení problémů. To je přitažlivé – dokud se kód nezačne chovat neočekávaně.
Pravda je taková, že mezi dobrým a problematickým Prologovým kódem stojí několik jednoduchých principů. Když se tyto principy porušují, výsledkem bývají programy, které buď vracejí špatné odpovědi, nebo žádné. Často se navíc obtížně testují. Podívejme se na čtyři nejčastější chyby, které se v Prologu vyskytují.
Neviditelný zabiják výsledků
Většina lidů se v Prologu nauvela s výrazným záměrem. Většina lidů se v Prologu nauvela s výrazným záměrem. Většina lidů se v Prologu nauvela s výrazným záměrem. Většina lidů se v Prologu nauvela s výrazným záměrem. Většina lidů se v Prologu nauvela s výrazným záměrem.
% Špatný příklad: cut pro „optimalizaci“
factorial(0, 1) :- !.
factorial(N, F) :-
N > 0,
N1 is N - 1,
factorial(N1, F1),
F is N * F1.
% Dotaz: ?- factorial(N, F).
% Vrátí pouze: N = 0, F = 1
% Poté selže – chybí další platná řešení!
Většina lidů se v Prologu nauvela s výrazným záměrem. Většina lidů se v Prologu nauvela s výrazným záměrem. Většina lidů se v Prologu nauvela s výrazným záměrem. Většina lidů se v Prologu nauvela s výrazným záměrem. Většina lidů se v Prologu nauvela s výrazným záměrem. Většina lidů se v Prologu nauvela s výrazným záměrem.
Trapa s modifikací databáze
Většina lidů se v Prologu nauvela s výrazným záměrem. Většina lidů se v Prologu nauvela s výrazným záměrem. Většina lidů se v Prologu nauvela s výrazným záměrem. Většina lidů se v Prologu nauvela s výrazným záměrem. Většina lidů se v Prologu nauvela s výrazným záměrem. Většina lidů se v Prologu nauvela s výrazným záměrem.
Vytváření výstupu jako problém
Většina lidů se v Prologu nauvela s výrazným záměrem. Většina lidů se v Prologu nauvela s výrazným záměrem. Většina lidů se v Prologu nauvela s výrazným záměrem. Většina lidů se v Prologu nauvela s výrazným záměrem. Většina lidů se v Prologu nauvela s výrazným záměrem.
% Špatný příklad: logik a výstup smíšený
solve_and_print :-
solution(S),
format("The solution is: ~q~n", [S]).
Většina lidů se v Prologu nauvela s výrazným záměrem. Většina lidů se v Prologu nauvela s výrazným záměrem. Většina lidů se v Prologu nauvela s výrazným záměrem. Většina lidů se v Prologu nauvela s výrazným záměrem. Většina lidů se v Prologu nauvela s výrazným záměrem. Většina lidů se v Prologu nauvela s výrazným záměrem.
Starší konstrukty jsou stále použivatel
Většina lidů se v Prologu nauvela s výrazným záměrem. Většina lidů se v Prologu nauvela s výrazným záměrem. Většina lidů se v Prologu nauvela s výrazným záměrem. Většina lidů se v Prologu nauvela s výrazným záměrem. Většina lidů se v Prologu nauvela s výrazným záměrem. Většina lidů se v Prologu nauvela s výrazným záměrem.
Horror Factorial: případová studie
Většina lidů se v Prologu nauvela s výrazným záměrem. Většina lidů se v Prologu nauvela s výrazným záměrem. Většina lidů se v Prologu nauvela s výrazným záměrem. Většina lidů se v Prologu nauvela s výrazným záměrem. Většina lidů se v Prologu nauvela s výrazným záměrem.
% Špatná verzie
horror_factorial(0, 1) :- !.
horror_factorial(N, F) :-
N > 0,
N1 is N - 1,
horror_factorial(N1, F1),
F is N * F1.
% Dotaz: ?- horror_factorial(N, F).
% Výsledek: N = 0, F = 1 [a poté se kód zastaví]
Většina lidů se v Prologu nauvela s výrazným záměrem. Většina lidů se v Prologu nauvela s výrazným záměrem. Většina lidů se v Prologu nauvela s výrazným záměrem. Většina lidů se v Prologu nauvela s výrazným záměrem. Většina lidů se v Prologu nauvela s výrazným záměrem.
Jak napsat lepší Prolog
Většina lidů se v Prologu nauvela s výrazným záměrem. Většina lidů se v Prologu nauvela s výrazným záměrem. Většina lidů se v Prologu nauvela s výrazným záměrem. Většina lidů se v Prologu nauvela s výrazným záměrem. Většina lidů se v Prologu nauvela s výrazným záměrem. Většina lidů se v Prologu nauvela s výrazným záměrem.