Frames Filmdomän Artificiell Intelligens Lektion 4 Frames (Lab4) Resolution & unifiering Frames system Lagrar hierarkisk information Attribut lagras i attributvärdesstrukturer Attribut kan ha egenskaper Regler för arv Olika typer av värden Huvudfunktionlitet Store lagra info om ramar och attribut Tell Lagra värden för attribut Ask Fråga efter värden på attribut get- och put-metoder Get-metoder: ärvning lokalt värde (ingen ärvning) Put-metoder: ersätt lägg till Attributvärden Enkla värden Tal, strängar, booleska värden et.c. Sammansatta värden Listor med värden av enkel typ Procedural attachments Procedur räknar ut värdet istället för att det är lagrat direkt (ask-association) Kan även finnas vid tell (ingår ej i labben) Frames Arkitektur
Frames (ramar) Skapa datatyper för frame Instansvariabler name isa attributes Metoder konstruktor get_attribute(attributename) set_attribute(attributename, value)... Kunskapsbas Skapa datatyper för kunskapsbas Instansvariabler kb Metoder konstruktor get_frame(framid) store_frame(frameid, frame)... Frames-system Skapa datatyper för frames-system Instansvariabler kb Metoder konstruktor store_frame(frameid, frame) store_attribute(attributename, getmethod, setmethod) ask(frameid, attributename) tell(frameid, attributename, value) MovieKB = KB() Skapa Frames-system FS = FrameSystem(MovieKB) FS.store_frame('Movie', None) FS.store_frame('Drama', 'Movie') FS.store_frame('Crime', 'Drama') FS.store_frame('LA Confidential','Crime') FS.store_frame('Omhetsbevis','Drama') FS.store_attribute('blood', FrameSystem.inherit, FrameSystem.replace) FS.store_attribute('review', FrameSystem.local, FrameSystem.add)... TELL Nytt attribut läggs in i attributlistan FS.tell('Movie', 'blood', 'unk') FS.tell('Movie', 'violence', 5) Ersätt gammalt värde med nytt FS.tell('Movie', 'blood', 0) FS.tell('Movie', 'violence', 0) Lägg till nytt värde till gammalt FS.tell( LA Confidential', review', Bra skådisar ) FS.tell( LA Confidential', review', Tråkig ) Ask Lokalt värde hämtas FS.ask('The Matrix', 'review') LA Confidential has the following values for review: Tråkig Bra skådisar FS.ask('The Matrix', 'actors') Value is missing for actors in LA Confidential Ärvning från en kategori högre upp i hierarkin FS.ask('LA Confidential', 'genre') Attribute genre has value 'drama' for frame LA Confidential
Ask Procedural attachment anropas för att beräkna värdet FS.ask('LA Confidential', 'age-limit') Attribute age-limit has value 15 for frame LA Confidential Procedural attachments Definiera funktionen def calculate_age_limit(frameid): blood = FS.ask-value(frameid, 'blood') violence = FS.ask-value(frameid, 'violence') age = (blood + violence) * 2 + 3 return age Lagra funktionsnamnet som värde FS.tell('Movie', 'age-limit', calculate_age_limit) I ask, kontrollera om värdet är en funktion type(value) is types.functiontype (eller: callable(value) ) Applicera funktionen på aktuell frame value(frameid) Python - Dictionary Skapa initial tom dictionary dict = {} Lägg till ett object i dictionary dict[nyckel] = värde Hämta ett objekt ur dictionary dict[nyckel] > värde Tips: använd dictionary för kunskapsbasen, attributtyper och attributvärden Domän Välj en domän ni vill lagra kunskap om Alla typer av tell och ask ska förekomma, fundera ut lämpliga attribut Domänen ska gå att representera hierarkiskt Exempel: Böcker, mat, växter, djur, fordon, geografisk info... Egen (ska godkännas av handledare) Resolution Övning Översätt följande meningar till predikatlogik: Idag är det många arbetslösa Hög arbetslöshet betyder att konjunkturen är låg Det är bättre tider vid högkonjunktur än lågkonjunktur Det var högkonjunktur förr Visa med resolution att: Det var bättre förr Predikatlogik HögArbetslöshet(Idag) t HögArbetslöshet(t) LågKonjunktur(t) t1,t2 HögKonjunktur(t1) LågKonjunktur(t2) Bättre(t1,t2) HögKonjunktur(Förr) Bättre(Förr,Idag)
Konvertering till konjunktiv form: Eliminera implikationer HögArbetslöshet(Idag) t HögArbetslöshet(t) LågKonjunktur(t) t1,t2 (HögKonjunktur(t1) LågKonjunktur(t2)) Bättre(t1,t2) HögKonjunktur(Förr) Reducera negationernas räckvidd HögArbetslöshet(Idag) t HögArbetslöshet(t) LågKonjunktur(t) t1,t2 HögKonjunktur(t1) LågKonjunktur(t2) Bättre(t1,t2) HögKonjunktur(Förr) (Standardisera variabler) (Konvertera till prenexform) (Eliminera existenskvantifierare (Skolemisera)) Skippa prefix HögArbetslöshet(Idag) HögArbetslöshet(t) LågKonjunktur(t) HögKonjunktur(t1) LågKonjunktur(t2) Bättre(t1,t2) HögKonjunktur(Förr) (Konvertera till en konjunktion av disjunktioner) (Bilda klausuler) (Döp om variabler) Negera och konvertera slutsatsen Bättre(Förr,Idag) HögArbetslöshet(Idag) HögArbetslöshet(t) LågKonjunktur(t) HögKonjunktur(t1) LågKonjunktur(t2) Bättre(t1,t2) HögKonjunktur(Förr) Bättre(Förr,Idag)
5 + 3 {t1/förr, t2/idag} = HögKonjunktur(Förr) LågKonjunktur(Idag) 6 + 4 = LågKonjunktur(Idag) 7 + 2 {t/idag} = HögArbetslöshet(Idag) 8 + 1 = MOTSÄGELSE Unifiering - Övning Unifiera uttrycken h(a, g(b, d)) och h(d, g(e, A)) Unifiering - Exempel Unifiering - Exempel Konvertering till CNF 1.Eliminera implikation 2.Reducera negationernas räckvidd 3.Standardisera variabler 4.Eliminera existenskvantifierare 5.Konvertera till prenex form 6.Skippa prefix 7.Konvertera till konjunktion av disjunktioner 8.Bilda klausuler 9.Döp om variabler