Definicje wyższego poziomu

Podobne dokumenty
Elementy języka Scheme

Elementy języka Scheme

Liczby losowe i pętla while w języku Python

Paradygmaty programowania

REKURENCJA W JĘZYKU HASKELL. Autor: Walczak Michał

Programowanie w Turbo Pascal

Języki i metody programowania

Podstawy programowania skrót z wykładów:

4. Funkcje. Przykłady

Cw.12 JAVAScript w dokumentach HTML

Pętla for. Wynik działania programu:

Programowanie Funkcyjne. Marcin Kubica Świder,

WHILE (wyrażenie) instrukcja;

Bash - wprowadzenie. Bash - wprowadzenie 1/39

Prolog struktury danych oraz obliczenia. 1. Arytmetyka?- Y is 2+2. Y = 4. ?- 5 is 3+3. false. ?- Z is (3.9 / 2.1). Z =

Składnia funkcji i Rekurencja w języku Haskell

Poprawność semantyczna

Projekt 4: Programowanie w logice

Programowanie w logice Prolog 2

Podstawy programowania w Pythonie

Zmienne powłoki. Wywołanie wartości następuje poprzez umieszczenie przed nazwą zmiennej znaku dolara ($ZMIENNA), np. ZMIENNA=wartosc.

Bash - instrukcje warunkowe, pętle i funkcje

ZMIENNE. Podstawy PHP

Języki programowania C i C++ Wykład: Typy zmiennych c.d. Operatory Funkcje. dr Artur Bartoszewski - Języki C i C++, sem.

Obiektowy PHP. Czym jest obiekt? Definicja klasy. Składowe klasy pola i metody

LISP - "LISt Processing"

Podstawy Programowania Podstawowa składnia języka C++

Przykład 1: Funkcja jest obiektem, przypisanie funkcji o nazwie function() do zmiennej o nazwie funkcja1

Podstawy i języki programowania

Funkcje są prawdopodobnie najważniejszą częścią każdego poważnego programu (w każdym języku programowania).

Zapisywanie algorytmów w języku programowania

Opis zagadnieo 1-3. Iteracja, rekurencja i ich realizacja

Paradygmaty programowania

Naukę zaczynamy od poznania interpretera. Interpreter uruchamiamy z konsoli poleceniem

Wstęp do Programowania potok funkcyjny

Informatyka I. Typy danych. Operacje arytmetyczne. Konwersje typów. Zmienne. Wczytywanie danych z klawiatury. dr hab. inż. Andrzej Czerepicki

Układy VLSI Bramki 1.0

Programowanie w języku Python. Grażyna Koba

Arytmetyka liczb binarnych

ALGORYTMY I STRUKTURY DANYCH

Operacje wykonywane są na operandach (argumentach operatorów). Przy operacji dodawania: argumentami operatora dodawania + są dwa operandy 2 i 5.

Języki programowania deklaratywnego

Kiedy i czy konieczne?

Myśl w języku Python! : nauka programowania / Allen B. Downey. Gliwice, cop Spis treści

Podstawy Programowania C++

Java Podstawy. Michał Bereta

Programowanie obiektowe

WHILE (wyrażenie) instrukcja;

KOTLIN. Język programowania dla Androida

Rozwiązanie. #include <cstdlib> #include <iostream> using namespace std;

Testowanie i walidacja oprogramowania

Język JAVA podstawy. Wykład 3, część 3. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Instrukcje wyboru. Tworzenie programu, Schematy blokowe, Instrukcje wyboru, Operatory logiczne

Python dla początkujących. Małgorzata Niewiem AGH, GGiOŚ, Katedra Geoinformatyki i Informatyki Stosowanej SATIM Satelitarny Monitoring

Laboratorium Wstawianie skryptu na stroną: 2. Komentarze: 3. Deklaracja zmiennych

Programowanie strukturalne. Opis ogólny programu w Turbo Pascalu

Wstęp do Programowania potok funkcyjny

SQL, LIKE, IN, CASE, EXISTS. Marcin Orchel

Procedura rekurencyjna to taka procedura, która wywołuje samą siebie.

Metody Kompilacji Wykład 8 Analiza Syntaktyczna cd. Włodzimierz Bielecki WI ZUT

Instrukcje warunkowe i skoku. Spotkanie 2. Wyrażenia i operatory logiczne. Instrukcje warunkowe: if else, switch.

