FL 5: Aritmetik. Teori

Relevanta dokument
DD1361 Programmeringsparadigm. Carina Edlund

Föreläsning 3: rekursion

Procedurer och villkor

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

Övningshäfte 2: Induktion och rekursion

Datatyper och kontrollstrukturer. Skansholm: Kapitel 2) De åtta primitiva typerna. Typ Innehåll Defaultvärde Storlek

Programkonstruktion och Datastrukturer

Traditionell Programmering

Pythons standardbibliotek

Datalogi, grundkurs 1

Tentamen TEN1 HI

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

Föreläsning 4. Kö Implementerad med array Implementerad med länkad lista Djup kontra bredd Bredden först mha kö

Föreläsning 2 Programmeringsteknik och C DD1316. Mikael Djurfeldt

MÖNSTER OCH TALFÖLJDER

Funktionell programmering DD1361

Textsträngar från/till skärm eller fil

Föreläsning 2 Programmeringsteknik och C DD1316

Introduktion till formella metoder Programmeringsmetodik 1. Inledning

public boolean containskey(string key) { return search(key, head)!= null; }

Denna uppdelning är ovanlig i Sverige De hela talen (Både positiva och negativa) Irrationella tal (tal som ej går att skriva som bråk)

Våra enkla funktioner eller procedurer

Datastrukturer. Erik Forslin. Rum 1445, plan 4 på Nada

Föreläsning 6: Introduktion av listor

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

Programmering II (ID1019) :00-12:00

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

Programmering II (ID1019)

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

Logikprogrammering. Undervisningsmaterialet NYTT för 2013: Learn Prolog Now! SWI Prolog-tolk, startas under tuxedo/ pingvinerna med swipl!

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?

Ett Logikprogram. Logik och Programmering. Introduktion till PROLOG, dvs. PROgramming in LOGic. Viktiga begrepp/områden i Prolog. Framtiden?

Länkning av Prolog under C

DD1361 Programmeringsparadigm HT16

Grundläggande datalogi - Övning 1

Introduktion till programmering D0009E. Föreläsning 9: Tupler och dictionaries

Föreläsning 6: Induktion

Övningsuppgifter till föreläsning 2 Variabler och uttryck

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

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

Föreläsning 2 Programmeringsteknik och Matlab DD1312. Programspråk. Utskrift på skärmen

Outline. For. I istället för att följa det normala ordningen, man ändra den. I i Java får man inte göra hopp hur som helst

DD1361 Programmeringsparadigm HT15

Programmeringsuppgifter 1

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

TDIU01 - Programmering i C++, grundkurs

Centrala begrepp i prolog och logikprogrammering. Annamaris lista

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

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

Introduktion till programmering SMD180. Föreläsning 8: Listor

Föreläsning 3: Typomvandling, villkor och val, samt textsträngar

Programmering II (ID1019) :00-17:00

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

729G04 Programmering och diskret matematik

JavaScript del 3 If, Operatorer och Confirm

DD1361 Programmeringsparadigm HT15

TDDC74 Programmering, abstraktion och modellering DUGGA 2

Föreläsning 9 i programmeringsparadigm. Unifiering (Brna Chapter 4.1).

Programstruktur och terminologi. Programmet producerar följande utskrift i terminalfönstret: Ett Javaprogram består av en eller flera klasser

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

Programmering A. Johan Eliasson

Instruktioner - Datortentamen TDDD73 Funktionell och imperativ programmering i Python TDDE24 Funktionell och imperativ programmering del 2

TDDC74 Programmering, abstraktion och modellering. Tentamen

Hej Då, Karel! Programmering. Vårt första Javaprogram. hh.se/db2004. Java. Grundtyper, variabler och arrayer

TENTAMEN PROGRAMMERINGSMETODIK MOMENT 2 - JAVA, 4P

TDIU01 - Programmering i C++, grundkurs

Datalogi, grundkurs 1

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

Tentamen i Introduktion till programmering

729G74 - IT och programmering, grundkurs. Dugga.

Övning2. Variabler. Data typer

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

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

MATLAB. Python. Det finns flera andra program som liknar MATLAB. Sage, Octave, Maple och...

Objektorienterad programmering Föreläsning 8. Copyright Mahmud Al Hakim Agenda (halvdag)

