Malmö högskola Teknik och samhälle 2012/2013 Föreläsning 6 • • • • pseudokod problemlösning logik algoritmer Inledning Logik är läran om korrekt resonemang – att kunna dra korrekta slutledningar utifrån det man vet. Vi gör detta ständigt utan att tänka på det men inom programmering så blir det ofta mer påtagligt. Det finns informell logik som är logiskt resonemang uttryck med naturligt språk. Det är detta vi använder till vardags när vi argumenterar eller resonerar om vardagliga frågor. Här hamnar även det vi kallar pseudokod även om detta är en mer strikt form av naturligt språk. Sedan har vi formell logik där formen för det korrekta resonemanget är fångat i ett formellt språk som exempelvis satslogik som vi kommer att titta på. De formella språken är begränsade av att man måste följa språkets regler och man kan inte uttrycka lika mycket med ett formellt språk som med naturligt språk. Java och andra programmeringsspråk kan ses som formella språk. DA129A Programmering 1 1 Malmö högskola Teknik och samhälle 2012/2013 Pesudokod Vi börjar med pseudokod som kommer att bli ett oundvikligt redskap när du gör lite mer komplexa program. Pseudokod är egentligen bara naturligt språk strukturerat lite kortare och liknande det sätt man strukturerar källkod på. Du använder dig av satser och indrag men en sats kan vara betydligt större i sitt omfång än vad som är vanligt i det formella programmeringsspråket. Indragen blir mycket viktiga i pseudokod då dessa visar vilka satser som är underordnade andra satser. I pseudokod använder man sig sällan av något tecken för att starta eller sluta ett block. Pseudokod används för att bryta ner ett problem i mindre delar innan man sätter sig och skriver källkod. Detta gör man för att upptäcka hur man lämpligt kan dela in koden i metoder och kontrollstrukturer samt för att identifiera nödvändig indata. Pseudokod kan också användas för att testa en algoritm innan man kodar denna. Genom att kontrollera att pseudokoden löser problemet så sparar man tid innan man kodar och slipper risken att en massa kod är gjord förgäves och ändå måste slängas. Antag att vi har följande problem: Du är på biblioteket och vill låna boken ”Populärmusik från Vittula” av Mikael Niemi. Tyvärr så sker det underhåll på deras elektroniska katalog så du kan inte via denna ta reda på om boken finns eller ej utan måste använda dig av en lite ålderdomligare metod att helt enkelt se om boken finns i hyllan eller inte. Finns boken i hyllan så tar du den och går till disken för att låna denna annars så går du till disken för att reservera boken. Då det är en skönlitterär bok så vet vi att den finns på hylla Hc. Om vi nu skall skriva pseudokod för hur vi löser problemet ovan så ställs vi inför några frågor: Vilka delar kan vi bryta ner det här problemet i? Hur mycket detaljer skall vi visa? Hur vi vet att boken finns är ganska lätt men hur vet vi om boken inte finns? De två första frågorna hör ihop. Ju fler detaljer vi vill visa desto fler delar måste vi bryta ner problemet i. Vi vill inte göra en för abstrakt pseudokod: gå till hyllan där boken borde finnas OM boken finns Ta boken och låna den ANNARS Reservera boken Detta hjälper ju inte oss särskilt mycket. Det är för generellt. Mer detaljer då: TILLS vi kommer till första hyllan Lyft fot 1 Placera fot 1 framför fot 2 Lyft fot 2 Placera framför fot 1 … Det blir lite väl mycket detaljer. Konsten är alltså att hitta en nivå där man får med nödvändiga detaljer men kan utelämna sådant som är självklart. Vilka är våra viktiga delar då: vi måste hitta rätt hylla, vi måste hitta rätt författare och vi måste hitta rätt titel. Ordningen på ett bibliotek hjälper oss då vi kan utgå DA129A Programmering 1 2 Malmö högskola Teknik och samhälle 2012/2013 från att hyllorna är sorterade efter det vanliga bibliotekssystemet och att författare är sorterade i bokstavsordning efter efternamn och böckerna för varje författare efter titel. Om vi under vårt letande kommer till en författare som finns efter Niemi i bokstavsordning eller en bok av Niemi som finns efter den vi söker så fanns inte boken ”Populärmusik från Vittula”. Så om vi utgår från stegen ovan: 1 gå till närmsta hylla 2 TILLS hylltypen är Hc //vi förutsätter att det finns en hylla Hc 3 Gå till nästa hylla 4 //vi har nu hittat hylla Hc 5 FÖR VARJE författare på Hc 6 7 OM namn är Mikael Niemi FÖR VARJE bok av Mikael Niemi 8 OM titel är ”Populärmusik från Vittula” 9 ta boken 10 AVBRYT för varje bok av Mikael Niemi 11 12 13 AVBRYT för varje författare på Hc ANNARS OM författare kommer efter Niemi i bokstavsordning 14 AVBRYT för varje författare på Hc 15 //vi har nu hittat boken eller konstaterat att den inte fanns 16 gå till lånedisken 17 OM vi har boken med oss 18 låna boken 19 ANNARS 20 reservera boken Radnumreringen är inte nödvändig utan gör det bara lättare att referera till delar av psudokoden nu i denna text. Så låt oss nu analysera denna pseudokod och se vilka slutsatser vi kan dra från vår algoritm för att låna eller reservera en viss bok. I den första loopen (2) så gör vi ett antagande att det finns minst en hylla av typen Hc. Om det inte skulle finnas någon hylla av typen Hc så har vi en oändlig loop. Men då vi vet att det är ett vanligt bibliotek så kan detta vara ett rimligt antagande. Vi gör också ett antagande att det finns något sätt att ordna hyllorna i en ordning eller hålla reda på vilka vi tittat på eller inte. Vi har inte nästlat in senare händelser i denna loop utan när raden efter loopen startar (5) så kan vi utgå från att vi står vid första hyllan av typen Hc. I nästa loop (5) så tittar vi på alla författare som finns på Hc. Villkoret är här inte ”tills vi hittar Niemi” utan vi måste använda en break-sats för att avbryta loopen när vi hittat Niemi eller vet att Niemi inte finns (11) respektive (14). Det händer egentligen ingenting avgörande om vi skulle fortsätta att titta på alla författare efter att vi hittat boken eller vet att den inte finns men det är ganska onödigt. Om vi i denna loop hittar Niemi så startas en ny loop där vi tittar på titlar(7). DA129A Programmering 1 3 Malmö högskola Teknik och samhälle 2012/2013 Loopen som tittar på titlar (7) avbryts om vi hittar rätt bok(10) men om boken vi söker inte finns så kommer vi at titta på alla böcker av Niemi även om vi gått förbi den sökta boken i bokstavsordning. Vi får här avgöra om det är nödvändigt att lägga in detta avbrott eller inte. Är det värt en extra selektion för varje titel jämfört med någon iteration för mycket? När rad (16) inleds så har loopen som letar bland författare och titlar på Hc avslutats på något sätt och vi går till lånedisken då vi oavsett resultatet i looparna ovan skall dit. Väl framme vid lånedisken så avgör vi vad vi ska göra utifall vi har boken med oss eller inte. Detta kallas att man sätter en flagga och är vanligt när man har loopar som letar efter något. Alternativet hade varit att flytta upp denna kod till loopen på följande sätt: 8 OM titel är ”Populärmusik från Vittula” 9 ta boken 9.1 gå till lånedisken och låna boken 10 AVBRYT för varje bok av Mikael Niemi samt 13 OM författare kommer efter Niemi i bokstavsordning 13.1 gå till lånedisken och reservera boken 14 AVBRYT för varje författare på Hc 15 //vi har nu hittat boken eller konstaterat att den inte fanns Här har vi ganska korta följder beroende på om vi hittar boken eller inte och det blir fortfarande läsbar kod. Men om det hade inneburit längre kodavsnitt så hade metoden med en flagga varit bättre. Lägg märke till hur viktigt det är att indragen ovan stämmer i pseudokoden för att avgöra vad som ingår i en viss loop. Om indragen inte stämmer blir pseudokoden fullständigt meningslös. Motsvarigheter till reserverade ord skrivs ofta med versaler i pseodukod för att öka läsbarheten då dessa ord lätt försvinner i mängden vanliga ord annars. Ett mer tillämpbart exempel: från menyn till testprogrammet till inlämningsuppgift 1. skapa instans av klassen Prog1 skriv ut menyn läs in val från menyn SÅ LÄNGE val inte är 0 anropa vald testmetod med den skapade instansen som argument läs in nytt val Den översta raden anger initieringen av en variabel. Det är inte alltid man anges dessa då de ofta är triviala och mest ger extra rader över något som är självklart. Här har den tagits med då den är viktig för utan denna variabel så kan vi inte korrekt anropa testmetoderna. Det blir också synligt att vi inte skapar en ny instans för varje anrop utan att vi skapar en instans som används upprepade gånger. Det har däremot utelämnats ovan vilken kontrollstruktur som används för att avgöra vilket val som gjorts ovan. Om man vill specificera något av detta så kan man skriva utförligare pseudokod: DA129A Programmering 1 4 Malmö högskola Teknik och samhälle 2012/2013 skapa instans av klassen Prog1 skriv ut menyn läs in val från menyn SÅ LÄNGE val inte är 0 SWITCH val val är 1 Anropa testmetod A val är 2 Anropa testmetod B val är 3 Anropa testmetod C val är 4 Anropa testmetod D val är 5 Anropa testmetod E val är 6 Anropa testmetod F val är 7 Anropa testmetod G läs in nytt val Detta blev dock långt och gav oss inte så mycket mer information. Break-satsen i en switchsats har ansetts som underförstådd för att spara rader. Hur vi implementerar valet är ju en programmeringsteknisk detalj. Pseudokoden i det första alternativet visar bättre på styrkan hus denna, att kort kunna ange det viktigaste. I det här fallet att vi väljer olika metoder beroende på indata. Så som påpekat tidigare så är svårigheten att hitta den grad av detaljer som behövs. Det är bättre att börja med lite för lite detaljer för att se vad man behöver förtydliga när man skriver pseudokod än att börja med att grotta ner sig i en pseudkod som i princip är källkod direkt och ta onödigt lång tid på sig. Det gäller att komma ihåg att pseudokoden skall vara en förenklig av källkoden. DA129A Programmering 1 5 Malmö högskola Teknik och samhälle 2012/2013 Satslogik Exempel på satslogik: P1 : Alla människor är dödliga. P2: Sokrates är människa. ______________________ Slutsats: Sokrates är dödlig Om premisserna, i det här fallet P1 och P2, är sanna så måste slutsatsen vara sann. Då är det en giltig slutledning. Historia Exemplet ovan är från Aristoteles syllogismer skapade för ca: 2000 år sedan. Aristoteles hittade former för korrekta slutledningar. Även om vi ersatte människa med däggdjur och Katt istället för Sokrates i exemplet ovan skulle slutledningen vara riktig. Det är inte innehållet som gör slutledningen giltig utan formen. Logiken utvecklades inte så mycket efter Aristoteles fram till slutet av 1800-talet. Men då tog utvecklingen fart med matematiker som Russell och Frege. Då kom satslogiken och predikatslogiken (standardlogiker). Under 1900-talet har logiken utvecklats mycket. Datorutvecklingen är ett exempel på tillämpad logik. Satslogikens uppbyggnad Satslogiken består av atomära satser som representeras av en symbol, oftast i form av en bokstav (p, q, r, s, t…). Exempelvis p= solen skiner, q= himlen är blå Satserna knyts sedan samman av så kallade konnektiv som beskriver satsernas relation till varandra. Logiska konnektiv: Symbol Tolkning Namn ¬ & v → icke och eller om...så.. om och endast om Negation Konjunktion Disjunktion Implikation Ekvivalens Andra symboler: (,) förtydligar prioritetsordningen Du känner igen vissa begrepp här från de logiska operatorerna och det är för dessa som den stora vinsten ligger i att känna till en del om satslogik när man programmerar. Genom att kunna satslogik så kan du lättare kontrollera att dina villkor innebär det som du avser och hur du kan skriva om dina villkor till att bli kortare och mer effektiva. DA129A Programmering 1 6 Malmö högskola Teknik och samhälle 2012/2013 Sanningsvärdestabeller Ett sätt att definiera konnektiven är att rita en sanningsvärdes tabell. Sanningsvärdestabell kan även användas för att visa om en slutledning är logiskt giltig eller inte. Definition av konnektivet ¬: Ex. p= solen skiner ¬ p utläses solen skiner inte Om p är sann så är ¬ p falsk. Om p är falsk så är ¬ p sann. Definition av konnektivet &: Ex. p= solen skiner, q= himlen är blå p&q utläses solen skiner och himlen är blå p ¬p sann falsk falsk sann p q p&q sann falsk falsk sann sann sann falsk sann falsk falsk falsk falsk Definition av konnektivet v: Ex. p= solen skiner, q= himlen är blå p v q utläses solen skiner eller himlen är blå p q pvq sann falsk sann sann sann sann p v q är bara falsk om både p och q är falska falsk sann sann falsk falsk falsk p q p→q sann falsk falsk sann sann sann falsk sann sann falsk falsk sann p & q är bara sann om både p och q är sann. Definition av konnektivet → : Ex. p= solen skiner, q= himlen är blå p→q utläses om solen skiner så är himlen blå p → q är bara falsk om både p är sann men q är falsk. DA129A Programmering 1 7 Malmö högskola Teknik och samhälle 2012/2013 Definition av konnektivet : Ex. p= solen skiner, q= himlen är blå pq utläses om och endast om solen skiner är himlen blå p q pq sann falsk falsk sann sann sann p q är sann om både p och q har samma falsk sanningsvärde. falsk sann falsk falsk sann För att kunna se den logiska strukturen i ett resonemang kan det vara bra att översätta resonemanget till satslogik. Exempel: Du hinner i tid om du skyndar dig. Annars hinner du inte. p= du hinner i tid q= du skyndar dig (q →p)& (¬q → ¬ p ) kan även skrivas // Tabell A nedan (q →p)& (p→ q ) kan även skrivas // Tabell B nedan qp // Tabell C nedan Kan du se att dessa tre översättningar har samma sanningsvärde för alla möjliga kombinationer av sanningsvärden på p och q? Vi gör sanningsvärdestabeller: Tabell A 1 2 3 4 5 6 7 q p (q →p) ¬q ¬p (¬q → ¬ p ) (q →p)& (¬q → ¬ p ) s s s f f S s s f f f s S f f s s s f F f f f s s s S s Kolumn 1 och 2 visar alla möjliga sanningsvärden på p och q och hur dessa kan kombineras. Kolumn 3 följer av 1, 2 och definitionen av implikation. Kolumn 4 och 5 följer av 1, 2 och definitionen av negation. Kolumn 6 följer av 4, 5 och definitionen av implikation. Kolumn 7 följer av 3, 6 och definitionen av konjunktion. DA129A Programmering 1 8 Malmö högskola Teknik och samhälle 2012/2013 Tabell B 1 2 3 4 5 q p (q →p) (p→ q ) (q →p)& (p→ q ) s s s s s s f f s f f s s f f f f s s s Kolumn 1 och 2 visar alla möjliga sanningsvärden på p och q och hur dessa kan kombineras. Kolumn 3 följer av 1, 2 och definitionen av implikation. Kolumn 4 följer av 1, 2 och definitionen av implikation. Kolumn 5 följer av 3, 4 och definitionen av konjunktion. Tabell C 1 2 3 q p qp s s s s f f f s f f f s Kolumn 1 och 2 visar alla möjliga sanningsvärden på p och q och hur dessa kan kombineras. Kolumn 3 följer av 1, 2 och definitionen av ekvivalens. Om du nu jämför värdena för de sist kolumnerna i de tre tabellerna ovan så ser du att dessa stämmer överens. Logiska lagar I satslogiken finns det beskrivet några logiska lagar och grundformerna för giltiga slutledningar. Dessa hjälper dig att kunna omforma uttryck. Exempel på logiska lagar är dubbla negationslagen, de Morgans lagar, kommutativa lagen, associativa lagar, omvändningslagen och disjunktiv utbytesregel. Exempel på giltig slutledning är modes ponens, modus tollens, disjunktiv slutlednings regel och reduktion ad absurdum. Vi kommer att gå igenom dessa nedan. Vi börjar med lagarna. Dubbla negationslagen ¬ (¬p) p Det är inte så att jag är orädd, är det samma som att jag är rädd. I meningen ovan så är där två negationer, först inte och sedan o- som tar ut varandra. DA129A Programmering 1 9 Malmö högskola Teknik och samhälle 2012/2013 De Morgans lagar ¬ (p &q) ¬ p v ¬q ¬ (p v q) ¬ p & ¬q Det är inte både så att det regnar och solen skiner är det samma som det regnar inte eller solen skiner inte. Det är inte så att det är torsdag eller fredag är det samma som det är inte torsdag och det är inte fredag. Kommutativa lagen p&q q&p pvq qvp pq qp Man kan kasta om ordningen på satserna vid &, v och Associativa lagar (p & q) & r p & (q & r) (p v q) v r p v (q v r) ((p q) r) (p (q r)) Paranteserna spelar ingen roll för &,v och Omvändningslagen p → q ¬q → ¬p Om solen skiner så är himlen blå. Är det samma som: Om himlen inte är blå så skiner inte solen. Disjunktiv utbytesregel ¬ p v q p→ q Solen skiner inte eller himlen är blå. Är det samma som: Om solen skiner så är himlen blå. Om du tycker någon lag ser knepig ut så skriv up en sanningsvärdestabell för att övertyga dig om att det stämmer. DA129A Programmering 1 10 Malmö högskola Teknik och samhälle 2012/2013 Vi kommer nu till former för slutledningar. Dessa skrivs på en speciell form så som du såg i det allra första exemplet. De ingående premisserna listas ovanför varandra och under strecket skrivs den slutsats vi kan dra av premisserna. Slutsatsen kan dras under förutsättning att alla premisserna är sanna(P1&P2). p=det är fredag idag q=det är lördag imorgon Modus Ponens p→q p___ ↓ q Om det är fredag idag så är det lördag imorgon. Det är fredag idag. Slutsats: Det är lördag imorgon. Modus Tollens p→q ¬q ↓ ¬p Om det är fredag i dag så är det lördag imorgon. Det är inte lördag imorgon. Slutsats: Det är inte fredag idag. Disjunktiv slutledningsregel pvq ¬p ↓ q Det är fredag idag eller så är jag pank. Det är inte fredag idag. Slutledning: Jag är pank. Reduktion ad absurdum p→q p→ ¬q ↓ ¬p Om en premiss leder fram till en motsägelse så måste premissen vara falsk. Detta är ett så kallat motsägelsebevis. De två premisserna kan inte vara sanna samtidigt om p är sann alltså måste p vara falsk det vill säga ¬p. DA129A Programmering 1 11 Malmö högskola Teknik och samhälle 2012/2013 Exempel: Premiss 1: Vi far till stranden Premiss 2: välj något av alternativen nedan a) Endast om det regnar far vi till stranden. b) Om solen skiner far vi till stranden. c) Vi far inte till stranden om det åskar d) Om det inte är kallt far vi till stranden. e) Vi far till stranden endast om det inte blåser. f) Endast om solen inte skiner far vi inte till stranden. g) Om vi far till stranden skiner solen. Kan vi dra någon giltig slutsats av dessa två premisser (Premiss 1 och Premiss 2a t.ex.)? Jag kan avslöja att utifrån Premiss 1 och Premiss 2a kan vi dra slutsatsen att det regnar. Hur kontrollerar vi detta: p = vi far till stranden q= det regnar P1: Vi far till stranden, p P2a: Endast om det regnar far vi till stranden, p→q (Om vi far till stranden så regnar det) p p→ q q Slutsats enligt modus ponens Vad kan vi säga om P1 och P2b? p = vi far till stranden q = solen skiner P1: Vi far till stranden, p P2: Om solen skiner far vi till stranden. q→p p q→ p ingen slutledning kan göras för vi kan inte säga något om q utifrån att p är sann. Vi vet inte vad vi gör om solen inte skiner, vi kan ju åka till stranden ändå. Vi vet bara att OM solen skiner så åker vi till stranden. Vad kan vi säga om P1 och P2c? p = vi far till stranden q = det åskar P1: Vi far till stranden, p P2: Vi far inte till stranden om det åskar, q→¬p (om det åskar far vi inte till stranden) p q→ ¬p ¬q enligt modus tollens. Detta då om vi vet att ¬p och q→p medför ¬q. Ser du hur det inte måste skrivas på just detta sätt utan att det viktiga är att p:na i det här fallet är motsatta varandra med det ena negerat och det andra inte. DA129A Programmering 1 12 Malmö högskola Teknik och samhälle 2012/2013 Vad kan vi säga om P1 och P2d? p = vi far till stranden q = det är kallt P1: Vi far till stranden, p P2: Om det inte är kallt far vi till stranden ¬q →p p ¬q→p ingen slutledning kan göras för vi kan inte säga något om q utifrån att p är sann. Vi vet inte vad som sker om det är kallt, vi kan åka till stranden ändå. Vad kan vi säga om P1 och P2e? p = vi far till stranden q = det blåser P1: Vi far till stranden, p P2: Vi far till stranden endast om det inte blåser, p→¬q (om vi far till stranden blåser det inte) p p→ ¬q ¬q Enligt modus ponens. Vad kan vi säga om P1 och P2f? p = vi far till stranden q = solen skiner P1: Vi far till stranden, p P2: Endast om solen inte skiner far vi inte till stranden, ¬p→¬q (om vi inte far till stranden skiner solen inte) vilket enligt omvändningslagen kan skrivas q→p (solen skiner) p q→ p ingen slutledning kan göras för vi kan inte säga något om q utifrån att p är sann. Vi kan åka till stranden även om solen inte skiner. Vi vet bara att om vi inte åkt till stranden så skiner inte solen. Vad kan vi säga om P1 och P2g? p = vi far till stranden q = solen skiner P1: Vi far till stranden, p P2: Om vi far till stranden skiner solen p→q p p→ q q Enligt modus ponens. DA129A Programmering 1 13 Malmö högskola Teknik och samhälle 2012/2013 Observera att satslogiken och vardagligt tal inte alltid ser på innebörden på samma sätt. När vi i vardagligt tal säger att ”Om solen skiner far vi till stranden” och sedan åker till stranden så menas det vanligtvis också att solen skiner. Satslogiken tillåter inte den tolkning vi gör i vardagligt tal. Det gäller alltså att komma ihåg att de inte är innehållet i en sats som gör att vi kan dra några slutsatser utan formen på satserna. Andra formella notationer Det finns ett flertal mer formella notationer utöver satslogik som kommer till nytta inom programmering och som är mer formella än pseudokod. Aktivitetsdiagram Du har redan stött på ett flertal aktivitetsdiagram för att beskriva en algoritms utseende. Aktivitetsdiagram lämpar sig speciellt väl för att beskriva en algoritms olika flöden beroende på indata som påverkar utfallet. Aktivitetsdiagram lämpar sig också väl när man skall beskriva parallella flöden av händelser vilket pseudokod inte är lämpat för. aktivitet beslut true Fyrkanten används för att representera en aktivitet. Texten i rutan skall mycket kortfattat beskriva aktiviteten. Romben används för att representera ett beslut. Texten i romben skall mycket kortfattat beskriva valet. Pilen används för att representera förflyttning till en annan aktivitet eller beslut. Om pilen leder från ett beslut skall det visas vilket beslut som denna pil representerar. En pil utan början representerar startpunkten och en pil utan slut representerar slutet Den tjocka linjen används för att representera en synkronisering mellan aktiviteter. Det kan handla om att vänta in vissa aktiviteter innan nästa på börjas eller att flera olika aktiviteter påbörjas vid ett tillfälle. DA129A Programmering 1 14 Malmö högskola Teknik och samhälle 2012/2013 Exempel på aktivitetsdiagram över att tappa upp ett bad. Gå till badrummet Fyll badkaret Hämta nya handdukar badsalt ja Häll i badsalt nej Kryp ner i badkaret Klassdiagram Aktivitetsdiagram eller pseudokod fungerar inte för att beskriva hur klasser refererar till varandra. För detta behöver man ett klassdiagram. För varje klass i ett klassdiagram listar man namn, attribut och metoder i en fyrkant enligt modellen: klassnamn attribut1:datatyp attribut2 : datatyp Beroende på antalet klasser och attribut och metoder så stryker man ibland attributen och metoderna och visar endast klassnamnet. Vi kommer att återkomma till klassdiagram när vi kommer till den del som handlar om klasser och relationer mellan klasser. metod1 matod2(parameter) DA129A Programmering 1 15 Malmö högskola Teknik och samhälle 2012/2013 UML UML – Unified Modeling Language- används för att beskriva olika mjukvara och olika delar av denna i en utvecklingsprocess. Detta är en objektorienterad notation som starkt fokuserar på användarperspektiv och klasser. UML är mycket användbart inom mjukvaruutveckling och används i kurslitteraturen för aktivitetsdiagram med mera. Notationen för dessa skiljer sig från den anklare notationen presenterad ovan. UML innehåller dock mycket mer än aktivitetsdiagram. Att gå in på hur UML fungerar från grunden kräver en förståelse för mjukvaruutveckling som ligger utanför denna kurs. UML är dock ett begrepp som det är bra att känna till. Den intresserade kan hämta mer information från webben, t.ex. från • http://www.uml.org/ DA129A Programmering 1 16