-

Размер: px
Започни от страница:

Download "-"

Препис

1 Лениво оценяване и програмиране от по-висок ред Трифон Трифонов Функционално програмиране, спец. Информатика, 2015/16 г. 7 януари 2016 г. Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 1 / 27

2 Лениво оценяване Щипка λ-смятане λ-изрази: E ::= x E 1 (E 2 ) λx E Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 2 / 27

3 Лениво оценяване Щипка λ-смятане λ-изрази: E ::= x E 1 (E 2 ) λx E Изчислително правило: (λx E 1 )(E 2 ) E 1 [x := E 2 ] Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 2 / 27

4 Лениво оценяване Щипка λ-смятане λ-изрази: E ::= x E 1 (E 2 ) λx E Изчислително правило: (λx E 1 )(E 2 ) E 1 [x := E 2 ] В какъв ред прилагаме изчислителното правило? Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 2 / 27

5 Лениво оценяване Щипка λ-смятане λ-изрази: E ::= x E 1 (E 2 ) λx E Изчислително правило: (λx E 1 )(E 2 ) E 1 [x := E 2 ] В какъв ред прилагаме изчислителното правило? Нека f := λx x!, g := λz z 2 + z Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 2 / 27

6 Лениво оценяване Щипка λ-смятане λ-изрази: E ::= x E 1 (E 2 ) λx E Изчислително правило: (λx E 1 )(E 2 ) E 1 [x := E 2 ] В какъв ред прилагаме изчислителното правило? Нека f := λx x!, g := λz z 2 + z g(f (4))? Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 2 / 27

7 Лениво оценяване Щипка λ-смятане λ-изрази: E ::= x E 1 (E 2 ) λx E Изчислително правило: (λx E 1 )(E 2 ) E 1 [x := E 2 ] В какъв ред прилагаме изчислителното правило? Нека f := λx x!, g := λz z 2 + z g(f (4))? g(f (4)) Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 2 / 27

8 Лениво оценяване Щипка λ-смятане λ-изрази: E ::= x E 1 (E 2 ) λx E Изчислително правило: (λx E 1 )(E 2 ) E 1 [x := E 2 ] В какъв ред прилагаме изчислителното правило? Нека f := λx x!, g := λz z 2 + z g(f (4))? g(f (4)) g(4!) Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 2 / 27

9 Лениво оценяване Щипка λ-смятане λ-изрази: E ::= x E 1 (E 2 ) λx E Изчислително правило: (λx E 1 )(E 2 ) E 1 [x := E 2 ] В какъв ред прилагаме изчислителното правило? Нека f := λx x!, g := λz z 2 + z g(f (4))? g(f (4)) g(4!) g(24) Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 2 / 27

10 Лениво оценяване Щипка λ-смятане λ-изрази: E ::= x E 1 (E 2 ) λx E Изчислително правило: (λx E 1 )(E 2 ) E 1 [x := E 2 ] В какъв ред прилагаме изчислителното правило? Нека f := λx x!, g := λz z 2 + z g(f (4))? g(f (4)) g(4!) g(24) Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 2 / 27

11 Лениво оценяване Щипка λ-смятане λ-изрази: E ::= x E 1 (E 2 ) λx E Изчислително правило: (λx E 1 )(E 2 ) E 1 [x := E 2 ] В какъв ред прилагаме изчислителното правило? Нека f := λx x!, g := λz z 2 + z g(f (4))? g(f (4)) g(4!) g(24) Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 2 / 27

12 Лениво оценяване Щипка λ-смятане λ-изрази: E ::= x E 1 (E 2 ) λx E Изчислително правило: (λx E 1 )(E 2 ) E 1 [x := E 2 ] В какъв ред прилагаме изчислителното правило? Нека f := λx x!, g := λz z 2 + z g(f (4))? g(f (4)) g(4!) g(24) g(f (4)) Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 2 / 27

13 Лениво оценяване Щипка λ-смятане λ-изрази: E ::= x E 1 (E 2 ) λx E Изчислително правило: (λx E 1 )(E 2 ) E 1 [x := E 2 ] В какъв ред прилагаме изчислителното правило? Нека f := λx x!, g := λz z 2 + z g(f (4))? g(f (4)) g(4!) g(24) g(f (4)) (f (4)) 2 + f (4) Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 2 / 27

14 Лениво оценяване Щипка λ-смятане λ-изрази: E ::= x E 1 (E 2 ) λx E Изчислително правило: (λx E 1 )(E 2 ) E 1 [x := E 2 ] В какъв ред прилагаме изчислителното правило? Нека f := λx x!, g := λz z 2 + z g(f (4))? g(f (4)) g(4!) g(24) g(f (4)) (f (4)) 2 + f (4) (4!) 2 + 4! Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 2 / 27

15 Лениво оценяване Щипка λ-смятане λ-изрази: E ::= x E 1 (E 2 ) λx E Изчислително правило: (λx E 1 )(E 2 ) E 1 [x := E 2 ] В какъв ред прилагаме изчислителното правило? Нека f := λx x!, g := λz z 2 + z g(f (4))? g(f (4)) g(4!) g(24) g(f (4)) (f (4)) 2 + f (4) (4!) 2 + 4! Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 2 / 27

16 Лениво оценяване Щипка λ-смятане λ-изрази: E ::= x E 1 (E 2 ) λx E Изчислително правило: (λx E 1 )(E 2 ) E 1 [x := E 2 ] В какъв ред прилагаме изчислителното правило? Нека f := λx x!, g := λz z 2 + z g(f (4))? g(f (4)) g(4!) g(24) g(f (4)) (f (4)) 2 + f (4) (4!) 2 + 4! Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 2 / 27

17 Лениво оценяване Щипка λ-смятане λ-изрази: E ::= x E 1 (E 2 ) λx E Изчислително правило: (λx E 1 )(E 2 ) E 1 [x := E 2 ] В какъв ред прилагаме изчислителното правило? Нека f := λx x!, g := λz z 2 + z g(f (4))? g(f (4)) g(4!) g(24) оценява се отвътре навън g(f (4)) (f (4)) 2 + f (4) (4!) 2 + 4! оценява се отвън навътре Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 2 / 27

18 Лениво оценяване Щипка λ-смятане λ-изрази: E ::= x E 1 (E 2 ) λx E Изчислително правило: (λx E 1 )(E 2 ) E 1 [x := E 2 ] В какъв ред прилагаме изчислителното правило? Нека f := λx x!, g := λz z 2 + z g(f (4))? g(f (4)) g(4!) g(24) оценява се отвътре навън стриктно (апликативно, лакомо) оценяване g(f (4)) (f (4)) 2 + f (4) (4!) 2 + 4! оценява се отвън навътре нестриктно (нормално, лениво) оценяване Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 2 / 27

19 Лениво оценяване Стриктно и нестриктно оценяване Стриктното оценяване се използва в повечето езици за програмиране Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 3 / 27

20 Лениво оценяване Стриктно и нестриктно оценяване Стриктното оценяване се използва в повечето езици за програмиране се нарича още call-by-value (извикване по стойност) Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 3 / 27

21 Лениво оценяване Стриктно и нестриктно оценяване Стриктното оценяване се използва в повечето езици за програмиране се нарича още call-by-value (извикване по стойност) позволява лесно да се контролира реда на изпълнение Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 3 / 27

22 Лениво оценяване Стриктно и нестриктно оценяване Стриктното оценяване се използва в повечето езици за програмиране се нарича още call-by-value (извикване по стойност) позволява лесно да се контролира реда на изпълнение пестеливо откъм памет, понеже пази чисто Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 3 / 27

23 Лениво оценяване Стриктно и нестриктно оценяване Стриктното оценяване се използва в повечето езици за програмиране се нарича още call-by-value (извикване по стойност) позволява лесно да се контролира реда на изпълнение пестеливо откъм памет, понеже пази чисто Нестриктното оценяване Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 3 / 27

24 Лениво оценяване Стриктно и нестриктно оценяване Стриктното оценяване се използва в повечето езици за програмиране се нарича още call-by-value (извикване по стойност) позволява лесно да се контролира реда на изпълнение пестеливо откъм памет, понеже пази чисто Нестриктното оценяване е по-рядко използвано Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 3 / 27

25 Лениво оценяване Стриктно и нестриктно оценяване Стриктното оценяване се използва в повечето езици за програмиране се нарича още call-by-value (извикване по стойност) позволява лесно да се контролира реда на изпълнение пестеливо откъм памет, понеже пази чисто Нестриктното оценяване е по-рядко използвано въпреки това се среща в някаква форма в повечето езици! Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 3 / 27

26 Лениво оценяване Стриктно и нестриктно оценяване Стриктното оценяване се използва в повечето езици за програмиране се нарича още call-by-value (извикване по стойност) позволява лесно да се контролира реда на изпълнение пестеливо откъм памет, понеже пази чисто Нестриктното оценяване е по-рядко използвано въпреки това се среща в някаква форма в повечето езици! x = p!= NULL? p->data : 0; Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 3 / 27

