%consult('/Users/anasofiaquintas/Desktop/tentativa').
%--------------------------------- - - - - - - - - - -  -  -  -  -   -
% PROG. LOGICA, CONHECIMENTO E RACIOCINIO - MIEB/4

%--------------------------------- - - - - - - - - - -  -  -  -  -   -
% TRABALHO PRçTICO N¼2

%--------------------------------- - - - - - - - - - -  -  -  -  -   -
% 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
% ACRESCENTAR DINAMICS

:- op( 900,xfy,'::' ).
:- dynamic '-'/1.
:- dynamic compra/3.
:- dynamic diagnostico/2.
:- dynamic medicamento/2.
:- dynamic pagamento/2.
:- dynamic precario/5.
:- dynamic compra/5.
:- dynamic pagamento/3.
:- dynamic internamento/2.
:- dynamic analise/5.
%--------------------------------- - - - - - - - - - -  -  -  -  -   -
%--------------------------------- - - - - - - - - - -  -  -  -  -   -
% BASE DE CONHECIMENTO
%--------------------------------- - - - - - - - - - -  -  -  -  -   -
%--------------------------------- - - - - - - - - - -  -  -  -  -   -

% Sintoma ---> sintoma,doena

sintoma( dordecabeca,gripe ).
sintoma( dordecabeca,ebola ).
sintoma( dordecabeca,legionela ).
sintoma( febre,gripe ).
sintoma( febre,ebola ).
sintoma( vomitos,ebola ).
sintoma( tosse,gripe ).
sintoma( sangramento,ebola ).
sintoma( fatiga,legionela ).
-sintoma( sangramento,gripe ).




%--------------------------------- - - - - - - - - - -  -  -  -  -   -
% Tratamento ---->medicamento,doena

tratamento( antigripine,gripe ).
tratamento( brufen,gripe ).
tratamento( benuron,gripe ).
-tratamento( antigripine,ebola ).

% Valor nulo tipo I - desconhecido

tratamento( desconhecido,ebola ).
tratamento( desconhecido,legionela ).


%--------------------------------- - - - - - - - - - -  -  -  -  -   -
% Medicamento: nome,tipoAdministraao,pvr (Preo de Venda Recomendado)

medicamento( antigripine,comprimidos,2.5 ).
medicamento( aspirina,comprimidos,2.5 ).
medicamento( aspirina,comprimidosEfervescentes,2.5 ).
medicamento( brufen,xarope,3 ).
medicamento( brufen,comprimidos,2.5 ).
medicamento( benuron,xarope,2 ).
medicamento( benuron,comprimidos,1.5 ).
medicamento( benuron,supositorio,3 ).
medicamento( rennie, pastilhas,3.5 ).
medicamento( omeprazol, comprimidos,6.5).
medicamento( bronxol, xarope,4).
medicamento( voltaren, comprimido,2.5).
medicamento( voltaren, pomada,3 ).


% NOTA: N‹o se admitir‡ mais que um pvr por medicamento na rela‹o medicamento/2.
% Um medicamento apenas pode ter um PVR
% Invariante de inserao

+medicamento( M,Pvr ) :: (solucoes(
(Pvr), (medicamento(M,Pvr)), S ),
comprimento( S,N ),
N =< 1).

%--------------------------------- - - - - - - - - - -  -  -  -  -   -
% Farm‡cia: Nome,Rua,Tipo

farmacia( hospitalar,rua_x,hospital ).
farmacia( antunes,rua_y,local ).

%--------------------------------- - - - - - - - - - -  -  -  -  -   -
% Pre‡rio: farmacia, medicamento, tipoAdministraao, preoRecomendado, preoPublico, preoEspecial
% NOTA: N‹o existe preprecario( hospitalar, aspirina, comprimidos , 2, 3, 2.5 ).o de regime especial para o medicamento benuron
% Trata-se de um valor nulo do tipo Desconhecido e n‹o permitido (Tipo III): bloqueado

