Listor
Listor i Prolog markeras på ett enkelt sätt med [ och ], [] kallas tomma listan, det vill säga den innehåller inga element. [1,2,3,4] betecknar en lista med fyra tal. [1,2,[3,4],5] betecknar en lista med fyra element, men ett av dem är i sin tur en lista med två element.
Jämför strukturerna:
datum | _______________________________ -> datum(2001,04,23) | | | 2001 04 23 . | __________________ -> .(1, .(2, .(3,null))) | | [1,2,3] 1 . | _____________ | | 2 . | _______ | | 3 nullExempel på unifieringar med listor:
P Q Unifieringsmängd [] X {<X, []>} [a] X {<X,[a]>} [] [X|Y] {} [a] [X|Y] {<X,a>,<Y,[]>} [a,b,c] [X,Y|Z] {<X,a>, <Y,b>, <Z,[c]>} [a,[[b],c]] [X,Y|Z] {<X,a>, <Y,[[b],c]>, <Z,[]>} Medlem i lista
medlem(A, [A|R]). medlem(A, [B|R]) :- medlem(A, R).Sökrymd som illustrerar hur Prolog besvarar frågan medlem(b,[a,b,c]):
- <- medlem(b,[a,b,c])
(2) { <A, b>, <B,a>, <R,[b,c]>}- <- medlem(b,[b,c])
(1) { <A, b>, <R,[c]>}Ihopslagning av listor
Att slå ihop listor är ofta nödvändigt.
slå_ihop([], L, L). slå_ihop([X|L1], L2, [X|L3]) :- slå_ihop(L1, L2, L3).Borttagning ur lista
Att ta bort saker ur en lista är också ofta användbart.
ta_bort(X, [], []). ta_bort(X, [X|R], R). ta_bort(X, [X1|R], [X1|R2]) :- ta_bort(X, R, R2).Om man bara vill att den första förekomsten av X ska tas bort, får ett test läggas in i den sista regeln (X \== X1).Fundera gärna på hur predikaten slå_ihop/3 och ta_bort/3 kan användas inför labben.
Operatorer
För att göra vissa strukturer tydligare kan man definiera operatorer. De kan vara prefix-, infix- eller suffixoperatorer. De har eller kan tilldelas olika precedens, för att följa olika normer.
Aritmetik
Operator Förklaring X + Y addition X - Y subtraktion X * Y multiplikation X / Y division X div Y heltalsdivision, (3 / 2 -> 1) X mod Y modulo, (resten vid heltalsdivision; 3 / 2 -> 1) X > Y X är större än Y X < Y X är mindre än Y X >= Y X är större än eller lika med Y X =< Y X är mindre än eller lika med Y X =:= Y X är lika med Y X =\= Y X är skilt från Y is tilldelning; X is 2 + 1
Kursuppgiften kommer att löpa under resten av kursen med redovisning 5 juni maj kl 10-12 för grupp ett och 13-15 för grupp två. Inlämningstillfälle är sjunde juni om inte annat överenskommits.
Handledning kommer att ges vid sju tillfällen; tisdag 7 maj, tisdag 14 maj, tisdag 21 maj, måndag 27 maj, tisdag 28 maj, torsdag 30 maj och måndag 3 juni. I övrigt se schemat.
Kursuppgiften svarar för 50 % av examinationen.
Rapporten ska bestå av avsnitten sammanfattning, mål/syfte, uppgiftsanalys, implementering och diskussion. Den kommenterade koden läggs i bihang. Detsamma gäller ett körningsexempel.
Det ska tydligt framgå i rapporten, vem som ansvarat för vad och vilka som varit aktiva i olika moment och avsnitt. Alla måste dock ha varit aktiva i programutvecklingen.
Analys och syntes av substantiv och adjektiv
Indata för analys
filmer -> NNUPIBIndata för syntes
film.nn, PIG -> filmersGrovstruktur
Börja med att identifiera delproblem utifrån nedanstående grovstruktur.
- Läsa från fil, både mönsterfiler och stamfil, och göra om till predikat som läggs till databasen. (Exempelvis: stamlex(stam, lemma, mönster, koddel1) och mönster(mönster, morf, koddel2).)
- Inläsning av indata från terminal, börja först med att ange som argument till predikat (bokstavslista).
- Välj sökstrategi. Beskriv egenskaperna hos den strategi ni valt i rapporten, ge förslag på alternativ strategi. Hur skulle er strategi fungera om lexikonet skulle vara avsevärt mycket större?
- Presentation, utskrift av utdata.