Styrteknik: MELSEC FX och numeriska värden

Tentamen Datastrukturer D DAT 035/INN960

Objektorienterad programmering

Utvidgad aritmetik. AU

DD1361 Programmeringsparadigm HT17

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

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

Tentamen TEN1 HI

Datalogi för E Övning 3

Föreläsning 4 Programmeringsteknik och Matlab DD1312. Logiska operatorer. Listor. Listor, tupler, strängar och forslingor

TDIU01 - Programmering i C++, grundkurs

Anmälningskod: Lägg uppgifterna i ordning. Skriv uppgiftsnummer (gäller B-delen) och din kod överst i högra hörnet på alla papper

Introduktion till Datalogi DD1339. Föreläsning 2 22 sept 2014

Inledande programmering med C# (1DV402) 27+15=42 1 (22)

Introduktion Schenker-BTL AB, Stab IT Beskrivning över informationsintegreringmed Schenker, metodbeskrivning version 1.

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

Programmeringsteknik med C och Matlab

Introduktion till programmering SMD180. Föreläsning 7: Strängar

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

Formell logik Kapitel 1 och 2. Robin Stenwall Lunds universitet

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

Användning av stack: evaluera uttryck i RPN

C++ Funktioner 1. int summa( int a, int b) //funktionshuvud { return a+b; //funktionskropp } Värmdö Gymnasium Programmering B ++ Datainstitutionen

Användar- och systemdokumentation

Att förstå hur man konstruerar modulära program Att kunna skapa nya funktioner Att förstå hur data skickas mellan funktioner

Transkript:

FL 5: Aritmetik Teori Introducerar Prologs inbyggda operationer för aritmetik Tillämpar dessa på enkla listhanteringsproblem, mha ackumulatorer Ser på svansrekursiva predikat och förklarar varför de är mera effektiva än icke-svansrekursiva predikat

Aritmetik i Prolog Prolog erbjuder ett antal grundläggande verktyg för aritmetik Heltal och flyttal Aritmetik 2 + 3 = 5 3 x 4 = 12 5 3 = 2 3 5 = -2 4 : 2 = 2 1 är resten när 7 divideras med 2 Prolog?- 5 is 2+3.?- 12 is 3*4.?- 2 is 5-3.?- -2 is 3-5.?- 2 is 4/2.?- 1 is mod(7,2).

Exempel på förfrågningar?- 10 is 5+5. yes?- 4 is 2+3. no?- X is 3 * 4. X=12 yes?- R is mod(7,2). R=1 yes

Att definiera predikat mha aritmetik addthreeanddouble(x, Y):- Y is (X+3) * 2.

Att definiera predikat mha aritmetik addthreeanddouble(x, Y):- Y is (X+3) * 2.?- addthreeanddouble(1,x). X=8 yes?- addthreeanddouble(2,x). X=10 yes

En närmare titt Det är viktigt att veta att +, -, / och * utför ingen aritmetik Uttryck som 3+2, 4-7, 5/5 är vanliga Prolog-termer Funktor: +, -, /, * Aritet: 2 Argument: heltal

En närmare titt?- X = 3 + 2.

En närmare titt?- X = 3 + 2. X = 3+2 yes?-

En närmare titt?- X = 3 + 2. X = 3+2 yes?- 3 + 2 = X.

En närmare titt?- X = 3 + 2. X = 3+2 yes?- 3 + 2 = X. X = 3+2 yes?-

Predikatet is/2 För att tvinga Prolog att verkligen evaluera aritmetiska uttryck, måste vi använda is såsom vi gjorde i exempelfallen Detta instruerar Prolog att utföra beräkningarna Eftersom detta inte är ett vanligt Prologpredikat, finns det några begränsningar

Predikatet is/2?- X is 3 + 2.

Predikatet is/2?- X is 3 + 2. X = 5 yes?-

Predikatet is/2?- X is 3 + 2. X = 5 yes?- 3 + 2 is X.

Predikatet is/2?- X is 3 + 2. X = 5 yes?- 3 + 2 is X. ERROR: is/2: Arguments are not sufficiently instantiated?-

Predikatet is/2?- X is 3 + 2. X = 5 yes?- 3 + 2 is X. ERROR: is/2: Arguments are not sufficiently instantiated?- Result is 2+2+2+2+2.

