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 3 pośrednich wersji utworzonych przez tego samego użytkownika)
Linia 21: Linia 21:
** historia powstania pojęcia algorytmu,  
** historia powstania pojęcia algorytmu,  
** bliższe spojrzenie na przykładowy algorytm (rozwiązywanie równań kwadratowych metodą Al-Chuwarizmiego),
** 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.
** przykłady algorytmów i języków programowania w otaczającym nas Świecie,
** 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 32: 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.
*** algorytm Euklidesa,
*** metoda Newtona liczenia pierwiastków kwadratowych.


* 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:
Poniżej ''under construction''
** 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.


* Języki formalne:
* Model obliczeń programów funkcyjnych (uproszczona semantyka operacyjna):
** alfabet, składnia i semantyka
** Środowiska i ramki,
** gramatyki bezkontekstowe jako narzędzie definiowania składni
** Semantyka definicji globalnych,
** definiowanie semantyki przez interpretację wyrażeń poprawnych składniowo
** Reprezentacja danych i procedur,
* Reprezentacja liczb w komputerze:
** Aplikacja procedur,
** stałe całkowite i rzeczywiste
** Rekurencja ogonowa,
** reprezentacje binarne stało- i zmiennopozycyjne
** Semantyka definicji lokalnych,
** systemy znak-moduł i uzupełnieniowy
** Odśmiecanie.
** rachunek zmiennopozycyjny — pojęcie zakresu i błędu zaokrągleń
 
* Zmienne i wyrażenia:
* Analiza złożoności:
** typ zmiennej i wartościowanie zmiennych
** rzędy funkcji,  
** wyrażenia arytmetyczne i logiczne: składnia i semantyka
** asymptotyczny koszt pesymistyczny,
* Instrukcje while-programów:
** koszt czasowy i pamięciowy,  
** 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
** koszt zamortyzowany
* Rekurencja:
** przykłady analizy kosztów algorytmów,
** rekurencyjne wyrażanie pojęć
 
** zastosowania i implementacja
* Metoda ''dziel i zwyciężaj'':
** dowodzenie poprawności procedur rekurencyjnych
** metoda inkrementacyjna,
* Programowanie z nawrotami:
** podział binarny,
** przeszukiwanie pełnej przestrzeni stanów
** przykłady: różne algorytmy sortowania,
** ucinanie rekursji
** quick-sort -- przykład analizy kosztu oczekiwanego.
* Metoda ''dziel i rządź'':
 
** metoda inkrementacyjna
* Moduły i funktory:
** podział binarny
** pojęcie modułu i enkapsulacji,
* Dynamiczne struktury danych:
** struktury,
** typy wskaźnikowe
** sygnatury i zależności między strukturami i sygnaturami,
** wskaźnikowa realizacja list
** funktory,
** podstawowe operacje na listach
** funktory wyższych rzędów.
** listy jednokierunkowe, dwukierunkowe i cykliczne
 
** atrapy i strażnicy
* Konstrukcje imperatywne:
* Liniowe struktury danych: stosy i kolejki:
** referencje,
** implementacja tablicowa i listowa
** tablice,
** implementacja grafu za pomocą list sąsiedztwa
** sekwencyjne złożenie instrukcji (<tt>;</tt>),
** algorytmy DFS i BFS
** pętle,
* Drzewa:
** przykłady ilustrujące charakter programowania imperatywnego i jego połączenie z programowaniem funkcyjnym.
** implementacja drzew dowolnego rzędu
 
** drzewa binarne
* Imperatywne wskaźnikowe struktury danych:
** obiegi drzew
** dwustronne kolejki ze scalaniem i odwracaniem,
** konwersja wyrażeń z postaci infiksowej na prefiksową i postfiksową (ONP)
** 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).
 
* 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.