Deklarativ programmering

Relevanta dokument
Deklarativ programmering

TDP007 Konstruktion av datorspråk Hemtentamen

Deklarativt programmeringsparadigm

Uppmärkningsspråk. TDP007 Konstruktion av datorspråk Föreläsning 4. Peter Dalenius Institutionen för datavetenskap

Parsning. TDP007 Konstruktion av datorspråk Föreläsning 6. Peter Dalenius Institutionen för datavetenskap

Domänspecifika språk. TDP007 Konstruktion av datorspråk Föreläsning 5. Peter Dalenius Institutionen för datavetenskap

Konstruktion av datorspråk

Uppmärkningsspråk. TDP007 Konstruktion av datorspråk Föreläsning 3. Peter Dalenius Institutionen för datavetenskap

Introduktion till programmering D0009E. Föreläsning 1: Programmets väg

Uppmärkningsspråk. TDP007 Konstruktion av datorspråk Föreläsning 3. Peter Dalenius Institutionen för datavetenskap

Konstruktion av datorspråk

Introduktion till programmering D0009E. Föreläsning 5: Fruktbara funktioner

Konstruktion av datorspråk

DD1361 Programmeringsparadigm. Carina Edlund

Prova på-laboration i Prolog

Repetition i Pascal. Exemplen fac. Exemplen fac i Pascal. Exemplen fac motivering. Orginalet

Tentamen i. TDDA 69 Data och programstrukturer

Användarhandledning Version 1.2

Alla datorprogram har en sak gemensam; alla processerar indata för att producera något slags resultat, utdata.

Introduktion till programmering SMD180. Föreläsning 5: Fruktbara funktioner

Mjukstart i programmering

Prova på-laboration i Ada

Tentamen i Introduktion till programmering

F4. programmeringsteknik och Matlab

Grundläggande datalogi - Övning 1

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

Backcode. Jonathan Crusoe TDP019 Projekt: Datorspråk Linköpings universitet

Alla filer som bearbetar PHP script ska avslutas med ändelsen.php, exempelvis ska en indexsida till en hemsida heta index.php

Python. Python är, som Scheme, ett interpreterat språk men det finns kompilatorer för Python.

CS - Computer science. Datateknik Informationsbehandling Datalogi Datavetenskap (ÅA 2008)

Förra gången: Primitiva data

Bakgrund och motivation. Definition av algoritmer Beskrivningssätt Algoritmanalys. Algoritmer. Lars Larsson VT Lars Larsson Algoritmer 1

Föreläsning 1: Intro till kursen och programmering

Python. Python är, som Scheme, ett interpreterat språk men det finns kompilatorer för Python.

Introduktion till programmering. Programspråk och paradigmer

Kompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering

Typkonvertering. Java versus C

Föreläsning 2 Programmeringsteknik DD1310. Programmering. Programspråk

Introduktion till programmering SMD180. Föreläsning 4: Villkor och rekursion

DD1314 Programmeringsteknik

Föreläsning 3: Booleans, if, switch

Föreläsning 8: Exempel och problemlösning

Besiktningsprotokollet

Repetition i Python 3. Exemplen fac. Exemplen fac motivering. Exemplen fac i Python

DD1361 Programmeringsparadigm Föreläsning 1: Intro

DD1361 Programmeringsparadigm. Formella Språk & Syntaxanalys. Per Austrin

Programmeringsteknik I

Vem är vem på kursen. Objektorienterad programvaruutveckling GU (DIT011) Kursbok Cay Horstmann: Big Java 3rd edition.

Föreläsning 10 Datalogi 1 DA2001. Utskrift på skärmen. Syntax. print( Hej ) Hur är det? Hej. print( Hej,end= ) print( Hur är det? ) HejHur är det?

Imperativ programmering

Imperativ programmering. Föreläsning 2

TDP002 - Imperativ programmering

TDIU01 - Programmering i C++, grundkurs

Föreläsning 1: Intro till kursen och programmering

Program & programmering

Programmering i C++ En manual för kursen Datavetenskaplig introduktionskurs 5p

Software Technology. Josef Svenningsson

Introduktion till programmering och Python Grundkurs i programmering med Python

Föreläsning 10. Besiktningsprotokollet

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

Procedurer och villkor

Föreläsning 10. Pekare (Pointers)

JavaScript del 3 If, Operatorer och Confirm

DD1361 Programmeringsparadigm Föreläsning 1: Intro

1/15/2013. DD1310/DD1314/DA3009 Programmeringsteknik. Lärandemål... Vilka läser kursen? ...fler lärandemål VARFÖR? Föreläsning 1

DD1310/DD1314/DA3009 Programmeringsteknik LÄRANDEMÅL... Vilka läser kursen? ...FLER LÄRANDEMÅL. Föreläsning 1

IT OCH PROGRAMMERING I SKOLAN. Jan Erik Moström Peter Vinnervik

TDDC30. Kursledning Kursledare: Jonas Lindgren. Labassistent: Jonas Lindgren Labassistent: Niklas Holma Labassistent: Erik Nilsson