precario( hospitalar, antigripine, comprimidos, 2.5, 3.5, 3 ).
precario( hospitalar, aspirina, comprimidos , 2.5, 3, 2 ).
precario( hospitalar, aspirina, comprimidosEfervercentes , 2.5, 3, 2 ).
precario( hospitalar, brufen, comprimidos,2.5, 3.5, 3 ).
precario( hospitalar, brufen, xarope,3, 3.5, 3 ).
precario( hospitalar, benuron, comprimidos ,1.5, 2.5, bloqueado ).
precario( hospitalar, benuron, xarope ,2, 2.5, bloqueado ).
precario( hospitalar, benuron, supositorio ,3, 2.5, bloqueado ).
precario( hospitalar,rennie, pastilhas,3.5,4,3.7 ).
precario( hospitalar,omeprazol, comprimidos,6.5, 8, 7).
precario( hospitalar,bronxol, xarope,4, 4.5, 4.2).
precario( hospitalar,voltaren, comprimido,2.5, 3.5, 3).
precario( hospitalar,voltaren, pomada,3, 4.5, 4 ).

precario( antunes, antigripine, 2.5, 4, 3.5 ).
precario( antunes, aspirina, 2, 3.5, 3 ).
precario( antunes, brufen, 2.5, 4, 3.5 ).
precario( antunes, benuron, 1.5, 3, bloqueado ).
precario( hospitalar, benuron, xarope ,2, 2.5, bloqueado ).
precario( hospitalar, benuron, supositorio ,3, 2.5, bloqueado ).
precario( hospitalar,voltaren, pomada,3, 4, 3.5 ).

% Como n‹o se pretende, nunca, que a base de conhecimento tenha acesso ao valor bloqueado
% Criou-se o predicado nulo, com um s— argumento.

nulo( bloqueado ).

%Como se pretende que nunca seja conhecido o valor do preoEspecial do benuron cria-se um invariante:

+precario( F,M,PR,PP,PE ) :: (solucoes(PE,
(precario( F,benuron,PR,PP,PE ), nao(nulo(PE)) ), S),
comprimento( S,N ),
N ==0 ).

%Na mesma farm‡cia cada medicamento (e seus preos) apenas pode estar tabelado uma vez.
%Invariante

+precario( F,M,_,_,_ ) :: (solucoes(( F,M ),
(precario( F,M,_,_,_ )), S ),
comprimento( S,N ),
N == 1 ).

%O preo especial de cada medicamento tem que ser maior que o preo recomendado mas menor que o preo pœblico
%Invariante

+precario( _,_,PR,PP,PE ) :: ( PE > PR, PP > PE ).

%--------------------------------- - - - - - - - - - -  -  -  -  -   -
%--------------------------------- - - - - - - - - - -  -  -  -  -   -
% Representa‹o de Conhecimento Negativo
%--------------------------------- - - - - - - - - - -  -  -  -  -   -
%--------------------------------- - - - - - - - - - -  -  -  -  -   -

-sintoma( S,D ) :-
nao( sintoma( S,D )),
nao( excepcao( sintoma(S,D) )).

-tratamento( M,D ) :-
nao( tratamento( M,D )),
nao( excepcao(tratamento(M,D))).

-medicamento( Nome,Pvr ) :-
nao( medicamento( Nome,Pvr )),
nao( excepcao(medicamento(Nome,Pvr))).

-farmacia( Nome,Rua,Tipo ) :-
nao( farmacia( Nome,Rua,Tipo )),
nao( excepcao(farmacia( Nome,Rua,Tipo ))).

-precario( Farmacia,Medicamento,PR,PP,PE ) :-
nao( precario( Farmacia,Medicamento,PR,PP,PE )),
nao( excepcao(precario( Farmacia,Medicamento,PR,PP,PE ))).

-diagnostico( Paciente,Doenca ) :-
nao( diagnostico( Paciente,Doenca )),
nao( excepcao( diagnostico( Paciente,Doenca ))).

-receita( Paciente,Lista ) :-
nao( receita( Paciente,Lista )),
nao( excepcao( receita( Paciente,Lista ))).

-compra( Medicamento,Quantidade,Classificacao ) :-
nao( compra( Medicamento,Quantidade,Classificacao )),
nao( excepcao( compra( Medicamento,Quantidade,Classificacao ))).

-pagamento( Farmacia,Listademedicamentos,Total ) :-
nao( pagamento( Farmacia,Listademedicamentos,Total )),
nao( excepcao( pagamento( Farmacia,Listademedicamentos,Total ))).

-internamento(Paciente,Local) :-
nao(internamento(Paciente,Local)),
nao(excepcao(internamento(Paciente,Local))).

-analise(Paciente,C,VMINR,VMA, VO) :-
nao(analise(Paciente,C, VMINR,VMA, VO)),
nao(excepcao(analise(Paciente,C, VMINR,VMA, VO))).