27 Лениво оценяване Стриктно и нестриктно оценяване Стриктното оценяване се използва в повечето езици за програмиране се нарича още call-by-value (извикване по стойност) позволява лесно да се контролира реда на изпълнение пестеливо откъм памет, понеже пази чисто Нестриктното оценяване е по-рядко използвано въпреки това се среща в някаква форма в повечето езици! x = p!= NULL? p->data : 0; found = i < n && a[i] == x Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 3 / 27

28 Лениво оценяване Стриктно и нестриктно оценяване Стриктното оценяване се използва в повечето езици за програмиране се нарича още call-by-value (извикване по стойност) позволява лесно да се контролира реда на изпълнение пестеливо откъм памет, понеже пази чисто Нестриктното оценяване е по-рядко използвано въпреки това се среща в някаква форма в повечето езици! x = p!= NULL? p->data : 0; found = i < n && a[i] == x нарича се още call-by-name (извикване по име) Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 3 / 27

29 Лениво оценяване Стриктно и нестриктно оценяване Стриктното оценяване се използва в повечето езици за програмиране се нарича още call-by-value (извикване по стойност) позволява лесно да се контролира реда на изпълнение пестеливо откъм памет, понеже пази чисто Нестриктното оценяване е по-рядко използвано въпреки това се среща в някаква форма в повечето езици! x = p!= NULL? p->data : 0; found = i < n && a[i] == x нарича се още call-by-name (извикване по име) може да спести сметки, понеже изхвърля боклуците Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 3 / 27

30 Лениво оценяване Кога мързелът помага (define (f x y) (if (< x 5) x y)) (define (g l) (f (car l) (cadr l))) Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 4 / 27

31 Лениво оценяване Кога мързелът помага (define (f x y) (if (< x 5) x y)) (define (g l) (f (car l) (cadr l))) (g (3)) Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 4 / 27

32 Лениво оценяване Кога мързелът помага (define (f x y) (if (< x 5) x y)) (define (g l) (f (car l) (cadr l))) (g (3)) (f (car (3)) (cadr (3))) Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 4 / 27

33 Лениво оценяване Кога мързелът помага (define (f x y) (if (< x 5) x y)) (define (g l) (f (car l) (cadr l))) (g (3)) (f (car (3)) (cadr (3))) (f 3 (cadr (3))) Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 4 / 27

34 Лениво оценяване Кога мързелът помага (define (f x y) (if (< x 5) x y)) (define (g l) (f (car l) (cadr l))) (g (3)) (f (car (3)) (cadr (3))) (f 3 (cadr (3))) Грешка! Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 4 / 27

35 Лениво оценяване Кога мързелът помага (define (f x y) (if (< x 5) x y)) (define (g l) (f (car l) (cadr l))) (g (3)) (f (car (3)) (cadr (3))) (f 3 (cadr (3))) Грешка! f x y = if x < 5 then x else y g l = f (head l) (head (tail l)) Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 4 / 27

36 Лениво оценяване Кога мързелът помага (define (f x y) (if (< x 5) x y)) (define (g l) (f (car l) (cadr l))) (g (3)) (f (car (3)) (cadr (3))) (f 3 (cadr (3))) Грешка! f x y = if x < 5 then x else y g l = f (head l) (head (tail l)) g [3] Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 4 / 27

37 Лениво оценяване Кога мързелът помага (define (f x y) (if (< x 5) x y)) (define (g l) (f (car l) (cadr l))) (g (3)) (f (car (3)) (cadr (3))) (f 3 (cadr (3))) Грешка! f x y = if x < 5 then x else y g l = f (head l) (head (tail l)) g [3] f (head [3]) (head (tail [3])) Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 4 / 27

38 Лениво оценяване Кога мързелът помага (define (f x y) (if (< x 5) x y)) (define (g l) (f (car l) (cadr l))) (g (3)) (f (car (3)) (cadr (3))) (f 3 (cadr (3))) Грешка! f x y = if x < 5 then x else y g l = f (head l) (head (tail l)) g [3] f (head [3]) (head (tail [3])) if head [3] < 5 then head [3] else head (tail [3]) Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 4 / 27

39 Лениво оценяване Кога мързелът помага (define (f x y) (if (< x 5) x y)) (define (g l) (f (car l) (cadr l))) (g (3)) (f (car (3)) (cadr (3))) (f 3 (cadr (3))) Грешка! f x y = if x < 5 then x else y g l = f (head l) (head (tail l)) g [3] f (head [3]) (head (tail [3])) if head [3] < 5 then head [3] else head (tail [3]) if 3 < 5 then head [3] else head (tail [3]) Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 4 / 27

40 Лениво оценяване Кога мързелът помага (define (f x y) (if (< x 5) x y)) (define (g l) (f (car l) (cadr l))) (g (3)) (f (car (3)) (cadr (3))) (f 3 (cadr (3))) Грешка! f x y = if x < 5 then x else y g l = f (head l) (head (tail l)) g [3] f (head [3]) (head (tail [3])) if head [3] < 5 then head [3] else head (tail [3]) if 3 < 5 then head [3] else head (tail [3]) if True then head [3] else head (tail [3]) Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 4 / 27

41 Лениво оценяване Кога мързелът помага (define (f x y) (if (< x 5) x y)) (define (g l) (f (car l) (cadr l))) (g (3)) (f (car (3)) (cadr (3))) (f 3 (cadr (3))) Грешка! f x y = if x < 5 then x else y g l = f (head l) (head (tail l)) g [3] f (head [3]) (head (tail [3])) if head [3] < 5 then head [3] else head (tail [3]) if 3 < 5 then head [3] else head (tail [3]) if True then head [3] else head (tail [3]) head [3] Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 4 / 27

42 Лениво оценяване Кога мързелът помага (define (f x y) (if (< x 5) x y)) (define (g l) (f (car l) (cadr l))) (g (3)) (f (car (3)) (cadr (3))) (f 3 (cadr (3))) Грешка! f x y = if x < 5 then x else y g l = f (head l) (head (tail l)) g [3] f (head [3]) (head (tail [3])) if head [3] < 5 then head [3] else head (tail [3]) if 3 < 5 then head [3] else head (tail [3]) if True then head [3] else head (tail [3]) head [3] 3 Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 4 / 27

43 Лениво оценяване Теорема за нормализация всеки път когато апликативното оценяване дава резултат и нормалното оценяване дава резултат Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 5 / 27

44 Лениво оценяване Теорема за нормализация всеки път когато апликативното оценяване дава резултат и нормалното оценяване дава резултат има случаи, когато нормалното оценяване дава резултат, но апликативното не! Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 5 / 27

45 Лениво оценяване Теорема за нормализация всеки път когато апликативното оценяване дава резултат и нормалното оценяване дава резултат има случаи, когато нормалното оценяване дава резултат, но апликативното не! нещо повече: Теорема (за нормализация, Church-Rosser) Ако има някакъв ред на оценяване на програмата, който достига до резултат, то и с нормална стратегия на оценяване ще достигнем до някакъв резултат. Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 5 / 27

46 Лениво оценяване Теорема за нормализация всеки път когато апликативното оценяване дава резултат и нормалното оценяване дава резултат има случаи, когато нормалното оценяване дава резултат, но апликативното не! нещо повече: Теорема (за нормализация, Church-Rosser) Ако има някакъв ред на оценяване на програмата, който достига до резултат, то и с нормална стратегия на оценяване ще достигнем до някакъв резултат. Следствие Ако с нормално оценяване програмата даде грешка или не завърши, то няма да получим резултат с никоя друга стратегия на оценяване. Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 5 / 27

47 Лениво оценяване Извикване при нужда ( call-by-need ) Ако g(z) = z 2 + z, g(g(g(2))) =? Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 6 / 27

48 Лениво оценяване Извикване при нужда ( call-by-need ) Ако g(z) = z 2 + z, g(g(g(2))) =? g(g(g(2))) Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 6 / 27

49 Лениво оценяване Извикване при нужда ( call-by-need ) Ако g(z) = z 2 + z, g(g(g(2))) =? g(g(g(2))) g(g(2)) 2 + g(g(2)) Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 6 / 27

50 Лениво оценяване Извикване при нужда ( call-by-need ) Ако g(z) = z 2 + z, g(g(g(2))) =? g(g(g(2))) g(g(2)) 2 + g(g(2)) (g(2) 2 + g(2)) 2 + g(2) 2 + g(2) Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 6 / 27

51 Лениво оценяване Извикване при нужда ( call-by-need ) Ако g(z) = z 2 + z, g(g(g(2))) =? g(g(g(2))) g(g(2)) 2 + g(g(2)) (g(2) 2 + g(2)) 2 + g(2) 2 + g(2) (( ) ) + ( ) Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 6 / 27

52 Лениво оценяване Извикване при нужда ( call-by-need ) Ако g(z) = z 2 + z, g(g(g(2))) =? g(g(g(2))) g(g(2)) 2 + g(g(2)) (g(2) 2 + g(2)) 2 + g(2) 2 + g(2) (( ) ) + ( ) Времето и паметта нарастват експоненциално! Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 6 / 27