Predikatet is/2?- X is 3 + 2. X = 5 yes?- 3 + 2 is X. ERROR: is/2: Arguments are not sufficiently instantiated?- Result is 2+2+2+2+2. Result = 10 yes?-

Begränsningar på användning av is/2 Vi får använda variabler på högra sidan av predikatet is Men när Prolog utför beräkningen måste variablerna vara instantierade med en variabelfri Prolog-term Denna Prolog-term måste vara ett aritmetiskt uttryck

Notation Till slut två kommentarer på aritmetiska uttryck 3+2, 4/2, 4-5 är endast vanliga Prologtermer i en användarvänlig notation: 3+2 är egentligen +(3,2) osv. Även predikatet is är ett tvåställigt Prologpredikat

Notation Till slut två kommentarer på aritmetiska uttryck 3+2, 4/2, 4-5 är endast vanliga Prologtermer i en användarvänlig notation: 3+2 är egentligen +(3,2) osv. Även predikatet is är ett tvåställigt Prologpredikat?- is(x,+(3,2)). X = 5 yes

Aritmetik och listor Hur lång är en lista? Den tomma listan har längd 0 En icke-tom lista har längd 1 plus längden av sin svans Försök formulera predikatet length!

Längden av en lista i Prolog len([],0). len([_ L],N):- len(l,x), N is X + 1.?-

Längden av en lista i Prolog len([],0). len([_ L],N):- len(l,x), N is X + 1.?- len([a,b,c,d,e,[a,x],t],x).

Längden av en lista i Prolog len([],0). len([_ L],N):- len(l,x), N is X + 1.?- len([a,b,c,d,e,[a,x],t],x). X=7 yes?-

Ackumulatorer Detta var ett rätt så bra program Lätt att förstå Relativt effektivt Men det finns en annan metod för att beräkna längden av en lista Introducerar tanken bakom ackumulatorer Ackumulatorer är variabler som innehåller mellanresultat

Att definiera acclen/3 Predikatet acclen/3 har tre argument Listan vars längd vi vill få reda på Längden av listan, ett heltal En ackumulator som håller reda på mellanresultat för längden

Att definiera acclen/3 Ackumulatorn för acclen/3 Startvärdet för ackumulatorn är 0 Addera 1 till ackumulatorn för varje gång vi rekursivt behandlar huvudet av en lista När vi når den tomma listan, innehåller ackumulatorn längden av listan Försök formulera acclen!

Längden av en lista i Prolog acclen([],acc,length):- Length = Acc. acclen([_ L],OldAcc,Length):- NewAcc is OldAcc + 1, acclen(l,newacc,length).?-

Längden av en lista i Prolog acclen([],acc,length):- Length = Acc. acclen([_ L],OldAcc,Length):- NewAcc is OldAcc + 1, acclen(l,newacc,length).?- addera 1 till ackumulatorn varje gång vi avlägsnar huvudet från listan

Längden av en lista i Prolog acclen([],acc,length):- Length = Acc. acclen([_ L],OldAcc,Length):- NewAcc is OldAcc + 1, acclen(l,newacc,length).?- När vi når den tomma listan, innehåller ackumulatorn listans längd

Längden av en lista i Prolog acclen([],acc,acc). acclen([_ L],OldAcc,Length):-?- NewAcc is OldAcc + 1, acclen(l,newacc,length).

Längden av en lista i Prolog acclen([],acc,acc). acclen([_ L],OldAcc,Length):- NewAcc is OldAcc + 1, acclen(l,newacc,length).?-acclen([a,b,c],0,len). Len=3 yes?-

Sökträdet för acclen/3 acclen([ ],Acc,Acc).?- acclen([a,b,c],0,len). acclen([_ L],OldAcc,Length):- NewAcc is OldAcc + 1, acclen(l,newacc,length).

Sökträdet för acclen/3 acclen([ ],Acc,Acc).?- acclen([a,b,c],0,len). / \ acclen([_ L],OldAcc,Length):- NewAcc is OldAcc + 1, acclen(l,newacc,length).

Sökträdet för acclen/3 acclen([ ],Acc,Acc).?- acclen([a,b,c],0,len). / \ no?- acclen([b,c],1,len). / \ acclen([_ L],OldAcc,Length):- NewAcc is OldAcc + 1, acclen(l,newacc,length).

