Prolog er velegnet til konstruktion af programmer til regelbaseret diagnosticering og konsultation. I denne lektion vil jeg gennemgå en løsningsskabelon, som jeg vil kalde konsultationsparadigmet. Løsningen er samtidig et framework, som skulle gøre det let at omdanne den og videreudvikle den i forbindelse med udformning af egne videnbaserede systemer til konsultationer og diagnosticering.
Når man udvikler et system til konsultation og diagnosticering, kommer man ofte ud for, at samme symptom går igen i flere forskellige diagnoser. Det virker imidlertid ikke så godt, hvis man hele tiden skal stille brugeren det samme spørgsmål, blot fordi symptomet går igen i flere diagnoser. Systemet skulle jo gerne afspejle hvad det også er: nemlig et eksempel på kunstig intelligens. Man kan være sikker på, at brugeren ikke vil opfatte systemet som særlig intelligent, hvis det flere gange i konsultationen stiller samme spørgsmål.
:- dynamic husket/2.
go:- write('Prototype på videnbaseret system'), nl, nl, try.
try:- løsning(X), !, write('Årsagen til problemet kan være: '), write(X), nl, glem. try:- write('Sådan et problem har jeg aldrig hørt om'), nl, glem.
glem:- retract(husket(_, _)), glem.
løsning('Diagnose 1'):- positiv('Symptom 1'), positiv('Symptom 2'). løsning('Diagnose 2'):- negativ('Symptom 2'), positiv('Symptom 3').
positiv(X):- husket(X, ja), !. positiv(X):- husket(X, nej), !, fail. positiv(X):- write(X), write(': '), read(Svar), nl, ( (Svar == ja; Svar == j) -> assertz(husket(X, ja)) ; assertz(husket(X, nej)), fail).
negativ(X):- husket(X, nej), !. negativ(X):- husket(X, ja), !, fail. negativ(X):- write(X), write(': '), read(Svar), nl, ( (Svar == nej; Svar == n) -> assertz(husket(X, nej)) ; assertz(husket(X, ja)), fail).
Programkoden kan downloades her.
På baggrund af ovenstående generelle eksempel er der udviklet et lille videnbaseret system, som måske kan være til hjælp ved diagnosticering af almindeligt forekommende sygdomme. I det generelle eksempel udskiftes afsnittet med diagnoser og symptomer med følgende:
løsning('Influenza'):- positiv('Patienten har hovedpine'), positiv('Patienten har feber'). løsning('Lungebetændelse'):- negativ('Patienten har hovedpine'), positiv('Patienten har feber'), positiv('Patienten har høj feber'). løsning('Tømmermænd'):- positiv('Patienten har hovedpine'), negativ('Patienten har feber'), positiv('Patienten har kvalme').
Hele programeksemplet kan downloades her.