53 Лениво оценяване Извикване при нужда ( call-by-need ) Ако g(z) = z 2 + z, g(g(g(2))) =? g(g(g(2))) g(g(2)) 2 + g(g(2)) (g(2) 2 + g(2)) 2 + g(2) 2 + g(2) (( ) ) + ( ) Времето и паметта нарастват експоненциално! Идея: (λx E 1 )(E 2 ) let x = E 2 in E 1 Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 6 / 27

54 Лениво оценяване Извикване при нужда ( call-by-need ) Ако g(z) = z 2 + z, g(g(g(2))) =? g(g(g(2))) g(g(2)) 2 + g(g(2)) (g(2) 2 + g(2)) 2 + g(2) 2 + g(2) (( ) ) + ( ) Времето и паметта нарастват експоненциално! Идея: (λx E 1 )(E 2 ) let x = E 2 in E 1 g(g(g(2))) Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 6 / 27

55 Лениво оценяване Извикване при нужда ( call-by-need ) Ако g(z) = z 2 + z, g(g(g(2))) =? g(g(g(2))) g(g(2)) 2 + g(g(2)) (g(2) 2 + g(2)) 2 + g(2) 2 + g(2) (( ) ) + ( ) Времето и паметта нарастват експоненциално! Идея: (λx E 1 )(E 2 ) let x = E 2 in E 1 g(g(g(2))) let x = g(g(2)) in x 2 + x Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 6 / 27

56 Лениво оценяване Извикване при нужда ( call-by-need ) Ако g(z) = z 2 + z, g(g(g(2))) =? g(g(g(2))) g(g(2)) 2 + g(g(2)) (g(2) 2 + g(2)) 2 + g(2) 2 + g(2) (( ) ) + ( ) Времето и паметта нарастват експоненциално! Идея: (λx E 1 )(E 2 ) let x = E 2 in E 1 g(g(g(2))) let x = g(g(2)) in x 2 + x let y = g(2) in let x = y 2 + y in x 2 + x Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 6 / 27

57 Лениво оценяване Извикване при нужда ( call-by-need ) Ако g(z) = z 2 + z, g(g(g(2))) =? g(g(g(2))) g(g(2)) 2 + g(g(2)) (g(2) 2 + g(2)) 2 + g(2) 2 + g(2) (( ) ) + ( ) Времето и паметта нарастват експоненциално! Идея: (λx E 1 )(E 2 ) let x = E 2 in E 1 g(g(g(2))) let x = g(g(2)) in x 2 + x let y = g(2) in let x = y 2 + y in x 2 + x let z = 2 in let y = z 2 + z in let x = y 2 + y in x 2 + x Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 6 / 27

58 Лениво оценяване Извикване при нужда ( call-by-need ) Ако g(z) = z 2 + z, g(g(g(2))) =? g(g(g(2))) g(g(2)) 2 + g(g(2)) (g(2) 2 + g(2)) 2 + g(2) 2 + g(2) (( ) ) + ( ) Времето и паметта нарастват експоненциално! Идея: (λx E 1 )(E 2 ) let x = E 2 in E 1 g(g(g(2))) let x = g(g(2)) in x 2 + x let y = g(2) in let x = y 2 + y in x 2 + x let z = 2 in let y = z 2 + z in let x = y 2 + y in x 2 + x let y = 6 in let x = y 2 + y in x 2 + x Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 6 / 27

59 Лениво оценяване Извикване при нужда ( call-by-need ) Ако g(z) = z 2 + z, g(g(g(2))) =? g(g(g(2))) g(g(2)) 2 + g(g(2)) (g(2) 2 + g(2)) 2 + g(2) 2 + g(2) (( ) ) + ( ) Времето и паметта нарастват експоненциално! Идея: (λx E 1 )(E 2 ) let x = E 2 in E 1 g(g(g(2))) let x = g(g(2)) in x 2 + x let y = g(2) in let x = y 2 + y in x 2 + x let z = 2 in let y = z 2 + z in let x = y 2 + y in x 2 + x let y = 6 in let x = y 2 + y in x 2 + x let x = 42 in x 2 + x 1806 Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 6 / 27

60 Лениво оценяване Извикване при нужда ( call-by-need ) Ако g(z) = z 2 + z, g(g(g(2))) =? g(g(g(2))) g(g(2)) 2 + g(g(2)) (g(2) 2 + g(2)) 2 + g(2) 2 + g(2) (( ) ) + ( ) Времето и паметта нарастват експоненциално! Идея: (λx E 1 )(E 2 ) let x = E 2 in E 1 g(g(g(2))) let x = g(g(2)) in x 2 + x let y = g(2) in let x = y 2 + y in x 2 + x let z = 2 in let y = z 2 + z in let x = y 2 + y in x 2 + x let y = 6 in let x = y 2 + y in x 2 + x let x = 42 in x 2 + x 1806 Избягва се повторението чрез споделяне на общи подизрази Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 6 / 27

61 Лениво оценяване Извикване при нужда ( call-by-need ) Ако g(z) = z 2 + z, g(g(g(2))) =? g(g(g(2))) g(g(2)) 2 + g(g(2)) (g(2) 2 + g(2)) 2 + g(2) 2 + g(2) (( ) ) + ( ) Времето и паметта нарастват експоненциално! Идея: (λx E 1 )(E 2 ) let x = E 2 in E 1 g(g(g(2))) let x = g(g(2)) in x 2 + x let y = g(2) in let x = y 2 + y in x 2 + x let z = 2 in let y = z 2 + z in let x = y 2 + y in x 2 + x let y = 6 in let x = y 2 + y in x 2 + x let x = 42 in x 2 + x 1806 Избягва се повторението чрез споделяне на общи подизрази Заместването се извършва чак когато е абсолютно наложително Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 6 / 27

62 Лениво оценяване Кога се налага оценяване на израз? Във всеки даден момент Haskell оценява някой израз s. Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 7 / 27

63 Лениво оценяване Кога се налага оценяване на израз? Във всеки даден момент Haskell оценява някой израз s. ако s = if e then e 1 else e 2 Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 7 / 27

64 Лениво оценяване Кога се налага оценяване на израз? Във всеки даден момент Haskell оценява някой израз s. ако s = if e then e 1 else e 2 първо се оценява e Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 7 / 27

65 Лениво оценяване Кога се налага оценяване на израз? Във всеки даден момент Haskell оценява някой израз s. ако s = if e then e 1 else e 2 първо се оценява e ако оценката е True, се преминава към оценката на e 1 Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 7 / 27

66 Лениво оценяване Кога се налага оценяване на израз? Във всеки даден момент Haskell оценява някой израз s. ако s = if e then e 1 else e 2 първо се оценява e ако оценката е True, се преминава към оценката на e 1 ако оценката е False, се преминава към оценката на e 2 Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 7 / 27

67 Лениво оценяване Кога се налага оценяване на израз? Във всеки даден момент Haskell оценява някой израз s. ако s = if e then e 1 else e 2 първо се оценява e ако оценката е True, се преминава към оценката на e 1 ако оценката е False, се преминава към оценката на e 2 ако s = f e 1 e 2... e n, за f n-местна примитивна функция: Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 7 / 27

68 Лениво оценяване Кога се налага оценяване на израз? Във всеки даден момент Haskell оценява някой израз s. ако s = if e then e 1 else e 2 първо се оценява e ако оценката е True, се преминава към оценката на e 1 ако оценката е False, се преминава към оценката на e 2 ако s = f e 1 e 2... e n, за f n-местна примитивна функция: оценяват се последователно e 1,... e n Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 7 / 27

69 Лениво оценяване Кога се налага оценяване на израз? Във всеки даден момент Haskell оценява някой израз s. ако s = if e then e 1 else e 2 първо се оценява e ако оценката е True, се преминава към оценката на e 1 ако оценката е False, се преминава към оценката на e 2 ако s = f e 1 e 2... e n, за f n-местна примитивна функция: оценяват се последователно e 1,... e n прилага се примитивната операция над оценките им Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 7 / 27

70 Лениво оценяване Кога се налага оценяване на израз? Във всеки даден момент Haskell оценява някой израз s. ако s = if e then e 1 else e 2 първо се оценява e ако оценката е True, се преминава към оценката на e 1 ако оценката е False, се преминава към оценката на e 2 ако s = f e 1 e 2... e n, за f n-местна примитивна функция: оценяват се последователно e 1,... e n прилага се примитивната операция над оценките им нека сега да допуснем, че s = f e Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 7 / 27

71 Лениво оценяване Кога се налага оценяване на израз? Във всеки даден момент Haskell оценява някой израз s. ако s = if e then e 1 else e 2 първо се оценява e ако оценката е True, се преминава към оценката на e 1 ако оценката е False, се преминава към оценката на e 2 ако s = f e 1 e 2... e n, за f n-местна примитивна функция: оценяват се последователно e 1,... e n прилага се примитивната операция над оценките им нека сега да допуснем, че s = f e първо се оценява f, за да разберем как да продължим Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 7 / 27