Sökträdet för acclen/3 acclen([ ],Acc,Acc).?- acclen([a,b,c],0,len). / \ no?- acclen([b,c],1,len). / \ no?- acclen([c],2,len). / \ acclen([_ L],OldAcc,Length):- NewAcc is OldAcc + 1, acclen(l,newacc,length).

Sökträdet för acclen/3 acclen([ ],Acc,Acc).?- acclen([a,b,c],0,len). / \ no?- acclen([b,c],1,len). / \ no?- acclen([c],2,len). no / \ acclen([_ L],OldAcc,Length):- NewAcc is OldAcc + 1, acclen(l,newacc,length).?- acclen([],3,len). / \

Sökträdet för acclen/3 acclen([ ],Acc,Acc).?- acclen([a,b,c],0,len). / \ no?- acclen([b,c],1,len). / \ no?- acclen([c],2,len). no / \?- acclen([],3,len). / \ Len=3 acclen([_ L],OldAcc,Length):- NewAcc is OldAcc + 1, acclen(l,newacc,length). no

Att tillägga ett wrapper-predikat acclen([ ],Acc,Acc). acclen([ _ L],OldAcc,Length):- NewAcc is OldAcc + 1, acclen(l,newacc,length). length(list,length):- acclen(list,0,length).?-length([a,b,c], X). X=3 yes

Svansrekursion Varför är acclen/3 bättre än len/2? acclen/3 är svansrekursiv medan len/2 inte är det Skillnaden: När det gäller svansrekursiva predikat är resultatet färdigt beräknat så fort vi når basfallet När det gäller rekursiva predikat som inte är svansrekursiva, finns det ännu mål att evaluera på stacken när vi når basfallet

Jämförelse Icke-svansrekursiv Svansrekursiv len([],0). len([_ L],NewLength):- len(l,length), NewLength is Length + 1. acclen([],acc,acc). acclen([_ L],OldAcc,Length):- NewAcc is OldAcc + 1, acclen(l,newacc,length).

Sökträdet för len/2?- len([a,b,c], Len). len([],0). len([_ L],NewLength):- len(l,length), NewLength is Length + 1.

Sökträdet för len/2?- len([a,b,c], Len). no / \?- len([b,c],len1), Len is Len1 + 1. len([],0). len([_ L],NewLength):- len(l,length), NewLength is Length + 1.

Sökträdet för len/2?- len([a,b,c], Len). no / \?- len([b,c],len1), Len is Len1 + 1. / \ no?- len([c], Len2), Len1 is Len2+1, Len is Len1+1. len([],0). len([_ L],NewLength):- len(l,length), NewLength is Length + 1.

Sökträdet för len/2?- len([a,b,c], Len). no / \?- len([b,c],len1), Len is Len1 + 1. / \ no?- len([c], Len2), Len1 is Len2+1, Len is Len1+1. / \ no?- len([], Len3), Len2 is Len3+1, Len1 is Len2+1, Len is Len1 + 1. len([],0). len([_ L],NewLength):- len(l,length), NewLength is Length + 1.

Sökträdet för len/2?- len([a,b,c], Len). / \ no?- len([b,c],len1), Len is Len1 + 1. / \ no?- len([c], Len2), Len1 is Len2+1, Len is Len1+1. / \ no Len3=0, Len2=1, Len1=2, Len=3?- len([], Len3), Len2 is Len3+1, Len1 is Len2+1, Len is Len1 + 1. / \ len([],0). len([_ L],NewLength):- len(l,length), NewLength is Length + 1. no

Sökträdet för acclen/3 acclen([ ],Acc,Acc).?- acclen([a,b,c],0,len). / \ no?- acclen([b,c],1,len). / \ no?- acclen([c],2,len). no / \?- acclen([],3,len). / \ Len=3 acclen([_ L],OldAcc,Length):- NewAcc is OldAcc + 1, acclen(l,newacc,length). no

Lite övningar... Vad svarar Prolog på: X = 3*4.?- X = 3*4. X = 3*4.

Lite övningar... Vad svarar Prolog på: X is 3*4.?- X is 3*4. X = 12.

