Procedurální (klasické) programování Popisuje algoritmus – postup, jak vyřešit úlohu
Příklad programu v procedurálním programovacím jazyce (Pascal) Procedure kvadraticka_rovnice (a,b,c:Real); Begin D:=b*b-4*a*c if D<0 then writeln ('neni reseni'); if D=0 then writeln ('jedno reseni:', -b/(2*a)); if D>0 then begin D:=sqrt(D); R1:=(-b+D)/(2*a); R2:=(-b-D)/(2*a); writeln ('Dve reseni:', R1, R2); end;
Neprocedurální (logické) programování „Program“ je pouze popis situace, problému. Programátor nespecifikuje, jak problém řešit. To nechává na programu, respektive na překladači, či interpretu jazyka
Neprocedurální programovací jazyky LISP AUTOLISP Prolog (SWI-Prolog)
Příklad programu v Prologu Fakta pravidla
Fakta muz(tomas). muz petr). muz(jan). muz(jiri). muz(josef). muz(lukas). muz(bartolomej). zena(lucie). zena(zdislava). zena(petra). zena(hana). zena(johana). zena(anna).
Fakta rodic(tomas,josef). rodic(tomas,anna). rodic(lucie,josef). rodic(lucie,anna). rodic(petr,johana). rodic(petr,bartolomej). rodic(zdislava,johana). rodic(zdislava,bartolomej). rodic(jan,lukas). rodic(petra,lukas). rodic(jiri,tomas). rodic(jiri,petr). rodic(jiri,jan). rodic(hana,tomas). rodic(hana,petr). rodic(hana,jan).
Pravidla otec(X,Y) :- rodic(X,Y), muz(X). matka(X,Y) :- rodic(X,Y), zena(X). dite(X,Y) :- rodic(Y,X). sourozenec(X,Y) :- rodic(Z,X), rodic (Z,Y). bratr(X,Y) :- sourozenec(X,Y), muz(X). sestra(X,Y) :- sourozenec(X,Y), zena(X). manzel(X,Y) :- dite(Z,X), dite(Z,Y), muz(X). manzelka(X,Y) :- dite(Z,X), dite(Z,Y),zena(X).
Dotazy muz(tomas) muz(anna) otec(tomas,josef) otec(X,josef) dite(tomas,X) dite(X,_) otec(X,Y) sestra(X,Y) bratr(tomas,X)
Úkoly Napiše tato pravidla: dedecek(X,Y) babicka(X,Y) stryc(X,Y) teta(X,Y) synovec(X,Y) neter(X,Y) bratranec(X,Y) sestrenice(X,Y)
Predikát řez (!) Vždy splněn Není povolen návrat přes něj
Použití řezu Problém s opakovaným výskytem sourozenců (kteří mají dva společné rodiče) sourozenec(X,Y) :- rodic(Z,X),!,rodic(Z,Y).
Predikát fail Nikdy není splněn Použití: technika „konstruktivního selhání“ vypismuze:-muz(X),write(X),nl,fail.
Technika cut and fail Způsob tvorby negace Zařídím, aby člověk nebyl sám sobě sourozencem. ruzny(X,Y):-X=Y,!,fail. ruzny(X,Y):-true. sourozenec(X,Y) :- rodic(Z,X),!,rodic(Z,Y),ruzny(X,Y). Některé implementace Prologu (i SWi Prolog) obsahují přímo logickou spojku not, tvorbu negace není třeba takto opisovat.
Aritmetika soucet (A,B,C) :- C is A+B. soucin (A,B,C) :- C is A*B. sude_cislo(X) :- soucin(2,Y,X). (nefunguje, nevi se, co to je Y) cislo(X):-X=0. cislo(Y):-cislo(X),Y is X+1.
Albegrogram Zaměňte písmena za čísla, aby platilo: A * B * C = D + E + F = G + H + I =6 =4 =4 =4 Použijte čísla <=3.
Albegrogram řešení cis(0). cis(1). cis(2). cis(3). ohodnot(A,B,C,D,E,F,G,H,I) :- cis(A), cis(B), cis(C), cis(D), cis(E), cis(F), cis(G), cis(H), cis(I), 6 is A * B * C, 4 is A + D + G, 6 is D + E + F, 6 is G + H + I, 4 is C+F-I, 4 is B-E+H. ?- ohodnot(A,B,C,D,E,F,G,H,I).
Práce se seznamy Další příklady