72 Лениво оценяване Кога се налага оценяване на израз? Във всеки даден момент Haskell оценява някой израз s. ако s = if e then e 1 else e 2 първо се оценява e ако оценката е True, се преминава към оценката на e 1 ако оценката е False, се преминава към оценката на e 2 ако s = f e 1 e 2... e n, за f n-местна примитивна функция: оценяват се последователно e 1,... e n прилага се примитивната операция над оценките им нека сега да допуснем, че s = f e първо се оценява f, за да разберем как да продължим ако f x 1... x n g 1 = t 1... g k = t k е дефинирана чрез пазачи: Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 7 / 27

73 Лениво оценяване Кога се налага оценяване на израз? Във всеки даден момент Haskell оценява някой израз s. ако s = if e then e 1 else e 2 първо се оценява e ако оценката е True, се преминава към оценката на e 1 ако оценката е False, се преминава към оценката на e 2 ако s = f e 1 e 2... e n, за f n-местна примитивна функция: оценяват се последователно e 1,... e n прилага се примитивната операция над оценките им нека сега да допуснем, че s = f e първо се оценява f, за да разберем как да продължим ако f x 1... x n g 1 = t 1... g k = t k е дефинирана чрез пазачи: тогава f се замества с израза: \x 1... x n -> if g 1 then t 1 else... if g k then t k else error "..." Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 7 / 27

74 Лениво оценяване Кога се налага оценяване на израз? Във всеки даден момент Haskell оценява някой израз s. ако s = if e then e 1 else e 2 първо се оценява e ако оценката е True, се преминава към оценката на e 1 ако оценката е False, се преминава към оценката на e 2 ако s = f e 1 e 2... e n, за f n-местна примитивна функция: оценяват се последователно e 1,... e n прилага се примитивната операция над оценките им нека сега да допуснем, че s = f e първо се оценява f, за да разберем как да продължим ако f x 1... x n g 1 = t 1... g k = t k е дефинирана чрез пазачи: тогава f се замества с израза: \x 1... x n -> if g 1 then t 1 else... if g k then t k else error "..." ако f е конструктор (константа), оценката остава f e Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 7 / 27

75 Лениво оценяване Кога се налага оценяване на израз? Във всеки даден момент Haskell оценява някой израз s. ако s = if e then e 1 else e 2 първо се оценява e ако оценката е True, се преминава към оценката на e 1 ако оценката е False, се преминава към оценката на e 2 ако s = f e 1 e 2... e n, за f n-местна примитивна функция: оценяват се последователно e 1,... e n прилага се примитивната операция над оценките им нека сега да допуснем, че s = f e първо се оценява f, за да разберем как да продължим ако f x 1... x n g 1 = t 1... g k = t k е дефинирана чрез пазачи: тогава f се замества с израза: \x 1... x n -> if g 1 then t 1 else... if g k then t k else error "..." ако f е конструктор (константа), оценката остава f e ако f = \p -> t, където p е образец, редът на оценяване зависи от образеца! Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 7 / 27

76 Лениво оценяване Кога се оценяват изразите при използване на образци? Как се оценява (\p -> t) e? Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 8 / 27

77 Лениво оценяване Кога се оценяват изразите при използване на образци? Как се оценява (\p -> t) e? ако p = c е константа: Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 8 / 27

78 Лениво оценяване Кога се оценяват изразите при използване на образци? Как се оценява (\p -> t) e? ако p = c е константа: преминава се към оценката на аргумента e Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 8 / 27

79 Лениво оценяване Кога се оценяват изразите при използване на образци? Как се оценява (\p -> t) e? ако p = c е константа: преминава се към оценката на аргумента e ако се установи че оценката тя съвпада с c, преминава се към оценката на тялото t Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 8 / 27

80 Лениво оценяване Кога се оценяват изразите при използване на образци? Как се оценява (\p -> t) e? ако p = c е константа: преминава се към оценката на аргумента e ако се установи че оценката тя съвпада с c, преминава се към оценката на тялото t ако p = _ е анонимният образец: Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 8 / 27

81 Лениво оценяване Кога се оценяват изразите при използване на образци? Как се оценява (\p -> t) e? ако p = c е константа: преминава се към оценката на аргумента e ако се установи че оценката тя съвпада с c, преминава се към оценката на тялото t ако p = _ е анонимният образец: преминава се директно към оценката на t без да се оценява e Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 8 / 27

82 Лениво оценяване Кога се оценяват изразите при използване на образци? Как се оценява (\p -> t) e? ако p = c е константа: преминава се към оценката на аргумента e ако се установи че оценката тя съвпада с c, преминава се към оценката на тялото t ако p = _ е анонимният образец: преминава се директно към оценката на t без да се оценява e ако p = x е променлива: Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 8 / 27

83 Лениво оценяване Кога се оценяват изразите при използване на образци? Как се оценява (\p -> t) e? ако p = c е константа: преминава се към оценката на аргумента e ако се установи че оценката тя съвпада с c, преминава се към оценката на тялото t ако p = _ е анонимният образец: преминава се директно към оценката на t без да се оценява e ако p = x е променлива: преминава се към оценка на израза t като се въвежда локалната дефиниция x = e Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 8 / 27

84 Лениво оценяване Кога се оценяват изразите при използване на образци? Как се оценява (\p -> t) e? ако p = c е константа: преминава се към оценката на аргумента e ако се установи че оценката тя съвпада с c, преминава се към оценката на тялото t ако p = _ е анонимният образец: преминава се директно към оценката на t без да се оценява e ако p = x е променлива: преминава се към оценка на израза t като се въвежда локалната дефиниция x = e ако p = (p 1,p 2,...,p n ): Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 8 / 27

85 Лениво оценяване Кога се оценяват изразите при използване на образци? Как се оценява (\p -> t) e? ако p = c е константа: преминава се към оценката на аргумента e ако се установи че оценката тя съвпада с c, преминава се към оценката на тялото t ако p = _ е анонимният образец: преминава се директно към оценката на t без да се оценява e ако p = x е променлива: преминава се към оценка на израза t като се въвежда локалната дефиниция x = e ако p = (p 1,p 2,...,p n ): преминава се към оценката на e Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 8 / 27

86 Лениво оценяване Кога се оценяват изразите при използване на образци? Как се оценява (\p -> t) e? ако p = c е константа: преминава се към оценката на аргумента e ако се установи че оценката тя съвпада с c, преминава се към оценката на тялото t ако p = _ е анонимният образец: преминава се директно към оценката на t без да се оценява e ако p = x е променлива: преминава се към оценка на израза t като се въвежда локалната дефиниция x = e ако p = (p 1,p 2,...,p n ): преминава се към оценката на e ако се установи, че тя е от вида (e 1,e 2,...,e n ), преминава се към оценката на израза (\p 1 p 2... p n -> t) e 1 e 2... e n Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 8 / 27

87 Лениво оценяване Кога се оценяват изразите при използване на образци? Как се оценява (\p -> t) e? ако p = (p h :p t ): Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 9 / 27

88 Лениво оценяване Кога се оценяват изразите при използване на образци? Как се оценява (\p -> t) e? ако p = (p h :p t ): преминава се към оценката на e Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 9 / 27

89 Лениво оценяване Кога се оценяват изразите при използване на образци? Как се оценява (\p -> t) e? ако p = (p h :p t ): преминава се към оценката на e ако се установи, че тя е от вида (e h :e t ), преминава се към оценката на израза (\p h p t -> t) e h e t Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 9 / 27

90 Лениво оценяване Кога се оценяват изразите при използване на образци? Как се оценява (\p -> t) e? ако p = (p h :p t ): преминава се към оценката на e ако се установи, че тя е от вида (e h :e t ), преминава се към оценката на израза (\p h p t -> t) e h e t ако p = [p 1,p 2,...,p n ]: Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 9 / 27

91 Лениво оценяване Кога се оценяват изразите при използване на образци? Как се оценява (\p -> t) e? ако p = (p h :p t ): преминава се към оценката на e ако се установи, че тя е от вида (e h :e t ), преминава се към оценката на израза (\p h p t -> t) e h e t ако p = [p 1,p 2,...,p n ]: преминава се към оценката на e Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 9 / 27

92 Лениво оценяване Кога се оценяват изразите при използване на образци? Как се оценява (\p -> t) e? ако p = (p h :p t ): преминава се към оценката на e ако се установи, че тя е от вида (e h :e t ), преминава се към оценката на израза (\p h p t -> t) e h e t ако p = [p 1,p 2,...,p n ]: преминава се към оценката на e ако се установи, че тя е от вида [e 1,e 2,...,e n ], преминава се към оценката на израза (\p 1 p 2... p n -> t) e 1 e 2... e n Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 9 / 27

93 Лениво оценяване Кога се оценяват изразите при използване на образци? Как се оценява (\p -> t) e? ако p = (p h :p t ): преминава се към оценката на e ако се установи, че тя е от вида (e h :e t ), преминава се към оценката на израза (\p h p t -> t) e h e t ако p = [p 1,p 2,...,p n ]: преминава се към оценката на e ако се установи, че тя е от вида [e 1,e 2,...,e n ], преминава се към оценката на израза (\p 1 p 2... p n -> t) e 1 e 2... e n всъщност е еквивалентно да разгледаме p като p 1 :p 2 :...:p n :[] Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 9 / 27

