Prezentace se nahrává, počkejte prosím

Prezentace se nahrává, počkejte prosím

Logické programování Prezentace číslo 5.

Podobné prezentace


Prezentace na téma: "Logické programování Prezentace číslo 5."— Transkript prezentace:

1 Logické programování Prezentace číslo 5

2 Práce se seznamy Smazání prvku ze seznamu % smaz(Co,Sez,Vysl)
smaz(_,[],[]). % kde nic neni, nic nesmazes smaz(X,[X|T],T). % smaz nalezeny vyskyt smaz(X,[H|T],[H|T1]) :- X\=H, smaz(X,T,T1). % nech "jiny" prvek byt a hledej dal ?- smaz(a,[b,a,b,a],X). X = [b,b,a] ; no

3 Práce se seznamy Smazání prvku ze seznamu (s chybou)
Co když na 3. řádku zapomenu na „různost“? smaz(_,[],[]). smaz(X,[X|T],T). smaz(X,[H|T],[H|T1]) :- /* X\=H, */ smaz(X,T,T1). % nyni se 3. radek muze pouzit kdykoliv!!! ?- smaz(a,[b,a,b,a],X). X = [b,b,a] ; % smazal 1. vyskyt a-cka X = [b,a,b] ; % smazal 2. vyskyt a-cka X = [b,a,b,a] ; % nesmazal nic (viz 3. radek) no

4 Práce se seznamy Smazání všech výskytů prvku ze seznamu
% smaz_all(Co,Sez,Vysl) smaz_all(_,[],[]). smaz_all(X,[X|T],T1) :- smaz_all(X,T,T1). % smaz nalezeny vyskyt a pokracuj dal smaz_all(X,[H|T],[H|T1]) :- X\=H, smaz_all(X,T,T1). ?- smaz_all(a,[b,a,b,a],X). X = [b,b] ; no

5 Práce se seznamy Postupné (a opakované) mazání prvků Josephova funkce
Podle legendy, za panování cisaře Vespasiana, v době bojů mezi Římany a Židy, ukryl se do jeskyně Josephus (Flavius Josephus, židovský vojevůdce a dějepisec) se čtyřiceti svými druhy. Když viděli, že se nemohou zachránit, rozhodli se navzájem pobít. Všech 41 se postavilo do řady a každý třetí byl zabit (tj. 3., 6., 9., ...). Když se došlo na konec řady, pokračovalo se v počítání znovu od začátku (tj. 1., 5., 10.,...). Josephus se svým přítelem nechtěli zemřít, proto se postavili tak, že nakonec zůstali na živu sami dva. Napište program, který bude daný problém řešit obecně pro různá N (počet čísel v řadě) a K (krok, se kterým se odstraňuje z řady další číslo). 

6 Využití akumulátoru Největší prvek v seznamu čísel
% nejvetsi-prvek-seznamu(Sez,Max) max([H|T], Max) :- max(H,T,Max). % max(Docasne-max,Sez,Vysledek) max(Pom,[],Pom). max(Pom,[H|T],Max) :- H>Pom, max(H,T,Max). max(Pom,[H|T],Max) :- H=<Pom, max(Pom,T,Max). ?- max([3,1,4,5,2],M). M = 5 ; no

7 Práce se seznamy Vytvoření podmnožiny prvků seznamu
% podmnozina(Mnozina,Podmnozina) podm([],[]). podm([H|T],[H|V]) :- podm(T,V). % vezmi hlavu a dej ji do podmnoziny podm([H|T],V) :- podm(T,V). % vezmi hlavu a nedavej ji do podmnoziny ?- podm([a,b,c],P). P = [a,b,c] ; P = [b,c] ; P = [a,b] ; P = [b] ; P = [a,c] ; P = [c] ; P = [a] ; P = []

8 Práce se seznamy Vytknutí prvku ze seznamu % vytkni(Co,Odkud,Zbytek)
vytkni(X,[X|T],T). % vytkni prvni prvek, T je zbytek vytkni(X,[H|T],[H|T1]) :- vytkni(X,T,T1). % prvni nech, vytknes nejaky dalsi prvek ?- vytkni(X,[1,2,3],Z). X = 1 , Z = [2,3] ; X = 2 , Z = [1,3] ; X = 3 , Z = [1,2] ; no

9 Využití vytkni/3 cislo(0). cislo(1). cislo(9). res2:- cislo(D), cislo(E),E\=D, S1 is D+E, cislo(Y),Y\=E,Y\=D, Y is S1 mod 10, Pr1 is S1//10, cislo(N),N\=Y,N\=E,N\=D, cislo(R),R\=N,R\=Y,R\=E,R\=D, S2 is N+R +Pr1, E is S2 mod 10, Pr2 is S2//10, cislo(O),O\=R,O\=N,O\=Y,O\=E,O\=D, S3 is E+O+Pr2, N is S3 mod 10, Pr3 is S3//10, cislo(S),S\=0,S\=O,S\=R,S\=N,S\=Y,S\=E,S\=D, cislo(M),M\=0,M\=S,M\=O,M\=R,M\=N, M\=Y,M\=E,M\=D, S4 is S+M+Pr3, O is S4 mod 10, M is S4 // 10, write(‘ ‘:S:E:N:D), nl, write(‘ ‘:M:O:R:E), nl, write(‘ ’), nl, write(M:O:N:E:Y), nl. , Úlohy typu generuj a testuj obsahují velkou část kódu, který slouží pouze k zajištění vzájemné různosti čísel. Je to nepřehledné, zdlouhavé, snadno se udělá chyba, ..

