Enunciado

Propaganda
Proje ct o de Ló gi ca pa ra P rog ra ma çã o
LEIC
2007-200 8
Siste m a de Di ag nósti co Médi co
1.
Intr oduçã o
O que faz um médico num processo de diagnóstico? Observa os sintomas apresentados pelo
paciente, serve-se dos seus conhecimentos e, com base na informação de que dispõe, raciocina
e apresenta o diagnóstico. Caso o médico conheça o (historial do) paciente, essa informação
pode ainda ser usada no processo de diagnóstico. Ora, um diagnóstico médico pode ser visto
como a apresentação de um conjunto de hipóteses de doenças, umas com maior probabilidade
do que outras, calculadas em função da informação disponível. O que se propõe neste projecto é
a criação de um sistema (em Prolog) que simule diagnósticos médicos.
O projecto divide-se em duas partes: numa PRIM EIRA ETAP A os alunos deverão IMP LEM ENT AR
um sistema de diagnóstico médico, respeitando os requisitos apresentados no enunciado do
projecto, tais como o formato das bases de conhecimento e fórmulas usadas no cálculo das
probabilidades; numa SEGUND A ET AP A, os alunos deverão ESCR EVER UM RE LA TÓRIO em
que descrevem como implementariam um conjunto de extensões ao sistema de diagnóstico
médico da primeira etapa.
2.
Implementação do sistema de diagnóstico médico básico (PRIMEIRA ETAPA)
2.1
Descrição do problema, estruturas de dados e fórmulas a usar
Pode-se modelar a estrutura global de um sistema de diagnósticos através do esquema que se
segue:
2.1.1
−
Base de conhecimento contendo os sintomas do paciente;
−
Base de conhecimento contendo os conhecimentos médicos;
−
Motor de inferência que permite raciocinar com a informação disponível.
Base de conhecimento contendo os sintomas do paciente
Esta base de dados contém os sintomas que o paciente apresenta, podendo esta informação ser
representada na seguinte forma (doravante clá us ul a-p aciente):
apresenta(N UM, SIN TO MA )
% em que:
% a) NUM é o número que identifica univocamente o paciente ;
% b) SIN TO MA é o nome do sintoma.
1
Exem plo:
Se o nariz a pingar é um dos sintomas apresentados pelo paciente 4, cria-se a cláusula:
apresent a(4, ‘n ariz a pi ngar’).
2.1.2
Base de conhecimento contendo os conhecimentos médicos
Nesta base de conhecimento encontra-se o conhecimento médico, i.e., a informação sobre cada
doença e os respectivos sintomas.
A informação sobre cada doença pode ser apenas o nome da doença e uma lista de sintomas
associados:
doenca(DOENC A, L IST A_ SINT O MA S).
% em que:
% a) DOENCA é o nome da doen ça;
% b) LIS TA _S INT OM AS é a lista dos sintomas da doe nça.
Exemplo:
Se o nariz a pingar e a febre forem os sintomas da gripe, cria-se a cláusula:
doenca(gri pe,[‘nariz a pingar’, ’febre ’]).
Infelizmente, esta representação não é suficientemente expressiva para representar a probabilidade
associada a uma doença (há doenças mais raras que outras), nem as probabilidades associadas
a cada sintoma de uma doença (há sintomas específicos de certas doenças; há sintomas que se
manifestam em várias doenças), sendo este tipo de informação fundamental na construção do
diagnóstico. Considerem-se então as seguintes probabilidades1 :
−
Probabilidade inicial de uma doença (PI): probabilidade de um paciente, antes de ter sido
observado, ter a doença. Por exemplo, em 100 pessoas que adoecem, 10 têm gripe.
Então a probabilidade inicial de se ter gripe é 10%.
−
Probabilidade de um sintoma ser observado em alguém com a doença (PT): alguns
sintomas são muito mais significativos numa doença que outros. Assim, a probabilidade
PT, associada a cada sintoma de uma doença, representa a probabilidade do sintoma ser
observado em alguém com essa doença (quanto maior for este valor, maior é a
probabilidade de uma pessoa que tenha essa doença ter esse sintoma). Por exemplo, a
mancha de Koplic (ponto branco na saída da glândula salivar) é um indicador fortíssimo,
para não dizer absoluto, do sarampo: quem apanha sarampo tem uma mancha de Koplic.
Por exemplo, se observando 100 pessoas com sarampo, 100 têm a mancha de Koplic,
então a probabilidade de esse sintoma ser observado em alguém com a doença é de
100%. Se em 100 pessoas com sarampo, 70 tiverem febre, a probabilidade de alguém
1
As probabilidades apresentadas em todo este enunciado não têm nenhum suporte científico.
2
com sarampo ter febre é de 70%. Note-se que esta probabilidade é diferente da
probabilidade de uma pessoa com febre ter sarampo (o que nos leva à probabilidade
seguinte).
−
Probabilidade de um paciente ter os sintomas de uma doença e não ter essa doença
(PN): um sintoma que seja comum a várias doenças ajuda menos no diagnóstico do que
um que seja característico de uma doença em particular. Por outras palavras, há certos
sintomas, que o facto de um paciente os apresentar, não quer dizer que tenha a doença,
apesar de serem sintomas da doença. Por exemplo, a febre é um sintoma do sarampo,
mas uma pessoa que tenha febre não tem necessariamente sarampo. Por exemplo, se em
100 pessoas com febre, 2 tiverem sarampo, pode-se concluir que 2% das pessoas que
têm febre têm sarampo (ou seja, que 98% das pessoas que têm febre, não têm
sarampo). Note-se que não permite concluir que 2% das pessoas que têm sarampo têm
febre (isso é determinado pela probabilidade anterior).
Cada doença pode então representar-se através de cláusulas na seguinte forma (doravante
cláu su la-doe nça):
doenca(DOENC A, PI, [sintoma(SINT O MA 1 , P T 1 , PN 1 ),
...,
sintoma(SINT O MA n , PT n , PN n )])
% em que
% a) DOENCA é o nome da doen ça;
% b) P I é a probabilidade inicial da doença;
% c ) SINT OM A i é o nome do sintoma i;
% d) P T i é a probabilidade do sintoma i ser observado em alguém com a do ença;
% e ) PN i é a probabilidade de um sintoma i s er obse rvado em alguém sem a doença.
Exem plo:
A seguinte cl áu su la-doe nça:
doenca(s ara m po, 2, [si ntom a('m anch as verme lha s', 95, 60),
sintom a(‘febre ’, 90, 98),
sintom a('m anch a de Koplic', 100, 3)]).
indica que:
− 2% dos doentes têm sarampo;
− 95% das pessoas que têm sarampo têm manchas vermelhas;
− 60% das pessoas que têm manchas vermelhas não têm sarampo;
− 90% das pessoas que têm sarampo têm febre;
− 98% das pessoas que têm febre não têm sarampo;
− 100% das pessoas que têm sarampo têm a mancha de Koplic (repare-se que com esta
informação pode-se concluir que uma pessoa que não tenha essa mancha, não tem sarampo,
mas não que uma pessoa que tenha essa mancha tem sarampo);
− 3% das pessoas que têm a mancha de Koplic não têm sarampo.
3
2.1.3
Motor de inferência que permite raciocinar com a informação anterior
Com base nos sintomas apresentados pelo paciente, o processo de diagnóstico pode ser feito do
seguinte modo, analisando uma doença de cada vez:
−
começa-se com a probabilidade inicial PI da doença,
−
para cada sintoma, vai-se actualizando a probabilidade de se ter essa doença, tendo em
conta as probabilidades PT e PN do sintoma e o facto do doente os apresentar ou não.
No final, a doença com maior probabilidade é a doença diagnosticada pelo médico.
−
A actualização de probabilidades pode ser feita recorrendo ao teorema de Bayes, que permite
calcular uma nova probabilidade, dada uma probabilidade anterior e uma nova evidência (neste
caso, cada novo sintoma). Assim, a probabilidade de um paciente ter uma dada doença pode ser
calculada com base nas fórmulas (1) e (2), que devem ser aplicadas sempre que se analisa um
dado sintoma da doença em estudo, respectivamente nos casos em que o paciente apresenta o
sintoma ou não o apresenta (ou seja, a fórmula (1) deve ser aplicada caso o paciente apresente
o sintoma em análise; a fórmula (2) caso não apresente). Note-se que p representa a
probabilidade anteriormente calculada.
(1)
P’ =
PT " p
"100
PT " p + PN(100 # p)
(2)
p’ =
(100 " PT) # p
#100
(100 " PT) # p + (100 " PN)(100 " p)
!
2.2
2.2.1
Detalhes da implementação
!
Ferramenta
Vai ser usado o swi-prolog (ferramenta com a qual vai ser avaliado o projecto). Informação sobre
o swi-prolog pode ser consultada em http:/www.swi-prolog.org/, onde se podem também obter as
ferramentas para as várias plataformas.
2.2.2
Regra a implementar e formato dos resultados
Os alunos terão de implementar uma regra cuja cabeça seja “diagnostica”. Esta regra deverá ser
implementada no ficheiro motorDiagnostico.pl e será através dela que serão calculadas (de
acordo com as fórmulas dadas) as probabilidades associadas a cada doença (dados os sintomas
de cada paciente), bem como o diagnóstico.
Note que:
o
O código a entregar deve estar ÚNICA e EXCLUSIVAMENTE no ficheiro motorDiagnostico.pl;
o
O ficheiro motorDiagnostico.pl não deve carregar a BDMedica.pl e a BDPacientes.pl.
4
Em relação ao formato de saída, este deverá ser o seguinte:
nu m: NUM1
d: DOENÇA1 p: P11
...
d: DOENÇAn p: P1n
diag nostico -> d: DOENCAi p : P1i
...
nu m: NUMm
d: DOENÇA1 p: Pm1
...
d: DOENÇAn p: Pmn
diag nostico -> d: DOENCAj p : Pmj
Em que:
o
NUMi é o número do paciente i;
o
DOENÇAi é o nome da doença i;
o
Pij é a probabilidade de o doente i ter a doença j.
Note que:
a)
Os pacientes devem aparecer por ordem numérica crescente;
b)
As doenças devem aparecer por ordem alfabética crescente;
c)
A seguir a “nu m”, “d” e “p” segue-se IMEDIATAMENTE o símbolo “:” e um espaço;
d)
A seguir à palavra “diagnostico” segue-se um espaço, os símbolos “–“ e “>” e um
espaço;
e)
2.2.3
Entre o nome de cada doença e “p ” existe um espaço.
Como testar o programa
Supondo que a cláusula “diagnostica” está definida em motorDiagnostico.pl e que está igualmente
definido o ficheiro teste.pl com o seguinte conteúdo:
start :- carregaD ados , di agnostic a.
carregaDado s :- ['BDMedica. pl' ], ['BDPacie ntes.pl' ], ['motorDiag nostico.pl' ].
A seguinte linha de comando2:
swipl -s teste.pl -g start -t halt
> resultados.txt
permitirá guardar os resultados do programa no ficheiro resultados.txt.
2
A chamada ao Prolog varia nas diferentes plataformas (por exemplo, para windows deve usar-se
plcon.exe, em linux pl e em Mac (ppc) deve usar-se /opt/local/bin/swipl).
5
Exemplo:
Considerando BDMedica.pl
doenca('sarampo', 17, [sintoma('mancha de koplic', 100, 20)]).
doenca('cataratas', 8, [sintoma('turvacao da imagem', 81, 78), sintoma('cores esbatidas', 85, 70),
sintoma('diplopia', 76, 67), sintoma('distorcao dos objectos', 98, 69), sintoma('aumento de sensibilidade a luz',
50, 80), sintoma('aparecimento de aureolas em redor das luzes', 65, 60)]).
doenca('cirrose', 21, [sintoma('ictericia', 97, 54), sintoma('fadiga', 89, 80), sintoma('fraqueza', 90, 81),
sintoma('perda de apetite', 89, 91), sintoma('ascite', 99, 40), sintoma('emagrecimento', 89, 88), sintoma('nauseas
e vomitos', 95, 83), sintoma('edema', 98, 97), sintoma('facilidade de sangrar e ficar com equimoses', 87, 85)]).
doenca(diabetes, 12, [sintoma('polaquiuria', 77, 40), sintoma('sede intensa', 85,55), sintoma('fadiga', 95, 98),
sintoma('fome', 95, 89), sintoma('dificuldades de visao', 98, 78)]).
doenca('enxaquecas', 17, [sintoma('dor pulsante num dos lados da cabeca', 96, 55), sintoma('enjoos', 97,70),
sintoma('vomitos', 89, 90)]).
doenca(artrite, 10, [sintoma('dor em partes do corpo', 79, 5), sintoma('rigidez matinal', 98, 90), sintoma('limitaco
de movimento em partes do corpo', 74, 70)]).
e BDPacientes.pl
apresenta(45, 'mancha de koplic').
apresenta(5, 'polaquiuria').
apresenta(5, 'sede intensa').
apresenta(5, 'fadiga').
apresenta(5, 'dificuldades de visao').
apresenta(2, 'febre').
apresenta(2, 'nariz a pingar').
apresenta(6, 'fadiga').
apresenta(6, 'ictericia').
apresenta(6, 'ascite').
Deverá ser obtido o seguinte ficheiro resultados,txt:
num: 2
d: artrite p: 0.423926
d: cataratas p: 0.383925
d: cirrose p: 0.00159239
d: diabetes p: 0.179679
d: enxaquecas p: 0.199867
d: sarampo p: 0
diagnostico -> d: artrite p: 0.423926
num: 5
d: artrite p: 0.423926
d: cataratas p: 0.383925
d: cirrose p: 0.00322092
d: diabetes p: 18.3401
d: enxaquecas p: 0.199867
d: sarampo p: 0
diagnostico -> d: diabetes p: 18.3401
num: 6
d: artrite p: 0.423926
d: cataratas p: 0.383925
d: cirrose p: 11.6409
d: diabetes p: 0.0697482
d: enxaquecas p: 0.199867
d: sarampo p: 0
diagnostico -> d: cirrose p: 11.6409
num: 45
d: artrite p: 0.423926
d: cataratas p: 0.383925
d: cirrose p: 0.00159239
d: diabetes p: 0.179679
d: enxaquecas p: 0.199867
d: sarampo p: 50.5952
diagnostico -> d: sarampo p: 50.5952
6
3.
Extensões ao sistema de diagnóstico médico (SEGUNDA ETAPA)
3.1
Descrição do problema
3.1.1
Inclusão de dados relativos ao paciente no processo de diagnóstico
Como foi dito anteriormente, dados sobre o (historial do) paciente podem (e devem) ser tidos em
conta no processo de diagnóstico. Ou seja, doenças anteriores de que o paciente tenha padecido
poderão servir para aumentar ou diminuir a probabilidade de certas doenças. Por outro lado,
certos dados do paciente podem igualmente interferir no processo de diagnóstico, tais como a
idade do paciente (uma criança tem praticamente probabilidade zero de ter Alzheimer), o seu
sexo (há mais mulheres com cancro de mama do que homens) ou o local onde vive ou viveu (a
doença de Chagas é uma doença endémica da América Latina).
Em conclusão, nesta fase deverá ser explicado como estender o sistema de diagnóstico médico
desenvolvido na primeira parte do projecto, de modo a que o novo sistema inclua no processo
de diagnóstico: o historial de doenças do paciente, a sua idade, sexo e local onde vive(u).
3.1.2
Afinação das probabilidades iniciais de cada doença
A probabilidade inicial (PI) de uma doença pode alterar-se ao longo do tempo (por exemplo,
actualmente existem vacinas contra algumas formas de meningite, tornando-as menos frequentes
do que há 20 anos).
Supondo que tinha acesso aos registos de um hospital relativos a informação sobre as doenças
e sintomas apresentados pelos pacientes, explique em Português como poderia ser feita a
actualização à probabilidade inicial de cada doença com base no Prolog (note que NÃO TEM DE
IMPLEMENTAR).
3.2
Resultados Esperados: Relatório
Relatório com um máximo de 20 000 caracteres (incluindo espaços) contendo:
4.
4.1
−
estruturas de dados propostas;
−
regras propostas;
−
fórmulas usadas (caso sejam diferentes das fórmulas dadas no enunciado);
−
motivação/explicação para as decisões tomadas.
Informações importantes
Grupos
Serão aceites grupos de 2 alunos
trabalhadores-estudante que o desejarem.
e,
excepcionalmente,
grupos
de
1
para
os
7
4.2
Avaliação
Cotação (sobre 2 0 valor es)
-
PR IMEI R A
ETAP A
10 valores
-
Cotação (sobre 2 0 valor es)
SEGUNDA
ETAP A
10 valores
-
Avaliação
Avaliação Automática sobre duas bases de dados,
sendo uma delas a que é dada aos alunos (8
valores);
Qualidade do código (2 valores).
Avaliação
Será tida em conta a facilidade de extensão em
relação ao sistema existente e em relação a
possíveis
extensões
futuras,
a
originalidade,
viabilidade e eficácia da proposta;
Será igualmente tida em conta a qualidade do
relatório
em
relação
aos
seguintes
pontos:
organização, clareza e qualidade da escrita.
Notas:
Caso se detectem cópias os alunos terão 0 no projecto e não poderão fazer LP este semestre.
4.3
Processo de entrega
PR IMEI R A ET AP A + SEG UNDA ETA P A
Formato de entrega
-
-
Data de entrega
-
-
Modo de entr ega
-
NUM-GRUPO.zip (ex: 71.zip) que deverá
conter:
o
O ficheiro motorDiagnostico.pl;
o
O relatório em formato .pdf.
Papel:
o
O código de motorDiagnostico.pl;
o
O relatório contendo o número
e nome dos elementos do
grupo, bem como o número do
grupo na primeira página.
NUM-GRUPO.zip
o
Até às 23h 59 de 10 de
Dezembro de 2007
Papel
o
Até às 12h de 11 de Dezembro
de 2007
NUM-GRUPO.zip
o
Através do Fenix
Papel
o
Repografia do DEI (Alameda)
o
Secretariado do DEI (Tagus) das
10h-12h30 e 14h-16h
Penalização
(sobre 20 valores)
O desrespeito por qualquer
um destes formatos levará à
não avaliação do projecto.
- 2 valores se entregue até
24 horas de atraso;
- 4 valores se entregue até
48 horas de atraso;
Não
serão
aceites
projectos a partir das 48
horas de atraso.
O não cumprimento do
modo de entrega levará à
não avaliação do projecto.
8
Download