94 Лениво оценяване Кога се оценяват изразите при използване на образци? Как се оценява (\p -> t) e? ако p = (p h :p t ): преминава се към оценката на e ако се установи, че тя е от вида (e h :e t ), преминава се към оценката на израза (\p h p t -> t) e h e t ако p = [p 1,p 2,...,p n ]: преминава се към оценката на e ако се установи, че тя е от вида [e 1,e 2,...,e n ], преминава се към оценката на израза (\p 1 p 2... p n -> t) e 1 e 2... e n всъщност е еквивалентно да разгледаме p като p 1 :p 2 :...:p n :[] ако има няколко равенства за f с използване на различни образци, се търси кой образец пасва отгоре надолу Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 9 / 27

95 Лениво оценяване Оценяване в Haskell: пример 1 sumfirst (x:xs) (y:ys) = x + y Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 10 / 27

96 Лениво оценяване Оценяване в Haskell: пример 1 sumfirst (x:xs) (y:ys) = x + y sumfirst [1..10] [5..50] Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 10 / 27

97 Лениво оценяване Оценяване в Haskell: пример 1 sumfirst (x:xs) (y:ys) = x + y sumfirst [1..10] [5..50] (\(x:xs) -> \(y:ys) -> x + y) [1..10] [5..50] Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 10 / 27

98 Лениво оценяване Оценяване в Haskell: пример 1 sumfirst (x:xs) (y:ys) = x + y sumfirst [1..10] [5..50] (\(x:xs) -> \(y:ys) -> x + y) [1..10] [5..50] (\(x:xs) -> \(y:ys) -> x + y) (1:[2..10]) [5..50] Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 10 / 27

99 Лениво оценяване Оценяване в Haskell: пример 1 sumfirst (x:xs) (y:ys) = x + y sumfirst [1..10] [5..50] (\(x:xs) -> \(y:ys) -> x + y) [1..10] [5..50] (\(x:xs) -> \(y:ys) -> x + y) (1:[2..10]) [5..50] let x=1; xs=[2..10] in (\(y:ys) -> x + y) [5..50] Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 10 / 27

100 Лениво оценяване Оценяване в Haskell: пример 1 sumfirst (x:xs) (y:ys) = x + y sumfirst [1..10] [5..50] (\(x:xs) -> \(y:ys) -> x + y) [1..10] [5..50] (\(x:xs) -> \(y:ys) -> x + y) (1:[2..10]) [5..50] let x=1; xs=[2..10] in (\(y:ys) -> x + y) [5..50] let x=1; xs=[2..10] in (\(y:ys) -> x + y) (5:[6..50]) Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 10 / 27

101 Лениво оценяване Оценяване в Haskell: пример 1 sumfirst (x:xs) (y:ys) = x + y sumfirst [1..10] [5..50] (\(x:xs) -> \(y:ys) -> x + y) [1..10] [5..50] (\(x:xs) -> \(y:ys) -> x + y) (1:[2..10]) [5..50] let x=1; xs=[2..10] in (\(y:ys) -> x + y) [5..50] let x=1; xs=[2..10] in (\(y:ys) -> x + y) (5:[6..50]) let x=1; xs=[2..10]; y=5; ys=[6..50] in x+y Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 10 / 27

102 Лениво оценяване Оценяване в Haskell: пример 1 sumfirst (x:xs) (y:ys) = x + y sumfirst [1..10] [5..50] (\(x:xs) -> \(y:ys) -> x + y) [1..10] [5..50] (\(x:xs) -> \(y:ys) -> x + y) (1:[2..10]) [5..50] let x=1; xs=[2..10] in (\(y:ys) -> x + y) [5..50] let x=1; xs=[2..10] in (\(y:ys) -> x + y) (5:[6..50]) let x=1; xs=[2..10]; y=5; ys=[6..50] in x+y Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 10 / 27

103 Лениво оценяване Оценяване в Haskell: пример 1 sumfirst (x:xs) (y:ys) = x + y sumfirst [1..10] [5..50] (\(x:xs) -> \(y:ys) -> x + y) [1..10] [5..50] (\(x:xs) -> \(y:ys) -> x + y) (1:[2..10]) [5..50] let x=1; xs=[2..10] in (\(y:ys) -> x + y) [5..50] let x=1; xs=[2..10] in (\(y:ys) -> x + y) (5:[6..50]) let x=1; xs=[2..10]; y=5; ys=[6..50] in x+y Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 10 / 27

104 Лениво оценяване Оценяване в Haskell: пример 2 (filter isprime [ ])!! 1 Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 11 / 27

105 Лениво оценяване Оценяване в Haskell: пример 2 (filter isprime [ ])!! 1 (\(x:xs) n -> xs!! (n-1)) (filter isprime [ ]) 1 Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 11 / 27

106 Лениво оценяване Оценяване в Haskell: пример 2 (filter isprime [ ])!! 1 (\(x:xs) n -> xs!! (n-1)) (filter isprime [ ]) 1 (\(x:xs) n -> xs!! (n-1)) (filter isprime [ ]) 1 Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 11 / 27

107 Лениво оценяване Оценяване в Haskell: пример 2 (filter isprime [ ])!! 1 (\(x:xs) n -> xs!! (n-1)) (filter isprime [ ]) 1 (\(x:xs) n -> xs!! (n-1)) (filter isprime [ ]) 1... (\p (z:zs) -> if p z then z:filter p zs else filter p zs) isprime [ ]... Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 11 / 27

108 Лениво оценяване Оценяване в Haskell: пример 2 (filter isprime [ ])!! 1 (\(x:xs) n -> xs!! (n-1)) (filter isprime [ ]) 1 (\(x:xs) n -> xs!! (n-1)) (filter isprime [ ]) 1... (\p (z:zs) -> if p z then z:filter p zs else filter p zs) isprime [ ] let p=isprime in (\(z:zs) -> if p z then z:filter p zs else filter p zs) [ ]... Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 11 / 27

109 Лениво оценяване Оценяване в Haskell: пример 2 (filter isprime [ ])!! 1 (\(x:xs) n -> xs!! (n-1)) (filter isprime [ ]) 1 (\(x:xs) n -> xs!! (n-1)) (filter isprime [ ]) 1... (\p (z:zs) -> if p z then z:filter p zs else filter p zs) isprime [ ] let p=isprime in (\(z:zs) -> if p z then z:filter p zs else filter p zs) [ ] let p=isprime in (\(z:zs) -> if p z then z:filter p zs else filter p zs) (4:[ ]))... Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 11 / 27

110 Лениво оценяване Оценяване в Haskell: пример 2 (filter isprime [ ])!! 1 (\(x:xs) n -> xs!! (n-1)) (filter isprime [ ]) 1 (\(x:xs) n -> xs!! (n-1)) (filter isprime [ ]) 1... (\p (z:zs) -> if p z then z:filter p zs else filter p zs) isprime [ ] let p=isprime in (\(z:zs) -> if p z then z:filter p zs else filter p zs) [ ] let p=isprime in (\(z:zs) -> if p z then z:filter p zs else filter p zs) (4:[ ])) let p=isprime; z=4; zs=[ ] in if p z then z:filter p zs else filter p zs... Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 11 / 27

111 Лениво оценяване Оценяване в Haskell: пример 2 (filter isprime [ ])!! 1 (\(x:xs) n -> xs!! (n-1)) (filter isprime [ ]) 1 (\(x:xs) n -> xs!! (n-1)) (filter isprime [ ]) 1... (\p (z:zs) -> if p z then z:filter p zs else filter p zs) isprime [ ] let p=isprime in (\(z:zs) -> if p z then z:filter p zs else filter p zs) [ ] let p=isprime in (\(z:zs) -> if p z then z:filter p zs else filter p zs) (4:[ ])) let p=isprime; z=4; zs=[ ] in if p z then z:filter p zs else filter p zs let p=isprime; z=4; zs=[ ] in if False then z:filter p zs else filter p zs... Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 11 / 27

112 Лениво оценяване Оценяване в Haskell: пример 2... (\p (z:zs) -> if p z then z:filter p zs else filter p zs) isprime [ ]... Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 12 / 27

113 Лениво оценяване Оценяване в Haskell: пример 2... (\p (z:zs) -> if p z then z:filter p zs else filter p zs) isprime [ ] let p=isprime in (\(z:zs) -> if p z then z:filter p zs else filter p zs) (5:[ ])... Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 12 / 27

114 Лениво оценяване Оценяване в Haskell: пример 2... (\p (z:zs) -> if p z then z:filter p zs else filter p zs) isprime [ ] let p=isprime in (\(z:zs) -> if p z then z:filter p zs else filter p zs) (5:[ ])......let p=isprime; z=5; zs=[ ] in if p z then z:filter p zs else filter p zs... Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 12 / 27

