MIMINF:Wstęp do programowania (potok funkcyjny): Różnice pomiędzy wersjami

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
Kubica (dyskusja | edycje)
Kubica (dyskusja | edycje)
 
(Nie pokazano 2 pośrednich wersji utworzonych przez tego samego użytkownika)
Linia 23: Linia 23:
** przykłady algorytmów i języków programowania w otaczającym nas Świecie,  
** przykłady algorytmów i języków programowania w otaczającym nas Świecie,  
** pojęcie dziedziny algorytmicznej.
** pojęcie dziedziny algorytmicznej.
* Podstawy języka programowania:
* Podstawy języka programowania:
** sposób opisu składni języka programowania -- formalizm Backusa-Naura (wariant gramatyk bezkontekstowych dostosowany do praktycznych zastosowań),
** sposób opisu składni języka programowania -- formalizm Backusa-Naura (wariant gramatyk bezkontekstowych dostosowany do praktycznych zastosowań),
Linia 33: Linia 34:
*** rekurencja ogonowa,  
*** rekurencja ogonowa,  
** definicje lokalne.  
** definicje lokalne.  
* Dekompozycja problemu, specyfikacja i weryfikacja programów funkcyjnych:
* Dekompozycja problemu, specyfikacja i weryfikacja programów funkcyjnych:
** warunek początkowy i końcowy,  
** warunek początkowy i końcowy,  
** zasady dowodzenia poprawności,  
** zasady dowodzenia poprawności,  
** dowodzenie poprawności procedur rekurencyjnych:
** dowodzenie poprawności procedur rekurencyjnych:
*** poprawność pełna i częściowa, własność stopu,  
*** funkcja miary dla wywołań rekurencyjnych i własność stopu,  
*** funkcja miary dla wywołań rekurencyjnych,  
*** poprawność pełna i częściowa,  
** przykłady weryfikacji.
** przykłady weryfikacji.
* Typy danych:
* Typy danych:
** proste typy wbudowane,  
** proste typy wbudowane,  
Linia 49: Linia 52:
** typy wariantowe (drzewa),  
** typy wariantowe (drzewa),  
** wyjątki.
** wyjątki.
* Budowanie abstrakcji za pomocą danych:
* Budowanie abstrakcji za pomocą danych:
** .......
** konstruktory, selektory i modyfikatory,
** bariery abstrakcji,
** przykłady.
 
* Procedury wyższych rzędów:
* Procedury wyższych rzędów:
** przykłady,
** przykłady,
Linia 56: Linia 63:
** zastosowania procedur wyższych rzędów.  
** zastosowania procedur wyższych rzędów.  


* Model obliczeń programów funkcyjnych (uproszczona semantyka operacyjna):
** Środowiska i ramki,
** Semantyka definicji globalnych,
** Reprezentacja danych i procedur,
** Aplikacja procedur,
** Rekurencja ogonowa,
** Semantyka definicji lokalnych,
** Odśmiecanie.
* Analiza złożoności:
** rzędy funkcji,
** asymptotyczny koszt pesymistyczny,
** koszt czasowy i pamięciowy,
** koszt zamortyzowany
** przykłady analizy kosztów algorytmów,


----------------------
* Metoda ''dziel i zwyciężaj'':
Poniżej ''under construction''
** metoda inkrementacyjna,
** podział binarny,
** przykłady: różne algorytmy sortowania,
** quick-sort -- przykład analizy kosztu oczekiwanego.


* Moduły i funktory:
** pojęcie modułu i enkapsulacji,
** struktury,
** sygnatury i zależności między strukturami i sygnaturami,
** funktory,
** funktory wyższych rzędów.
* Konstrukcje imperatywne:
** referencje,
** tablice,
** sekwencyjne złożenie instrukcji (<tt>;</tt>),
** pętle,
** przykłady ilustrujące charakter programowania imperatywnego i jego połączenie z programowaniem funkcyjnym.
* Imperatywne wskaźnikowe struktury danych:
** dwustronne kolejki ze scalaniem i odwracaniem,
** drzewa find-union.
* Dowodzenie poprawności programów imperatywnych:
** logika Hoare'a,
** niezmienniki pętli,
** funkcja miary dla pętli <tt>while</tt> i własność stopu,
** częściowa i pełna poprawność programów,
** przykłady weryfikacji.
* Przeszukiwanie przestrzeni rozwiązań:
** przeszukiwanie z nawrotami (ang. ''back-tracking''):
** obcinanie gałęzi przeszukiwania,
** przykłady, w tym:
*** problem ośmiu hetmanów,
*** algorytm mini-max,
*** <math>\alpha</math>-<math>\beta</math>-obcięcie,
** inne sposoby przeszukiwania niż z nawrotami,
** przykład -- drzewa and-or.
* Technika spamiętywania:
** struktury słownikowe i ich przykładowa implementacja,
** spamiętywanie i uniwersalny spamiętywacz,
** przykłady zastosowania.
* Programowanie dynamiczne:
** uogólnienie problemu i tablicowanie wyników,
** przykłady zastosowania (z wykorzystaniem różnych struktur danych do tablicowania).