Dugga Datastrukturer (DAT036)

Hur man programmerar. TDDC66 Datorsystem och programmering Föreläsning 3. Peter Dalenius Institutionen för datavetenskap

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Muddy. Funktioner / metoder. Punktnotation. Evalueringsordning

Föreläsning 2 Programmeringsteknik och C DD1316. Programmering. Programspråk

Introduktion. Klasser. TDP004 Objektorienterad Programmering Fö 2 Objektorientering grunder

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

Föreläsning 2 Programmeringsteknik DD1310. Programmering. Programspråk

Introduktion till Ruby

Static vs Dynamic binding Polymorfism. Objekt-orienterad programmering och design Alex Gerdes, 2016

Tentamen ID1004 Objektorienterad programmering October 29, 2013

Samlingar, Gränssitt och Programkonstruktion! Förelasning 11!! TDA540 Objektorienterad Programmering!

MMA132: Laboration 2 Matriser i MATLAB

Konstruktion av datorspråk

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

Föreläsning 5-6 Innehåll. Exempel på program med objekt. Exempel: kvadratobjekt. Objekt. Skapa och använda objekt Skriva egna klasser

Labb i Datorsystemteknik och programvaruteknik Programmering av kalkylator i Visual Basic

TDP002 - Imperativ programmering

TDIU01 - Programmering i C++, grundkurs

Föreläsning 5-6 Innehåll

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

Föreläsning 9 Innehåll. Söndra och härska. Fibonaccitalen. Söndra och härska. Divide and conquer teknik för att konstruera rekursiva algoritmer.

Fly me to the moon. Laboration om relationer, TDDC75 Diskreta strukturer. Mikael Asplund. 5 september 2017

Föreläsning 9: NP-fullständighet

Programmering I Tobias Wrigstad fredag, 2009 augusti 28

Platser för att skriva och testa kod online. Workshop om programmering i matematikkurser, version 0.7 senast sparat

Static vs Dynamic binding Polymorfism. Objekt-orienterad programmering och design (DIT953) Niklas Broberg, 2018

Karlstads Universitet, Datavetenskap 1

Datatyper. Programmering. Att definiera datatyper i Java. Laddade partiklar. (x,y) (Rx,Ry) hh.se/db2004

Objektorienterad Programmering (TDDC77)

Översikt. Stegvis förfining. Stegvis förfining. Dekomposition. Algoritmer. Metod för att skapa ett program från ett analyserat problem

Tentamen, EDA501/EDAA20 Programmering M MD W BK L

Transkript:

Kursens mål Deklarativ programmering Peter Dalenius petda@ida.liu.se Institutionen för datavetenskap Linköpings universitet 2008-02-26 redogöra för och använda reguljära uttryck använda XML för att definera data- och metadataformat använda och modifiera en tolk för språksyntax implementera ett eget datorspråk för ett givet ändamål resonera kring design av datorspråk och andra metanotationer förstå olika beräkningsmodeller för datorspråk Deklarativ programmering Program skrivet i ett deklarativt språk logikspråk, t.ex. Prolog funktionellt språk, t.ex. Scheme restriktionsspråk (eng. constraint) Programmet specificerar vad som ska göras snarare än hur det ska göras. Exempel: Prolog Programmet består av regler och fakta. syskon(x,y) :- förälder(z,x), förälder(z,y). förälder(x,y) :- far(x,y). förälder(x,y) :- mor(x,y). mor(tina,sally). far(tom,sally). far(tom,erica) far(mike,tom). Att köra programmet innebär att ställa frågor som besvaras med utgångspunkt i de regler och fakta som gäller.?- syskon(sally,erica). Yes Exempel: Scheme Exempel: HTML Programmet består av ett antal funktioner som definierar problemet matematiskt. (define (fakultet n) (if (= n 0) 1 (* n (fakultet (1- n))))) (define (kvadrat x) (* x x)) Att köra programmet innebär att konstruera uttryck vars värde beräknas med hjälp av funktionsdefinitionerna. Även om HTML inte är ett programmeringsspråk är det ett bra exempel på hur man kan definiera data deklarativt. Med HTML definierar vi (åtminstone som det var tänkt från början) ast innehåll och inte utsee. <h2>exempel</h2> <p>det finns många bra exempel på frukter. <a href= banan.html >Bananen</a> t.ex. är en avlång frukt med gult skal som är ganska god.</p> > (+ (fakultet 5) (kvadrat 2)) 124 1