10 Využití vytkni/3 vytkni(X,[X|T],T).
vytkni(X,[H|T],[H|T1]) :- vytkni(X,T,T1). % cisla se budou brat ze seznamu res3:- vytkni(D,[1,2,3,4,5,6,7,8,9,0],Z1), vytkni(E,Z1,Z2), % automaticky plati E\=D S1 is D+E, Y is S1 mod 10, Pr1 is S1//10, vytkni(Y,Z2,Z3), % automaticky plati Y\=E,Y\=D vytkni(N,Z3,Z4), % automaticky plati N\=Y,N\=E,N\=D vytkni(R,Z4,Z5), % .... S2 is N+R +Pr1, E is S2 mod 10, Pr2 is S2//10, vytkni(O,Z5,Z6), S3 is E+O+Pr2, N is S3 mod 10, Pr3 is S3//10, vytkni(S,Z6,Z7), vytkni(M,Z7,_), M\=0, S4 is S+M+Pr3, O is S4 mod 10, M is S4 // 10, write(' ':S:E:N:D), nl, write(' ':M:O:R:E), nl, write(' '), nl, write(M:O:N:E:Y), nl. ,

11 Příklad generuj a testuj
Desetice Najděte n-tici čísel, pro kterou platí: na místě jednotek je počet nul v čísle, na místě desítek je počet jedniček, na místě stovek je počet dvojek, …. Pro čtveřici jde např. o kombinace: 0121 (0 trojek, 1 dvojka, 2 jedničky, 1 nula) 0202 (0 trojek, 2 dvojky, 0 jedniček, 2 nuly) Najděte takovou desetici (existuje jediné řešení). Bohužel nepůjde využít vytkni/3 (ale třeba člen/2 )

12 Využití vytkni/3 Permutace prvků seznamu % vytkni(Co,Odkud,Zbytek)
vytkni(X,[X|T],T). vytkni(X,[H|T],[H|T1]) :- vytkni(X,T,T1). % permutace(Seznam,Permutovany-seznam) perm([],[]). perm(S,[X|P]) :- vytkni(X,S,Zb), perm(Zb,P). ?- perm([a,b,c],P). P = [a,b,c] ; P = [c,a,b] ; P = [a,c,b] ; P = [c,b,a] ; P = [b,a,c] ; no P = [b,c,a] ;

13 Práce se seznamy Otočení seznamu % otoceni-seznamu(Sez,Otoceny-sez)
otoc([H|T],O):-otoc(T,T1), spoj(T1,[H],O). % spoj(S1,S2,Vysl) spoj([],S2,S2). spoj([H|T],S2,[H|W]) :- spoj(T,S2,W). ?- otoc([a,l,e,s],O). O = [s,e,l,a]

14 Práce se seznamy Otočení seznamu – znovu a lépe
% otoceni-seznamu(Sez,Otoceny) -rychlejsi alg. otoc2(Sez,Ot) :- otoc(Sez,[],Ot). % otoc(Sez,Pomocna=Stul,Vysledek) otoc([],Ot,Ot). otoc([H|T],Pom,Ot) :- otoc(T,[H|Pom],Ot). ?- otoc([a,l,e,s],O). O = [s,e,l,a]

15 Praktický rozdíl Praktický rozdíl mezi použitím algoritmu 1 a 2 na seznamu o velikosti N: (čas je uveden ve formátu min:sec:ssec) Rozměr vstupních dat N 3 000 10 000 otoc (n2) 00:14:00 02:40:00 otoc2 (n) 00:00:00 00:00:03

16 Doba výpočtu pro různé složitosti
Čas výpočtu při rychlosti 1 milion operací za vteřinu: Složitost Rozměr vstupních dat n 10 50 100 200 1000 n 10s 50s 100s 200s 1ms n2 2.5ms 10ms 40ms 1s n3 125ms 8s 16min 40s 2n 1024s 35,7 let 4,0E+16 let 5,1E+46 let n! 3.6288s 9,6E+50 let 3E+144 let

17 Možný růst rozměru úlohy při daném zrychlení procesoru
Předpokládejme, že v dané chvíli jsme v čase T schopni řešit úlohu o rozměru n=100. Tabulka udává rozměr úlohy řešitelné ve stejném čase T na počítači s x-krát rychlejším procesorem. Složitost Zrychlení procesoru 1 (nyní) 5-krát 10-krát 100-krát 1000-krát n 100 500 1000 10000 100000 n2 223 316 3162 n3 170 215 464 2n 102 103 106 109 n! 101

18 Práce se seznamy Vygenerování seznamu s posloupností čísel
% generuj-seznam-cisel(N,Sez). gen(0,[]). gen(N,[N|T]) :- N>0, N1 is N-1, gen(N1,T). ?- gen(7,S). S = [7,6,5,4,3,2,1] Napište program, který vygeneruje seznam [1,2,..,N] bez použití predikátu otoc/2


Stáhnout ppt "Logické programování Prezentace číslo 5."

Podobné prezentace


Reklamy Google