* Zmienne i wyrażenia:
** typ zmiennej i wartościowanie zmiennych
** wyrażenia arytmetyczne i logiczne: składnia i semantyka
* Instrukcje while-programów:
** pusta, przypisania, warunkowa, iteracji, wyboru, czytania, pisania, wywołania procedury
** składnia i semantyka powyższych instrukcji
** obliczenia skończone i nieskończone
** błędy obliczeń
** przykłady algorytmów
* Asercje w programach i niezmienniki pętli:
** formuły Hoare'a
** uzasadnianie poprawności programów
** własność stopu i metody jej dowodzenia
* Typy danych:
** tablice
** rekordy
** zbiory
** pliki
** typy wyliczeniowe i okrojone
** typy wskaźnikowe
* Pliki:
** pliki o dostępie bezpośrednim
** pliki tekstowe
* Funkcje i procedury:
** składnia i semantyka
** sposoby przekazywania parametrów: przez wartość i przez zmienną
** widoczność zmiennych w zagnieżdżonych procedurach
* Miary złożoności algorytmów:
** koszty algorytmu: czasowy i pamięciowy, pesymistyczny i średni
** rozmiar danych
** przykłady wyznaczania kosztów
** koszt zamortyzowany
* Rekurencja:
** rekurencyjne wyrażanie pojęć
** zastosowania i implementacja
** dowodzenie poprawności procedur rekurencyjnych
* Programowanie z nawrotami:
** przeszukiwanie pełnej przestrzeni stanów
** ucinanie rekursji
* Metoda ''dziel i rządź'':
** metoda inkrementacyjna
** podział binarny
* Dynamiczne struktury danych:
** typy wskaźnikowe
** wskaźnikowa realizacja list
** podstawowe operacje na listach
** listy jednokierunkowe, dwukierunkowe i cykliczne
** atrapy i strażnicy
* Liniowe struktury danych: stosy i kolejki:
** implementacja tablicowa i listowa
** implementacja grafu za pomocą list sąsiedztwa
** algorytmy DFS i BFS
* Drzewa:
** implementacja drzew dowolnego rzędu
** drzewa binarne
** obiegi drzew
** konwersja wyrażeń z postaci infiksowej na prefiksową i postfiksową (ONP)
* Programowanie zachłanne:
* Programowanie zachłanne:
** algorytm Huffmana
** zasada programowania zachłannego,
* Metoda spamiętywania:
** przykłady (w tym kody Huffmana).
** programowanie dynamiczne
 
** problem plecakowy
Opcjonalne zaawansowane wykłady ("na deser"):
** optymalne mnożenie wielu macierzy
 
* Wyszukiwanie i algorytm Knutha-Morrisa-Pratta (KMP):
** naiwny algorytm wyszukiwania wzorca,
** algorytm KMP,
** zastosowanie algorytmu KMP do wyszukiwania wzorców.
 
* Procedury dużo wyższych rzędów:
** odraczanie (uleniwianie) obliczeń,
** proceduralna definicja różnych typów danych,
** liczby naturalne Churcha.
 
* Strumienie:
** pojęcie strumienia,
** implementacja strumieni,
** procedury przekształcające strumienie,
** przykłady strumieni,
** definicje uwikładne strumieni,
** przykłady.