Vem gör grovjobbet? Deklarativ programmering i Ruby Även om programmet uttrycks deklarativt måste någon förr eller senare bestämma sig för hur problemet ska lösas. Generell problemlösare Grundspråk (t.ex. Ruby) högre abstraktionsnivå Deklarativt grundspråk (t.ex. Prolog) Problemets natur avgör hur generell lösning vi behöver. Generell problemlösare Grundspråk (t.ex. Ruby) Problemet kan t.ex. uttryckas med hjälp av ett nytt (domänspecifikt) språk. Problemlösaren kan då ses som en interpretator för det nya språket. Dagens föreläsning Vi ska idag titta på två tekniker för generella problemlösare som låter oss definiera problem deklarativt: Icke-deterministisk programmering med hjälp av continuations Restriktionsnätverk (eng. constraint propagation networks) för att modellera matematiska samband 1. Exempel på problem Kalle köper 20 saker i kiosken och betalar totalt 100 kr. Tuggummi kostar 1 kr, äpplen 7 kr och Coca Cola 12 kr. Hur många köpte han av varje? Vi skulle vilja lösa detta t.ex. så här: gum <- 1..20 apple <- 1..20 coke <- 1..20 gum*1+apple*7+coke*12=100 Generell problemlösare Backtracking För att kunna deklarera problemen på det viset behöver vi en generell problemlösare som kan: tilldela en variabel ett värde ur ett intervall ta hand om särskilda villkor på variablerna försöka igen om tilldelningen inte stämmer överens med villkoren x får ett av värdena i intervallet 1..20 Programmet fortskrider. Ett villkor på x gör att det valda värdet inte kan accepteras. 2

Continuation En continuation representerar resten av en beräkning. Den innehåller all information som behövs för att fortsätta programmet från en viss punkt. Man kan använda en continuation för att åsidosätta normala styrstrukturer, t.ex. för att hoppa ut ur eller upprepa kod. Continuations skapas med konstruktionen callcc, vilket står för call with current continuation. Exempel i = 0 def start i = 0 callcc { c $again = c } i = i+1 i Skriv in koden ovan, eller kopiera från kurshemsidan. Pröva att anropa start och därefter $again.call några gånger. Backtracking med continuations Backtracking med continuations class Amb def initialize @backtrack_points = [] def choose(choices) choices_array = choices.to_a backtrack if choices_array.empty? callcc do cc @backtrack_points.push cc return choices_array[0] choose(choices_array[1..choices_array.length]) class Amb def backtrack if @backtrack_points.empty? fail ExhaustedError, "Can't backtrack" else @backtrack_points.pop.call def require(condition) backtrack unless condition Problemets lösning 2. Modellera matematiska samband def my_problem a = Amb.new begin gum = a.choose 1..20 apple = a.choose 1..20 coke = a.choose 1..20 a.require gum*1+apple*7+coke*12 == 100 puts "#{gum} tuggummi, #{apple} äpplen, #{coke} cola" a.next rescue ExhaustedError puts "Det var alla möjligheter." Hämta koden från kurshemsidan. Lägg till en räknare som kollar hur många alternativ vi testar! Antag att vi ska bygga en spelmotor och på något sätt vill använda Newtons lagar om gravitation. Hur kan vi få in följande ekvation i vårt program? F = Gm 1 m 2 /r 2 3

Modellera matematiska samband Alternativt sätt att visa en ekvation Som en ekvation: irb(main):107:0> f == g*m1*m2/r**2 true Som ett antal metoder: def calculate_f(g,m1,m2,r) g*m1*m2/r**2 def calculate_m1(f,g,m2,r) f*(r**2)/(g*m2) en connector innehåller ett värde F * sq G ett constraint uttrycker förhållandet mellan värden r * m 1 m 2 Exempel att arbeta med Binärt constraint class BinaryConstraint r and d or a b def initialize(input1,input2,output) @input1=input1 @input1.add_constraint(self) @input2=input2 @input2.add_constraint(self) @output=output new_value() e not c Implementation av and och or Implementation av not class AndGate < BinaryConstraint @output.value=(@input1.value and @input2.value) class OrGate < BinaryConstraint @output.value=(@input1.value or @input2.value) class NotGate def initialize(input,output) @input=input @input.add_constraint(self) @output=output new_value() @output.value=(not @input.value) 4

Connectors class Wire def initialize(name,value=false) @name=name @value=value @constraints=[] def add_constraint(gate) @constraints << gate def value=(value) @value=value @constraints.each { c c.new_value } Implementation av nätverk def my_test $a = Wire.new('a') $b = Wire.new('b') $c = Wire.new('c') d = Wire.new('d') e = Wire.new('e') $r = Wire.new('r') ng = NotGate.new($c,e) og = OrGate.new($a,$b,d) ag = AndGate.new(d,e,$r) Ladda in koden och kör metoden my_test. Vad händer om man ändrar a till true? Och hur gör man det? Om uppgifterna Uppgift 1 Skriv tester för constraints Adder och Multiplier Implementera ett nätverk för att konvertera mellan olika fysikaliska storheter Uppgift 2 Gör färdigt en parser som kan läsa in en textuell beskrivning av constraint-nätverk och bygga upp ett sådant (inklusive tester). Källor Thomas, Dave (2005) Programming Ruby. Abelson & Sussman (1996) Structure and Interpretation of Computer Programs. Sebesta, Robert (1996) Concepts of Programming Languages, 3rd Ed. Van Roy & Haridi (2004) Concepts, Techniques, and Models of Computer Programming. 5