Bloki anonimowe w PL/SQL

Strategia "dziel i zwyciężaj"

Dynamiczne struktury danych

METODY KOMPUTEROWE W OBLICZENIACH INŻYNIERSKICH

Blockly Kodowanie pomoc.

Typy, klasy typów, składnie w funkcji

PHP może zostać rozszerzony o mechanizmy dostępu do różnych baz danych:

Systemy ekspertowe i ich zastosowania. Katarzyna Karp Marek Grabowski

PODSTAWY INFORMATYKI 1 PRACOWNIA NR 6

Podstawy programowania. Podstawy C# Tablice

Odczyt danych z klawiatury Operatory w Javie

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

Stuck in the loop. Sterowanie. Marcin Makowski. 29 października Zak lad Chemii Teoretycznej UJ

Deklarowania faktów dotyczących obiektów i związków między nimi. Definiowania reguł dotyczących obiektów i związków między nimi.

W naukach technicznych większość rozpatrywanych wielkości możemy zapisać w jednej z trzech postaci: skalara, wektora oraz tensora.

GRUPA ĆWICZENIOWA (ZAKREŚL ODPOWIEDNIĄ): MG8 MG13 MB13 MD13 BT13

Przy dużej wielkości głębokości uzyskamy wrażenie nieskończoności: Dla głębokości zerowej uzyskamy tekst płaski:

JAVAScript w dokumentach HTML (1) JavaScript jest to interpretowany, zorientowany obiektowo, skryptowy język programowania.

Algorytmy i struktury danych

Algorytm. a programowanie -

Instrukcje wyboru. Tworzenie programu, Schematy blokowe, Instrukcje wyboru, Operatory logiczne

Pętla for. Matematyka dla ciekawych świata -19- Scilab. for i=1:10... end. for k=4:-1:1... end. k=3 k=4. k=1. k=2

PARADYGMATY I JĘZYKI PROGRAMOWANIA. Programowanie funkcyjne (w- 9)

Wprowadzenie do programowania w języku C

Funkcje wbudowane PHP

3. Instrukcje warunkowe

Podstawy programowania w języku C++

λ 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

Pętle instrukcje powtórzeo

LibreOffice Calc VBA

Visual Basic for Application (VBA)

Jak tworzyd filtry? W jaki sposób odbywa się filtrowanie w systemie pokaż/ukryj pytania?

Funkcje. Deklaracja funkcji. Definicja funkcji. Wykorzystanie funkcji w programie.

Wstęp do Programowania potok funkcyjny

Instrukcje sterujące. wer. 11 z drobnymi modyfikacjami! Wojciech Myszka :53:

Podstawy programowania w języku C

Po uruchomieniu programu nasza litera zostanie wyświetlona na ekranie

JAVAScript w dokumentach HTML (1)

