PARADYGMATY I JĘZYKI PROGRAMOWANIA. Programowanie funkcyjne (w- 9)
|
|
- Nina Wysocka
- 8 lat temu
- Przeglądów:
Transkrypt
1 PARADYGMATY I JĘZYKI PROGRAMOWANIA Programowanie funkcyjne ()
2 Zagadnienia 2 Wstęp Rachunek lambda i programowanie funkcjonalne (Podstawa: An introduc/on to func/onal programming through lambda calculus. Greg Michaelson.) Podsumowanie
3 Entscheidungsproblem 3 Historia XX wiek GoTried Wilhelm Leibniz ( ) ( ) David Hilbert: Czy istnieje algorytm, który w ramach danego języka formalnego pozwoli udowodnić prawdziwość lub fałszywość zdań wywiedzionych z tego języka? Kurt Goedel: W aksjomatycznej niesprzecznej teorii matematycznej zawierającej pojęcie liczb ( ) naturalnych da się sformułować takie zdanie, którego w ramach tej teorii nie da się ani udowodnić, ani obalić.
4 Entscheidungsproblem 4 Dowód... W latach 1936 i 1937 Alonzo Church i Alan Turing w niezależnie opublikowanych pracach pokazali, że problem decyzyjny Hilberta nie posiada ogólnego rozwiązania. Church: rachunek lambda (λ) Turing: maszyna Turinga Obie teorie (Churcha i Turinga) miały i mają dominujący wpływ na rozwój informatyki i teorii obliczania ( ) ( )
5 Porównanie języków i/f 5 Języki imperatywne oparte na ciągu przypisań ta sama nazwa może być związana z wieloma wartościami ustalony porządek obliczeń wartości związane z nazwą są nadawane przez powtarzanie poleceń... Języki funkcyjne oparte na zagnieżdżonych wywołaniach funkcji nazwa może być związana tylko z jedną wartością porządek obliczeń nie ma znaczenia nowe nazwy wiązane są z nowymi wartościami poprzez rekurencyjne wywołania funkcji dostarczają jawnych reprezentacji struktur danych funkcje są wartościami oparte na logice matematycznej, teorii obliczeń, teorii funkcji rekurencyjnych, rachunku λ
6 6 Rachunek λ - podstawy
7 Rachunek λ podstawy 7 Rachunek lambda jest teorią funkcji jako formuł system operowania funkcjami, wyrażeniami <wyrażenie> := <nazwa> <funkcja> <obliczanie> <funkcja> := λ<nazwa>. <wyrażenie> <nazwa> - zmienna związana (podobna do parametru formalnego w deklaracji funkcji w językach imperatywnych). Kropka. oddziela zmienną związaną od wyrażenia, w którym nazwa jest używana. Jest to ciało funkcji może być wyrażeniem lambda. Funkcja nie ma nazwy! <obliczanie> := (<wyrażenie_fun> <wyrażenie_arg>) zastosowanie funkcji do wyrażenia, argumentu. Przykład: (λx.x λa.λb.b)
8 Najmniejszy język funkcjonalny Definicja w zapisie BNF <λ - term> := <variable> λ <variable>. <λ - term> ( <λ - term> <λ - term> ) <variable> := x y z Lub w zwarty sposób: E := V λ V.E (E1 E2 ) V : = x y z gdzie V jest dowolną zmienną a E jest dowolnym λ- wyrażeniem. λv nazywamy głową λ- wyrażenia a E ciałem.
9 Rachunek λ podstawy 9 Obliczanie, dwa rodzaje W obu wypadkach najpierw obliczane jest wyrażenie funkcyjne w celu zwrócenia funkcji Sposoby obliczania zmienna związana w ciele funkcji jest zastępowana przez wartość wyrażenia (argument) tryb aplikacyjny (w Pascalu wywołanie przez wartość) zmienna związana w ciele funkcji jest zastępowana przez nieobliczone wyrażenie tryb normalny (w Algolu wywołanie przez nazwę) Na końcu obliczane jest ciało funkcji Tryb normalny jest wygodny, lecz może być mniej efektywny
10 Funkcje w różnych zapisach Teoria zbiorów: {(x,y) x,y N : y = x 2 } Algebra: f : N->N f(x) = x 2 ; λ- notacja bez typów: (λx.x*x) Typowana notacja λ: (λx:int.x * x) Polimorficzna notacja λ: (λx:α.x*x) LISP: (defun square(x) (* x x))) Scheme: (define square (lambda (x) (* x x))) Fortran function square(x) square=x*x end K & R C: square(x) int x; { return (x*x); } Algol60: integer procedure square(x); integer x; begin square := x*x end; Pascal: function square (x:integer) : integer; begin square := x*x end; ANSI C/C++ & Java: int square(int x) { return (x * x); } ML97: fun square x = x * x; fun square (x:int) = x * x; val square = fn x => x * x; Haskell: square :: Integer->Integer square x = x * x map (\x -> x * x) [1,2,3,4,5] [(x,y) x <- [0..], y <- [x * x]]
11 Funkcje 11 Funkcje matematyczne: f: X -> X; f. identycznościowa; X dowolny zbiór g: x -> x 2 ; (dziedzina, przeciwdziedzina zbiór wartości) h: x -> e x! λx.x funkcja identycznościowa; λx.x 2 ; λx.e x ; etc. Zastosujmy funkcję identycznościową do siebie samej: (λx.x λx.x). Tutaj λx.x jest zastosowana do argumentu λx.x. Podczas obliczania wyrażenia zmienna związana x w wyrażeniu funkcyjnym λx.x jest zastępowana przez wyrażenie- argument λx.x w ciele funkcji x, dając λx.x, czyli to samo Funkcje samoobliczalne. Weźmy funkcję λs.(s s) jej ciało (s s) jest obliczaniem funkcji s na argumencie s. Zastosujmy λx.x do tej funkcji: (λx.x λs.(s s)) -> λs.(s s). Zastosowanie λs.(s s) do λx.x: (λs.(s s) λx.x) -> (λx.x λx.x) - > λx.x. Dalej: (λs.(s s) λs.(s s)) -> (λs.(s s) λs.(s s)) ->...->(λs.(s s) λs.(s s)) proces nieskończony Funkcje te można wykorzystać do budowy funkcji rekurencyjnych
12 Funkcja obliczania funkcji 12 λfun.λarg.(fun arg) zastosowanie tej funkcji zwraca funkcję, która stosuje pierwszy argument do drugiego... Np. użyjemy tej funkcji by zastosować funkcję identycznościową do funkcji samoobliczalnej λs.(s s): ((λfun.λarg.(fun arg) λx.x) λs.(s s)) -> (λarg.(λx.x arg) λs.(s s)) -> (λx.x λs.(s s)) -> λs.(s s)! Inny zapis dla ułatwienia redukcji: def id = λx.x! def self_apply = λs.(s s)! def apply = λfun.λarg.(fun arg)! (<nazwa> <argument>) == (<funkcja> <argument>)! (<funkcja> argument>) => <wyrażenie>!
13 Funkcje z funkcji 13 Inna funkcja identycznościowa def id2 = λx.((apply id) x); (id2 id) == (λx.((apply id) x) id) => ((apply id) id) => ((λfunc.λarg.(func arg) id) => (λarg.(id arg) id) => (id id) =>... => id! id i id2 są równoważne. Załóżmy, że arg oznacza dowolne wyrażenie. Mamy (id2 arg) == (λx.((apply id) x) arg) =>( (apply id) arg) => (id arg) =>...=> arg!
14 Funkcje z funkcji 14 Funkcja obliczania funkcji... Oznaczmy przez <funct> dowolną funkcję (apply <funct>) = = (λf.λa.(f a) <funct>) => λa.(<funct> a) i zastosujmy do <arg> (λa.(<funct> a) <arg>) => (<funct> <arg>) czyli (apply <funct>) działa jak oryginalna <funct>! def self_apply2 = λs.((apply s) s)! Pokazać, że self_apply2 jest równoważna self_apply.
15 Wybór pierwszego argumentu 15 def select_first = λfirst.λsecond.first Funkcja ta ma związaną zmienną first i ciało λsecond.first; zastosowanie jej do argumentu zwraca funkcję, która zastosowana do innego, dowolnego argumentu zwraca argument pierwszy, np. ((select_first id) coś) == ((λfirst.λsecond.first id) coś) => (λsecond id) coś) => id! ((select_first <arg1>) arg2) == ((λfirst.λsecond.first <arg1>) <arg2>) => (λsecond.<arg1> <arg2>) => <arg1>!
16 Wybór drugiego argumentu 16 def select_second = λfirst.λsecond.second Związana zmienna: first; Ciało: λsecond.second identyczność Mamy więc ((select_second id) apply) == ((λfirst.λsecond.second id) apply) => (λsecond.second, apply) => apply dla dowolnych <arg1>, <arg2>: ((select_second <arg1>) <arg2>) == ((λfirst.λsecond.second <arg1>) <arg2>) => (λsecond.second <arg2>) => <arg2>!
17 Funkcje select 17 select_second zwraca jedynkę (select_second <byleco>) == (λfirst.λsecond.second <byleco>) => λsecond.second == id! Dalej (select_first id) => id Pokazać.
18 Tworzenie pary, wybieranie elementów pary 18 Poniższa funkcja zachowuje się jak para: def make_pair = = λfirst.λsecond.λfunc.((func first) second) Zmienna związana: first Zauważmy, że argumenty first i second są aplikowane przed func! dając λfunc.((func first) second) Funkcja zastosowana do select_first wybiera argument pierwszy, a zastosowana do select_second, argument drugi. Mamy więc możliwość wybierania elementów (((make_pair <arg1>) <arg2>) select_first) => <arg1> (((make_pair <arg1>) <arg2>) select_second) => <arg2>!
19 19 Wyrażenie logiczne, liczby naturalne
20 Wyrażenia logiczne 20 Logika boolowska opiera sie na wartościach TRUE i FALSE i operacjach NOT, AND, OR itd. W wyrażeniu (np. w języku C) <warunek>? <wyrażenie> : <wyrażenie> wybierane jest pierwsze wyrażenie gdy warunek jest prawdą i drugie gdy warunek jest fałszem Wyrażenia warunkowe można modelować za pomocą wersji make_pair - funkcji tworzenia par : def cond = λe1.λe2.λc.((c e1) e2)! Łatwo sprawdzić (patrz: następna strona), że ((cond <expr1>) <expr2>) => λc.((c <expr1>) <expr2>) Stosując to do select_first dostaniemy: (λc.((c <expr1>) <expr2>) select_first) =>...=> <expr1> Zastosowanie cond do select_second daje: (λc.((c <expr1>) <expr2>) select_second) =>...=> <expr2>!
21 Wyrażenia logiczne 21 Sprawdzenia (z poprzedniej strony; <wyr> = wyrażenie) ((cond <wyr1>) <wyr2>) ==((λe1.λe2.λc.((c e1) e2) <wyr1>) <wyr2>) =>λe2.λc((c <wyr1>) e2) <wyr2>) =>λc.((c <wyr1>) <wyr2>)! Stosując tę funkcję do select_first otrzymamy: (λc.((c <wyr1>) <wyr2>) select_first) =>((select_first <wyr1>) <wyr2>) =>...=> <wyr1> Zastosowanie do select_second prowadzi do: (λc.((c <wyr1>) <wyr2>) select_second) => <wyr2>! Operacje logiczne możemy modelować, definiując wartości true i false:!def true = select_first!def false = select_second!
22 Wyrażenia logiczne - NOT 22 NOT jest operatorem jednoargumentowym: NOT <operand>! def not = λx.(((cond false) true) x) Sprawdźmy działanie. Wnętrze: X NOT X FALSE TRUE TRUE FALSE X? FALSE : TRUE (((cond false) true) x) == (((cond λe2.λc.((c e1) e2) false) true) x) => ((λe2.λc.((c false) e2) true) x) => (λc.((c false) true) x) => ((x false) true)! Uproszczona definicja NOT jest więc: def not = λx.((x false) true) Sprawdzenie NOT TRUE : (not true) == (λx.((x false) true) true) => ((true false) true) == ((λfirst. λsecond.first false) true) => (λsecond.false true) => false Podobnie NOT FALSE ((not false) == ((λx.((x false) true) false) => (λsecond.false true) => true!
23 Wyrażenia logiczne - AND 23 AND Jeśli X jest TRUE to wynikiem X AND Y jest drugi argument, a jeśli X jest FALSE to wynikiem jest FALSE. X Y X AND Y FALSE FALSE FALSE FALSE TRUE FALSE TRUE FALSE FALSE TRUE TRUE TRUE X? Y : FALSE Reguła działania selektorów: jeśli lewy operand == TRUE to wybieramy prawy operand jako wynik, a jeśli lewy operand == FALSE wybieramy lewy
24 Wyrażenia logiczne - AND 24 Definicja def and = λx.λy.(((cond y) false) y)! Uproszczenie ciała funkcji wewnętrznej (((cond y) false) x) == (((λe1.λe2.λc.((c e1) e2) y) false) x) => ((λe2.λc.((c y) e2) false) x) => (λc.((c y) false) x) => ((x y) false)! Definicja AND po uproszczeniu: def and = λx.λx.((x y) false)! Sprawdzenie, np. TRUE AND FALSE : ((and true) false) == ((λx.λy.((x y) false) true) false) => (λy.((true y) false) false) => ((true false) false) => ((λfirst. λsecond.first false) false) => (λsecond.false) false) => false
25 Wyrażenia logiczne - OR 25 OR Jeśli pierwszym operandem jest TRUE to wynik jest TRUE; w innym przypadku wynikiem jest drugi operand Definicja def or = λx.λy.(((cond true) y) x)! Uproszczenie (((cond true) y) x) == (((λe1.λe2.λc.((c e1) e2) true) y x) => ((λe2.λc.((c true) e2) y) x) => (λc.((c true) y) x) ((x true) y)! X Y X OR Y FALSE FALSE FALSE FALSE TRUE TRUE TRUE FALSE TRUE TRUE TRUE TRUE X? TRUE : Y Nowa definicja def or = λx.λy.((x true) y)! Sprawdzić poprawność definicji z tabelką prawdy, tzn. obliczyć: ((or false) true), ((or false), false), itd.
26 Wyrażenia logiczne, podsumowanie 26 NOT def not = λx.((x false) true)! AND OR def and = λx.λy.((x y) false) def or = λx.λy.((x true) y)
27 Wyrażenia logiczne, liczby całkowite 27 Liczby całkowite. Jak reprezentować jawnie liczby całkowite? Oprzemy się na stwierdzeniu, że są one następnikami zera: 1 = następnik 0 2 = następnik 1 = następnik następnika 0 3 = następnik 2 = nastepnik następnika następnika 0 itd. Potrzebujemy funkcji reprezentującej zero oraz funkcji następnika: succ takich, że: def one = (succ zero) def two = (succ one) itd.
28 Wyrażenia logiczne, liczby całkowite 28 Zero możemy reprezentować np. przez id: def zero = id natomiast succ przez: def succ = λn.λs.((s false) n) Za każdym razem gdy zastosujemy succ do liczby n otrzymamy parę funkcji gdzie false jest pierwsza i następnie jest liczba n! one == (succ zero) == λn.λs((s false) n) zero) => λs.((s false) zero)! two == (succ one) == (λn.λs.((s false) n) one) => λs.((s false) one) == λs.((s false) λs.((s false) zero))! three = (succ two) == (λn.λs.((s false) n) two) => λs.((s false) two) == λs.((s false) λs.((s false) one) == λs.((s false) λs.((s false) λs.((s false) zero)))! itd. (Zadanie: Wypisać wyrażenia dla four, five)
29 Wyrażenia logiczne, liczby całkowite 29 Można zdefiniować funkcję iszero, która sprawdza, czy liczba jest zerem i zwraca true lub false; np. λs.((s false) <number>). Jeśli argumentem jest select_first to wybierane jest false (Pamiętamy, że liczba jest funkcją z argumentem, który może być użyty jako selektor) (λs.((s false) <number>) select_first) => ((select_first false) <number>) == ((λfirst.λsecond.first false) <number>) => (λsecond.false <number>) => false!
30 Wyrażenia logiczne, liczby całkowite 30 Jeśli zastosujemy zero (identyczność) do select_first to zostanie zwrócona wartość select_first, która jest z definicji równa true (zero select_first) == (λx.x select_first) => select_first == true! To sugeruje definicję def iszero = λn.(n select_first)!
31 Podsumowanie def id x = x def self_apply s = s s def apply func = λarg.(func arg) def apply func arg = func arg def select_first first = λsecond.first def select_first first second = first def select_second first = λsecond.second def select_second first second = second def make_pair e1 = λe2.λc.(c e1 e2) def make_pair e1 e2 = λc.(c e1 e2) def make_pair e1 e2 c = c e1 e2 def cond e1 e2 c = c e1 e2 def true first second = first def false first second = second def not x = x false true def and x y = x y false def or x y = x true y Inne funkcje tworzy się podobnie.
32 Nowy zapis Dla pewnych funkcji mamy standardowy, równoważny zapis, np. zamiast cond <wyr_prawdy> <wyr_fałszu> <warunek> piszemy if <warunek> then <wyr_prawdy> else <wyr_fałszu>! Zapiszemy więc, np. dla not def not x = if x then false else true! dla and: def and x y = if x then y else false! i dla or: def or x y = if x then true else y! itd
33 Rekurencja 33 Jak używana jest rekurencja w programowaniu funkcyjnym? W językach funkcyjnych programy oparte są na strukturalnie zagnieżdżonych wywołaniach funkcji Powtarzanie opiera się na rekurencji: definiowaniu czegoś przez to samo Należy rozróżniać prostą rekurencję gdzie znamy liczbę powtórzeń od rekurencji ogólnej gdzie liczba powtórzeń nie jest znana Przykład. Dodawanie dwu liczb poprzez zwiększanie jednej z nich i jednoczesne zmniejszanie drugiej do momentu aż stanie się zerem def add x y = if iszero y then x else add (succ x) (pred y)
34 Operacje arytmetyczne 34 Potęgowanie (naturalne) Potęgi liczb naturalnych oblicza się przez mnożenie liczby potęgowanej przez siebie, zmniejszenie wykładnika o jeden, i dalsze powtarzanie mnożenia otrzymanego wyniku przez liczbę potęgowaną aż do momentu gdy wykładnik będzie zerem, a więc potęga będzie jedynką. Funkcja potęgowania jest postaci rec power x y = if iszero y then one else mult x (power x (pred y))
35 Potęgowanie. Przykład 35 power two three =>... => mult two (power two (pred three)) ->... -> mult two (mult two mult two (power two (pred (pred three)))) ->... -> (mult two (mult two (power two (pred (pred (pred three)))))) ->... -> mult two (mult two mult two (mult two one)) ->... -> (mult two two) ->... -> mult two four =>... => eight
36 Odejmowanie 36 Różnicę dwu liczb naturalnych znajdziemy, powtarzając obliczenia dla różnicy obu zmniejszonych o jeden liczb. Jeśli w kolejnym kroku pierwsza z liczb stanie się zerem to druga będzie szukaną różnicą rec sub x y = if iszero y then x else sub (pred x) (pred y) Policzyć dla wprawy sub four two => 2 Uwaga: sub zwraca zero dla x<y.
37 Dzielenie 37 Problem dzielenia przez zero Dla niezerowego dzielnika zliczamy ile razy można go odjąć od dzielnej aż do momentu gdy dzielna będzie mniejsza od dzielnika rec div1 x y = if greater y x then zero else succ (div1 (sub x y) y) def div x y = if iszero y then zero else div1 x y Pokazać, że div seven three => 2
38 itd. 38 Typy; reprezentacja Sprawdzanie typów Listy i operacje na listach Napisy (strings) Struktury bardziej złożone; drzewa Leniwe obliczanie... Języki SCHEME ML LISP...
39 Przykład: przekazanie przez wartość 39 (λx.λf.f(succ x))(λz.(λg.(λy.(add (mul (g y) x)) z)))) (λz.(add z 3)) 5) => (λx.λf.f(succ x))(λz.(λg.(λy.(add (mul (g y) x)) z)))) (add 5 3) => (λx.λf.f(succ x))(λz.(λg.(λy.(add (mul (g y) x)) z)))) 8 => (λf.f(succ 8))(λz.(λg.(λy.(add (mul (g y) 8))) z)) => (λz.(λg.(λy.(add (mul (g y) 8))) z)) (succ 8) => (λz.(λg.(λy.(add (mul (g y) 8))) z)) 9 => (λg.(λy.(add (mul (g y) 8))) 9) Redukcję argumentu ((λz.(add z 3)) 5) należy traktować jak optymizację ponieważ przekazana została wartość, a nie wyrażenie, które byłoby obliczane dwukrotnie w ciele funkcji. Wyrażenie końcowe (jeszcze nie zredukowane do postaci normalnej) zawiera wywołania przez wartość.
40 Konstrukcja list 40 Funkcja parowania: pair def pair = λa.λb.λf.f a b Funkcje selekcji elementów head i tail def head = λg.g(λa.λb.a) def tail = λg.g(λa.λb.b)
41 Konstrukcja list 41 Sprawdzenie poprawności funkcji head (pair p q) head(pair p q) => => (λg.g (λa.λb.a))((λa.λb.λf.f a b) p q) => ((λa.λb.λf.f a b) p q) (λa.λb. a) => ((λb.λf.f p b) q)(λa.λb.a) => (λf.f p q)(λa.λb.a) => (λa.λb.a) p q => (λb.p) q => p Zadanie. Sprawdzić poprawność funkcji tail
42 Konstrukcja list 42 Funkcja pair wystarcza do konstruowania dowolnie długich list (podobnie jak cons w LISP). Zdefiniujmy stałą specjalną nil def nil = λx.λa.λb.a Listę [1,2,3,4] można zbudować następująco: def [1,2,3,4] = pair 1 (pair 2 (pair 3 (pair 4 nil))) Kombinacje selektorów head i tail pozwalają wybierać dowolne elementy z listy. Np. head(tail (tail [1,2,3,4])) => 3
43 Języki funkcyjne 43 Wszystkie języki funkcyjne są w pewnym sensie syntaktyczną odmianą rachunku lambda Podstawową operacją we wszystkich językach funkcyjnych jest budowa funkcji abstrakcji lambda i ich obliczanie Nazywanie funkcji ułatwia zapis (czytelność) lukier składniowy Podstawą powtarzania obliczeń jest rekurencja Większość języków funkcyjnych używa zakresów statycznych, leksykalnych (bloki) Wyrażenie let lub where pozwala zastąpić konstrukcję lambda i jej aplikację. Np. let x=6 in (add x 5) oznacza (λx.(add x 5)) 6 lub (add x 5) where x=6 też oznacza to samo
44 Redukcje α, β, η, δ 44 red- α: pozwala zamieniać zmienne związane w wyrażeniu lambda na inne zmienne λv.e => α λw.e[v->w] red- β: przekazanie argumentu (wyrażenia) do funkcji (λv.e)e 1 => β E[v->E 1 ] red- η: Jeśli v jest zmienną, a E wyrażeniem i v nie występuje w E to (nie stosuje się do E reprezentujących stałe) λv.(e v) => η E red- δ: w rachunku lambda ze stałymi reguły redukcji związane z tymi stałymi i funkcjami noszą nazwę reguł delta Wyrażenie lambda jest w postaci normalnej jeśli nie daje się redukować beta lub delta. Wyrażenie nie zawiera nieobliczonych funkcji
45 Listy LISTA nil jest listą cons h t jest listą (h head, t tail; głowa i ogon) jeśli h jest dowolnym obiektem i t jest listą cons jest tradycyjną nazwą konstruktora list cons 4 nil lista, w której head=4, a tail=nil head cons h t => h; head nil => error tail cons h t => t; tail nil => error def HEAD L = if islist L then (value L) select_first else LIST_ERROR def TAIL L = if islist L then (value L) select_second else LIST_ERROR
46 Długość listy 46 Funkcja obliczania długości listy (rekurencja) LENGTH nil = 0 LENGTH (CONS H T) = SUCC (LENGTH T) Przykład definicja rec LENGTH L = IF ISNIL L THEN 0 ELSE SUCC (LENGTH (TAIL L)) LENGTH (CONS 1 (CONS 2 (CONS 3 NIL))) - >... - > SUCC (LENGTH (CONS 2 (CONS 3 NIL))) - >... - > SUCC (SUCC (LENGTH (CONS 3 NIL))) - >... - > SUCC (SUCC (SUCC (LENGTH NIL))) - >... - > SUCC (SUCC (SUCC 0))) == 3
47 Dodawanie elementów append 47 Dodawanie elementów do listy APPEND NIL L = L APPEND (CONS H T) L = CONS H (APPEND T L) Przykład definicja rec APPEND L1 L2 = IF ISNIL L1 THEN L2 ELSE CONS (HEAD L1) (APPEND (TAIL L1) L2) APPEND (CONS 1 (CONS 2 NIL)) (CONS 3 (CONS 4 NIL)) - >... - > CONS 1 (APPEND (CONS 2 NIL) (CONS 3 (CONS 4 NIL))) - >... - > CONS 1 (CONS 2 (APPEND NIL (CONS 3 (CONS 4 NIL)))) - >... - > CONS 1 (CONS 2 (CONS 3 (CONS 4 NIL)))
48 Zapis Inny zapis dla list CONS (CONS 5 (CONS 12 NIL)) (CONS (CONS 10 (CONS 15 NIL)) (CONS (CONS 15 (CONS 23 NIL)) (CONS (CONS 20 (CONS 45 NIL)) NIL))) [[5,12],[10,15],[15,23],[20,45]] W listach skonstruowanych za pomocą [ i ] zakłada się istnienie list pustej []
49 Usuwanie elementów 49 Jeśli lista jest pusta zwracana jest lista pusta. Jeśli pierwszy element listy jest taki jak usuwany to zwracany jest ogon listy; rekurencja DELETE X [] = [] DELETE X (H::T) = T if <equal> X H Przykład DELETE 10 [5,10,15,20] (HEAD [5,10,15,20])::(DELETE 10 (TAIL [5,10,15,20])) - >... - > 5::(DELETE 10 ([10,15,20])) 5::(TAIL [10,15,20]) - >... - > 5::[15,20] =>... => [5,15,20] definicja rec DELETE V L = IF ISNIL L THEN NIL ELSE IF EQUAL V (HEAD L) THEN TAIL L ELSE (HEAD L)::(DELETE V (TAIL L))
50 Porównywanie list 50 porównywanie LIST_EQUAL [] [] = TRUE LIST_EQUAL [] (H::T) = FALSE LIST_EQUAL (H::T) [] = FALSE LIST_EQUAL (H1::T1) (H2::T2) = LIST_EQUAL T1 T2 if <equal> H1 H2 LIST_EQUAL (H1::T1) (H2::T2) = FALSE if NOT (<equal> H1 H2) Napisz definicję rekurencyjną rec LIST_EQUAL L1 L2 korzystając z podanego powyżej przepisu działania funkcji
51 Porównywanie list LIST_EQUAL (TAIL [2,3]) (TAIL [2,4]) - >... - > LIST_EQUAL [3] [4] - >... - > { EQUAL (HEAD [3]) (HEAD [4])) - >... - > EQUAL >... - > FALSE} FALSE definicja rec LIST_EQUAL L1 L2 = IF AND (ISNIL L1) (ISNIL L2) THEN TRUE ELSE IF OR (ISNIL L1) (ISNIL L2) THEN FALSE ELSE IF EQUAL (HEAD L1) (HEAD L2) THEN LIST_EQUAL (TAIL L1) (TAIL L2) ELSE FALSE
52 za tydzień...!? 52 w- 3
Programowanie Funkcyjne. Marcin Kubica Świder,
Programowanie Funkcyjne Marcin Kubica Świder, 28-04-2015 Czym jest programowanie funkcyjne? Obliczalne pojęcia matematyczne. Definicje stałych i funkcji i relacji. Wszystkie definicje są konstruktywne,
Paradygmaty programowania
Paradygmaty programowania Jacek Michałowski, Piotr Latanowicz 15 kwietnia 2014 Jacek Michałowski, Piotr Latanowicz () Paradygmaty programowania 15 kwietnia 2014 1 / 12 Zadanie 1 Zadanie 1 Rachunek predykatów
Definicje wyższego poziomu
Definicje wyższego poziomu Interpreter Scheme-a nie będzie narzekad w przypadku wystąpienia niezdefionowanej zmiennej w ciele wyrażenia lambda dopóki nie będzie zastosowana Przykład braku informacji o
Programowanie funkcyjne Wykład 13. Siła wyrazu rachunku lambda
Programowanie funkcyjne Wykład 13. Siła wyrazu rachunku lambda Zdzisław Spławski Zdzisław Spławski: Programowanie funkcyjne, Wykład 13. Siła wyrazu rachunku lambda 1 Wstęp Wartości logiczne Liczby naturalne
Elementy języka Scheme
Elementy języka Scheme Historia języka Lisp Historia języka Lisp Wyrażenia i ewaluacja wyrażeń Identyfikatory i wyrażenie let Wyrażenia lambda Definicje globalne Wyrażenia warunkowe Przypisanie Kontynuacje
Programowanie strukturalne. Opis ogólny programu w Turbo Pascalu
Programowanie strukturalne Opis ogólny programu w Turbo Pascalu STRUKTURA PROGRAMU W TURBO PASCALU Program nazwa; } nagłówek programu uses nazwy modułów; } blok deklaracji modułów const } blok deklaracji
Logika binarna. Prawo łączności mówimy, że operator binarny * na zbiorze S jest łączny gdy (x * y) * z = x * (y * z) dla każdego x, y, z S.
Logika binarna Logika binarna zajmuje się zmiennymi mogącymi przyjmować dwie wartości dyskretne oraz operacjami mającymi znaczenie logiczne. Dwie wartości jakie mogą te zmienne przyjmować noszą przy tym
Programowanie. programowania. Klasa 3 Lekcja 9 PASCAL & C++
Programowanie Wstęp p do programowania Klasa 3 Lekcja 9 PASCAL & C++ Język programowania Do przedstawiania algorytmów w postaci programów służą języki programowania. Tylko algorytm zapisany w postaci programu
Elementy rachunku lambda. dr hab. inż. Joanna Józefowska, prof. PP 1
Elementy rachunku lambda λ 1 Notacja λ x 3x + 7 3x + 7 jest różniczkowalna 3x + 7 jest mniejsze od 2 (2,3) 5 f(2, 3) = 2 + 3 g(2) = 2 + 3 λx(3x + 7) 3x + 7 λx λy(x + y) = λxy(x + y) λx(x + 3) 2 Rachunek
Informatyka 1. Wyrażenia i instrukcje, złożoność obliczeniowa
Informatyka 1 Wykład III Wyrażenia i instrukcje, złożoność obliczeniowa Robert Muszyński ZPCiR ICT PWr Zagadnienia: składnia wyrażeń, drzewa rozbioru gramatycznego i wyliczenia wartości wyrażeń, operatory
Teoretyczne Podstawy Języków Programowania Wykład 4. Siła wyrazu rachunku λ
Teoretyczne Podstawy Języków Programowania Wykład 4. Siła wyrazu rachunku λ Zdzisław Spławski Zdzisław Spławski: Teoretyczne Podstawy Języków Programowania, Wykład 4. Siła wyrazu rachunku λ 1 Wstęp Wartości
Programowanie funkcyjne. Wykªad 13
Programowanie funkcyjne. Wykªad 13 Siªa wyrazu rachunku lambda Zdzisªaw Spªawski Zdzisªaw Spªawski: Programowanie funkcyjne. Wykªad 13, Siªa wyrazu rachunku lambda 1 Wst p Warto±ci logiczne Liczby naturalne
Elementy języka Scheme
Elementy języka Scheme Historia języka Lisp Wyrażenia i ewaluacja wyrażeń Identyfikatory i wyrażenie let Wyrażenia lambda Definicje globalne Wyrażenia warunkowe Przypisanie Kontynuacje Historia języka
REKURENCJA W JĘZYKU HASKELL. Autor: Walczak Michał
REKURENCJA W JĘZYKU HASKELL Autor: Walczak Michał CZYM JEST REKURENCJA? Rekurencja zwana rekursją, polega na wywołaniu przez funkcję samej siebie. Algorytmy rekurencyjne zastępują w pewnym sensie iteracje.
Programowanie funkcyjne wprowadzenie Specyfikacje formalne i programy funkcyjne
Programowanie funkcyjne wprowadzenie Specyfikacje formalne i programy funkcyjne dr inż. Marcin Szlenk Politechnika Warszawska Wydział Elektroniki i Technik Informacyjnych m.szlenk@elka.pw.edu.pl Paradygmaty
Wstęp do Programowania potok funkcyjny
Wstęp do Programowania potok funkcyjny Marcin Kubica 2010/2011 Outline Procedury wyższych rzędów 1 Procedury wyższych rzędów jako abstrakcje konstrukcji programistycznych Intuicje Procedury wyższych rzędów
Języki programowania zasady ich tworzenia
Strona 1 z 18 Języki programowania zasady ich tworzenia Definicja 5 Językami formalnymi nazywamy każdy system, w którym stosując dobrze określone reguły należące do ustalonego zbioru, możemy uzyskać wszystkie
Jak należy się spodziewać, mamy. Zauważmy jednak, że nie zachodzi równość
11. Wykład 11: Rachunek λ. Obliczenia i obliczalność. Rachunek λ jest systemem pozornie bardzo prostym. Abstrakcja i aplikacja wydają się trywialnymi operacjami, i może się zdawać, że niczego ciekawego
Rekurencja, schemat rekursji i funkcje pierwotnie rekurencyjne
Rekurencja, schemat rekursji i funkcje pierwotnie rekurencyjne Elementy Logiki i Teorii Mnogości 2015/2016 Zadanie 1. Oblicz iteracyjnie i rekurencyjnie f(4), gdzie f jest funkcją określoną na zbiorze
Podstawy programowania funkcjonalnego
Podstawy programowania funkcjonalnego haskell.mariuszrozycki.pl Mariusz Różycki Churchill College, University of Cambridge rev. 2014.03.27.1 Wprowadzenie Materiały haskell.mariuszrozycki.pl Slajdy (w tym
Logika i teoria mnogości Wykład 14
Teoria rekursji Teoria rekursji to dział logiki matematycznej zapoczątkowany w latach trzydziestych XX w. Inicjatorzy tej dziedziny to: Alan Turing i Stephen Kleene. Teoria rekursji bada obiekty (np. funkcje,
Podstawy programowania. 1. Operacje arytmetyczne Operacja arytmetyczna jest opisywana za pomocą znaku operacji i jednego lub dwóch wyrażeń.
Podstawy programowania Programowanie wyrażeń 1. Operacje arytmetyczne Operacja arytmetyczna jest opisywana za pomocą znaku operacji i jednego lub dwóch wyrażeń. W językach programowania są wykorzystywane
Składnia funkcji i Rekurencja w języku Haskell
Składnia funkcji i w języku Haskell Tomasz Ostrowski, Adrian Niechciał, Michał Workiewicz, Marcin Wilk 26 marca 2015 Składnia funkcji i w języku Haskell Spis treści Składnia funkcji Tomasz Ostrowski Adrian
Ćwiczenia z wyliczania wartości funkcji
Ćwiczenia z wyliczania wartości funkcji 4 października 2011 1 Wprowadzenie Wyliczanie wartości wyrażenia nie jest sprawą oczywistą, szczególnie jeżeli chodzi o aplikację funkcji. Poniższy tekst nie jest
Funkcje w PL/SQL Funkcja to nazwany blok języka PL/SQL. Jest przechowywana w bazie i musi zwracać wynik. Z reguły, funkcji utworzonych w PL/SQL-u
Funkcje w PL/SQL Funkcja to nazwany blok języka PL/SQL. Jest przechowywana w bazie i musi zwracać wynik. Z reguły, funkcji utworzonych w PL/SQL-u będziemy używać w taki sam sposób, jak wbudowanych funkcji
2.8. Algorytmy, schematy, programy
https://app.wsipnet.pl/podreczniki/strona/38766 2.8. Algorytmy, schematy, programy DOWIESZ SIĘ co oznaczają pojęcia: algorytm, schemat blokowy, język programowania, jakie są sposoby obliczania największego
4. Funkcje. Przykłady
4. Funkcje Przykłady 4.1. Napisz funkcję kwadrat, która przyjmuje jeden argument: długość boku kwadratu i zwraca pole jego powierzchni. Używając tej funkcji napisz program, który obliczy pole powierzchni
Bloki anonimowe w PL/SQL
Język PL/SQL PL/SQL to specjalny język proceduralny stosowany w bazach danych Oracle. Język ten stanowi rozszerzenie SQL o szereg instrukcji, znanych w proceduralnych językach programowania. Umożliwia
Obliczenia na stosie. Wykład 9. Obliczenia na stosie. J. Cichoń, P. Kobylański Wstęp do Informatyki i Programowania 266 / 303
Wykład 9 J. Cichoń, P. Kobylański Wstęp do Informatyki i Programowania 266 / 303 stos i operacje na stosie odwrotna notacja polska języki oparte na ONP przykłady programów J. Cichoń, P. Kobylański Wstęp
Matematyczne Podstawy Informatyki
Matematyczne Podstawy Informatyki dr inż. Andrzej Grosser Instytut Informatyki Teoretycznej i Stosowanej Politechnika Częstochowska Rok akademicki 2013/2014 Gramatyki bezkontekstowe I Gramatyką bezkontekstową
Poprawność semantyczna
Poprawność składniowa Poprawność semantyczna Poprawność algorytmu Wypisywanie zdań z języka poprawnych składniowo Poprawne wartościowanie zdań języka, np. w języku programowania skutki wystąpienia wyróżnionych
Operatory AND, OR, NOT, XOR Opracował: Andrzej Nowak Bibliografia:
Operatory logiczne Komputery i ich logika AND - && Podstawy programowania w C++ Operatory AND, OR, NOT, XOR Opracował: Andrzej Nowak Bibliografia: CPA: PROGRAMMING ESSENTIALS IN C++ https://www.netacad.com
Paradygmaty programowania
Paradygmaty programowania Paradygmat funkcyjny Cezary Bolek Katedra Informatyki UŁ 1 Dlaczego programowanie funkcyjne? Języki imperatywne, a w duŝym stopniu takŝe obiektowe, są bardzo silnie związane z
Indukcja. Materiały pomocnicze do wykładu. wykładowca: dr Magdalena Kacprzak
Indukcja Materiały pomocnicze do wykładu wykładowca: dr Magdalena Kacprzak Charakteryzacja zbioru liczb naturalnych Arytmetyka liczb naturalnych Jedną z najważniejszych teorii matematycznych jest arytmetyka
Język ludzki kod maszynowy
Język ludzki kod maszynowy poziom wysoki Język ludzki (mowa) Język programowania wysokiego poziomu Jeśli liczba punktów jest większa niż 50, test zostaje zaliczony; w przeciwnym razie testu nie zalicza
Programowanie obiektowe
Programowanie obiektowe Język programowania Ruby Marcin Młotkowski 12 kwietnia 2018 Plan wykładu 1 Wstęp 2 Typy numeryczne Łańcuchy znaków (klasa String) Przedziały Tablice i tablice asocjacyjne Nazwy
Analiza algorytmów zadania podstawowe
Analiza algorytmów zadania podstawowe Zadanie 1 Zliczanie Zliczaj(n) 1 r 0 2 for i 1 to n 1 3 do for j i + 1 to n 4 do for k 1 to j 5 do r r + 1 6 return r 0 Jaka wartość zostanie zwrócona przez powyższą
Pascal - wprowadzenie
Pascal - wprowadzenie Ogólne informacje o specyfice języka i budowaniu programów Filip Jarmuszczak kl. III c Historia Pascal dawniej jeden z najpopularniejszych języków programowania, uniwersalny, wysokiego
Algorytmy i struktury danych
Algorytmy i struktury danych Funkcje i procedury Zasięg zmiennych Rekurencja Witold Marańda maranda@dmcs.p.lodz.pl 1 Modularyzacja programu Algorytmy strukturalne moŝna redukować, zastępując złoŝone fragmenty
Wstęp do programowania
Wstęp do programowania Programowanie funkcyjne Paweł Daniluk Wydział Fizyki Jesień 2013 P. Daniluk(Wydział Fizyki) WP w. XIV Jesień 2013 1 / 25 Paradygmaty programowania Programowanie imperatywne Program
Liczby losowe i pętla while w języku Python
Liczby losowe i pętla while w języku Python Mateusz Miotk 17 stycznia 2017 Instytut Informatyki UG 1 Generowanie liczb losowych Na ogół programy są spójne i prowadzą do przewidywanych wyników. Czasem jednak
0 --> 5, 1 --> 7, 2 --> 9, 3 -->1, 4 --> 3, 5 --> 5, 6 --> 7, 7 --> 9, 8 --> 1, 9 --> 3.
(Aktualizacja z dnia 3 kwietnia 2013) MATEMATYKA DYSKRETNA - informatyka semestr 2 (lato 2012/2013) Zadania do omówienia na zajęciach w dniach 21 i 28 kwietnia 2013 ZESTAW NR 3/7 (przykłady zadań z rozwiązaniami)
Wykład 11a. Składnia języka Klasycznego Rachunku Predykatów. Języki pierwszego rzędu.
Andrzej Wiśniewski Logika I Materiały do wykładu dla studentów kognitywistyki Wykład 11a. Składnia języka Klasycznego Rachunku Predykatów. Języki pierwszego rzędu. 1 Logika Klasyczna obejmuje dwie teorie:
1. Wykład NWD, NWW i algorytm Euklidesa.
1.1. NWD, NWW i algorytm Euklidesa. 1. Wykład 1 Twierdzenie 1.1 (o dzieleniu z resztą). Niech a, b Z, b 0. Wówczas istnieje dokładnie jedna para liczb całkowitych q, r Z taka, że a = qb + r oraz 0 r< b.
Języki programowania C i C++ Wykład: Typy zmiennych c.d. Operatory Funkcje. dr Artur Bartoszewski - Języki C i C++, sem.
Języki programowania C i C++ Wykład: Typy zmiennych c.d. Operatory Funkcje 1 dr Artur Bartoszewski - Języki C i C++, sem. 1I- WYKŁAD programowania w C++ Typy c.d. 2 Typy zmiennych Instrukcja typedef -
λ parametry. wartość funkcji suma = λ x y. x + y kwadrat = λ x. x * x K.M. Ocetkiewicz, 2008 WETI, PG 2 K.M. Ocetkiewicz, 2008 WETI, PG 3
Organizacja przedmiotu Języki programowania (Programming language concepts) Krzysztof M. Ocetkiewicz pok. 205 email: Krzysztof.Ocetkiewicz@eti.pg.gda.pl konsultacje: czwartek 10:15-11.00, 13:15-14:00 projekt:
KONKURS MATEMATYCZNY KOMA 2018
ELIMINACJE SZKOLNE RACHUNEK LAMBDA NOTATKI Z WYKŁADU - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Typy, klasy typów, składnie w funkcji
Typy, klasy typów, składnie w funkcji Typy w Haskell Każde wyrażenie w Haskell posiada zdefiniowany typ. Dzięki temu już na etapie kompilacji kodu następuje sprawdzenie poprawności kodu i zabezpiecza nas
Operacje wykonywane są na operandach (argumentach operatorów). Przy operacji dodawania: argumentami operatora dodawania + są dwa operandy 2 i 5.
Operatory w Javie W Javie występują następujące typy operatorów: Arytmetyczne. Inkrementacji/Dekrementacji Przypisania. Porównania. Bitowe. Logiczne. Pozostałe. Operacje wykonywane są na operandach (argumentach
Definicje. Algorytm to:
Algorytmy Definicje Algorytm to: skończony ciąg operacji na obiektach, ze ściśle ustalonym porządkiem wykonania, dający możliwość realizacji zadania określonej klasy pewien ciąg czynności, który prowadzi
Instrukcje dla zawodników
Płock, 21 marca 2015 r. Instrukcje dla zawodników Arkusze otwieramy na wyraźne polecenie komisji. Wszystkie poniższe instrukcje zostaną odczytane i wyjaśnione. 1. Arkusz składa się z 3 zadań. 2. Każde
Języki programowania deklaratywnego
Katedra Inżynierii Wiedzy laborki 14 Języki deklaratywne Główne różnice między paradygmatem deklaratywnym a imperatywnym Omów główne cechy paradygmatu programowania w logice na przykładzie Prologa Główne
PoniŜej znajdują się pytania z egzaminów zawodowych teoretycznych. Jest to materiał poglądowy.
PoniŜej znajdują się pytania z egzaminów zawodowych teoretycznych. Jest to materiał poglądowy. 1. Instrukcję case t of... w przedstawionym fragmencie programu moŝna zastąpić: var t : integer; write( Podaj
ZASADY PROGRAMOWANIA KOMPUTERÓW
POLITECHNIKA WARSZAWSKA Instytut Automatyki i i Robotyki ZASADY PROGRAMOWANIA KOMPUTERÓW Język Język programowania: C/C++ Środowisko programistyczne: C++Builder 6 Wykład 9.. Wskaźniki i i zmienne dynamiczne.
ForPascal Interpreter języka Pascal
Akademia Podlaska w Siedlcach Wydział Nauk Ścisłych Instytut Informatyki ForPascal Interpreter języka Pascal Przedmiot: Sieci i Systemy Wirtualne Informatyka IV Prowadzący: dr Krzysztof Trojanowski Grupa:
Algorytmy i struktury danych. Wykład 4
Wykład 4 Różne algorytmy - obliczenia 1. Obliczanie wartości wielomianu 2. Szybkie potęgowanie 3. Algorytm Euklidesa, liczby pierwsze, faktoryzacja liczby naturalnej 2017-11-24 Algorytmy i struktury danych
Programowanie obiektowe
Programowanie obiektowe Podstawowe cechy i możliwości języka Scala mgr inż. Krzysztof Szwarc krzysztof@szwarc.net.pl Sosnowiec, 2017 1 / 32 mgr inż. Krzysztof Szwarc Programowanie obiektowe Informacje
Programowanie w logice
Programowanie w logice PROLOG cz.1 PROLOG język wysokiego poziomu Powstał w 1972 na Uniwersytecie w Marsylii (Francja) w zespole A.Colmerauer a i F.Roussel a PROgrammation en LOGique, PROgramming in LOGic,
Ciała i wielomiany 1. przez 1, i nazywamy jedynką, zaś element odwrotny do a 0 względem działania oznaczamy przez a 1, i nazywamy odwrotnością a);
Ciała i wielomiany 1 Ciała i wielomiany 1 Definicja ciała Niech F będzie zbiorem, i niech + ( dodawanie ) oraz ( mnożenie ) będą działaniami na zbiorze F. Definicja. Zbiór F wraz z działaniami + i nazywamy
Wydział Zarządzania AGH. Katedra Informatyki Stosowanej. Podstawy VBA cz. 2. Programowanie komputerowe
Wydział Zarządzania AGH Katedra Informatyki Stosowanej Podstawy VBA cz. 2 Programowanie 1 Program wykładu Typy danych Wyrażenia Operatory 2 VBA Visual Basic dla aplikacji (VBA) firmy Microsoft jest językiem
Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018
Informatyka I Klasy i obiekty. Podstawy programowania obiektowego dr inż. Andrzej Czerepicki Politechnika Warszawska Wydział Transportu 2018 Plan wykładu Pojęcie klasy Deklaracja klasy Pola i metody klasy
Wstęp do Programowania potok funkcyjny
Wstęp do Programowania potok funkcyjny Marcin Kubica 2010/2011 Outline 1 Pojęcie typu Definition (Typ danych) Typ danych to zbiór wartości wraz z zestawem podstawowych operacji na tych wartościach. Typy
Podstawy programowania w języku C i C++
Podstawy programowania w języku C i C++ Część czwarta Operatory i wyrażenia Autor Roman Simiński Kontakt roman.siminski@us.edu.pl www.us.edu.pl/~siminski Niniejsze opracowanie zawiera skrót treści wykładu,
PROGRAMOWANIE W PYTHONIE OD PIERWSZYCH KROKÓW
PROGRAMOWANIE W PYTHONIE OD PIERWSZYCH KROKÓW http://metodycy.torun.pl/ m.informatyka@metodycy.torun.pl 1. Wprowadzenie do Pythona podstawowe informacje Python to język programowania wysokiego poziomu,
Zapisywanie w wybranej notacji algorytmów z warunkami i iteracyjnych
Temat 2. Zapisywanie w wybranej notacji algorytmów z warunkami i iteracyjnych Cele edukacyjne Usystematyzowanie podstawowych pojęć: algorytm z warunkami, iteracja, algorytm iteracyjny, zmienna sterująca.
Języki i paradygmaty programowania
Języki i paradygmaty programowania Instytut Teleinformatyki ITI PK Kraków marzec 2012 Spis rzeczy 1 Operatory w C/C++ Operatory Operatory w C/C++ operator - rodzaj funkcji wbudowanej w język; różnica notacja
Język C zajęcia nr 11. Funkcje
Język C zajęcia nr 11 Funkcje W języku C idea podprogramów realizowana jest wyłącznie poprzez definiowanie i wywołanie funkcji. Każda funkcja musi być przed wywołaniem zadeklarowana. Deklaracja funkcji
Luty 2001 Algorytmy (7) 2000/2001 s-rg@siwy.il.pw.edu.pl
System dziesiętny 7 * 10 4 + 3 * 10 3 + 0 * 10 2 + 5 *10 1 + 1 * 10 0 = 73051 Liczba 10 w tym zapisie nazywa się podstawą systemu liczenia. Jeśli liczba 73051 byłaby zapisana w systemie ósemkowym, co powinniśmy
Podprogramy. Procedury
Podprogramy Turbo Pascal oferuje metody ułatwiające tworzenie struktury programu, szczególnie dotyczy to większych programów. Przy tworzeniu większego programu stosuje się jego podział na kilka mniejszych
Podstawy i języki programowania
Podstawy i języki programowania Laboratorium 3 - operatory oraz instrukcje warunkowe i wyboru mgr inż. Krzysztof Szwarc krzysztof@szwarc.net.pl Sosnowiec, 19 października 2018 1 / 35 mgr inż. Krzysztof
Analiza leksykalna 1. Języki formalne i automaty. Dr inż. Janusz Majewski Katedra Informatyki
Analiza leksykalna 1 Języki formalne i automaty Dr inż. Janusz Majewski Katedra Informatyki Zadanie analizy leksykalnej Kod źródłowy (ciąg znaków) Analizator leksykalny SKANER Ciąg symboli leksykalnych
Programowanie funkcyjne (Haskell Wprowadzenie) Kowalik Adrian
Programowanie funkcyjne (Haskell Wprowadzenie) Kowalik Adrian Programowanie funkcyjne Krótka geneza języka Haskell Polecenia i składnia języka Funkcje i wyrażenia Typy i typy klasowe Listy i krotki Programowanie
Wstęp do Programowania potok funkcyjny
Wstęp do Programowania potok funkcyjny Marcin Kubica 2010/2011 Outline 1 Kilka podstawowych pojęć Definition Programy imperatywne zmieniają stan, czyli wartości zmiennych. Asercja = warunek logiczny, który
Algorytmy i struktury danych
Algorytmy i struktury danych 4. Łódź 2018 Suma szeregu harmonicznego - Wpisz kod programu w oknie edycyjnym - Zapisz kod w pliku harmonic.py - Uruchom skrypt (In[1]: run harmonic.py) - Ten program wykorzystuje
Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1
Podstawy programowania. Wykład Funkcje Krzysztof Banaś Podstawy programowania 1 Programowanie proceduralne Pojęcie procedury (funkcji) programowanie proceduralne realizacja określonego zadania specyfikacja
Wstęp do programowania
Wstęp do programowania Podstawowe konstrukcje programistyczne Paweł Daniluk Wydział Fizyki Jesień 2014 P. Daniluk (Wydział Fizyki) WP w. II Jesień 2014 1 / 38 Przypomnienie Programowanie imperatywne Program
Logika Stosowana. Wykład 1 - Logika zdaniowa. Marcin Szczuka. Instytut Informatyki UW. Wykład monograficzny, semestr letni 2016/2017
Logika Stosowana Wykład 1 - Logika zdaniowa Marcin Szczuka Instytut Informatyki UW Wykład monograficzny, semestr letni 2016/2017 Marcin Szczuka (MIMUW) Logika Stosowana 2017 1 / 30 Plan wykładu 1 Język
Analiza leksykalna 1. Teoria kompilacji. Dr inż. Janusz Majewski Katedra Informatyki
Analiza leksykalna 1 Teoria kompilacji Dr inż. Janusz Majewski Katedra Informatyki Zadanie analizy leksykalnej Kod źródłowy (ciąg znaków) Analizator leksykalny SKANER Ciąg symboli leksykalnych (tokenów)
iks plus trzy dzielone na dwa iks razy iks plus pięć
ELIMINACJE SZKOLNE RACHUNEK LAMBDA NOTATKI Z WYKŁADU - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Planowanie eksperymentu 2 (k p) w 2 r blokach. Stanisław Jaworski, Wojciech Zieliński
Planowanie eksperymentu 2 (k p) w 2 r blokach Stanisław Jaworski, Wojciech Zieliński 1. Wstęp W praktyce często możemy spotkać się z sytuacją, kiedy nie jest możliwe wykonanie pełnego eksperymentu czynnikowego
Programowanie w Logice Przykłady programów. Przemysław Kobylański
Programowanie w Logice Przykłady programów Przemysław Kobylański Język Imperator 1 jest prostym językiem imperatywnym. Jego składnię opisuje poniższa gramatyka BNF: PROGRAM ::= PROGRAM ::= INSTRUKCJA ;
Maszyna Turinga. Algorytm. czy program???? Problem Hilberta: Przykłady algorytmów. Cechy algorytmu: Pojęcie algorytmu
Problem Hilberta: 9 Czy istnieje ogólna mechaniczna procedura, która w zasadzie pozwoliłaby nam po kolei rozwiązać wszystkie matematyczne problemy (należące do odpowiednio zdefiniowanej klasy)? 2 Przykłady
Semantyka i Weryfikacja Programów - Laboratorium 3
Semantyka i Weryfikacja Programów - Laboratorium 3 Modelowanie układów mikroprocesorowych - część II Wykonywanie całego programu Cały program wykonywany jest przez funkcję intpprog. Jedynym argumentem
Wstęp do programowania
Wstęp do programowania wykład 2 Piotr Cybula Wydział Matematyki i Informatyki UŁ 2012/2013 http://www.math.uni.lodz.pl/~cybula Język programowania Każdy język ma swoją składnię: słowa kluczowe instrukcje
Myśl w języku Python! : nauka programowania / Allen B. Downey. Gliwice, cop Spis treści
Myśl w języku Python! : nauka programowania / Allen B. Downey. Gliwice, cop. 2017 Spis treści Przedmowa 11 1. Jak w programie 21 Czym jest program? 21 Uruchamianie interpretera języka Python 22 Pierwszy
Wstęp do programowania. Listy. Piotr Chrząstowski-Wachtel
Wstęp do programowania Listy Piotr Chrząstowski-Wachtel Do czego stosujemy listy? Listy stosuje się wszędzie tam, gdzie występuje duży rozrzut w możliwym rozmiarze danych, np. w reprezentacji grafów jeśli
Grupy, pierścienie i ciała
Grupy, pierścienie i ciała Definicja: Niech A będzie niepustym zbiorem. Działaniem wewnętrznym (lub, krótko, działaniem) w zbiorze A nazywamy funkcję : A A A. Niech ponadto B będzie niepustym zbiorem.
Instrukcja do ćwiczeń nr 4 typy i rodzaje zmiennych w języku C dla AVR, oraz ich deklarowanie, oraz podstawowe operatory
Instrukcja do ćwiczeń nr 4 typy i rodzaje zmiennych w języku C dla AVR, oraz ich deklarowanie, oraz podstawowe operatory Poniżej pozwoliłem sobie za cytować za wikipedią definicję zmiennej w informatyce.
Zapis algorytmów: schematy blokowe i pseudokod 1
Zapis algorytmów: schematy blokowe i pseudokod 1 Przed przystąpieniem do napisania kodu programu należy ten program najpierw zaprojektować. Projekt tworzącego go algorytmu może być zapisany w formie schematu
Języki i Paradygmaty Programowania
Języki i Paradygmaty Programowania Odkrywamy Haskell Marcin Benke 24 lutego 2014 Odkrywamy Haskell Haskell zasadniczo kompilowany, ale też interpreter: ghci $ ghci GHCi, version 7.6.2: http://www.haskell.org/ghc/
Metoda tabel semantycznych. Dedukcja drogi Watsonie, dedukcja... Definicja logicznej konsekwencji. Logika obliczeniowa.
Plan Procedura decyzyjna Reguły α i β - algorytm Plan Procedura decyzyjna Reguły α i β - algorytm Logika obliczeniowa Instytut Informatyki 1 Procedura decyzyjna Logiczna konsekwencja Teoria aksjomatyzowalna
Programowanie. Lista zadań nr 15. Na ćwiczenia 11, 19 i 23 czerwca 2008
Programowanie Lista zadań nr 15 Na ćwiczenia 11, 19 i 23 czerwca 2008 Zadanie 1. Pokaż, że w systemie z polimorfizmem parametrycznym można napisać program P n rozmiaru O(n), którego typ ma rozmiar 2 2Ω(n).
Instrukcje warunkowe i skoku. Spotkanie 2. Wyrażenia i operatory logiczne. Instrukcje warunkowe: if else, switch.
Instrukcje warunkowe i skoku. Spotkanie 2 Dr inż. Dariusz JĘDRZEJCZYK Wyrażenia i operatory logiczne Instrukcje warunkowe: if else, switch Przykłady 11/3/2016 AGH, Katedra Informatyki Stosowanej i Modelowania
Metody Kompilacji Wykład 7 Analiza Syntaktyczna
Metody Kompilacji Wykład 7 Analiza Syntaktyczna Parsowanie Parsowanie jest to proces określenia jak ciąg terminali może być generowany przez gramatykę. Włodzimierz Bielecki WI ZUT 2/57 Parsowanie Dla każdej
Matematyka Dyskretna. Andrzej Szepietowski. 25 czerwca 2002 roku
Matematyka Dyskretna Andrzej Szepietowski 25 czerwca 2002 roku Rozdział 1 Poprawność programów Jeżeli projektujemy algorytmy lub piszemy programy, to ważne jest pytanie, czy nasz algorytm lub program
Informatyka 1. Procedury i funkcje, struktura programu w Pascalu
Informatyka 1 Wykład V Procedury i funkcje, struktura programu w Pascalu Robert Muszyński ZPCiR IIAiR PWr Zagadnienia: deklaracje procedury i funkcji, parametry procedur i funkcji, reguły użycia parametrów
Elżbieta Kula - wprowadzenie do Turbo Pascala i algorytmiki
Elżbieta Kula - wprowadzenie do Turbo Pascala i algorytmiki Turbo Pascal jest językiem wysokiego poziomu, czyli nie jest rozumiany bezpośrednio dla komputera, ale jednocześnie jest wygodny dla programisty,
Kod U2 Opracował: Andrzej Nowak
PODSTAWY TEORII UKŁADÓW CYFROWYCH Kod U2 Opracował: Andrzej Nowak Bibliografia: Urządzenia techniki komputerowej, K. Wojtuszkiewicz http://pl.wikipedia.org/ System zapisu liczb ze znakiem opisany w poprzednim
Podstawy programowania w Pythonie
Podstawy programowania w Pythonie Wykład 5 dr Andrzej Zbrzezny Instytut Matematyki i Informatyki Akademia Jana Długosza w Częstochowie 7 listopada 2012 dr Andrzej Zbrzezny (IMI AJD) Podstawy programowania
Informatyka I. Typy danych. Operacje arytmetyczne. Konwersje typów. Zmienne. Wczytywanie danych z klawiatury. dr hab. inż. Andrzej Czerepicki
Informatyka I Typy danych. Operacje arytmetyczne. Konwersje typów. Zmienne. Wczytywanie danych z klawiatury. dr hab. inż. Andrzej Czerepicki Politechnika Warszawska Wydział Transportu 2019 1 Plan wykładu