=== Literatura ===
=== Literatura ===
# S.Alagić, M.Arbib, ''Projektowanie programów poprawnych i dobrze zbudowanych'', Wydawnictwa Naukowo - Techniczne 1982
# H. Abelson, G. J. Sussman, ''Struktura i interpretacja programów komputerowych'', WNT 2002.
# L. Banachowski, A.Kreczmar, ''Elementy analizy algorytmów'', Wydawnictwa Naukowo - Techniczne 1987
# L. Banachowski, A. Kreczmar, ''Elementy analizy algorytmów'', WNT 1987.
# T.H.Cormen, Ch.E.Leiserson, R.L.Rivest, ''Wprowadzenie do algorytmiki'', Wydawnictwa Naukowo-Techniczne, Warszawa 2004.
# T. H. Cormen, Ch. E. Leiserson, R. L. Rivest, ''Wprowadzenie do algorytmiki'', WNT 2004.
# D.E.Knuth, ''Sztuka programowania komputerów tom 3'', Wydawnictwa Naukowo-Techniczne, Warszawa 2002.
# M. Kubica, ''Wstęp do programowania i Metody programowania'', notatki do wykładów, [http://www.mimuw.edu.pl/~kubica/wpf/wpf.ps]
# N.Wirth, ''Wstęp do programowania systematycznego'', Wydawnictwa Naukowo - Techniczne 1999.
# X. Leroy, ''The Objective Caml system'', [http://caml.inria.fr/pub/docs/manual-ocaml/index.html].
# N.Wirth, ''Algorytmy+Struktury danych=Programy'', Wydawnictwa Naukowo-Techniczne, Warszawa 2001.
# W. Lipski, ''Kombinatoryka dla programistów'', WNT 2004.
# N. Wirth, ''Algorytmy+Struktury danych=Programy'', WNT 2001.

Aktualna wersja na dzień 14:58, 26 paź 2006

Forma zajęć

Wykład (60 godzin) + ćwiczenia (60 godzin) + laboratorium (30 godzin)

Opis

Jest to podstawowy przedmiot wprowadzający w dziedzinę informatyki. Poświęcony jest on głównie programowaniu i podstawom tworzenia algorytmów. Kurs obejmuje:

  • podstawowe pojęcia, takie jak: algorytm, program, specyfikacja, weryfikacja,
  • zasady projektowania i tworzenia algorytmów: zasady abstrakcji, dekompozycji problemów,
  • podstawy wnioskowania o programach: weryfikacja programów, analiza złożoności programów,
  • podstawowe struktury danych,
  • techniki tworzenia algorytmów: dziel i zwyciężaj, programowanie zachłanne, dynamiczne i przeszukiwanie z nawrotami.

Całości towarzyszy nauka wybranego funkcyjnego języka programowania (Ocaml).

Sylabus

Autor

  • Marcin Kubica — Uniwersytet Warszawski, Instytut Informatyki