Lite övningar... Vad svarar Prolog på: 4 is X.?- 4 is X. ERROR: is/2: Arguments are not sufficiently instantiated

Lite övningar... Vad svarar Prolog på: X = Y.?- X = Y. X = Y.

Lite övningar... Vad svarar Prolog på: 3 is 1+2.?- 3 is 1+2. true.

Lite övningar... Vad svarar Prolog på: 3 is +(1,2).?- 3 is +(1,2). true.

Lite övningar... Vad svarar Prolog på: 3 is X+2.?- 3 is X+2. ERROR: is/2: Arguments are not sufficiently instantiated

Lite övningar... Vad svarar Prolog på: X is 1+2.?- X is 1+2. X = 3.

Lite övningar... Vad svarar Prolog på: 1+2 is 1+2.?- 1+2 is 1+2. false. Ej heller aritmetisk likhet! IS är inte unifieringsoperator!

Lite övningar... Vad svarar Prolog på: is(x,+(1,2)).?- is(x, +(1,2)). X = 3.

Lite övningar... Vad svarar Prolog på: 3+2 = +(3,2).?- 3+2 = +(3,2). true.

Lite övningar... Vad svarar Prolog på: *(7,5) = 7*5.?- *(7,5) = 7*5. true.

Lite övningar... Vad svarar Prolog på: *(7,+(3,2)) = 7*(3+2).?- *(7, +(3,2)) = 7*(3+2). true.

Lite övningar... Vad svarar Prolog på: *(7,(3+2)) = 7*(3+2).?- *(7,(3+2)) = 7*(3+2). true.

Lite övningar... Vad svarar Prolog på: 7*3+2 = *(7,+(3,2)).?- 7*3+2 = *(7,+(3,2)). false.

Lite övningar... Definiera ett predikat increment/2 som kontrollerar att dess andra argument är ett större än dess första argument, ex.?- increment(4,5). true.?- increment(4,6). false.?- increment(4,x). X = 5.

Lite övningar... Definiera ett predikat increment/2 som kontrollerar att dess andra argument är ett större än dess första argument, ex. increment(b, A) :- A is B+1. Obs!?- increment(x,5). ERROR: is/2: Arguments are not sufficiently instantiated

Att jämföra heltal Några av Prologs aritmetiska predikat utför de facto beräkningarna själva Detta gäller de operatorer som jämför heltal

Att jämföra heltal Aritmetik Prolog x < y X < Y x y x = y x y x y x > y X =< Y X =:= Y X =\= Y X >= Y X > Y Obs!

Jämförelseoperatorer Har den sedvanliga betydelsen Påtvingar både det vänstra och det högra argumentet att evalueras?- 2 < 4+1. yes?- 4+3 > 5+5. no

Jämförelseoperatorer Har den sedvanliga betydelsen Påtvingar både det vänstra och det högra argumentet att evalueras?- 4 = 4. yes?- 2+2 = 4. no?- 2+2 =:= 4. yes Unifiering!!! Aritmetisk likhet

Att jämföra tal Vi ska definiera ett predikat som tar två argument och gäller när: Det första argumentet är en heltalslista Det andra argumentet är det största heltalet i listan Grundidén Vi ska använda en ackumulator Ackumulatorn håller reda på det hittills största värdet Om vi hittar ett större värde, uppdateras ackumulatorn

Definition av accmax/3 accmax([h T],A,Max):- H > A, accmax(t,h,max). accmax([h T],A,Max):- H =< A, accmax(t,a,max). accmax([],a,a).?- accmax([1,0,5,4],0,max). Max=5 yes Fungerar ej för negativa tal!

Att tillägga en wrapper max/2 accmax([h T],A,Max):- H > A, accmax(t,h,max).?- max([1,0,5,4], Max). Max=5 yes accmax([h T],A,Max):- H =< A, accmax(t,a,max). accmax([],a,a). max([h T],Max):- accmax(t,h,max).?- max([-3, -1, -5, -4], Max). Max= -1 yes?- Fungerar detta för negativa tal?

Sammandrag Vi har bekantat oss med aritmetik i Prolog Vi har sett på skillnaden mellan svansrekursiva och ickesvansrekursiva predikat Vi har introducerat programmeringsteknik som använder ackumulatorer Vi har också introducerat idén om wrapper-predikat