Transkrypt:

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 błędzie (define proc1 (lambda (x y) (proc2 y x)) LISP 1

Definicje wyższego poziomu Próba zastosowania proc1 przed definicją proc2 spowoduje wystąpienie błędu Przykładowe utworzenie proc2 i wywołanie funkcji proc1 (define proc2 cons) (proc1 'a 'b) (b. a) LISP 2

Definicje wyższego poziomu Scheme akceptuje założenie o zdefiniowaniu proc2 w innym miejscu kodu programu Nie uruchamianie proc1 przed zdefiniowaniem proc2 nie generuje błędu Definicje funkcji mogą byd umieszczane w dowolnej kolejności Użyteczny mechanizm do bardziej czytelnego pisania programów i organizacji w pliku definicji funkcji LISP 3

Wyrażenie if ma postad: (if test consequent alternative) gdzie: consequent wyznaczane wyrażenie jeżeli test jest prawdą alternative oceniane wyrażenie jeżeli test jest fałszem LISP 4

Rozważmy funkcje modulus Jeżeli argument n jest ujemny, modulus zwraca n, w przeciwnym przypadku zwracane jest n (define modulus (lambda (n) (if (< n 0) (- 0 n) n))) (modulus 77) 77 (modulus -77) 77 LISP 5

Inne sposoby definicji funkcji modulus (define modulus (lambda (n) (if (>= n 0) n (- 0 n)))) (define modulus (lambda (n) (if (not (< n 0)) n (- 0 n)))) LISP 6

(define modulus (lambda (n) (if (or (> n 0) (= n 0)) n (- 0 n)))) (define modulus (lambda (n) (if (= n 0) 0 (if (< n 0)(- 0 n) n)))) (define modulus (lambda (n) ((if (>= n 0) + -)0 n))) LISP 7

if jest formą składniową nie procedurą Rozważmy funkcję reciprocal (define reciprocal (lambda (n) (if (= n 0) "oops!" (/ 1 n)))) LISP 8

Forma składniowa or działa podobnie jak if Ogólna postad wyrażenia or (or exp...) Wartośd wyrażenia (or)jest fałszem Każde exp jest oceniane do jednej z wartości: a) jedno z wyrażeo jest prawdą (#t) b) brak wyrażeo w ciele formy if (#f) LISP 9

Wartośd wyrażenia or jest wartością ostatniego podwyrażenia - (a) Wiele możliwych obiektów dla wartości prawdy Zwykle, wartośd wyrażenia testowanego jest jedną z dwóch obiektów #t dla prawdy lub #f dla fałszu (< -1 0) #t (> -1 0) #f LISP 10

Obiekty Scheme-a mogą przyjmowad wartośd prawdy lub fałszu: w wyrażeniach warunkowych w przypadku stosowania procedury not Tylko obiekt #f posiada wartośd fałszu Pozostałe obiektu mają wartośd prawdy (if #t 'true 'false) true (if #f 'true 'false) false LISP 11

(if '() 'true 'false) true (if 1 'true 'false) true (if '(a b c) 'true 'false) true (not #t) #f (not "false") #f (not #f) #t (or) #f (or #f) #f (or #f #t) #t (or #f 'a #f) a LISP 12

and forma składniowa podobna do formy or Wyrażenie and jest prawdą jeżeli wszystkie podwyrażenia mają wartośd #t Wyrażenie (and) jest zawsze prawdziwe Podwyrażenia są oceniane do jednej z wartości: brak podwyrażeo w ciele formy - #t wartośd podwyrażenia jest fałszem Wartośd wyrażenia and jest wartością ostatniego ocenianego podwyrażenia LISP 13

Przykład. Użycie and w funkcji reciprocal (define reciprocal (lambda (n) (and (not (= n 0)) (/ 1 n)))) (reciprocal 3) 1/3 (reciprocal 0.5) 2.0 (reciprocal 0) #f Wartość - #f jeżeli n jest zerem w przeciwnym wypadku 1/n LISP 14

Predykaty =, <, >, <=, >= Predykat jest procedurą, która odpowiada na specyficzne pytania dotyczące argumentu i zwraca jedną z dwóch wartości #t or #f Nazwy predykatów zakooczone są znakiem (? ) Zwykłe predykaty relacji są wyjątkiem od powyższej reguły LISP 15

Nie wszystkie predykaty wymagają argumentów w postaci liczb Predykat null? jest prawdą jeżeli jego argument jest listą pustą () Przykładowo: (null? '()) #t (null? 'abc) #f (null? '(x y z)) #f (null? (cdddr '(x y z))) #t LISP 16

Problem z wyrażeniem(cdr '()) Interpreter Scheme-z informuje o błędzie Definicja lisp-cdr rozwiązuje ów problem (define lisp-cdr (lambda (x) (if (null? x) '() (cdr x)))) (lisp-cdr '(a b c)) (b c) (lisp-cdr '(c)) () (lisp-cdr '()) () LISP 17

Predykat eqv? wymaga dwóch argumentów Jeżeli dwa argumenty są równoważne prawda W przeciwnym wypadku eqv? zwraca fałsz Przykładowo: (eqv? 'a 'a) #t (eqv? 'a 'b) #f (eqv? #f #f) #t (eqv? #t #t) #t (eqv? #f #t) #f (eqv? 3 3) #t (eqv? 3 2) #f LISP 18

Inne przykłady (let ((x "Hi Mom!")) (eqv? x x)) #t (let ((x (cons 'a 'b))) (eqv? x x)) #t (eqv? (cons 'a 'b) (cons 'a 'b)) #f LISP 19

Predykaty typu zwracające prawdę lub fałsz: pair?, symbol?, number?, string? Predykat pair? zwraca prawdę tylko jeżeli jego argument jest parą (pair? '(a. c)) #t (pair? '(a b c)) #t (pair? '()) #f (pair? 'abc) #f (pair? "Hi Mom!") #f (pair? 1234567890) #f LISP 20

Predykat typu jest użyteczny do określania czy stosowany argument jest odpowiedniego typu Przykładowo: (define reciprocal (lambda (n) (if (and (number? n) (not (= n 0))) (/ 1 n) "oops!"))) (reciprocal 2/3) 3/2 (reciprocal 'a) "oops!" LISP 21

Rozważmy inne wyrażenie warunkowe cond często stosowane zamiast if cond (podobne do if) pozwala na użycie wielu testów i alternatywnych wyrażeo Wyrażenie cond posiada ogólną formę: (cond (test exp)... (else exp)) LISP 22

Rozważmy definicje funkcji sign zwracającej: -1 dla ujemnych argumentów +1 dla dodatnich argumentów 0 dla zera (define sign (lambda (n) (if (< n 0) -1 (if (> n 0) +1 0)))) LISP 23

Dwa wyrażenia if mogą byd zastąpione przez pojedyncze wyrażenie cond: (define sign (lambda (n) (cond ((< n 0) -1) ((> n 0) +1) (else 0)))) LISP 24

Pominięcie else zwiększa przejrzystośd kodu Nowa wersja funkcji sign (define sign (lambda (n) (cond ((< n 0) -1) ((> n 0) +1) ((= n 0) 0)))) Definicja sign nie zależy od kolejności testowanych warunków LISP 25

Przykładowa procedura obliczająca podatek dla danych dochodów w skali progresywnej z progami 10000, 20000, and 30000 euro (define income-tax (lambda (income) (cond ((<= income 10000) (* income.05)) ((<= income 20000) (+ (* (- income 10000).08) 500.00)) ((<= income 30000) (+ (* (- income 20000).13) 1300.00)) (else (+ (* (- income 30000).21) 2600.00))))) LISP 26

Przykładowe wywołania: (income-tax 5000) 250.0 (income-tax 15000) 900.0 (income-tax 25000) 1950.0 (income-tax 50000) 6800.0 Ważny kierunek przeprowadzania testu od lewej do prawej i od góry do dołu LISP 27

Prosta rekurencja Q: Jak wykonad powtórnie wyrażenie: dla wszystkich elementów listy dla liczb np. od 1 do 10? A: Realizacja za pomocą rekurencji Rekurencja jest prostą koncepcją zastosowania procedury w procedurze LISP 28

Prosta rekurencja Rekurencyjna procedura jest procedurą zastosowaną do samej siebie Najprostsza rekurencyjna procedura: (define goodbye (lambda () (goodbye))) (goodbye) Procedura nie zwraca wyniku ze względu na nieskooczone wywołanie LISP 29

Prosta rekurencja Rekurencyjne procedury powinny mied co najmniej dwa podstawowe elementy: przypadek bazowy krok rekurencyjny Przypadek bazowy kooczy rekurencję dając procedurze wartośd Krok rekurencyjny daje wartośd pod względem wartości zastosowanej procedury do innego argumentu LISP 30

Prosta rekurencja Problem: znalezienie funkcji wyznaczającej długośd listy w sposób rekurencyjny Argument bazowy rekursji to lista pusta Długośd pustej listy wynosi zero Przypadek bazowy powinien zwrócid zerową wartośd dla listy pustej W celu zbliżania się do listy pustej krok rekurencji dotyczy ogona listy (cdr) LISP 31

Prosta rekurencja Krok rekurencji daje wartośd o jeden więcej niż długośd ogona listy (cdr) (define length (lambda (ls) (if (null? ls) 0 (+ (length (cdr ls)) 1)))) (length '()) 0 (length '(a)) 1 (length '(a b)) 2 LISP 32

Prosta rekurencja Śledzenie kolejnych kroków procedury rekurencyjnej length '(a b c d)) (length (a b c d)) (length (b c d)) (length (c d)) (length (d)) (length ()) 0 1 2 3 4 LISP 33

Prosta rekurencja Wcięcia reprezentują poziom zagnieżdżenia procedury Linie pionowe odpowiadają graficznie wartościom wywołao rekurencyjnych Każde wywołanie funkcji długośd powoduje zmniejszenie listy aż do listy pustej Wartośd dla listy pustej wynosi 0 a następnie każdy zewnętrzny poziom dodaje 1 do otrzymania ostatecznej wartości LISP 34

Prosta rekurencja Rozważmy procerdurę list-copy zwracająca kopie listy będącej jej argumentem list-copy zwraca nową listę zawierającą elementy (nie pary) starej listy Tworzenie kopi listy ma na celu zachowanie oryginału, który może podlegad dalej zmianie (list-copy '()) () (list-copy '(a b c)) (a b c) LISP 35

Definicja list-copy Prosta rekurencja (define list-copy (lambda (ls) (if (null? ls) '() (cons (car ls) (list-copy (cdr ls)))))) list-copy łączy głowę listy z wartościami rekurencyjnego wywołania LISP 36

Prosta rekurencja Możliwośd zdefiniowania więcej niż jednego przypadku bazowego Procedura memv ma 2 argumenty - obiekt i lista memv zwraca: podlistę (ogon) którego pierwszy element jest równy obiektowi #f jeżeli obiekt nie został znaleziony Wartości memv - używane jako lista lub jako wartośd prawdy w wyrażeniach warunkowych LISP 37

Prosta rekurencja (define memv (lambda (x ls) (cond ((null? ls) #f) ((eqv? (car ls) x) ls) (else (memv x (cdr ls)))))) Pierwszy cond testuje bazowy przypadek () Obiekt nie jest elementem listy #f Drugi cond pyta czy głowa listy jest obiektem Krok rekurencji kontynuuje sprawdzanie dla pozostałych elementów LISP 38

Prosta rekurencja Przykładowe wywołanie: (memv 'a '(a b b d)) (memv 'b '(a b b d)) (memv 'c '(a b b d)) (memv 'd '(a b b d)) (a b b d) (b b d) #f (d) (if (memv 'b '(a b b d)) "yes" no") "yes" LISP 39

Prosta rekurencja Procedura remv posiada dwa argumenty - obiekt i listę remv zwraca nową listę obiektów bez ich powtórzeo (define remv (lambda (x ls) (cond ((null? ls) '()) ((eqv? (car ls) x) (remv x (cdr ls))) (else (cons (car ls) (remv x (cdr ls) )))))) LISP 40

Prosta rekurencja (remv 'a '(a b b d)) (b b d) (remv 'b '(a b b d)) (a d) (remv 'c '(a b b d)) (a b b d) (remv 'd '(a b b d)) (a b b) remv nie zatrzymuje się tylko na elementach głowy listy kontynuuje rekurencję poprzez zignorowanie obiektów pojedynczych Jeżeli obiekt nie został znaleziony jako car listy, remv łączy ten element z rekurencyjną wartością LISP 41

Prosta rekurencja Inna wersja procedury tree-copy traktującej strukturę drzewa argumentu jako parę (define tree-copy (lambda (tr) (if (not (pair? tr)) tr (cons (tree-copy (car tr)) (tree-copy (cdr tr)))))) (tree-copy '((a. b). c)) ((a. b). c) LISP 42

Prosta rekurencja Lewe podrzewo jest głową pary Prawe podrzewo jest ogonem pary Podobna operacja do list-copy budująca nowe pary pozostawiając tylko liście Przypadek bazowy sprawdza czy elementem drzewa jest wszystko poza parą Krok rekurencyjny jest podwójnie rekursywny znajdujący wartośd rekurencyjnie dla głowy jak i ogona argumentu LISP 43

Prosta rekurencja Iteracje w Scheme-a wyrażone za pomocą rekurencji są bardziej czytelne i treściwe Rekurencja jest eliminuje dodatkowe zmienne i przypisania wymagane w innych językach zawierające struktury iteracyjne W rezultacie kod programu jest bardziej niezawodny i łatwiejszy do śledzenia Niektóre rekurencje są w istocie iteracją LISP 44

Prosta rekurencja Rozważmy specjalną formę składniową powtórzeo zwanych odwzorowaniem Procedura modulus-all posiada argument będący listą liczb całkowitych i zwraca ich moduł (define modulus-all (lambda (ls) (if (null? ls) '() (cons (modulus (car ls)) (modulus-all (cdr ls)))))) (abs-all '(1-2 3-4 5-6)) (1 2 3 4 5 6) LISP 45

Przypisanie Przypisanie nie tworzy nowego związania jak wyrażenia let lub lambda Przypisanie zmienia wartośd istniejącego związania Przypisanie realizowane wyrażeniem set! (define abcde '(a b c d e)) abcde (a b c d e) (set! abcde (cdr abcde)) abcde (b c d e) LISP 46