Dagens föreläsning Programmering i Lisp Fö 7. Sammanfattning funktionell programmering Exempel på funktionella programspråk

Relevanta dokument
Dagens föreläsning Programmering i Lisp Fö 5

Universitetet i Linköping Institutionen för datavetenskap Anders Haraldsson 2

Rekursiva algoritmer sortering sökning mönstermatchning

LABORATION 1. Inledande Lisp - rekursion

Tentamen i. TDDC67 Funktionell programmering och Lisp

Dagens föreläsning Programmering i Lisp. - Bindning av variabler (avs 14.6) fria variabler statisk/lexikalisk och dynamisk bindning

Två fall: q Tom sekvens: () q Sekvens av element: (a b c) ; (sum-rec '(2 4 6)) = 12. q Första elementet uppfyller vissa villkor: (2 a b c)

Universitetet i Linköping Institutionen för datavetenskap Anders Haraldsson

Dagens föreläsning. Diverse Common Lisp. Konstanter, parametrar, globala variabler

Imperativ programmering. Imperativ programmering konstruktioner i Lisp. Datastrukturer (kap ) arraystruktur poststruktur

TDDC74 Programmering, abstraktion och modellering DUGGA 2

Komma igång med Allegro Common Lisp

Signalflödesmodellen. Två (gamla) exempel: Kvadratera alla jämna löv.

Idag: Par och listor. Scheme. DA2001 (Föreläsning 6) Datalogi 1 Hösten / 29

TDDC74 Programmering: Abstraktion och modellering Datortenta , kl 14-18

Idag: Par och listor. Symboler. Symboler används för att uttrycka icke-numeriska data såsom namn, adress, bilregisternummer, boktitel, osv.

FÖRELÄSNING 2, TDDC74, VT2018 BEGREPP PROBLEMLÖSNING MED HJÄLP AV FALLANALYS PROBLEMLÖSNING MED HJÄLP AV REKURSION

TDDC74 Programmering: Abstraktion och modellering Tentamen, onsdag 9 juni 2016, kl 14 18

BEGREPP HITTILLS FÖRELÄSNING 2 SAMMANSATTA UTTRYCK - SCHEME DATORSPRÅK

Sista delen av kursen

Programmering II (ID1019) :00-17:00

Tillämpad Programmering (ID1218) :00-13:00

Sista delen av kursen

Programspråkslingvistik. Sista delen av kursen. Ett programspråk

TDDC74 Programmering: Abstraktion och modellering Tentamen, lördag 27 augusti 2016, kl 8 12

TDDC74 Lab 02 Listor, sammansatta strukturer

Objektorienterad programmering

Programmering II (ID1019)

TDDC74 Programmering, abstraktion och modellering. Tentamen

Föreläsning 9 Exempel. Intervallhalveringsmetoden. Intervallhalveringsmetoden... Intervallhalveringsmetoden...

729G74 IT och programmering, grundkurs. Tema 2. Föreläsning 3 Jody Foo,

TENTAMEN I PROGRAMSPRÅK -- DVG C kl. 08:15-13:15

Uppgift 4A - Definition av enkla funktioner

Typsystem. Typsystem... Typsystem... Typsystem... 2 *

Introduktion till algoritmer - Lektion 4 Matematikgymnasiet, Läsåret Lektion 4

Dagens föreläsning. - Vad skall vi kunna inför den skriftliga examinationen? - Vad skall vi ta med oss till andra kurser.

TDDC74 Programmering, abstraktion och modellering. Tentamen

Typsystem. DA2001 (Föreläsning 23) Datalogi 1 Hösten / 19

Programmering II (ID1019) :00-12:00

Föreläsning 9 Exempel

TDDC74 Programmering, abstraktion och modellering DUGGA 1

Funktionell programmering DD1361

TDDC74 PROGRAMMERING: ABSTRAKTION OCH MODELLERING VT 2017

DD1361 Programmeringsparadigm. Carina Edlund

Uppsala Universitet Matematiska Institutionen Thomas Erlandsson

Uppgift 6A - Frekvenstabell

Instruktioner - Datortentamen TDDD73 Funktionell och imperativ programmering i Python

Tentamen i. TDDA 69 Data och programstrukturer

KOMBINATORIK. Exempel 1. Motivera att det bland 11 naturliga tal finns minst två som slutar på samma

FÖRELÄSNING 1 PERSONAL TDDC74 PROGRAMMERING: ABSTRAKTION OCH MODELLERING VT 2017 SYFTE EXAMINATION ORGANISATION

Dagens föreläsning. Modeller för programmeringsspråk. - Olika modeller programspråk Interpretator - kompilator. - Syntax - semantik.

Föreläsningsanteckningar och övningar till logik mängdlära

n Detta för att kunna koncentrera oss på n Tal: number? n Symboler: symbol? n Strängar: string? n Tecken: char? n Boolskt: boolean?

allt.cl Page 1 of 17 Date: torsdag 7 december 2006

Abstrakta datatyper. Dagens föreläsning. Abstract data types (ADT)

Dagens föreläsning. TDDC67 Funktionell programmering och Lisp Fö 8 och 9

Dataabstraktion. TDDD73 Funktionell och impterativ programmering i Python Föreläsning 12. Peter Dalenius Institutionen för datavetenskap

Grundläggande logik och modellteori

Programkonstruktion och datastrukturer. Moment 9 Om högre ordningens funktioner. PKD 2010/11 moment 9 Sida 1 Uppdaterad

Programmering II (ID1019) :00-12:00

Universitetet i Linköping Institutionen för datavetenskap Anders Haraldsson

729G74 IT och programmering, grundkurs. Tema 2. Föreläsning 3 Jody Foo,

Instruktioner - Datortentamen TDDD73 Funktionell och imperativ programmering i Python

Tentamen i TDDC75 Diskreta strukturer , lösningsförslag

Procedurer och villkor. Rekursiva procedurer. Exempel: n-fakultet

Lösning till tentamensskrivning i Diskret Matematik för CINTE, CL2 och Media 1, SF1610 och 5B1118, onsdagen den 17 augusti 2011, kl

Procedurer och villkor

TDDC74 Programmering: Abstraktion och modellering Datordugga 2 - exempel

Lösningar Datastrukturer TDA

I kursen i endimensionell analys är mängden av reella tal (eng. real number), R, fundamental.

Läsanvisning till Discrete matematics av Norman Biggs - 5B1118 Diskret matematik

TDDC74 Programmering: Abstraktion och modellering Tentamen, onsdag 19 oktober 2016, kl 14 18

TENTAMEN: Algoritmer och datastrukturer. Läs detta!

Introduktion till Haskell

Programmering II (ID1019) :00-11:00

Övningshäfte 6: 2. Alla formler är inte oberoende av varandra. Försök att härleda ett par av de formler du fann ur några av de övriga.

729G74 IT och programmering, grundkurs. Tema 1, Föreläsning 3 Jody Foo,

Tillämpad programmering

Föreläsning Datastrukturer (DAT036)

SCB :-0. Uno Holmer, Chalmers, höger 2 Ex. Induktiv definition av lista. // Basfall

(N) och mängden av heltal (Z); objekten i en mängd behöver dock inte vara tal. De objekt som ingår i en mängd kallas för mängdens element.

Instruktioner - Datortentamen TDDD73 Funktionell och imperativ programmering i Python

Föreläsningsanteckningar, Introduktion till datavetenskap HT S4 Datastrukturer. Tobias Wrigstad

Lösning av tentamensskrivning i Diskret Matematik för CINTE och CMETE, SF1610, tisdagen den 27 maj 2014, kl

Övningshäfte 3: Funktioner och relationer

Lambdas. (och fler design patterns) Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2017

729G74 IT och programmering, grundkurs. Tema 3. Föreläsning 2 Jody Foo,

Tabeller. Programkonstruktion. Moment 8 Om abstrakta datatyper och binära sökträd. Implementering av tabellen. Operationer på tabellen

Centrala begrepp i prolog och logikprogrammering. Annamaris lista

TDDC74 Programmering, abstraktion och modellering. Tentamen

Exempel på typer av datorspråk EXCEL

TENTAMEN: Algoritmer och datastrukturer. Läs detta! Uppgifterna är inte avsiktligt ordnade efter svårighetsgrad.

Linjärt minne. Sammanhängande minne är ej flexibelt. Effektivt

Övningshäfte 1: Logik och matematikens språk

Språket Python - Del 1 Grundkurs i programmering med Python

TDDC74 Programmering: Abstraktion och modellering Datortenta , kl 14-18

Föreläsning 7 Innehåll. Rekursion. Rekursiv problemlösning. Rekursiv problemlösning Mönster för rekursiv algoritm. Rekursion. Rekursivt tänkande:

Föreläsning 4 Datastrukturer (DAT037)

Föreläsning 13. Träd

Universitetet i Linköping Institutionen för datavetenskap Anders Haraldsson

Transkript:

1 Dagens föreläsning Programmering i Lisp Fö 7 Kopplingen funktionella programmering och diskret matematik. Jämför vad ni hittills gjort i denna kurs och i den diskreta matematiken, med referenser in i läroboken Diskret matematik. Sammanfattning funktionell programmering Exempel på funktionella programspråk

2 DM-Kapitel 1. Mängder Mängder kan lätt representeras som listor i Lisp, men dubblerade element kan ej förekomma. Ordningen spelar ingen roll. DM-Avsnitt 1.2 I Övning 120.* föreslås att definiera mängdoperationerna union, snitt och differens, samt lägg till ett element och är ett element medlem i en mängd. Man kan också införa en funktion som jämför om två mängder är lika eller en delmängd av en annan mängd. DM-Avsnitt 1.3 I Lisp-föreläsning 5 i samband med reduce och den rekursiva och iterativa processlösningen, diskuterade vi olika egenskaper hos operatorer, kommutativ och associativ operator, samt vänster- resp högerassociativitet. I vilken ordning beräknas uttryck som 1-2 - 3-4 - 5 (1 - (2 - (3 - (4-5)))) eller ((((1-2) - 3) - 4) - 5) Hur är det med +?

3 Vi kom då fram till att vi kunde använda samma operator i den rekursiva och iterativa processlösningen om operatorn var kommutativ och associativ. Från 1.3 ser vi dessa lagar för operatorn union. I nästa steg i Lisp-kursen kommer vi att ta upp Dataabstraktion och kommer då att använda mängder som ett sätt att beskriva datatyper. DM-Avsnitt 1.4 Vi kommer att använda begrepp som ordnade par och kartesiska produkt. DM-Avsnitt 1.8 Delmängd och potensmängd. Nu skall i uppgift 3A skriva en funktion som genererar potensmängden av en mängd, dvs alla delmängder man kan skapa.

4 DM Kapitel 4. Induktion I Lisp-kursen vill vi använda resonemanget med induktion för att skriva och verifiera rekursiva funktioner. Antag att det rekursiva anropet är korrekt. Lisp-föreläsning 6 tog upp DM 4.1 Induktionsprincipen. Exemplifierat med samma summering som i läroboken. När ni definierade de första rekursiva funktionerna över tal så exemplifierade på samma sätt som sid 52 i DM-boken hur man kunde se det rekursiva sambandet. DM 4.2 Välordningsprincipen. Det finns ett minsta element i en delmängd av tal i N. Vi kan även göra induktion över sekvenser, som inte tas upp i läroboken, utan man gör induktionsbevis över naturliga talen.

5 DM 4.4 Rekursiva definitioner. Se DM-exempel 4.3.2 och fakultetsfunktionen i 4.4.2. I DM-exempel 4.4.3 ser ni sambandet för n-te potensen, som ni definierad i övning 108 med funktionen upphöjt-till.

6 Vad ni kan göra: Ni kan testa många samband i DM-övningarna (sid 58) genom att använda funktioner ni definierat i Lisp, tex summera de n första talen. Gör om den till en högre ordningens funktion, som tar termen i summan (som en funktion). (defun summera (n term) (summera-från n 1 term)) (defun summera-från (n i term) (if (> i n) 0 (+ (funcall term i) (summera-från n (+ i 1) term)))) (defun fak (n) (if (= n 0) 1 (* n (fak (- n 1))))) (defun square (n) (* n n)) (defun test-4.5 (n) (= (summera n # (lambda (k)(* k (fak k)))) (- (fak (+ n 1)) 1))) (defun test-4.6 (n) (= (summera n # (lambda (k) (* k k k))) (square (summera n # (lambda (k) k))))) (test-4.5 5) => t (test 4.6) = t

7 DM Kapitel 5 Kombinatorik Här kanske vi inte använder så mycket i programmeringen som sådant, utan mer hittar många bra exempel att lösa. DM 5.3-5.4 Permutationer. Där definieras fakultet igen, och sätt att beräkna antalet permutationer. I Lisp-läroboken i avsnitt 8.2 en funktion som tar fran alla permutationer av elementen i en lista. (Senare i avsnitt 12.7 visas hur en rekursiv lösning mer systematiskt kan överföras till ett iterativ program.) DM 5.5 Kombinationer. På Lisp-föreläsning och övning 301 är att skriva en funktion som genererar alla kombinationer av elementen i ett godtyckligt antal listor. Egentligen löser vi här problemet att ta fram den kartesiska produkten av ett antal tupler. Se DM-avsnitt 1.4, men där ger man kartesiska produkten av 2 tupler, medan vi i denna uppgift tar fram med godtyckligt antal tupler.

8 DM 5.7 Binomialsatsen och 5.9 Pascals triangel. Sedan införs n över k, som kan beräknas med fakultet, som leder till binomialkoefficienterna, som kan beräknas med Pascals triangel, som är er Uppgift 2E. Vad kan ni göra: Även här kan ni med ganska enkla medel kunna skriva program som löser en del av övningarna från DM-kapitel 5 på sidan 82 och framåt.

9 DM-Kapitel 7. Grafer DM Avsnitt-7.1.1 Grafer och enkla grafer. Här ges den allmänna defintionen av en graf. Här använd begreppet hörn, som motsvarande begrepp för en nod, som vi har använt här i Lisp-kursen. En båge kallas även en kant. DM Avsnitt 7.1.7. Vägar. Här definieras väg som en sekvens bågar. DM avsnitt 7.4 Träd. Här ges den allmänna definitionen av ett träd, som är en graf utan cykler. Vi har mest använt begreppet binärt träd, då antalet utgående bågar är 2 (eller max 2).

10 DM Kapitel 10. Logik DM Avsnitt 10.2 Konnektiv och sanningsvärdestabeller. Vi använder detta i dels Lisp-övning 208, där de logiska konnektiven negation (icke/ not), disjunktion (eller/or) och konjunktion (och/eller) skall definieras. Sannigstabellerna ges i DMavsnitt 10.2. I Lisp-uppgift 2A skall logiska uttryck beräknas.

11 Återblick funktionell programmering Program är funktioner. Funktionerna ses som matematiska funktioner, dvs avbildning av argument till värde. Funktioner gör ej eller beror på sidoeffekter. Funktionsanrop med samma argument skall ge samma värde (referential transparency). (f 1 2) => 2345 (f 1 2) => 4567 Ej möjligt! Beräkningsmodell: Substitutionsmodellen, ersätt funktionsanrop med funktionsdefinition och substituera formella parametrar med värdet av de aktuella parametrarna. Deklarativ programmering: Program beskriver mer vad som skall göras ej exakt hur. Program ses mer som en specifikation av problemet, men som även kan beräknas. Till gruppen hör även logikprogrammering.

12 Vi har hittills gått igenom den funktionella delmängden eller pure Lisp. - dataobjekt: tal, symboler och listor - uttryck - villkorliga uttryck - funktioner - högre ordningens funktioner - lokala variabler - lokala funktioner - ge globalt namn (med setq) till värden Icke-funktionella operationer är: Användning av setq, som tilldelning inne i funktioner. In- och utmatning. Datastrukturer som ändrar innehåll, t ex poster och arraystrukturer.

13 - Vi har lärt oss skriva algoritmer som bearbetar sekvenser och binär träd-strukturer. Ni har nu övat på detta. - Vi har identifierat olika typer av mallar eller mönster. - Vi kan traversera en sådan struktur, dvs gå igenom den element för element. Vi kan nu identifiera olika typer av algoritmmönster: sökning efter givet element (finns-bokstav? i Övn 118, forwardfind i Uppg 2B) mappning, transformera varje elements värde till ett nytt och skapa en struktur av samma slag. (positiva i Uppg 1A, högre ordningens funktion mapcar) filtrering, skapa en ny struktur med alla elementen som uppfyller ett villkor (ta-bort-vokaler i Uppg 119, filtrera i Uppg 1A, filter Övn 213) reduktion (ackumulering), t ex summera alla talen i en sekvens (räkna i Uppg 1A, högre ordningens funktion reduce) back-tracking, sök först bestäm sedan (efter-sista i Uppg 205, backfind i Uppg 2C) generering, från ett värde skapa nästa (generate-list i Uppg 2E)

14 Används funktionell programmering? Ericsson har tagit fram ett deklarativt språk ER- LANG (http://www.erlang.org/) baserat på funktionell programmering (ML) och logikprogrammering (Prolog). Innehåller processer för concurrent programming. Skiljer sig från LISP genom annan syntax och anrop genom mönstermatchning. member(x, [X _]) -> true member(x, [_ T]) -> member(x,t) member(x, []) -> nil member(a, [a, b, c, d]) > true (defun member (x l) (cond ((endp l) nil) ((eq x (first l)) t) (t (member x (rest l)))))

15 Exempel: Binärt sorteringsträd. Kan användas för att snabba upp sökningen i en tabell jämfört med exempelvis en sekvensiell lista (typ associationslista). Vi har en nyckel (key) och ett värde (value). Representation för ett sorterat-binärt-träd: löv: nil nod: {nyckel värde sorterat-binärt-träd sorterat-binärt-träd} Exempel: ett - one, två - two, tre - three, fyra - four Sorteringsträdet byggs upp genom ta en nyckel och ett värde i taget, traversera trädet och bygga ut ett löv: nil {ett one nil nil} {ett one nil {två two nil nil}} {ett one nil {två two {tre three nil nil} nil}} {ett one nil {två two {tre three {fyra four nil nil} nil} nil}}

16 Sökning i ett sorterat binärt träd. Erlangkod: lookup(key, nil) -> not-found lookup(key, {Key, Value, _, _}) -> {found, Value} lookup(key, {Key1, _, Smaller, _}) when Key < Key1 -> lookup(key, Smaller) lookup(key, {Key1, _, _, Bigger}) when Key > Key1 -> lookup(key, Bigger) motsvarande Lispkod: (defun lookup (key node) (cond ((eq node nil) not-found) ((eq key (first node)) (list found (second node))) ((string< key (first node)) (lookup key (third node))) (t (lookup key (fourth node)))))

17 Funktionella programspråk. Haskell http://www.haskell.org/ Används som första programspråk på Chalmers. qsort [] = [] qsort (x:xs) = qsort elts_lt_x ++ [x] ++ qsort elts_greq_x where elts_lt_x = [y y <- xs, y < x] elts_greq_x = [y y <- xs, y >= x] (x:xs) --- x binds till första elementet och xs till resten ++ är append [y y <- xs, y < x] är en högre ordningens operation som skapar en lista med alla y där y tillhör xs och y är mindre än x. Andra egenskaper: strongly typed (stark typning), polymorphism non-strict functional programming languages => lazy evaluation (lat evaluering) till skillnad från eager evaluation Man kan hantera oändliga listor

18 Lat evaluering (defun f (test arg1 arg2)... (if test arg1 arg2)...) (f (= x 3) (/ x y) (/ x 0)) Om detta är enda stället där arg2 används och om x=3 så behövs inte arg2 som då inte beräknas. Om arg2 i detta fall beräknas får vi ju fel, division med 0! Strömmar, man kan hantera oändliga listor. Definition av alla heltalen. (defun heltal-från (n) (cons n (heltal-från (+ n 1)))) (setq heltal (heltal-från 1)) heltal = (1 2 3 4 5... (fifth heltal) => 5 Antag vi har ström-add som adderar elementen i två strömmar parvis. (ström-add heltal heltal) => ( 2 4 6 8 10... Vi definierar om heltalen: (setq ettor (cons 1 ettor)) (setq heltal (cons 1 (ström-add ettor heltal))) Vi definierar fibonaccitalen: (setq fib-tal (cons 0 (cons 1 (ström-add (rest fib-tal) fib-tal)))) fib-tal = ( 0 1 1 2 3 5 8 13... (sixth fib-tal) => 8

19 Mer om detta kan man läsa i kurserna: TDDA69 Data- och programstrukturer TDDA43 Programmeringsteori