-horario_farmacia(Nome,H:M,Tipo,Estado):-
nao(horario_farmacia(Nome,H:M,Tipo,Estado)),
nao(horario_farmacia(horario_farmacia(Nome,H:M,Tipo,Estado))).



%--------------------------------- - - - - - - - - - -  -  -  -  -   -
%--------------------------------- - - - - - - - - - -  -  -  -  -   -
% Valores nulos - Representa‹o de Excep›es
%--------------------------------- - - - - - - - - - -  -  -  -  -   -
%--------------------------------- - - - - - - - - - -  -  -  -  -   -

excepcao( tratamento( M,D )) :- tratamento( desconhecido,D ).

excepcao( precario( F,M,PR,PP,PE )) :- precario( F,M,PR,PP,bloqueado ).

excepcao(analise(Paciente,C,VMINR,VMA, VO)):-analise(Paciente,C,VMINR,VMA, desconhecimento).



%--------------------------------- - - - - - - - - - -  -  -  -  -   -
%--------------------------------- - - - - - - - - - -  -  -  -  -   -
% SISTEMA DE INFERæNCIA
%--------------------------------- - - - - - - - - - -  -  -  -  -   -

%--------------------------------- - - - - - - - - - -  -  -  -  -   -
%Nega‹o por falha na prova
%Extens‹o do meta-predicado nao

nao( X ) :- X,!,fail.
nao( X ).

%--------------------------------- - - - - - - - - - -  -  -  -  -   -
% Extensao do meta-predicado demo: Questao,Resposta -> {V,F}

demo( Questao,verdadeiro ) :-
Questao.
demo( Questao,falso ) :-
-Questao.
demo( Questao,desconhecido ) :-
nao( Questao ),
nao( -Questao ).

%--------------------------------- - - - - - - - - - -  -  -  -  -   -
% Extens‹o do predicado solu›es: X,Y,Z -> {V,F}

solucoes( X,Y,Z ) :-
findall( X,Y,Z ).

%--------------------------------- - - - - - - - - - -  -  -  -  -   -
% Extens‹o do predicado comprimento: S,N -> {V,F}

comprimento( S,N ) :-
length( S,N ).


%--------------------------------- - - - - - - - - - -  -  -  -  -   -
%--------------------------------- - - - - - - - - - -  -  -  -  -   -
% Evolu‹o de Conhecimento
%--------------------------------- - - - - - - - - - -  -  -  -  -   -
%--------------------------------- - - - - - - - - - -  -  -  -  -   -

% Extens‹o do predicado que permite a evolucao do conhecimento
% evolucao: Termo -> {V,F}

evolucao( Termo ) :-
solucoes( Invariante,+Termo::Invariante,Lista ),
insercao( Termo ),
teste( Lista ).

%--------------------------------- - - - - - - - - - -  -  -  -  -   -
% Extens‹o do predicado insercao: Termo -> {V,F}

insercao( Termo ) :- assert( Termo ).
insercao( Termo ) :- retract( Termo ),!,fail.

%--------------------------------- - - - - - - - - - -  -  -  -  -   -
% Extens‹o do predicado remover: Termo -> {V,F}

remover(Termo) :- retract(Termo).
remover(Termo) :- assert(Termo), !, fail.

%--------------------------------- - - - - - - - - - -  -  -  -  -   -
% Extens‹o do predicado remo‹o: Termo -> {V,F}

remocao(Termo) :-
Termo,
solucoes( Invariante, -Termo::Invariante, Lista ),
remover( Termo ),
teste( Lista ).

%--------------------------------- - - - - - - - - - -  -  -  -  -   -
% Extens‹o do predicado teste: H,T -> {V,F}
% H - Cabea da lista
% T - Cauda da lista

teste( [] ).
teste( [H|T] ) :-
H,
teste( T ).


%--------------------------------- - - - - - - - - - -  -  -  -  -   -
%--------------------------------- - - - - - - - - - -  -  -  -  -   -
% PREDICADOS PARA O PROBLEMA REAL: Qual a doena do JosŽ?
%--------------------------------- - - - - - - - - - -  -  -  -  -   -
%--------------------------------- - - - - - - - - - -  -  -  -  -   -

%--------------------------------- - - - - - - - - - -  -  -  -  -   -
% I: O JosŽ foi ao hospital com os sintomas dor de cabea e febre.
%doente(sintoma).??-demasiado simples? N‹o? ass: Quintas Linda

jose(dordecabeca).
jose(febre).


