%--------------------------------- - - - - - - - - - -  -  -  -  -   -
% UNIVERSIDADE DO MINHO
% MESTRADO INTEGRADO EM ENGENHARIA BIOMEDICA
% PROG. LOGICA, CONHECIMENTO E RACIOCINIO
%%%%%%%%%%%%
% GRUPO 5
% TRABALHO PRATICO 3

%--------------------------------- - - - - - - - - - -  -  -  -  -   -
% SICStus PROLOG: Declaracoes iniciais

:- set_prolog_flag( discontiguous_warnings,off ).
:- set_prolog_flag( single_var_warnings,off ).
:- set_prolog_flag( unknown,fail ).

%--------------------------------- - - - - - - - - - -  -  -  -  -   -
% SICStus PROLOG: definicoes iniciais

:- op( 800,fx,se ).
:- op( 800,fx,facto ).
:- op( 800,fx,tratamento ).
:- op( 700,xfx,entao ).
:- op( 300,xfy,ou ).
:- op( 200,xfy,e ).
:- op( 900,xfy,:: ).
:- op( 400,xfx,com).
:- op( 400,xfx,com_grau).
:- op( 500,xfy,porque).
:- op( 500,fy,diagnostico).
:- op( 500,xfy,logo_tratamento).
:- op( 500,fy,ocorrencia).
:- op( 500,fy,factos).

:- dynamic facto/1.
:- dynamic '::'/2.

%--------------------------------- - - - - - - - - - -  -  -  -  -   -
% Construcao de Regras de Producao: se CONDICAO entao CONCLUSAO
% se FACTOS entao DIAGNOSTICO :: OCORRENCIA :: TRATAMENTO


se 'frequencia cardiaca lenta'
    entao 'bradicardia' :: 'certo' :: 'administracao de atropina'.

se 'frequencia cardiaca rapida'
   entao 'taquicardia' :: 'certo' :: 'dieta alimentar'.

se 'frequencia cardiaca rapida' e 'frequencia cardiaca irregular'
    entao 'arritmia' :: 'certo' :: 'cardioversao'.

se 'taquicardia' e 'consumo cafe'
    entao 'taquicardia paroxistica' :: 'provavel' :: 'tossir ou suspender respiracao um minuto'.

se 'taquicardia' e 'consumo alcool'
   entao 'taquicardia paroxistica' :: 'provavel' :: 'imergir cabeca agua fria'.

se 'emagrecimento' e 'diarreia' e 'flatulencia'
    entao 'dispepsia' :: 'algo provavel' :: 'gastroscopia'.

se 'diarreia' e 'flatulencia' e 'mau halito'
   entao 'dispepsia' :: 'muito provavel' :: 'saneamento bucal'.

se 'flatulencia' e 'ausencia de dor'
    entao 'anosmia' :: 'muito provavel' :: 'remocao polipos nasais'.


%--------------------------------- - - - - - - - - - -  -  -  -  -   -
% Extensao do meta-predicado inserir: FACTO -> { V,F }

inserir( S ) :-
	nao(facto S),
	asserta(facto S),
	write('sintoma inserido').
inserir( S ) :-
	write('sintoma ja existente').


%--------------------------------- - - - - - - - - - -  -  -  -  -   -
% Extensao do meta-predicado limpar -> { V,F }

limpar:-
	retractall(facto S),
	write('processo concluido').


%--------------------------------- - - - - - - - - - -  -  -  -  -   -
% Extensao do meta-predicado demo: DIAGNOSTICO -> { V,F }
% "Forward Chaining" 

exame( Q ) :-
    	(se C entao Q :: G :: T ),
    	composicao( C ),
    	insere( facto Q ), nl,
	write('causas associadas: '),	write(C), nl,
	write('grau de confianca de diagnostico: '),	write(G), nl,
	write('tratamento: '),		write(T).

composicao( CONDICAO ) :-
    facto CONDICAO.

composicao( QUESTAO1 e QUESTAO2):-
	composicao(QUESTAO1),
	composicao(QUESTAO2).

insere( facto FACTO ) :-
    nao( facto FACTO ),
    asserta( facto FACTO ).


%--------------------------------- - - - - - - - - - -  -  -  -  -   -
% Extensao do meta-predicado demo: DIAGNOSTICO, SIST APOIO DECISAO -> { V,F }
% Versao "Backward Chaining"
	
demo( Q,(Q com_grau G) ) :-
    facto( Q ),
	G='indefinido'.
	
demo( Q,(Q com_grau G porque Ec logo_tratamento T) ) :-
    ( se C entao Q ) :: G :: T,
    demo( C,Ec ).
	
demo( (C1 e C2),(E1 e E2) ) :-
    nonvar( C1 ), nonvar( C2 ),
    demo( C1,E1 ),
    demo( C2,E2 ).


%--------------------------------- - - - - - - - - - -  -  -  -  -   -
% Extensao do meta-predicado EXAMINAR -> { V,F }
% retorna uma lista com os sintomas do paciente e os possiveis diagnosticos

examinar:-
	findall(X,demo(X,Y),Lista),
	write(Lista).


%--------------------------------- - - - - - - - - - -  -  -  -  -   -
% Extensao do meta-predicado diagnostico: DIAGNOSTICO -> { V,F }
% Permite consultar a informacao relativa a um diagnostico

diagnostico( D ) :-
    	(se S entao D :: G :: T),
	write('sintomas associados: '), 		write(S), nl,
	write('grau de confianca de diagnostico: '),	write(G), nl,
	write('tratamento: '),		write(T).

diagnostico( D ) :-
	write('diagnostico nao existente').


%--------------------------------- - - - - - - - - - -  -  -  -  -   -
% Extensao do meta-predicado tratamento: TRATAMENTO -> { V,F }
% permite consultar a informacao relativa a um tratamento

tratamento( T ) :-
    	(se S entao D :: G :: T),
	write('diagnostico: '), 	write(D), nl,
	write('sintomas associados: '), 		write(S), nl,
	write('grau de confianca de diagnostico: '),	write(G).

tratamento( T ) :-
	write('tratamento nao existente').


%--------------------------------- - - - - - - - - - -  -  -  -  -   -
% Extensao do meta-predicado nao: QUESTAO -> { V,F }

nao( QUESTAO ) :-
	QUESTAO, !, fail.

nao( QUESTAO ).


%--------------------------------- - - - - - - - - - -  -  -  -  -   -
%--------------------------------- - - - - - - - - - -  -  -  -  -   -
