Göteborgs Universitet / Datavetenskap / Logikprogrammering Projektarbete Syftet med det projektarbete som avslutar kursen är att få prova på att skriva ett större program som löser något icke-trivialt problem. Arbetet utföres lämpligen i grupper om 3-4 personer. För att det hela ska fungera är det viktigt att tänka först, planera ordentligt och sedan göra det som ska göras. Arbetsgång Den första uppgiften att lösa är att hitta något man vill göra och någon/några att göra det med. Förslag på uppgifter finns nedan. Efter övningen 8/11 bör alla ha hittat något att göra och några att jobba med. På övningen kommer vi att hitta grupper och uppgifter till de som inte bestämt sig tidigare, samt bestämma handledare. Då man valt uppgift gäller det att specificera den ordentligt. Börja med att tänka efter och försök skriva ner en någorlunda precis beskrivning av vad det resulterande programmet ska klara av. Boka därefter en tid med handledaren för genomgång av vad ni tänkt göra då vi tillsammans kan fastställa ramarna för uppgiften. Försök att få detta överstökat så snart som möjligt så ni kan komma igång. Sedan börjar det verkliga arbetet. Var som sagt noggranna med att tänka efter först, försök t.ex. se vilka delproblem som måste lösas och dela upp arbetet på olika personer. Försök att fastställa gränssnitt mellan de olika delproblemen så att de kan lösas var för sig, etcetera. Krav på programmet All kod som skrivs ska som vanligt vara snygg och väldokumenterad. Tänk på att ni ska kunna komma tillbaka om ett år, läsa koden och förstå hur programmet fungerar. Alla i gruppen ska veta vad de olika delarna i programmet gör, så informera varandra om hur delarna fungerar. Uppenbara effektivitetsmissar i form av onödiga val och liknande godtas inte. Programmet ska också delas in i olika "riktiga" moduler, dvs inte enbart i ett antal filer som i laboration 3 utan i moduler deklarerade med module/2. Redovisning Projektarbetet redovisas skriftligt och muntligt. Den skriftliga redovisningen ska vara en rapport innehållande: Beskrivning av uppgiften. Beskrivning av lösningen. Beskrivning av hur programmet fungerar i stora drag, innehållande åtminstone en förklaring av de olika delarna/modulerna och deras inbördes beroende, samt en beskrivning av de viktigare
predikaten i varje modul. Beskrivning av hur ni gått tillväga. Användarhandledning i form av en enkel manual (som appendix). Programkod, väl kommenterad (som appendix). Den muntliga redovisningen består av att gruppen får en stund (ungefär 20 minuter) på sig att berätta för övriga vad de gjort och hur. Detta kommer att ske tisdagen den 8 januari i hörsalen. Observera att det är obligatorisk närvaro på alla redovisningar, inte bara ens egen. Redovisningen bör innehålla följande element: Kort beskrivning av vad programmet gör. Ett körningsexempel (dator i form av unixterminal finns i hörsalen). Översiktlig beskrivning av hur programmet fungerar. Projektförslag Här är några förslag på möjliga projektuppgifter. Egna förslag är välkomna. Observera att ett projekt ska motsvara minst 3 veckors heltidsarbete för alla i projektgruppen. Många av förslagen går utmärkt att kombinera med varandra: alla sorters program mår väl av ett snyggt gränssnitt (mot internet, eller ett fönstersystem), dessutom kan det vara trevligt att kunna prata med databaser på naturligt språk istället för att skriva konstiga formler, etcetera. Samtliga förslag är ganska lösa, första uppgiften blir förstås att precisera tillräckligt exakt vad projektet omfattar. Språk Gör ett grammatiksystem, där man kan skriva in sina egna grammatiker och parsa satser. Alltså ungefär som DCG, men detta ska klara av vänsterrekursiva regler och automatiskt bygga parsträd, samt kunna skriva ut dem på ett läsbart sätt. Det finns ganska enkla algoritmer för att parsa vänsterrekursiva grammatiker, så ni behöver inte hitta på en egen lösning för det. Gör ett konkordanssystem - ett program där man kan få reda på i vilka sammanhang vissa ord eller fraser i texter finns. Språkbanken på universitetet har ett exempel på hur det kan se ut på nätet. http://spraakdata.gu.se/lb/konk/ Gör ett dialogsystem för att boka biljetter till konserter och andra evenemang. Programmet ska kunna svara på enkla frågor av typen "vilka konserter ges på måndag?". Alternativt kan systemet agera bilförsäljare, eller boka föreläsningslokaler på universitetet. Gör ett läromedel, som t.ex. tränar språkfärdighet. Det kan vara glosor, grammatik, böjningsformer eller något sådant. Tänk på att tänka på målgruppen; programmet bör agera olika om det är till för lågstadieelever eller universitetsstudenter. Alternativ till språkfärdighet kan vara lågstadiematematik, geografi, historia eller något annat av intresse.
Gör ett översättningssystem som översätter från ett språk till ett annat. Ett sätt att göra detta på är att skriva två grammatiker som båda översätter till en gemensam semantisk form, men det finns flera andra varianter. Implementera en enkel morfologi för ett språk, t.ex. svenska eller engelska. Programmet ska översätta mellan ytnivå och lexikalnivå; ordet "pojkars" ska översättas till "pojke", samt säga att originalordet var ett substantiv i utrum, plural, obestämd form och genitiv. Gör ett program som försöker rätta till svenska nominalfraser. Det ska läsa en text, hitta nominalfraserna, och reagera när det hittar en felaktig böjning någonstans. Då ska det försöka förändra nominalfrasen på något sätt så att den blir korrekt, och föreslå för användaren. Skriv ett program som automatiskt lär sig känna igen t.ex. ordklasser eller grammatiska strukturer från en given korpus (databas med texter). Exempel på hur det kan fungera finns på Torbjörn Lagers hemsida, klicka på länken "Demos". http://www.ling.gu.se/~lager/ Eller mer generellt, gör ett program som på något sätt analyserar en text, t.ex. genom att beräkna statistik. Spel och pussel Gör ett brädspel där datorn spelar den ena motståndaren. Exempel på passande spel är: othello, fyra i rad, luffarschack, dam, kinaschack, kalaha, eller något annat skoj. En del brädspel innehåller slumpmoment, vilket går precis lika bra, t.ex. yatzy, backgammon, fia med knuff, poker, och så vidare. Dessutom finns det solitärspel som patienser som man kan leka med. Ett program som spelar Alfapet är en höjdare; men man kan ju också göra ett program som hjälper användaren att tillverka eller lösa ett korsord. Vissa brädspel kan vara lite svåra att få en dator att spela, t.ex. schack, go eller mah jong. Alternativet kan då vara att bara skriva ett program där två människor spelar mot varandra - gärna så att de två kan sitta på olika datorer och spela, t.ex. via internet. Ett annat alternativ kan vara att göra ett program som löser schackproblem av typen "matt i tre drag" och sånt. Prolog lämpar sig alldeles lysande till att lösa "logiska klurigheter" på formen "Pelle bor bredvid den rosa kaninen; giraffen har en röd volvo; vilket husdjur har Lisa?". Gör ett generellt system för att lösa logiska klurigheter, där man kan specificera en klurighet och Prolog hittar lösningen. En annan sorts problem är på formen "en bonde ska tar sin varg och sitt får över en bro; hur ska han göra det på snabbast möjliga sätt?". Man kan kombinera spel med dialogsystem för att göra ett s.k. äventyrsspel, där man går omkring i en påhittad värld och ska lösa problem av olika slag (typ döda prinsen och rädda draken).
En variant på äventyrsspel är s.k. "MUD" - virtuella världar där flera kan gå omkring samtidigt och interagera med varandra. Ett tips är att göra ett gränssnitt mot internet. Ett actionspel kan ju också vara skoj, med grafik och interaktivitet. Eller kanske något pusselspel (t.ex. sokoban, tetris eller minröj), eller ett "gissa rätt svar"-spel (t.ex. hänga gubbe). Databaser och AI Skriv ett program som ger förslag på hur man ska åka kollektivt från plats A till B vid en viss tidpunkt. Aktuella tidtabeller finns att hämta på nätet, och kan transformeras om till en Prologdatabas. Ett alternativ är att datorn föreslår en passande väg för att köra bil från stad A till stad B, samt säger hur lång tid det kommer att ta. I detta fall får man tillverka en databas utifrån en kartbok eller en itllgänglig avståndstabell. Gör ett system som föreslår matrecept - användaren anger vilka ingredienser som finns, kanske vilket sorts mat som önskas, och systemet föreslår ett passande recept. Eller kanske genererar hela veckans mat och ger en inköpslista. Det går också att göra t.ex. en drinkblandare (fast användaren får nog blanda drinken själv). Skriv ett program som skapar lämpliga TV-kvällar åt användaren. Programmet ska lagra/läsa information om alla tillgängliga TV-program och utifrån vad användaren föredrar sätta ihop ett förslag på program att se. Gör ett schemaläggningsprogram för en skola. Skolan har ett begränsat antal lärare och lokaler, och en bunt med elever som ska läsa olika ämnen som helst inte ska krocka alltför mycket. Ett expertsystem är ett program som har kunskap om ett visst område, t.ex. sjukdomar. Användaren får t.ex. svara på frågor om olika symptom och expertsystemet ger förslag på troliga sjukdomar och kanske behandlingar. Det behöver inte handla om just sjukdomar, det går bra med t.ex. väderprognoser, elektriska kretsar eller system för att hitta rätt bok i ett bibliotek. Ett känt AI-problem är att göra planering i en blockvärld. Man tänker sig att man har ett antal olikformade block i en värld och en robot som kan flytta runt dem. Uppgiften är att skriva ett program där man kan be roboten att göra saker t.ex. "Ställ det röda blocket på det blåa". Utifrån väderstatistik kan man göra ett program som beräknar var olika klimatområden finns. Dessutom vill man visa dessa områden visuellt på något sätt. Det behöver inte handla om meteorologi, utan egentligen vad som helst där det finns statistik. Övrigt Gör ett system som ritar bilder på skärmen med hjälp av så kallad sköldpaddsgrafik. Eller översätter grafiska bilder till tecken så att de kan visas i ett terminalfönster. I bildbehandlingsprogrammet Photoshop finns det en mängd filter för att bearbeta bilder, t.ex. genom att hitta linjer eller göra en bild skarpare. Gör ett eget bildbehandlingsprogram som transformerar om en bild genom att applicera ett eller flera filter.
Eftersom Prolog inte direkt kan visa bilder så krävs det lite kunskap om Unix eller t.ex. Java för att få programmet att fungera bra. Gör en interpretator/tolkare för ett mindre imperativt programmeringsspråk, t.ex. Basic eller en delmängd av Pascal. En mer avancerad uppgift är att göra en kompilator, som översätter ett program till en lägre nivå, t.ex. maskinkod. Prolog passar också alldeles utmärkt till att bevisa saker - man kan skriva ett program som säger om ett visst påstående följer av en samling fakta eller inte. Något eget förslag går naturligtvis alldeles utmärkt. Peter Ljunglöf (peb@cs.chalmers.se) 29 oktober 2001