%--------------------------------- - - - - - - - - - -  -  -  -  -   -
% II: O Dr. Faria n‹o sabe se o JosŽ tem Žbola, legionela ou gripe.
% Como o JosŽ pode ter uma das trs doenas trata-se de um valor nulo tipo II.

%Predicado diagn—stico
%P - Paciente
%D - Diagnostico

%diagnostico( P,D ).

excepcao(diagnostico(jose,ebola)).
excepcao(diagnostico(jose,legionela)).
excepcao(diagnostico(jose,gripe)).

%--------------------------------- - - - - - - - - - -  -  -  -  -   -
% III: A Enfermeira Ana procura quarto para internar o JosŽ. Pode ser na Enfermaria 1/2 ou nos cuidados intensivos.
%internamento(Doente, Enfermaria).

excepcao(internamento(jose, enfermaria1)).
excepcao(internamento(jose,enfermaria2)).
excepcao(internamento(jose,cuidadosintensivos)).



%apesar das trs possibilidades de internamento o josŽ apenas pode ser internado num unico local.
%--------------------------------- - - - - - - - - - -  -  -  -  -   -
% IV: O Dr. Faria sugeriu que o JosŽ fizesse an‡lises.
%analise(Paciente,Componente, ValorReferencia, ValorObtido)
% No laborat—rio, houve um problema tecnico e os muito dos resultados imprecisos
% Sabe-se que os valores de referencia s‹o sempre conhecidos e os Valores Obtidos caracteristicos de cada analises
% Foram pedidas analises gerais, que abrangiam resultados de Leucocitos, Neutrofilos, e Colestrol, glicemia, TSH, Plaquetas, Eritrograma
%O laborat—rio, depois do problema tecnico, apenas conseguiu distinguir claramente os valores alterados dos valores normais, e soube-se imediatamente, que algo se passava com os valores obtidos para os Leucocitos, Neutrofilos, e Colestrol e de TSH, e que os restantes estariam dentro dos parametros considerados normais.


% os leucocitos estao a baixo do valor normal
excepcao(analise(jose,leucocitos,VMINR,20,VO)):- VO<VMINR,VMINR=10  .

%relativamente ˆs analises Neutrofilos, sabe-se que est‹o dentro dos resultados normais.

excepcao(analise(jose,neutrofilos, VMINR,VMA, VO)):- VO<VMA,VMA=30 , VO>VMINR, VMINR=20.


%relativamente ˆs analises de colestrol n‹o se sabe se o resultado foi 25 ou 250.

excepcao(analise(jose, colestrol,_,_,25)).
excepcao(analise(jose, colestrol,_,_,250)).

% Relativamente aos resultados de TSH nunca se chegou a efectuar as analises, pelo que nunca se poder‡ vir a saber quais os resultados para esta analise


analise(jose, tsh,40,80,interdito).
excepcao(analise(Paciente,C, VMINR,VMA, VO)):-analise(Paciente,C, VMINR,VMA, interdito).
nulo(interdito).
+analise(Paciente,C, VMINR,VMA, VO)::solucoes(X,(analise(jose, tsh,40,80,X),nao(nulo(X))),[]).



% relativamente aos resultados de plaquetas nao se sabe qual o resultado das analises
excepcao(analise(Paciente,C,VMINR,VMA, VO)):-analise(Paciente,C,VMINR,VMA, desconhecimento).
analise(jose, plaquetas,VMINR,VMA, desconhecimento).



% Os resultados de Eritrograma deu 300.

analise(jose,plaquetas,_,_,300).



% V: O Dr. Faria descobre a doena que o JosŽ tem

%evolu‹o do conhecimento--- remo‹o





%--------------------------------- - - - - - - - - - -  -  -  -  -   -
% VI: O mŽdico precreveu medicaao ao JosŽ. Este saiu do hospital e foi diretamente a %farmacia, j‡ passava da meia noite.

% Base de conhecimento: hor‡rios das farm‡cias
% horario_farmacia: Nome_farmacia, Horas, Regime, Estado

-horario_farmacia(hospitalar,H:M,normal,aberto):- H>=20, H <=24, M>=00, M <60.
horario_farmacia( hospitalar,H:M ,normal,aberto):- H>=9, H <20, M>=00, M <60.
horario_farmacia( hospitalar,H:M,normal,invalido):- H>24.
horario_farmacia( hospitalar, H:M,normal, invalido):- M >=60.

horario_farmacia( antunes, H:M,especial ,aberto):- H>=00, H <=24, M>=00, M <60.
horario_farmacia( antunes, H:M,especial,invalido):- H>24.
horario_farmacia( antunes, H:M, especial,invalido):- M >=60.