Zawartość

  • Pojęcie algorytmu:
    • historia powstania pojęcia algorytmu,
    • bliższe spojrzenie na przykładowy algorytm (rozwiązywanie równań kwadratowych metodą Al-Chuwarizmiego),
    • przykłady algorytmów i języków programowania w otaczającym nas Świecie,
    • pojęcie dziedziny algorytmicznej.
  • Podstawy języka programowania:
    • sposób opisu składni języka programowania -- formalizm Backusa-Naura (wariant gramatyk bezkontekstowych dostosowany do praktycznych zastosowań),
    • przyrostowy tryb pracy kompilatora,
    • wyrażenia i sposób ich obliczania,
    • wartości logiczne i wyrażenia warunkowe if-then-else,
    • definicje procedur:
      • λ-abstrakcja,
      • procedury rekurencyjne,
      • rekurencja ogonowa,
    • definicje lokalne.
  • Dekompozycja problemu, specyfikacja i weryfikacja programów funkcyjnych:
    • warunek początkowy i końcowy,
    • zasady dowodzenia poprawności,
    • dowodzenie poprawności procedur rekurencyjnych:
      • funkcja miary dla wywołań rekurencyjnych i własność stopu,
      • poprawność pełna i częściowa,
    • przykłady weryfikacji.
  • Typy danych:
    • proste typy wbudowane,
    • konstruktory i wzorce,
    • produkty kartezjańskie,
    • listy,
    • deklaracje typów,
    • rekordy,
    • typy wariantowe (drzewa),
    • wyjątki.
  • Budowanie abstrakcji za pomocą danych:
    • konstruktory, selektory i modyfikatory,
    • bariery abstrakcji,
    • przykłady.
  • Procedury wyższych rzędów:
    • przykłady,
    • procedury wyższych rzędów i listy,
    • zastosowania procedur wyższych rzędów.
  • Model obliczeń programów funkcyjnych (uproszczona semantyka operacyjna):
    • Środowiska i ramki,
    • Semantyka definicji globalnych,
    • Reprezentacja danych i procedur,
    • Aplikacja procedur,
    • Rekurencja ogonowa,
    • Semantyka definicji lokalnych,
    • Odśmiecanie.
  • Analiza złożoności:
    • rzędy funkcji,
    • asymptotyczny koszt pesymistyczny,
    • koszt czasowy i pamięciowy,
    • koszt zamortyzowany
    • przykłady analizy kosztów algorytmów,
  • Metoda dziel i zwyciężaj:
    • metoda inkrementacyjna,
    • podział binarny,
    • przykłady: różne algorytmy sortowania,
    • quick-sort -- przykład analizy kosztu oczekiwanego.
  • Moduły i funktory:
    • pojęcie modułu i enkapsulacji,
    • struktury,
    • sygnatury i zależności między strukturami i sygnaturami,
    • funktory,
    • funktory wyższych rzędów.
  • Konstrukcje imperatywne:
    • referencje,
    • tablice,
    • sekwencyjne złożenie instrukcji (;),
    • pętle,
    • przykłady ilustrujące charakter programowania imperatywnego i jego połączenie z programowaniem funkcyjnym.
  • Imperatywne wskaźnikowe struktury danych:
    • dwustronne kolejki ze scalaniem i odwracaniem,
    • drzewa find-union.
  • Dowodzenie poprawności programów imperatywnych:
    • logika Hoare'a,
    • niezmienniki pętli,
    • funkcja miary dla pętli while i własność stopu,
    • częściowa i pełna poprawność programów,
    • przykłady weryfikacji.
  • Przeszukiwanie przestrzeni rozwiązań:
    • przeszukiwanie z nawrotami (ang. back-tracking):
    • obcinanie gałęzi przeszukiwania,
    • przykłady, w tym:
      • problem ośmiu hetmanów,
      • algorytm mini-max,
      • α-β-obcięcie,
    • inne sposoby przeszukiwania niż z nawrotami,
    • przykład -- drzewa and-or.
  • Technika spamiętywania:
    • struktury słownikowe i ich przykładowa implementacja,
    • spamiętywanie i uniwersalny spamiętywacz,
    • przykłady zastosowania.
  • Programowanie dynamiczne:
    • uogólnienie problemu i tablicowanie wyników,
    • przykłady zastosowania (z wykorzystaniem różnych struktur danych do tablicowania).
  • Programowanie zachłanne:
    • zasada programowania zachłannego,
    • przykłady (w tym kody Huffmana).

Opcjonalne zaawansowane wykłady ("na deser"):

  • Wyszukiwanie i algorytm Knutha-Morrisa-Pratta (KMP):
    • naiwny algorytm wyszukiwania wzorca,
    • algorytm KMP,
    • zastosowanie algorytmu KMP do wyszukiwania wzorców.
  • Procedury dużo wyższych rzędów:
    • odraczanie (uleniwianie) obliczeń,
    • proceduralna definicja różnych typów danych,
    • liczby naturalne Churcha.
  • Strumienie:
    • pojęcie strumienia,
    • implementacja strumieni,
    • procedury przekształcające strumienie,
    • przykłady strumieni,
    • definicje uwikładne strumieni,
    • przykłady.

Literatura

  1. H. Abelson, G. J. Sussman, Struktura i interpretacja programów komputerowych, WNT 2002.
  2. L. Banachowski, A. Kreczmar, Elementy analizy algorytmów, WNT 1987.
  3. T. H. Cormen, Ch. E. Leiserson, R. L. Rivest, Wprowadzenie do algorytmiki, WNT 2004.
  4. M. Kubica, Wstęp do programowania i Metody programowania, notatki do wykładów, [1]
  5. X. Leroy, The Objective Caml system, [2].
  6. W. Lipski, Kombinatoryka dla programistów, WNT 2004.
  7. N. Wirth, Algorytmy+Struktury danych=Programy, WNT 2001.