Kunskapsbaserade
system, *38
HT 2001
Inlämningsuppgift
1p:
Inlämningsuppgift
2p:
Expertsystemet
Hemdoktorn
1. Inledning
Hemdoktorn är ett system som
bygger på ett så kallat fallbaserat resonerande (Case-Based-Reasoning-System). Detta
innebär att det slutresultat som fås kan användas för en intuitivare form av
resonerande och går i huvudsak ut på att med att en matchning av nuvarande
kunskap med redan lagrad sådan i en kunskapsmodul (kunskapsbas). I Hemdoktorn
skall en slutmodul därför innehålla fallbeskrivningar i form av
avpersonifierade journaler som köpts från olika sjukhus.
2. Syfte och problemformulering
Det först framarbetade
förslaget byggde på konstruktion av ett rådfrågningssystem som föräldrar kan
använda sig av för att få råd och tips om vad deras barn kan ha för sjukdom.
Problemet man då stöter på är ansvarsfrågan, det vill säga ett expertsystem kan
aldrig ersätta de kunskaper och erfarenheter som en läkare har. Slutversionen
är därför ett system som kan användas som komplement till en redan ställd
diagnos, ett så kallat "second-opinionsystem". Som exempel kan nämnas
en förälder som på barnklinikens akutmottagning fått veta att barnet har
kikhosta och vid hemkomsten undrar vad som egentligen blev sagt under
läkarbesöket.
3. Systembeskrivning
Jag arbetade fram två
förslag på systemlösning, det ena bestämde vi att använda gemensamt i
storgruppen och det andra tänkte jag presentera individuellt nedan. De olika
lösningarna skiljer sig inte nämnvärt åt, lösningen nedan visar hur systemet
kan se ut då man tar hand om alla allmänna frågor på ett annat sätt. Exempel på
allmänna frågor kan vara barnets ålder, hur hög feber det har samt hur länge
det varit sjukt. Vilket lösningsförslag man än väljer behövs en startmodul, ett
antal sjukdomsspecifika moduler samt någon form av slutmodul som tar hand om
systemets output, det vill säga de färdiga diagnoserna. Skillnaden ligger nu i
modulernas inre utformning dit allmänna frågor flyttats.
Under
seminariet strax innan jul diskuterades realiserbarheten i de olika system och
Hemdoktorn fick påpekandet att detta inte skulle vara möjligt att genomföra,
just på grund av ansvarsfrågan som nämns ovan. I kursen Kognitionsvetenskap
skrev jag en uppsats om svårigheten med att konstruera ett system som
innehåller "sunt förnuft" samt den förmåga till resonemang och
dragandet av slutsatser som bygger på tidigare förvärvad kunskap, det vill säga
egenskaper som gör oss människor unika (Varför representation av naturligt
språk som bakgrundskunskap begränsar möjligheten att skapa komplexa
intelligenta system, Föreläsning 7, i kursen
Kognitionsvetenskap).
Valet av systemstruktur var
enkel, konstruktionen bygger på lagrade fallbeskrivningar. Användaren har redan
fått en diagnos men vill nu antingen få den bekräftad, har glömt bort vad den
hette eller bli påmind om vad som egentligen sades under läkarbesöket.
Allmänna frågor har tagits
bort från startmodulen och användaren skall nu mata in namnet på den diagnos
denne fått eller välja symtom ur en tabell. Möjligheten att välja ur en
symtomtabell finns kvar då det kan underlätta användarens valmöjlighet.
Naturligtvis fungerar även en lösning med allmänna frågor, exempelvis kan man
ju tänka sig att det kan vara enklare för invandrare som kanske inte alltid
uppfattat eller förstått vad barnets läkare sagt men inte vågat be denne
upprepa sig.
Eftersom de inmatade värdena
skall matchas med redan inlagda fall viktas svaren direkt till de respektive modulerna.
Uppgifter som huruvida barnet har feber samt hur hög kan istället läggas in i
de sjukdomsspecifika modulerna. Viss redundans uppstår då men den borde vara
överkomlig. Barn kan ju vara ordentligt sjuka utan att för den skull vara
särskilt allmänpåverkade vilket understryker möjligheten och nyttan av allmänna
frågeställningar i de olika undermodulerna.
3.1 Flödesschema
Flödesschema över
informationen genom systemet.
Mage / Tarmåkommor
·
CBS = output
Hudåkommor
·
Modul H
· CBS = output
Förkylningsbesvär
·
Modul
F
·
CBS = output
Barnsjukdomar
·
Modul
B
·
modul
M (Mässling)
·
CBS = output
·
modul
T (Tredagarsfeber)
·
CBS = output
·
modul
K (Körtelfeber)
·
CBS = output
·
modul
V (Vattkoppor)
·
CBS = output
· modul S (Scharlakansfeber)
·
CBS = output
· modul R
(Röda Hund)
·
CBS = output
3.2 Input
Då användaren startar
systemet kan denne välja att fylla i ett eller flera symtom eller via en rullgardinsmeny
gå direkt till de olika modulerna. Beroende på vilka symtom som angetts viktas
svaren som skickas till respektive modul och på samma sätt sker kopplingen
mellan diagnosnamn och modul. Startmodulen kommer då
att se lite annorlunda ut än tidigare och så även de övriga modulerna som nu
fått ett tillskott av de allmänna frågorna. De moduler som skall finnas är som
tidigare modul F för förkylningsåkommor, modul B för
barnsjukdomar, modul H för hudåkommor, modul M för mage/tarmbesvär samt CBSmodulen som lagrar alla slutresultat.
I samtliga moduler utom
slutmodulen får användaren även svara på mer sjukdomsspecifika frågor och i
varje modul görs sökning genom frågeträdet både på djupet och på bredden. Då
tillräckligt många sjukdomsspecifika frågor har besvarats, viktas dessa och
skickas till slutmodulen.
Modul B för barnsjukdomar är
i sin tur uppdelad i sex undermoduler för sjukdomarna Mässling, Röda Hund, Vattkoppor,
Körtelfeber; Tredagarsfeber samt Scharlakansfeber.
För information om hur de
olika modulerna kan fungera, se respektive modul nedan eller gå direkt till
önskad modul.
3.3 Output
I slutmodulen matchas
frågorna mot ett antal lagrade diagnoser och en metod som heter showDiagnos()
skriver ut resultatet på skärmen. Användaren får ett svar av typen "Ditt
barn har diagnosen Mässling!".
4. Skärmlayout
Dialogen med användaren kan se ut som på bilden
nedan. En förklaring till hur systemet är tänkt att användas måste givetvis
finnas tillgänglig så fort systemet startas. Användaren kan bland annat välja
att avsluta, ångra val eller köra programmet en gång till. Val till de olika
modulerna görs som redan nämnts ovan. Inläggning respektive uppdatering görs av
den underhållsansvarige och är därför inte synligt för användaren.
5.
Startmodul
I startmodulen ligger givetvis huvudprogrammet.
Metoden startSystem() anropas varje gång användare börjar köra programmet samt
då denne önskar fortsätta. Slutmodulen har som nämnts tidigare endast system
underhållare tillgång till för uppdatering eller revidering.
void
main()
{
/* Huvudprogrammet */
IF ("Starta system") THEN
start_module.weight = 1000;
IF ("Lägga in ny diagnos") THEN
CBS.weight := 900;
WHILE (getNextExpertModule());
weight :=0;
/*Returnerar
och kör den modul med högst vikt. Är vikten 0 returneras NULL och villkoret :=
FALSE*/
ångraVal();
/*
Metod som anropas då användaren ångrar ett eller flera val. Rensar fälten och
går tillbaka ett steg.*/
fortsättSystem();
/*
Metod som anropas då användaren valt att fortsätta.*/
exitSytem()
{
/*exitSystem() är en metod som avslutar systemet.*/}
5.1 Regelbas (Start)
systemStart()
/*Variablerna
kräkning, diarré med mera väljs på skärmen då användaren startat systemet (Se
bild ovan). Man kan välja att ange ett, fler eller inget alternativ (AND/OR),
gå direkt till en viss modul, avsluta, ångra val med mera.*/
private
Boolean prickar, diarré, hosta, snuva, klåda, magsmärtor, blåsor, halsont,
utslag, fläckar, förstoppning;
private
String barnsjukdomar, hudåkommor, förkylningsåkommor, magtarmåkommor,
nydiagnos, ångra;
{
/*Välj
symtom nedan.*/
IF (first_time) THEN ställ_fråga (initiering);
IF (ställ_frågor(Frågamage1)=True)
THEN kräks:=True;
IF
(ställ_frågor(Frågamage 2)=True) THEN diarré:=True;
IF
(ställ_frågor(Frågamage 3)=True) THEN buksmärta:=True;
IF
(ställ_frågor(Frågamage 4)=True) THEN förstoppning:=True;
IF
(kräks, diarré, buksmärta, förstoppning,) THEN ModulM.weight :=900
}
ELSE {
IF
(ställ_frågor(Frågaförkylning1)=True) THEN snuva:=True;
IF
(ställ_frågor(Frågaförkylning2)=True) THEN hosta:=True;
IF
(ställ_frågor(Frågaförkylning3)=True) THEN halsont=:True;
IF (snuva, hosta, halsont) THEN ModulF.weight
:=800;
}
ELSE {
IF
(ställ_frågor(Frågahud1)=True) THEN klåda := True;
IF
(ställ_frågor(Frågahud2)=True) THEN utslag := True;
IF
(ställ_frågor(Frågahud3)=True) THEN blåsor := True;
IF
(ställ_frågor(Frågahud4)=True) THEN fläckar := True;
IF
(ställ_frågor(Frågahud5)=True) THEN prickar := True;
IF
(klåda, prickar, blåsor, fläckar, utslag) THEN ModulH.weight :=700;
}
ELSE {
IF
NOT (kräks, diarré, förstoppning) AND (ställ_fråga (Frågabarnsjukdom1)=True)
THEN barnsjukdom:=True;
IF (barnsjukdom) THEN ModulB.weight :=600;
}
ELSE DO {
/*Välj
åkomma för att starta respektive modul M, F, H eller B direkt vid start*/
IF (magtarmåkommor) THEN ModulM.weight :=500;
ELSE
IF (hudåkommor) THEN ModulH.weight :=400;
ELSE
IF (förkylningsåkommor) THEN ModulF.weight
:=300;
ELSE
IF (barnsjukdomar) THEN ModulB.weight :=200;
ELSE
IF (nydiagnos) THEN ModulCBS.weight :=100;
ELSE
IF
(avsluta) THEN GOTO exit_system(); /*Avslutar systemet*/
ELSE
IF
(fortsätt) THEN GOTO startSystem(); /*Repeterar hela tiden till användaren
väljer att sluta*/
ELSE
IF
(ångra) THEN ("Rensa fältet och gå tillbaka ett steg");
weight :=0;
}}
5.2 Frågeträd (Start)
I
frågeträdet skall förutom nedanstående frågor finnas med avsluta program, ångra
val med mera. Här har jag endast tagit upp de specifika frågorna.
·
Frågamage 1: Kräks barnet? : alternativ: (Välj ett alternativ
nedan);
·
Ja (True)
·
Nej (False)
·
Frågamage 2: Har barnet diarré? : alternativ: (Välj ett alternativ
nedan);
·
Ja (True)
·
Nej (False)
·
Frågamage 3: Har barnet ont i magen? : alternativ (Välj ett alternativ
nedan);
·
Ja (True)
·
Nej (False)
·
Frågaförkylning 3: Har barnet ont i halsen? : alternativ: (Välj ett alternativ
nedan);
·
Ja (True)
·
Nej (False)
·
Frågaförkylning 1: Är barnet snuvigt? : alternativ: (Välj ett alternativ nedan);
·
Ja (True)
·
Nej (False)
·
Frågaförkylning 2: Hostar barnet? : alternativ: (Välj ett alternativ nedan);
·
Ja (True)
·
Nej (False)
·
Frågahud 1: Har barnet klåda? : alternativ: (Välj ett alternativ nedan);
·
Ja (True)
·
Nej (False)
·
Frågamage 4: Är barnet förstoppat? : alternativ: (Välj ett alternativ
nedan);
·
Ja (True)
·
Nej (False)
·
Frågahud 2: Har barnet utslag? : alternativ: (Välj ett alternativ nedan);
·
Ja (True)
·
Nej (False)
·
Frågahud 3: Har barnet blåsor? : alternativ (Välj ett alternativ
nedan);
·
Ja (True)
·
Nej (False)
·
Fågahud 4: Har barnet fläckar? : alternativ: (Välj ett alternativ
nedan);
·
Ja (True)
·
Nej (False)
·
Frågahud 5: Har barnet prickar? : alternativ: (Välj ett alternativ
nedan);
·
Ja (True)
·
Nej (False)
·
Frågabarnsjukdom 1: Har barnet en barnsjukdom? : alternativ: (Välj ett
alternativ nedan);
·
Ja (True)
·
Nej (False)
6. ModulB (Barnsjukdomar)
/*
Denna modul är uppdelad i en huvudmodul och sex stycken undermoduler
motsvarande olika barnsjukdomar. Dessa är mässling, röda hund, scharlakansfeber,
vattkoppor, körtelfeber samt tredagarsfeber. Viss redundans är oundviklig
eftersom exempelvis feber ingår som symtom i samtliga diagnoser. Reglerna i de
olika modulerna kommer att bestämma vilka frågor som triggas. Dessa kan väljas
slumpmässigt och sökningen i frågeträdet kan ske både på djupet och på bredden.
Då ett visst antal frågor (eller alla) valts ur trädet görs en sökning i
CBSmodulen efter den diagnos som stämmer in på svarssymtomen. Innan sökning i
slutmodulen kan ske skall ett tillräckligt antal symtomspecifika frågor ha
valts ut för att sökningen skall lyckas.
Sökning
skall fungera för alla lagrade fallbeskrivningarna, det vill säga användaren
får alltid upp ett svarsalternativ då slutmodulen innehåller redan lagrad
kunskap som fallbeskrivningar. De enskilda modulerna innehåller enbart de
symtom som gäller för respektive sjukdom. Frågorna kan vara specade och då
väljer användaren ett av två alternativ, Ja (True) eller Nej (False), vid
skalsvar väljs svar ur ett intervall och detta sker på samma sätt i alla
moduler. Givetvis kan man tänka sig att lägga alla allmänna frågor direkt i
denna modul innan man går vidare, på det sättet undviker man en del av
redundansen.*/
startBarnsjukdomar()
{
private
String mässling, vattkoppor, scharlakansfeber, röda_hund, körtelfeber,
tredagarsfeber;
6.1 Start av Modul B
{
IF (mässling) THEN
moduleM.weight := 600;
}
ELSE /* Starta modul M */
IF (scharlakansfeber) THEN
moduleS.weight := 500; /* Starta modul S */
} ELSE
IF (vattkoppor) THEN moduleV.weight
:= 400; /* Starta modul V */
} ELSE
IF (röda_hund) THEN
moduleR.weight := 300; /* Starta modul R */
} ELSE
IF (körtelfeber) THEN
moduleK.weight := 200; /* Starta modul K */
} ELSE
IF (tredagarsfeber) THEN
moduleT.weight := 100; /* Starta modul T */
}
weight
:= 0;
6.2 Arbetsminne
Variablerna
I arbetsminnet lagras i en hashtabell samt matchas med liknande variabler i
modulerna. En formel räknar ut ett specifikt värde som skickas till
hashtabellen.
Variabler:
6.3 Modul M (Mässling)
6.3.1 Regelbas
IF (first_time) THEN ställ_fråga (initiering);
IF (ålder) THEN ställ_fråga (Fråga1);
IF (feber) THEN ställ_fråga (Fråga2);
IF (Fråga2) = True THEN ställ_fråga (Fråga3);
IF (Fråga3) AND/OR (Fråga2)=True THEN ställ_fråga (Fråga4);
IF (allmänpåverkan) THEN ställ_fråga (Fråga 5);
IF NOT (allmänpåverkan) THEN ställ_fråga (Fråga 6);
IF (smärttillstånd) AND (ögon) THEN ställ_fråga (Fråga 13);
IF (ögon) AND (irriterad) THEN ställ_fråga (Fråga 14);
IF (ögon) AND (röda) THEN ställ_fråga (Fråga 15);
IF (ögon) AND (ljuskänslig) THEN ställ_fråga (Fråga 16);
IF (rethosta) THEN ställ_fråga (Fråga 12);
IF (snuva) THEN ställ_fråga (Fråga 11);
IF (prickar) AND (insidan av kind) AND (vita) THEN ställ_fråga (Fråga
10);
IF (fläckar) AND (små) AND (röda) AND (upphöjda) THEN ställ_fråga (Fråga
9);
IF (fläckar) AND (börjat) AND (små) AND (upphöjda) AND (bakom öron) THEN
ställ_fråga (Fråga 7);
IF (fläckar) AND (spridning) AND (ansikte) THEN ställ_fråga (Fråga 8);
6.3.2 Fallbeskrivning
/*Frågeträdet gås igenom. Efter fråga 15 görs ett anrop till modulen med
fallbeskrivningar där matchning sker. Nästa fall får närmaste lägre vikt tills
inga diagnoser finns kvar*/
mässling:=False;
m:=0;
IF ((Fråga2)=True THEN (m :=m+1) AND
IF (Fråga 3)=True THEN (m :=m+2) AND
IF (Fråga 5)=True THEN (m := m+2)
AND
IF (Fråga 7)=True THEN (m:=m+1) AND
IF (Fråga 8)=True THEN (m:=m+1) AND
IF (Fråga 9)=True THEN (m:=m+1) AND
IF (Fråga 10)=True THEN (m:=m+1) AND
IF (Fråga14) =True THEN (m:=m+1)
IF (Fråga 15))=True THEN
mässling:=True;
IF (mässling) THEN
moduleCBS.weight:=1000;
6.3.3 Frågeträd
·
0-3 månader
·
3-6 månader
·
6-12 månader
·
1-2 år
·
2-3år
·
3-6 år
·
6-10 år
·
10-13 år
·
13-16 år
·
Fråga 2: Har barnet feber? : alternativ: (Välj ett alternativ nedan);
·
Ja (T)
·
Nej (F)
·
>= 38.5 grader (T)
·
< 38.5 grader (F)
·
< 1 dygn
·
1 dygn
·
2-3 dygn
·
3-5 dygn
·
5 dygn
·
Fråga 5: Verkar barnet allmänpåverkat? : alternativ: (…);
·
Ja (T)
·
Nej (F)
·
Fråga 6: Verkar barnet opåverkat trots feber? : alternativ: (…);
·
Ja (T)
·
Nej (F)
·
Fråga 7: Har barnet små röda upphöjda fläckar? : alternativ: (…);
·
Ja (T)
·
Nej (F)
·
Fråga 8: Började dessa bakom öronen? : alternativ: (…);
·
Ja (T)
·
Nej (F)
·
Fråga 9: Har dessa spridit sig till ansiktet, och/eller bål och/eller armar
respektive ben? : alternativ: (…);
·
Ja (T)
·
Nej (F)
·
Fråga 10: Har barnet vita prickar på kindernas insida? : alternativ: (…);
·
Ja (T)
·
Nej (F)
·
Fråga 11: Är barnet snuvigt? : alternativ: (…);
·
Ja (T)
·
Nej (F)
·
Fråga 12: Har barnet rethosta? : alternativ: (…);
·
Ja (T)
·
Nej (F)
·
Fråga 13: Har barnet ont i ögonen? : alternativ: (…);
·
Ja (T)
·
Nej (F)
·
Fråga 14: Är barnet irriterat i ögonen? : alternativ: (…);
·
Ja (T)
·
Nej (F)
·
Fråga 15: Har barnet röda ögonvitor? : alternativ: (…);
·
Ja (T)
·
Nej (F)
·
Fråga 16: Är barnet extra ljuskänsligt? : alternativ: (…);
·
Ja (T)
·
Nej (F)
6.3.4 Arbetsminne
Variablerna
I arbetsminnet lagras i en hashtabell samt matchas med liknande variabler i
modulerna. En formel räknar ut ett specifikt värde som skickas till
hashtabellen.
Exempel
på variabler:
6.4 Modul S (Scharlakansfeber)
6.4.1 Regelbas
IF (first_time)
THEN ställ_fråga (initiering);
IF (ålder) THEN ställ_fråga (Fråga1);
IF (feber) THEN ställ_fråga (Fråga2);
IF (Fråga2) = True THEN ställ_fråga (Fråga3);
IF (Fråga3) AND/OR (Fråga2) =True THEN ställ_fråga (Fråga4);
IF (feber) AND NOT (allmänpåverkad) THEN ställ_fråga (Fråga6)
IF (allmänpåverkan) THEN ställ_fråga (Fråga 5);
IF (utslag) AND (finprickiga) AND (sammanflytande) THEN ställ_fråga
(Fråga 7);
IF (utslag) AND (ansikte) THEN ställ_fråga (Fråga 9);
IF (utslag) AND (börjat) AND ((hals) OR (rygg) OR (bakom öron)) THEN
ställ_fråga (Fråga 10);
IF (utslag) AND (spridning) AND (snabb) THEN ställ_fråga (Fråga 11);
IF (utslag) AND (hudveck) THEN ställ_fråga (Fråga
12);
IF
(fläckar) AND (lätt upphöjda) THEN ställ_fråga(Fråga 8);
IF (hud) AND (torr) AND (fnasig) THEN ställ_fråga (Fråga 13);
IF (hud) AND (blek) AND (runt mun) THEN ställ_fråga (Fråga 15);
IF (ansiktsrodnad) THEN ställ_fråga (Fråga 14);
IF (smärttillstånd) AND (mun) THEN ställ_fråga (Fråga 16);
IF (smärttillstånd) AND (hals) THEN ställ_fråga (Fråga 21);
IF (tunga) AND (beläggning) THEN ställ_fråga (Fråga 17);
IF (tunga) AND ((beläggning) AND (börjat lossna)) THEN ställ_fråga
(Fråga 18);
IF (tunga) AND (starkt röd) THEN ställ_fråga (Fråga 19);
IF (tunga) AND (starkt röd) AND (bleka fält) THEN ställ_fråga (Fråga
20);
6.4.2 Fallbeskrivning
/*Frågeträdet gås igenom. Efter fråga 19 görs ett anrop till modulen med
fallbeskrivningar där matchning sker. Nästa fall får närmaste lägre vikt tills
inga diagnoser finns kvar*/
scharlakansfeber:=False;
sf:=0;
IF ((Fråga2)=True THEN (sf :=sf+1)
AND
IF (Fråga 3)=True THEN (sf :=sf+2)
AND
IF (Fråga 5)=True THEN (sf := sf+2)
AND
IF (Fråga 7)=True THEN (sf:=sf+1)
AND
IF (Fråga 8)=True THEN (sf:=sf+1)
AND
IF (Fråga 9)=True THEN (sf:=sf+1)
AND
IF (Fråga 10)=True THEN (sf:=sf+1)
AND
IF (Fråga 11)=True THEN (sf:=sf+1)
AND
IF ((Fråga12)=True THEN (sf :=sf+1)
AND
IF (Fråga 13)=True THEN (sf :=sf+3)
AND
IF (Fråga 16)=True THEN (sf := sf+3)
AND
IF (Fråga 19))=True THEN
scharlakansfeber:=True;
IF (scharlakansfeber) THEN
moduleCBS.weight:=1000;
6.4.3 Frågeträd
·
0-3 månader
·
3-6 månader
·
6-12 månader
·
1-2 år
·
2-3år
·
3-6 år
·
6-10 år
·
10-13 år
·
13-16 år
·
Fråga 2: Har barnet feber? : alternativ: (Välj ett alternativ nedan);
·
Ja (T)
·
Nej (F)
·
>= 38.5 (T)
·
< 38.5 grader (F)
·
< 1 dygn
·
1 dygn
·
2-3 dygn
·
3-5 dygn
·
5 dygn
·
Fråga 5: Verkar barnet allmänpåverkat? : alternativ: (…);
·
Ja (T)
·
Nej (F)
·
Fråga 6: Verkar barnet opåverkat trots feber? : alternativ: (…);
·
Ja (T)
·
Nej (F)
·
Fråga 7: Har barnet finprickiga, sammanflytande utslag? : alternativ: (…);
·
Ja (T)
·
Nej (F)
·
Fråga 8: Har utslagen inslag av lätt upphöjda fläckar? : alternativ: (…);
·
Ja (T)
·
Nej (F)
·
Fråga 9: Har barnet utslag i ansiktet? : alternativ: (…);
·
Ja (T)
·
Nej (F)
·
Fråga 10: Började dessa på halsen, ryggen eller bakom öronen? : alternativ: (…);
·
Ja (T)
·
Nej (F)
·
Fråga 11: Har utslagen spridit sig snabbt? : alternativ: (…);
·
Ja (T)
·
Nej (F)
·
Fråga 12: Har barnet dessa utslag huvudsakligen i hudveck? : alternativ: (…);
·
Ja (T)
·
Nej (F)
·
Fråga 13: Är huden torr och fnasig? : alternativ: (…);
·
Ja (T)
·
Nej (F)
·
Fråga 14: Har barnet en stark rodnad i ansiktet? : alternativ: (…);
·
Ja (T)
·
Nej (F)
·
Fråga 15: Är barnet blekt om munnen? : alternativ: (…);
·
Ja (T)
·
Nej (F)
·
Fråga 16: Har barnet ont i munnen? : alternativ: (…);
·
Ja (T)
·
Nej (F)
·
Fråga 17: Har barnet en vit beläggning på tungan? : alternativ: (…);
·
Ja (T)
·
Nej (F)
·
Fråga 18: Har beläggningen börjat lossna från tungan? : alternativ: (…);
·
Ja (T)
·
Nej (F)
·
Fråga 19: Är barnets tunga starkt rödfärgad? : alternativ: (…);
·
Ja (T)
·
Nej (F)
·
Fråga 20: Har barnet bleka fält på tungan ("smultrontunga")? :
alternativ: (…);
·
Ja (T)
·
Nej (F)
·
Fråga 21: Har barnet ont i halsen? : alternativ: (…);
·
Ja (T)
·
Nej (F)
6.4.4 Arbetsminne
Variablerna
I arbetsminnet lagras i en hashtabell samt matchas med liknande variabler i
modulerna. En formel räknar ut ett specifikt värde som skickas till
hashtabellen.
Exempel
på variabler:
6.5 Modul V (Vattkoppor)
6.5.1 Regelbas
IF (first_time) THEN ställ_fråga (initiering);
IF (ålder) THEN ställ_fråga (Fråga1);
IF (feber) THEN ställ_fråga (Fråga 2);
IF (Fråga2) = True THEN ställ_fråga (Fråga3);
IF ((Fråga2) AND/OR (Fråga3)) =True THEN ställ_fråga (Fråga 4);
IF (allmänpåverkan) THEN ställ_fråga (Fråga5);
IF (feber) AND NOT (allmänpåverkan) THEN ställ_fråga (Fråga 6);
IF (smärttillstånd) AND (huvud) THEN ställ_fråga (Fråga 13);
IF (utslag) AND (blåsformiga) THEN ställ_fråga (Fråga 7);
IF (utslag) AND (klåda) THEN ställ_fråga (Fråga 8);
IF (utslag) AND (delvis fallit av) AND (lämnat skorpor) THEN ställ_fråga
(Fråga 9);
IF (utslag) AND (börjat) AND (ansikte) THEN ställ_fråga (Fråga 10);
IF (utslag) AND (spridning) AND ((hårbotten) AND (armar) AND (ben)) THEN
ställ_fråga (Fråga 11);
IF (utslag) AND (spridning) AND ((munslemhinnan) AND (könsorganen)) THEN
ställ_fråga (Fråga 12);
6.5.2 Fallbeskrivning
/*Frågeträdet gås igenom. Efter fråga 9 görs ett anrop till modulen med
fallbeskrivningar där matchning sker. Nästa fall får närmaste lägre vikt tills
inga diagnoser finns kvar*/
vattkoppor:=False;
v:=0;
IF ((Fråga2)=True THEN (v :=v+1) AND
IF (Fråga 3)=True THEN (v :=v+3) AND
IF (Fråga 6)=True THEN (v :=v+1) AND
IF (Fråga 7)=True THEN (v:=v+1) AND
IF (Fråga 8)=True THEN (v:=v+1) AND
IF (Fråga 9))=True vattkoppor:=True;
IF (vattkoppor) THEN
moduleCBS.weight:=1000;
6.5.3 Frågeträd
·
0-3 månader
·
3-6 månader
·
6-12 månader
·
1-2 år
·
2-3år
·
3-6 år
·
6-10 år
·
10-13 år
·
13-16 år
·
Fråga 2: Har barnet feber? : alternativ: (Välj ett alternativ nedan);
·
Ja (T)
·
Nej (F)
·
Fråga 3: Om ja, hur hög är temperaturen? : skal_svar (Välj ett alternativ ur
intervallet);
·
>= 38.5 grader (T)
·
< 38.5 grader (F)
·
< 1 dygn
·
1 dygn
·
2-3 dygn
·
3-5 dygn
·
5 dygn
·
Fråga 5: Verkar barnet allmänpåverkat? : alternativ: (…);
·
Ja (T)
·
Nej (F)
·
Fråga 6: Verkar barnet opåverkat trots feber? : alternativ: (…);
·
Ja (T)
·
Nej (F)
·
Fråga 7: Har barnet blåsformiga utslag? : alternativ: (…);
·
Ja (T)
·
Nej (F)
·
Fråga 8: Kliar de? : alternativ: (…);
·
Ja (T)
·
Nej (F)
·
Fråga 9: Har utslagen delvis fallit av och lämnat skorpor? : alternativ: (…);
·
Ja (T)
·
Nej (F)
·
Fråga 10: Började utslagen i ansiktet? : alternativ: (…);
·
Ja (T)
·
Nej (F)
·
Fråga 11: Har utslagen spridit sig till hårbotten, armar och ben? : alternativ:
(…);
·
Ja (T)
·
Nej (F)
·
Fråga 12: Har utslagen spridit sig till munnen och / eller könsorganen? :
alternativ: (…);
·
Ja (T)
·
Nej (F)
·
Fråga 13: Har barnet huvudvärk? : alternativ: (…);
·
Ja (T)
·
Nej (F)
6.5.4 Arbetsminne modul V
Variablerna
I arbetsminnet lagras i en hashtabell samt matchas med liknande variabler i
modulerna. En formel räknar ut ett specifikt värde som skickas till
hashtabellen.
Exempel
på variabler:
6.6 Modul R (Röda
Hund)
6.6.1 Regelbas
IF (first_time) THEN ställ_fråga (initiering);
IF (ålder) THEN ställ_fråga (Fråga1);
IF (feber) THEN ställ_fråga (Fråga 2);
IF (Fråga 2)=True THEN ställ_fråga (Fråga 3);
IF ((Fråga2) AND/OR (Fråga3))=True THEN ställ_fråga (Fråga4);
IF (allmänpåverkan) THEN ställ_fråga (Fråga 5);
IF (smärttillstånd) AND (hals) THEN ställ_fråga (Fråga 7);
IF (smärttillstånd) AND (nacke) THEN ställ_fråga (Fråga 8);
IF NOT (allmänpåverkan) THEN ställ_fråga (Fråga 6);
IF (smärttillstånd) AND ((led) OR (leder)) THEN ställ_fråga (Fråga 9);
IF (smärttillstånd) AND (huvud) THEN ställ_fråga (Fråga 10);
IF ((utslag) AND (blekröda)) AND ((fläckar) AND (lätt upphöjda)) THEN
ställ_fråga (Fråga 11);
IF (utslag) AND (börjat) AND (ansikte) THEN ställ_fråga (Fråga 12);
6.6.2 Fallbeskrivning
/*Frågeträdet gås igenom. Efter fråga 11 görs ett anrop till modulen med
fallbeskrivningar där matchning sker. Nästa fall får närmaste lägre vikt tills inga
diagnoser finns kvar*/
röda_hund:=False;
r:=0;
IF ((Fråga2)=True THEN (r :=r+1) AND
IF (Fråga 3)=True THEN (r:=r+21) AND
IF (Fråga 5)=True THEN (r :=r+2) AND
IF (Fråga 7)=True THEN (r:=r+1) AND
IF (Fråga 8)=True THEN (r:=r+1) AND
IF (Fråga 9)=True THEN (r:=r+2) AND
IF (Fråga 11)=True THEN
röda_hund:=True;
IF (röda_hund) THEN
moduleCBS.weight:=1000;
6.6.3 Frågeträd
·
0-3 månader
·
3-6 månader
·
6-12 månader
·
1-2 år
·
2-3år
·
3-6 år
·
6-10 år
·
10-13 år
·
13-16 år
·
Fråga 2: Har barnet feber? : alternativ: (Välj ett alternativ nedan);
·
Ja (T)
·
Nej (F)
·
>= 38.5 grader (T)
·
< 38.5 grader (F)
·
< 1 dygn
·
1 dygn
·
2-3 dygn
·
3-5 dygn
·
5 dygn
·
Fråga 5: Verkar barnet allmänpåverkat? : alternativ: (…);
·
Ja (T)
·
Nej (F)
·
Fråga 6: Verkar barnet opåverkat trots feber? : alternativ: (…);
·
Ja (T)
·
Nej (F)
·
Fråga 7: Har barnet ont i halsen? : alternativ: (…);
·
Ja (T)
·
Nej (F)
·
Fråga 8: Har barnet ont i nacken? : alternativ: (…);
·
Ja (T)
·
Nej (F)
·
Fråga 9: Har barnet ont i en eller flera leder? : alternativ: (…);
·
Ja (T)
·
Nej (F)
·
Fråga 10: Har barnet huvudvärk? : alternativ: (…);
·
Ja (T)
·
Nej (F)
·
Fråga 11: Har barnet blekröda utslag, med inslag av lätt upphöjda fläckar? :
alternativ: (…);
·
Ja (T)
·
Nej (F)
·
Fråga 12: Började utslagen i ansiktet? : alternativ: (…);
·
Ja (T)
·
Nej (F)
6.6.4 Arbetsminne modul R
Variablerna
I arbetsminnet lagras i en hashtabell samt matchas med liknande variabler i
modulerna. En formel räknar ut ett specifikt värde som skickas till
hashtabellen.
Exempel
på variabler:
6.7 Modul K (Körtelfeber)
6.7.1 Regelbas
IF (first_time) THEN ställ_fråga (initiering);
IF (ålder) THEN ställ_fråga (Fråga1);
IF (feber) THEN ställ_fråga (Fråga 2);
IF (Fråga 2)=True THEN ställ_fråga (Fråga 3);
IF (Fråga2) AND/OR (Fråga3) = True THEN ställ_fråga (Fråga 4);
IF (allmänpåverkan) AND (trött) THEN ställ_fråga (Fråga 7);
IF (allmänpåverkan) THEN ställ_fråga (Fråga 5);
IF NOT (allmänpåverkan) (trött) THEN ställ_fråga (Fråga 6);
IF (smärttillstånd) AND (hals) THEN ställ_fråga (Fråga 9);
IF (smärttillstånd) AND (huvud) THEN ställ_fråga (Fråga 8);
IF (smärttillstånd) AND (halsont) AND (förstorade mandlar) AND (vit
beläggning) THEN ställ_fråga (Fråga 10);
IF (smärttillstånd) AND (muskler) THEN ställ_fråga (Fråga 12);
IF (snuva) THEN ställ_fråga (Fråga 13);
IF (lymfkörtlar) AND (svullna) AND ((ljumskar) OR (hals) OR armhålor))
THEN ställ_fråga(Fråga 11);
IF ((utslag) AND (blekröda)) AND ((fläckar) AND ((fläckar) AND (lätt
upphöjda)) THEN ställ_fråga (Fråga 15);
IF (fläckar) AND (små) AND (röda) AND (upphöjda) THEN ställ_fråga (Fråga
14);
6.7.2 Fallbeskrivning
/*Frågeträdet gås igenom. Efter fråga 15 görs ett anrop till modulen med
fallbeskrivningar där matchning sker. Nästa fall får närmaste lägre vikt tills
inga diagnoser finns kvar*/
körtelfeber:=False;
k:=0;
IF ((Fråga2)=True THEN (k :=k+1) AND
IF (Fråga 3)=True THEN (k :=k+2) AND
IF (Fråga 5)=True THEN (k := k+3)
AND
IF (Fråga 8)=True THEN (k:=k+2) AND
IF (Fråga 10)=True THEN (k:=k+1) AND
IF (Fråga 11)=True THEN (k:=k+3) AND
IF (Fråga 14)=True THEN (k:=k+1) OR
IF (Fråga 15))=True THEN
körtelfeber:=True;
IF (körtelfeber) THEN
moduleCBS.weight:=1000;
6.7.3 Frågeträd
·
0-3 månader
·
3-6 månader
·
6-12 månader
·
1-2 år
·
2-3år
·
3-6 år
·
6-10 år
·
10-13 år
·
13-16 år
·
Fråga 2: Har barnet feber? : alternativ: (Välj ett alternativ nedan);
·
Ja (T)
·
Nej (F)
·
>= 38.5 grader (T)
·
< 38.5 grader (F)
·
< 1 dygn
·
1 dygn
·
2-3 dygn
·
3-5 dygn
·
5 dygn
·
Fråga 5: Verkar barnet allmänpåverkat? : alternativ: (…);
·
Ja (T)
·
Nej (F)
·
Fråga 6: Verkar barnet opåverkat trots feber? : alternativ: (…);
·
Ja (T)
·
Nej (F)
·
Fråga 7: Verkar barnet onormalt trött? : alternativ: (…);
·
Ja (T)
·
Nej (F)
·
Fråga 8: Har barnet huvudvärk? : alternativ: (…);
·
Ja (T)
·
Nej (F)
·
Fråga 9: Har barnet ont i halsen? : alternativ: (…);
·
Ja (T)
·
Nej (F)
·
Fråga 10: Har barnet förstorade halsmandlar med vita beläggningar? : alternativ:
(…);
·
Ja (T)
·
Nej (F)
·
Fråga 11: Har barnet svullna lymfkörtlar i armhålorna, ljumskar eller på halsen? :
alternativ: (…);
·
Ja (T)
·
Nej (F)
·
Fråga 12: Har barnet muskelsmärtor? : alternativ: (…);
·
Ja (T)
·
Nej (F)
·
Fråga 13: Är barnet snuvigt? : alternativ: (…);
·
Ja (T)
·
Nej (F)
·
Fråga 14: Har barnet små röda upphöjda fläckar (Se mässling)? : alternativ: (…);
·
Ja (T)
·
Nej (F)
·
Fråga 15: Är dessa blekröda, med inslag av lätt upphöjda fläckar (Se röda hund)?
: alternativ: (…);
·
Ja (T)
·
Nej (F)
6.7.4 Arbetsminne modul K
Variablerna
I arbetsminnet lagras i en hashtabell samt matchas med liknande variabler i
modulerna. En formel räknar ut ett specifikt värde som skickas till
hashtabellen.
Exempel
på variabler:
6.8 Modul T (Tredagarsfeber)
6.8.1 Regelbas
IF (first_time) THEN ställ_fråga (initiering);
IF (ålder) THEN ställ_fråga (Fråga1);
IF (feber) THEN ställ_fråga (Fråga 2);
IF (Fråga 2)=True THEN ställ_fråga (Fråga 3);
IF (Fråga2) AND/OR (Fråga3) = True THEN ställ_fråga (Fråga4);
IF (allmänpåverkad) THEN ställ_fråga (Fråga5);
IF (feber) AND NOT (allmänpåverkan) THEN ställ_fråga (Fråga 6);
IF (utslag) AND ((småflammiga) AND (blekröda)) THEN ställ_fråga (Fråga
7);
IF (utslag) AND ((bål) AND (överarmar)) THEN ställ_fråga (Fråga 8);
6.8.2 Fallbeskrivning
/*Frågeträdet gås igenom. Efter fråga 8 görs ett anrop till modulen med fallbeskrivningar
där matchning sker. Nästa fall får närmaste lägre vikt tills inga diagnoser
finns kvar*/
tredagarsfeber:=False;
t:=0;
IF ((Fråga2)=True THEN (t :=t+1) AND
IF (Fråga 3)=True THEN (t:=t+3) AND
IF (Fråga 6)=True THEN (t :=t+1) AND
IF (Fråga 7)=True THEN (t:=t+1) AND
IF (Fråga 8))=True THEN
tredagarsfeber:=True;
IF (tredagarsfeber) THEN
moduleCBS.weight:=1000;
6.8.3 Frågeträd
·
0-3 månader
·
3-6 månader
·
6-12 månader
·
1-2 år
·
2-3år
·
3-6 år
·
6-10 år
·
10-13 år
·
13-16 år
·
Fråga 2: Har barnet feber? : alternativ: (Välj ett alternativ nedan);
·
Ja (T)
·
Nej (F)
·
>= 38.5 grader (T)
·
< 38.5 grader (F)
·
< 1 dygn
·
1 dygn
·
2-3 dygn
·
3-5 dygn
·
5 dygn
·
Fråga 5: Verkar barnet allmänpåverkat? : alternativ: (…);
·
Ja (T)
·
Nej (F)
·
Fråga 6: Verkar barnet opåverkat trots feber? : alternativ: (…);
·
Ja (T)
·
Nej (F)
·
Fråga 7: Har barnet blekröda och småflammiga utslag? : alternativ: (…);
·
Ja (T)
·
Nej (F)
·
Fråga 8: Sitter de huvudsakligen på bål samt överarmar? : alternativ: (…);
·
Ja (T)
·
Nej (F)
6.8.4 Arbetsminne
Variablerna
I arbetsminnet lagras i en hashtabell samt matchas med liknande variabler i
modulerna. En formel räknar ut ett specifikt värde som skickas till
hashtabellen.
Exempel
på variabler:
7. Modul CBS
/* I slutmodulen finns som nämnts tidigare alla de
fallbeskrivningar som matchar de olika symtomen. Här kan information lagras i
exempelvis en array, vilket underlättar sökning som då kan ske binärt. Detta
håller nere söktiden samt kostnaden för varje sökning. Variabler i modulernas
arbetsminne matchas mot motsvarande variabler i fallbeskrivningarna.
Variablerna friställs då de olika metoderna körts färdigt.
showDiagnos()
{
/*showDiagnos är en metod som går igenom slutmodulen med alla fallbeskrivningar
och matchar dessa med svarsalternativen i de olika symtommodulerna. Skriver ut
namnet på den diagnos som satts till TRUE.*/ }
7.1
Fallbeskrivningar
Innehåller
endast ett exempelfall per sjukdom.
·
Fall 1
·
Pojke 8 månader
·
opåverkat trots feber
·
hög feber
·
blekröda, flammiga utslag
·
sitter i huvudsak på bålen
showDiagnos(Tredagarsfeber);
·
flicka 15 år
·
feber
·
allmänpåverkan
·
snuva
·
muskelvärk
·
huvudvärk
·
förstorade halsmandlar med vita beläggningar
·
svullna lymfkörtlar i armhålor och ljumskar
·
blekröda utslag med inslag av lätt upphöjda fläckar (röda hundliknande)
showDiagnos(Körtelfeber);
·
pojke 5 år
·
låg allmänpåverkan
·
hög feber
·
blåsformiga utslag som kliar
·
dessa har delvis fallit av och lämnat skorpor
showDiagnos(Vattkoppor);
·
flicka 10 år
·
allmänpåverkad
·
halsont
·
nackont
·
hög feber
·
ont i en eller flera leder
·
blekröda utslag med inslag av lätt upphöjda fläckar
·
början i ansikte
showDiagnos(Röda Hund);
·
pojke 8 år
·
hög feber
·
allmänpåverkad
·
snuva
·
ont i ögon
·
irriterad i ögonen
·
röda ögonvitor
·
små röda upphöjda fläckar
·
vita prickar på kindernas insida
showDiagnos(Mässling);
·
flicka 9 år
·
feber
·
finprickiga, sammanflytande utslag
·
rodnad i ansikte
·
utslag i hudveck
·
torr och fnasig hud
·
utslagen börjat på rygg samt hals
·
utslagen spridits snabbt
·
vit beläggning på tunga
·
smultrontunga
showDiagnos(Scharlakansfeber);
8. Källa
Russel, Stuart and Norvig, Peter,
Artificial intelligence, a modern approach, Prentice-Hall, New Jersey, 1995.
Darlington, Keith, The essence of expert systems, Prentice-Hall and Pearson Education Limited 2000, http://www.pearsoneduc.com