%--------------------------------- - - - - - - - - - -  -  -  -  -   -
% VII: Na farm‡cia o JosŽ vai comprar os medicamentos receitados e aproveita para comprar uma caixa de aspirinas (compra livre).
% compra: F,M,Q,C,P ---> {V,F}
% onde:
% F - Farm‡cia onde Ž efetuada a compra
% M - Medicamento
% Q - Quantidade - Tem que ser um valor inteiro
% C - Classifica‹o: pode ser livre/receitado
% P - Preo
% NOTA: O JosŽ n‹o Ž de escal‹o especial
% NOTA: O JosŽ efetua a compra na farm‡cia antunes. Era a que estava a aberta.

compra( antunes,aspirina,1,livre,3.5 ).
compra( antunes,benuron,1,receitado,3 ).
compra( antunes,brufen,1,receitado,4 ).

compra( F,M,Q,livre,P ) :-
farmacia( F,_,_ ),
medicamento( M,_ ),
receita( L ),
inteiro( Q ),
nao( pertence( M,L )),
precario( F,M,_,P1,_ ),
P is P1 * Q.


%NOTA: Utiliza‹o da nega‹o forte para garantir que a base de conhecimento Ž consultada.
%Ou seja, n‹o haver‡ mesmo receita de um medicamento livre. ?
%DòVIDA

compra( F,M,Q,receitado,P ) :-
farmacia( F,_,_ ),
medicamento( M,_ ),
receita( L ),
inteiro( Q ),
pertence( M,L ),
precario( F,M,_,P1,_ ),
P is P1 * Q.

%Nota: O paciente s— pode usar a receita uma vez. Esta perde a "validade" ap—s a compra.
%Assim n‹o se admitir‡ a existncia de mais do que uma ocorrncia da mesma evidncia na rela‹o compra/3
%--------Invariante Estrutural-----------

+compra( F,M,Q,receitado,P ) :: ( solucoes( (M,Q),(compra( _,M,Q,receitado,_ )),S ),
comprimento( S,N ), N==1 ).

%predicado auxiliar: receita

% P - Nome do paciente a quem s‹o receitados os medicamentos
% L - Lista de medicamentos receitados

receita( P,L ) :-
diagnostico( _,D ),
solucoes( M,(tratamento( M,D )),L ).

%--------------------------------- - - - - - - - - - -  -  -  -  -   -
%VIII - ƒ necess‡rio que o JosŽ efetue o pagamento da compra na farm‡cia
% NOTA: O JosŽ n‹o Ž de escal‹o especial
% O total do pagamento Ž a soma dos preos dos produtos comprados pelo JosŽ
% F - Farm‡cia
% L - Lista de medicamentos comprados

pagamento( F,L,Total ) :-
solucoes( M,(compra(F,M,_,_,_)),L ),
solucoes( P,(compra(F,_,_,_,P)),P1 ),
soma( P1,Total ).

%O pagamento para uma determinada lista de medicamentos apenas deve ser efetuado uma œnica vez!
%Invariante

+pagamento( F,L,T ) :: ( solucoes( (F,L,T ),(pagamento( F,L,T )), S ),
comprimento( S,N ), N==1 ).


%--------------------------------- - - - - - - - - - -  -  -  -  -   -
%--------------------------------- - - - - - - - - - -  -  -  -  -   -
%Predicados Auxiliares
%--------------------------------- - - - - - - - - - -  -  -  -  -   -
%--------------------------------- - - - - - - - - - -  -  -  -  -   -

%--------------------------------- - - - - - - - - - -  -  -  -  -   -
%predicado auxiliar: pertence

pertence(A,[A|T]).

pertence(A,[H|T]) :-
A \= H,
pertence(A,T).

%--------------------------------- - - - - - - - - - -  -  -  -  -   -
%predicado auxiliar: inteiro: I --> {V,F,D}

inteiro( 0 ).
inteiro( X ) :- natural( X ).
inteiro( X ) :- natural(-X ).


%--------------------------------- - - - - - - - - - -  -  -  -  -   -
%predicado auxilar: natural: N --> {V,F,D}

natural( X ) :-
X>=1.

-natural( X ) :- X=<0.

%--------------------------------- - - - - - - - - - -  -  -  -  -   -
%predicado auxiliar: soma dos elementos de uma lista

soma([],0).

soma([H|T],S):-
soma(T,R),
S is R + H.