Prolog - Videnbaserede systemer

Oprettet 05. februar 2008
Rettet 11. februar 2008

Konsultationsparadigmet

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.

Den dynamiske database

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.