115 Лениво оценяване Оценяване в Haskell: пример 2... (\p (z:zs) -> if p z then z:filter p zs else filter p zs) isprime [ ] let p=isprime in (\(z:zs) -> if p z then z:filter p zs else filter p zs) (5:[ ])......let p=isprime; z=5; zs=[ ] in if p z then z:filter p zs else filter p zs......let p=isprime; z=5; zs=[ ] in if True then z:filter p zs else filter p zs... Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 12 / 27

116 Лениво оценяване Оценяване в Haskell: пример 2... (\p (z:zs) -> if p z then z:filter p zs else filter p zs) isprime [ ] let p=isprime in (\(z:zs) -> if p z then z:filter p zs else filter p zs) (5:[ ])......let p=isprime; z=5; zs=[ ] in if p z then z:filter p zs else filter p zs......let p=isprime; z=5; zs=[ ] in if True then z:filter p zs else filter p zs... (\(x:xs) n -> xs!! (n-1)) (5:filter isprime [ ]) 1 Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 12 / 27

117 Лениво оценяване Оценяване в Haskell: пример 2... (\p (z:zs) -> if p z then z:filter p zs else filter p zs) isprime [ ] let p=isprime in (\(z:zs) -> if p z then z:filter p zs else filter p zs) (5:[ ])......let p=isprime; z=5; zs=[ ] in if p z then z:filter p zs else filter p zs......let p=isprime; z=5; zs=[ ] in if True then z:filter p zs else filter p zs... (\(x:xs) n -> xs!! (n-1)) (5:filter isprime [ ]) 1 let xs=filter isprime [ ] in (\n -> xs!! (n-1)) 1 Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 12 / 27

118 Лениво оценяване Оценяване в Haskell: пример 2... (\p (z:zs) -> if p z then z:filter p zs else filter p zs) isprime [ ] let p=isprime in (\(z:zs) -> if p z then z:filter p zs else filter p zs) (5:[ ])......let p=isprime; z=5; zs=[ ] in if p z then z:filter p zs else filter p zs......let p=isprime; z=5; zs=[ ] in if True then z:filter p zs else filter p zs... (\(x:xs) n -> xs!! (n-1)) (5:filter isprime [ ]) 1 let xs=filter isprime [ ] in (\n -> xs!! (n-1)) 1 let xs=filter isprime [ ]; n=1 in xs!! (n-1) Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 12 / 27

119 Лениво оценяване Оценяване в Haskell: пример 2... (\p (z:zs) -> if p z then z:filter p zs else filter p zs) isprime [ ] let p=isprime in (\(z:zs) -> if p z then z:filter p zs else filter p zs) (5:[ ])......let p=isprime; z=5; zs=[ ] in if p z then z:filter p zs else filter p zs......let p=isprime; z=5; zs=[ ] in if True then z:filter p zs else filter p zs... (\(x:xs) n -> xs!! (n-1)) (5:filter isprime [ ]) 1 let xs=filter isprime [ ] in (\n -> xs!! (n-1)) 1 let xs=filter isprime [ ]; n=1 in xs!! (n-1) (\(y:_) 0 -> y) (filter isprime [ ]) 0 Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 12 / 27

120 Лениво оценяване Оценяване в Haskell: пример 2... (\p (z:zs) -> if p z then z:filter p zs else filter p zs) isprime [ ]... Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 13 / 27

121 Лениво оценяване Оценяване в Haskell: пример 2... (\p (z:zs) -> if p z then z:filter p zs else filter p zs) isprime [ ] let p=isprime in (\(z:zs) -> if p z then z:filter p zs else filter p zs) (6:[ ])... Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 13 / 27

122 Лениво оценяване Оценяване в Haskell: пример 2... (\p (z:zs) -> if p z then z:filter p zs else filter p zs) isprime [ ] let p=isprime in (\(z:zs) -> if p z then z:filter p zs else filter p zs) (6:[ ]) let p=isprime; z=6; zs=[ ] in if p z then z:filter p zs else filter p zs... Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 13 / 27

123 Лениво оценяване Оценяване в Haskell: пример 2... (\p (z:zs) -> if p z then z:filter p zs else filter p zs) isprime [ ] let p=isprime in (\(z:zs) -> if p z then z:filter p zs else filter p zs) (6:[ ]) let p=isprime; z=6; zs=[ ] in if p z then z:filter p zs else filter p zs let p=isprime; z=6; zs=[ ] in if False then z:filter p zs else filter p zs... Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 13 / 27

124 Лениво оценяване Оценяване в Haskell: пример 2... (\p (z:zs) -> if p z then z:filter p zs else filter p zs) isprime [ ] let p=isprime in (\(z:zs) -> if p z then z:filter p zs else filter p zs) (6:[ ]) let p=isprime; z=6; zs=[ ] in if p z then z:filter p zs else filter p zs let p=isprime; z=6; zs=[ ] in if False then z:filter p zs else filter p zs (\p (z:zs) -> if p z then z:filter p zs else filter p zs) isprime [ ]... Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 13 / 27

125 Лениво оценяване Оценяване в Haskell: пример 2... (\p (z:zs) -> if p z then z:filter p zs else filter p zs) isprime [ ] let p=isprime in (\(z:zs) -> if p z then z:filter p zs else filter p zs) (6:[ ]) let p=isprime; z=6; zs=[ ] in if p z then z:filter p zs else filter p zs let p=isprime; z=6; zs=[ ] in if False then z:filter p zs else filter p zs (\p (z:zs) -> if p z then z:filter p zs else filter p zs) isprime [ ] let p=isprime in (\(z:zs) -> if p z then z:filter p zs else filter p zs) (7:[ ])... Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 13 / 27

126 Лениво оценяване Оценяване в Haskell: пример 2... (\p (z:zs) -> if p z then z:filter p zs else filter p zs) isprime [ ] let p=isprime in (\(z:zs) -> if p z then z:filter p zs else filter p zs) (6:[ ]) let p=isprime; z=6; zs=[ ] in if p z then z:filter p zs else filter p zs let p=isprime; z=6; zs=[ ] in if False then z:filter p zs else filter p zs (\p (z:zs) -> if p z then z:filter p zs else filter p zs) isprime [ ] let p=isprime in (\(z:zs) -> if p z then z:filter p zs else filter p zs) (7:[ ]) let p=isprime; z=7; zs=[ ] in if p z then z:filter p zs else filter p zs... Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 13 / 27

127 Лениво оценяване Оценяване в Haskell: пример 2... let p=isprime; z=7; zs=[ ] in if True then z:filter p zs else filter p zs... Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 14 / 27

128 Лениво оценяване Оценяване в Haskell: пример 2... let p=isprime; z=7; zs=[ ] in if True then z:filter p zs else filter p zs... (\(y:_) 0 -> y) (7:filter isprime [ ]) 0 Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 14 / 27

129 Лениво оценяване Оценяване в Haskell: пример 2... let p=isprime; z=7; zs=[ ] in if True then z:filter p zs else filter p zs... (\(y:_) 0 -> y) (7:filter isprime [ ]) 0 let y=7 in y Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 14 / 27

130 Лениво оценяване Оценяване в Haskell: пример 2... let p=isprime; z=7; zs=[ ] in if True then z:filter p zs else filter p zs... (\(y:_) 0 -> y) (7:filter isprime [ ]) 0 let y=7 in y 7 Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 14 / 27

131 Потоци Потоци в Haskell Можем да си мислим, че аргументите в Haskell са обещания, които се изпълняват при нужда Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 15 / 27

132 Потоци Потоци в Haskell Можем да си мислим, че аргументите в Haskell са обещания, които се изпълняват при нужда В частност, x:xs = (:) x xs, където Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г. 15 / 27

Синтаксис за дефиниране на функции Трифон Трифонов Функционално програмиране, спец. Информатика, 2015/16 г. 6 януари 2016 г. Трифон Трифонов (ФП-И 15/

Синтаксис за дефиниране на функции Трифон Трифонов Функционално програмиране, спец. Информатика, 2015/16 г. 6 януари 2016 г. Трифон Трифонов (ФП-И 15/ Синтаксис за дефиниране на функции Трифон Трифонов Функционално програмиране, спец. Информатика, 2015/16 г. 6 януари 2016 г. Трифон Трифонов (ФП-И 15/16) Синтаксис за дефиниране на функции 6 януари 2016

Подробно

C++

C++ Управляващи оператори в C++ Трифон Трифонов Увод в програмирането, спец. Компютърни науки, 1 поток, 2018/19 г. 18 30 октомври 2018 г. Трифон Трифонов (УП 18/19) Управляващи оператори в C++ 18 30 октомври

Подробно

4

4 Наследяване и 4 Трифон Трифонов Обектно-ориентирано програмиране, спец. Компютърни науки, 1 поток, спец. Софтуерно инженерство, 2016/17 г. 11 май 2017 г. Трифон Трифонов (ООП 16/17) Наследяване и голямата

Подробно

Рекурсия Трифон Трифонов Увод в програмирането, спец. Компютърни науки, 1 поток, спец. Софтуерно инженерство, 2016/17 г. 21 декември 2016 г. 4 януари

Рекурсия Трифон Трифонов Увод в програмирането, спец. Компютърни науки, 1 поток, спец. Софтуерно инженерство, 2016/17 г. 21 декември 2016 г. 4 януари Рекурсия Трифон Трифонов Увод в програмирането, спец. Компютърни науки, 1 поток, спец. Софтуерно инженерство, 2016/17 г. 21 декември 2016 г. 4 януари 2017 г. Трифон Трифонов (УП 16/17) Рекурсия 21.12.16

Подробно

Масиви и низове Трифон Трифонов Увод в програмирането, спец. Компютърни науки, 1 поток, спец. Софтуерно инженерство, 2016/17 г. 9 ноември 2016 г. Триф

Масиви и низове Трифон Трифонов Увод в програмирането, спец. Компютърни науки, 1 поток, спец. Софтуерно инженерство, 2016/17 г. 9 ноември 2016 г. Триф и низове Трифон Трифонов Увод в програмирането, спец. Компютърни науки, 1 поток, спец. Софтуерно инженерство, 2016/17 г. 9 ноември 2016 г. Трифон Трифонов (УП 16/17) и низове 9 ноември 2016 г. 1 / 5 Логическо

Подробно

Информатика

Информатика ХИМИКОТЕХНОЛОГИЧЕН И МЕТАЛУРГИЧЕН УНИВЕРСИТЕТ - СОФИЯ ИНФОРМАТИКА част първа лектор: доц. д-р Атанас Атанасов Катедра Програмиране и използване на компютърни системи Лекция 3 ЛОГИЧЕСКИ ОСНОВИ НА КОМПЮТЪРНИТЕ

Подробно

(не)разложимост на полиноми с рационални коефициенти Велико Дончев Допълнителен материал за студентите по Висша алгебра и Алгебра 2 на ФМИ 1 Предварит

(не)разложимост на полиноми с рационални коефициенти Велико Дончев Допълнителен материал за студентите по Висша алгебра и Алгебра 2 на ФМИ 1 Предварит (не)разложимост на полиноми с рационални коефициенти Велико Дончев Допълнителен материал за студентите по Висша алгебра и Алгебра 2 на ФМИ 1 Предварителни сведения и твърдения Както е ясно от основната

Подробно

Масиви и низове Трифон Трифонов Увод в програмирането, спец. Компютърни науки, 1 поток, 2018/19 г ноември 2018 г. Трифон Трифонов (УП 18/19) Ма

Масиви и низове Трифон Трифонов Увод в програмирането, спец. Компютърни науки, 1 поток, 2018/19 г ноември 2018 г. Трифон Трифонов (УП 18/19) Ма Масиви и низове Трифон Трифонов Увод в програмирането, спец. Компютърни науки, 1 поток, 2018/19 г. 15 29 ноември 2018 г. Трифон Трифонов (УП 18/19) Масиви и низове 15 29 ноември 2018 г. 1 / 16 Масиви Логическо

Подробно

Microsoft Word - VM22 SEC55.doc

Microsoft Word - VM22 SEC55.doc Лекция 5 5 Диференциални уравнения от първи ред Основни определения Диференциално уравнение се нарича уравнение в което участват известен брой производни на търсената функция В общия случай ( n) диференциалното

Подробно

Масиви и низове Трифон Трифонов Увод в програмирането, спец. Компютърни науки, 1 поток, 2018/19 г. 15 ноември 6 декември 2018 г. Трифон Трифонов (УП 1

Масиви и низове Трифон Трифонов Увод в програмирането, спец. Компютърни науки, 1 поток, 2018/19 г. 15 ноември 6 декември 2018 г. Трифон Трифонов (УП 1 Масиви и низове Трифон Трифонов Увод в програмирането, спец. Компютърни науки, 1 поток, 2018/19 г. 15 ноември 6 декември 2018 г. Трифон Трифонов (УП 18/19) Масиви и низове 15.11-6.12.2018 г. 1 / 17 Масиви

Подробно

Microsoft Word - PRMAT sec99.doc

Microsoft Word - PRMAT sec99.doc Лекция 9 9 Изследване на функция Растене, намаляване и екстремуми В тази лекция ще изследваме особеностите на релефа на графиката на дадена функция в зависимост от поведението на нейната производна Основните

Подробно

1. Инструментални средства на изкуствения интелект. Основната характеристика на програмните системи, базирани на знания, отличаваща ги от стандартните

1. Инструментални средства на изкуствения интелект. Основната характеристика на програмните системи, базирани на знания, отличаваща ги от стандартните 1. Инструментални средства на изкуствения интелект. Основната характеристика на програмните системи, базирани на знания, отличаваща ги от стандартните програмни системи, е използването на знания в тях.

Подробно

Предефиниране на оператори. Копиращ конструктор. Оператор за присвояване Любомир Чорбаджиев Технологическо училище Електронни системи Технически униве

Предефиниране на оператори. Копиращ конструктор. Оператор за присвояване Любомир Чорбаджиев Технологическо училище Електронни системи Технически униве Предефиниране на оператори. Копиращ конструктор. Оператор за присвояване Любомир Чорбаджиев Технологическо училище Електронни системи Технически университет, София lchorbadjiev@elsys-bg.org Revision :

Подробно

Lush Green

Lush Green Класове Какво са класовете? Основен инструмент на ООП Средство за дефиниране на абстрактни типове данни Синтактична конструкция, която позволява логическо групиране на данни и операциите над тях Дефиниция

Подробно

Семинар 1: Комплексни числа. Функции на комплексна променлива.

Семинар 1: Комплексни числа. Функции на комплексна променлива. Семинар 1: Комплексни числа. Функции на комплексна променлива. Комплексно число, с: c z (, ) + + j а Re[c] реална част; Im[c] имагинерна част; j 1 r c + - модул на комплексното число (к. ч.). tg ϕ, ϕ rg

Подробно

Динамична памет Трифон Трифонов Увод в програмирането, спец. Компютърни науки, 1 поток, спец. Софтуерно инженерство, 2016/17 г. 21 декември 2016 г. Тр

Динамична памет Трифон Трифонов Увод в програмирането, спец. Компютърни науки, 1 поток, спец. Софтуерно инженерство, 2016/17 г. 21 декември 2016 г. Тр Динамична памет Трифон Трифонов Увод в програмирането, спец. Компютърни науки, 1 поток, спец. Софтуерно инженерство, 2016/17 г. 21 декември 2016 г. Трифон Трифонов (УП 16/17) Динамична памет 21 декември

Подробно

Канонична форма на клас или 4 (голямата четворка) Трифон Трифонов Обектно-ориентирано програмиране, спец. Компютърни науки, 1 поток, спец. Софтуерно и

Канонична форма на клас или 4 (голямата четворка) Трифон Трифонов Обектно-ориентирано програмиране, спец. Компютърни науки, 1 поток, спец. Софтуерно и Канонична форма на клас или 4 (голямата четворка) Трифон Трифонов Обектно-ориентирано програмиране, спец. Компютърни науки, 1 поток, спец. Софтуерно инженерство, 2016/17 г. 6 април 2017 г. Трифон Трифонов

Подробно

Homework 2

Homework 2 Домашна работа 2 по Дизайн и анализ на алгоритми за специалност Компютърни науки, 2. курс, 1. поток СУ, ФМИ, летен семестър на 2017 / 2018 уч. г. СЪСТАВЯНЕ НА АЛГОРИТМИ Задача 1 2 3, а 3, б 3, в Общо получен

Подробно

Динамична памет. Конструктори и деструктори Любомир Чорбаджиев Технологическо училище Електронни системи Технически университет, София

Динамична памет. Конструктори и деструктори Любомир Чорбаджиев Технологическо училище Електронни системи Технически университет, София Динамична памет. Конструктори и деструктори Любомир Чорбаджиев Технологическо училище Електронни системи Технически университет, София lchorbadjiev@elsys-bg.org Revision : 1.3 16 ноември 2004 г. Пример:

Подробно

Виртуални функции

Виртуални функции Виртуални функции Статично свързване Как компилаторът избира кой метод или коя функция да бъде извикана? Прави се сравнение между формални и фактически параметри и се избира най-точното съвпадение в случай,

Подробно

ЛЕКЦИЯ 6 ЗАКОН ЗА ИНЕРЦИЯТА Определение. Броят на положителните коефициенти в каноничния вид на дадена квадратична форма се нарича положителен индекс

ЛЕКЦИЯ 6 ЗАКОН ЗА ИНЕРЦИЯТА Определение. Броят на положителните коефициенти в каноничния вид на дадена квадратична форма се нарича положителен индекс ЛЕКЦИЯ 6 ЗАКОН ЗА ИНЕРЦИЯТА Определение. Броят на положителните коефициенти в каноничния вид на дадена квадратична форма се нарича положителен индекс на инерцията на тази квадратична форма. Броят на отрицателните

Подробно

Lush Green

Lush Green Конструктори Жизнен цикъл на обект За обекта се заделя памет и се свързва с неговото име Извиква се подходящ конструктор на обекта... (достъп до компоненти на обект, изпълняване на операции) Достига се

Подробно

Microsoft Word - VM22 SEC66.doc

Microsoft Word - VM22 SEC66.doc Лекция 6 6 Теорема за съществуване и единственост Метричното пространство C [ a b] Нека [ a b] е ограничен затворен интервал и да разгледаме съвкупността на непрекъснатите функции f ( определени в [ a

Подробно

Глава 15 Въпрос 15: Оператор на Рейнолдс. Крайна породеност на пръстена от инвариантни полиноми на крайна матрична група. Навсякъде в настоящия въпрос

Глава 15 Въпрос 15: Оператор на Рейнолдс. Крайна породеност на пръстена от инвариантни полиноми на крайна матрична група. Навсякъде в настоящия въпрос Глава 15 Въпрос 15: Оператор на Рейнолдс. Крайна породеност на пръстена от инвариантни полиноми на крайна матрична група. Навсякъде в настоящия въпрос полето k е с характеристика char(k = 0. За произволни

Подробно

Microsoft Word - PMS sec1212.doc

Microsoft Word - PMS sec1212.doc Лекция Екстремуми Квадратични форми Функцията ϕ ( = ( K се нарича квадратична форма на променливите когато има вида ϕ( = aij i j i j= За коефициентите предполагаме че a ij = a ji i j При = имаме ϕ ( =

Подробно

СОФИЙСКА МАТЕМАТИЧЕСКА ГИМНАЗИЯ ТУРНИР ПО МАТЕМАТИКА И ИНФОРМАТИКА "ЗА ТОРТАТА НА ДИРЕКТОРА" ТЕМА ПО МАТЕМАТИКА 8 КЛАС Задача 1. Да се реши в цели чис

СОФИЙСКА МАТЕМАТИЧЕСКА ГИМНАЗИЯ ТУРНИР ПО МАТЕМАТИКА И ИНФОРМАТИКА ЗА ТОРТАТА НА ДИРЕКТОРА ТЕМА ПО МАТЕМАТИКА 8 КЛАС Задача 1. Да се реши в цели чис СОФИЙСКА МАТЕМАТИЧЕСКА ГИМНАЗИЯ ТУРНИР ПО МАТЕМАТИКА И ИНФОРМАТИКА "ЗА ТОРТАТА НА ДИРЕКТОРА" ТЕМА ПО МАТЕМАТИКА 8 КЛАС Задача 1. Да се реши в цели числа уравнението p( + b) = (5 + b) 2, където p е просто.

Подробно

16. Основни методи за интегриране. Интегриране на някои класове функции Интегриране по части. Теорема 1 (Формула за интегриране по части). Ако

16. Основни методи за интегриране. Интегриране на някои класове функции Интегриране по части. Теорема 1 (Формула за интегриране по части). Ако 6. Основни методи за интегриране. Интегриране на някои класове функции. 6.. Интегриране по части. Теорема (Формула за интегриране по части). Ако функциите f(x) и g(x) садиференцируеми в интервала (a, b)

Подробно

Глава 3 Едномерни стационарни задачи 3.1 Едномерна безкрайна правоъгълна потенциална яма В тази глава ще разгледаме най-простия едномерен потенциал: б

Глава 3 Едномерни стационарни задачи 3.1 Едномерна безкрайна правоъгълна потенциална яма В тази глава ще разгледаме най-простия едномерен потенциал: б Глава 3 Едномерни стационарни задачи 3.1 Едномерна безкрайна правоъгълна потенциална яма В тази глава ще разгледаме най-простия едномерен потенциал: безкрайна правоъгълна потенциална яма. Преди това ще

Подробно

Семинар № 2: Граници на редици, признаци на Даламбер и Коши за сходимост на редове

Семинар № 2: Граници на редици, признаци на Даламбер и Коши за сходимост на редове Семинар 4 / 7 Семинар 4: Производна на неявна функция. Развитие на функция в ред на Тейлър. Правило на Лопитал. Развитие на функция в ред на Тейлър Дефиниция: Нека функцията f() да е дефинирана в някаква

Подробно

Проф

Проф Утвърдил:.. / доц. д-р Е. Великова / Утвърден от Факултетен съвет с протокол... /... СОФИЙСКИ УНИВЕРСИТЕТ СВ. КЛИМЕНТ ОХРИДСКИ Факултет по Математика и Информатика Специалност: Компютърни науки М И К 0

Подробно

Програмиране на Паскал

Програмиране на Паскал Поради връзката на С++ с езика С в голяма част от литературата е прието записването С/С++. Това е найизползваният език за програмиране в света, поради което синтаксисът на някои от по-новите езици като

Подробно

Частично рекурсивни, рекурсивни и примитивно рекурсивни функции. Рекурсивни и рекурсивно номеруеми множества Този текст съдържа някои сведения от теор

Частично рекурсивни, рекурсивни и примитивно рекурсивни функции. Рекурсивни и рекурсивно номеруеми множества Този текст съдържа някои сведения от теор Частично рекурсивни, рекурсивни и примитивно рекурсивни функции. Рекурсивни и рекурсивно номеруеми множества Този текст съдържа някои сведения от теорията на изчислимостта, които ще се предполагат известни

Подробно

Microsoft Word - Sem02_KH_VM2-19.doc

Microsoft Word - Sem02_KH_VM2-19.doc Семинар Действия с матрици. Собствени стойности и собствени вектори на матрици. Привеждане на квадратична форма в каноничен вид. Матрица k всяка правоъгълна таблица от k-реда и -стълба. Квадратна матрица

Подробно

Microsoft Word - nbb2.docx

Microsoft Word - nbb2.docx Коректност на метода на характеристичното уравнение за решаване на линейно-рекурентни уравнения Стефан Фотев Пиша този файл, тъй като не успях да намеря в интернет кратко и ясно обяснение на коректността

Подробно

5

5 4. ОПЕРАТОР ЗА ИЗБОР НА ДАННИ ОТ ТАБЛИЦА За различните видове справки най-често се използва оператор SELECT. Обикновено резултатът от изпълнението му е таблица. Общ вид на оператора 1 : [ DISTINCT ]

Подробно

Microsoft Word - VM-2-7-integrirane-na-racionalni-funkcii-seminar.doc

Microsoft Word - VM-2-7-integrirane-na-racionalni-funkcii-seminar.doc 7. Интегриране на рационални функции Съдържание. Пресмятане на неопределен интеграл от елементарни дроби. Интегриране на правилни рационални функции. Интегриране на неправилни рационални функции ТЕОРИЯ

Подробно

Black and White

Black and White Advanced C++ Memory Management Йордан Димитър Зайков Трендафилов Memory Management Effective C++ 2 nd ed: 3, 5, 7, 8, 9, 10 More Effective C++: 1, 3, 8 Exceptional C++: 35, 36 Какво всъщност прави new?

Подробно

Microsoft Word - IGM-SER1111.doc

Microsoft Word - IGM-SER1111.doc Лекция Редове на Фурие поточкова сходимост Теорема на Дирихле Тук ще разглеждаме -периодична функция ( ) която ще искаме да бъде гладка по части Това означава че интервала ( ) може да се раздели на отделни

Подробно

Класове в C++ (Rev: 742) Любомир Чорбаджиев 1 20 октомври 2006 г. Съдържание Съдържание 1 Обектно-ориентирано програмиране 1

Класове в C++ (Rev: 742) Любомир Чорбаджиев 1 20 октомври 2006 г. Съдържание Съдържание 1 Обектно-ориентирано програмиране 1 Класове в C++ (Rev: 742) Любомир Чорбаджиев 1 lchorbadjiev@elsys-bg.org 20 октомври 2006 г. Съдържание Съдържание 1 Обектно-ориентирано програмиране 1 1.1 Модулност............................ 1 1.2 Обектно-ориентирана

Подробно

Глава 17 ζ-функция на Hasse-Weil. Преди да разгледаме ζ-функцията на Hasse-Weil трябва да въведем някои числови инварианти на крива, определена над кр

Глава 17 ζ-функция на Hasse-Weil. Преди да разгледаме ζ-функцията на Hasse-Weil трябва да въведем някои числови инварианти на крива, определена над кр Глава 7 ζ-функция на Hasse-Weil. Преди да разгледаме ζ-функцията на Hasse-Weil трябва да въведем някои числови инварианти на крива, определена над крайно поле. Лема 7.. Ако F е функционално поле на една

Подробно

Microsoft Word - Lecture 14-Laplace Transform-N.doc

Microsoft Word - Lecture 14-Laplace Transform-N.doc Лекция 4: Интегрално преобразувание на Лаплас 4.. Дефиниция и образи на елементарните функции. Интегралното преобразувание на Лаплас Laplac ranorm се дефинира посредством израза: Λ[ ] преобразувание на

Подробно

Slide 1

Slide 1 Списъци. Структура и синтаксис. Създаване и показване. Основни операции(добавяне, изваждане на елемент или цял подсписък; подреждане). Трансформации. проф. дмн С. Христова Списъци Списъците / list са основна

Подробно