%consult('/Users/anasofiaquintas/Desktop/analise').
%--------------------------------- - - - - - - - - - -  -  -  -  -   -
%--------------------------------- - - - - - - - - - -  -  -  -  -   -
% 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 sintoma/2.
:- dynamic tratamento/2.
:- dynamic diagnostico/2.
:- dynamic medicamento/3.
:- dynamic pagamento/2.
:- dynamic precario/6.
:- 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,T,_ ) :: (solucoes(
(M,T), (medicamento(M,T,_)), 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

%pre‡rio: Farmacia, Medicamento, Tipo, PVR, PP, PE

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, comprimidos,2.5, 3.5, 3).
precario( hospitalar, voltaren, pomada,3, 4.5, 4 ).

precario( antunes, antigripine, comprimidos, 2.5, 4, 3.5 ).
precario( antunes, aspirina, comprimido, 2, 3.5, 3 ).
precario( antunes, brufen, comprimidos, 2.5, 4, 3.5 ).
precario( antunes, benuron, comprimidos, 1.5, 3, bloqueado ).
precario( antunes, benuron, xarope ,2, 2.5, bloqueado ).
precario( antunes, benuron, supositorios ,3, 2.5, bloqueado ).
precario( antunes, voltaren, pomada,3, 4, 3.5 ).

%Como se pretende que nunca seja conhecido o valor do preoEspecial do benuron cria-se um invariante:

+precario( F,M,TA,PR,PP,PE ) :: (solucoes(PE,
(precario( F,benuron,TA,PR,PP,PE ), nao(nulo(PE)) ), S),
comprimento( S,N ),
N ==0 ).

%Um medicamento s— pode estar no pre‡rio de uma farm‡cia se existir

+precario( F,M,TA,PR,PP,PE ) :: (medicamento(M,TA,PR)).


%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 ).


%--------------------------------- - - - - - - - - - -  -  -  -  -   -
%Predicado stock(NomeFarmacia,NomeMedicamento,Quantidade)

stock(antunes,antigripine, comprimidos,30).
stock(antunes,brufen,xarope,20).
stock(antunes,brufen,comprimidos,20).
stock(antunes,aspirina,comprimidosEfervescentes,bloqueado).
stock(antunes,aspirina,comprimidos,10).
stock(antunes,benuron,comprimidos,15).
stock(antunes,benuron,xarope,15).
stock(antunes,benuron,supositorio,15).
stock(antunes,voltaren,pomada,30).
stock(antunes,rennie,pastilhas,30).
stock(hospitalar,antigripine,comprimidos,25).
stock(hospitalar,brufen,comprimidos,40).
stock(hospitalar,aspirina,comprimidos,50).
stock(hospitalar,benuron,comprimidos,45).
stock(hospitalar,aspirina,compimidosEfervescentes,50).
stock(hospitalar,brufen,xarope,40).
stock(hospitalar,benuron,xarope,45).
stock(hospitalar,benuron,supositorio,20).
stock(hospitalar,rennie,pastilhas,25).
stock(hospitalar,omeprazol,comprimidos,35).
stock(hospitalar,bronxol,xarope,27).
stock(hospitalar,voltaren,comprimidos,35).
stock(hospitalar,voltaren,pomada,40).

%Perdeu-se a chave da gaveta das aspirinas efervescentes, na farm‡cia antunes, e n‹o se guardava registo da quantidade
%ƒ um valor bloqueado

+stock( F,M,TA,Q ) :: (solucoes(Q,
(stock( antunes,aspirina,comprimidosEfervescentes,Q ), nao(nulo(Q)) ), S),
comprimento( S,N ),
N==0).


%Invariante: Medicamento s— se pode encontrar no stock se for um medicamento

+stock(F,M,T,Q) :: (medicamento(M,T)).

%--------------------------------- - - - - - - - - - -  -  -  -  -   -
% Invariante: Um produto s— pode ser comprado por utente se existir no stock da farmacia

+compra( F,M,T,Q,_,_ ) :: ( solucoes(
(F,M,T,_), (stock(F,M,T,_)), S ),
comprimento( S,N ), N \=0 ).

%--------------------------------- - - - - - - - - - -  -  -  -  -   -
% Invariante: Um produto s— pode ser comprado se a qtd da compra for inferior ˆ do stock
+compra( F,M,T,Q,_,_ ) :: (stock(F,M,T,Q1), Q1>Q ).

%--------------------------------- - - - - - - - - - -  -  -  -  -   -
%--------------------------------- - - - - - - - - - -  -  -  -  -   -
% 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,Tipo,Pvr ) :-
nao( medicamento( Nome,Tipo,Pvr )),
nao( excepcao(medicamento(Nome,Tipo,Pvr))).

-farmacia( Nome,Rua,Tipo ) :-
nao( farmacia( Nome,Rua,Tipo )),
nao( excepcao(farmacia( Nome,Rua,Tipo ))).

-precario( Farmacia,Medicamento,Tipo,PR,PP,PE ) :-
nao( precario( Farmacia,Medicamento,Tipo,PR,PP,PE )),
nao( excepcao(precario( Farmacia,Medicamento,Tipo,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,Tipo,Quantidade,Classificacao ) :-
nao( compra( Medicamento,Tipo,Quantidade,Classificacao )),
nao( excepcao( compra( Medicamento,Tipo,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))).

-stock(Farmacia,Medicamento,Tipo,Quantidade) :-
nao(stock(Farmacia,Medicamento,Tipo,Quantidade)),
nao(excepcao(stock(Farmacia,Medicamento,Tipo,Quantidade))).

%--------------------------------- - - - - - - - - - -  -  -  -  -   -
%--------------------------------- - - - - - - - - - -  -  -  -  -   -
% Valores nulos - Representa‹o de Excep›es
%--------------------------------- - - - - - - - - - -  -  -  -  -   -
%--------------------------------- - - - - - - - - - -  -  -  -  -   -

excepcao( tratamento( M,D )) :- tratamento( desconhecido,D ).

excepcao( precario( F,M,T,PR,PP,PE )) :- precario( F,M,T,PR,PP,bloqueado ).

excepcao( stock( F,M,T,Q )) :- stock( F,M,T,bloqueado ).

excepcao(diagnostico(,)):-analise(N,VR,imperfeito).

excepcao(analise(Paciente,C, VMINR,VMA, VO)):-analise(Paciente,C, VMINR,VMA, bloqueado). %invarian

excepcao(analise(Paciente,C,VMINR,VMA, VO)):-analise(Paciente,C,VMINR,VMA, desconhecido).

% Como n‹o se pretende, nunca, que a base de conhecimento tenha acesso aos valores bloqueado
% Criou-se o predicado nulo, com um s— argumento.

nulo( bloqueado ).

%--------------------------------- - - - - - - - - - -  -  -  -  -   -
%--------------------------------- - - - - - - - - - -  -  -  -  -   -
% 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 ).

diagnostico(jose,desconhecido).

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).

internamento(jose,desconhecido).

excepcao(internamento(jose, enfermaria1)).
excepcao(internamento(jose,enfermaria2)).
excepcao(internamento(jose,cuidadosintensivos)).


% o josŽ so pode estar internado num sitio
% Invariante referencial

+internamento( Paciente,Local ) :: (solucoes( (Ls),(internamento( Paciente,Ls )),S ),
comprimento( S,N ), N =< 1).


% os leucocitos estao a baixo do valor normal



excepcao(analise(jose,leucocitos,VMINR,VMAX,VO)):- VO<VMINR, VMINR=4, VMA=10.

%relativamente ˆs analises Neutrofilos, sabe-se que est‹o dentro dos resultados normais.

analise(jose,neutrofilos,1,8,desconhecido).

excepcao(analise(jose,neutrofilos, VMINR,VMA, VO)):- VO<VMA, VO>VMINR.


%relativamente ˆs analises de colesterol n‹o se sabe se o resultado foi 25 ou 250.

analise(jose,colesterol,50,200,desconhecido).

excepcao(analise(jose, colesterol,_,_,25)).
excepcao(analise(jose, colesterol,_,_,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,bloqueado).

+analise(Paciente,C, VMINR,VMA, VO)::solucoes(X,(analise(jose, tsh,40,80,X),nao(nulo(X))),[]). %onde se mete isto?

% relativamente aos resultados de plaquetas nao se sabe qual o resultado das analises

analise(jose, plaquetas,_,_, desconhecido).


% Os resultados de Eritrograma deu 300.

analise(jose,plaquetas,250,350,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,comprimidos,1,livre,3.5 ).
compra( antunes,benuron,comprimidos,1,receitado,3 ).
compra( antunes,brufen,comprimidos,1,receitado,4 ).

compra( F,M,T,Q,livre,P ) :-
precario( F,M,T,_,P1,_ ),
receita( L ),
inteiro( Q ),
nao( pertence( M,L )),
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,T,Q,receitado,P ) :-
receita( L ),
inteiro( Q ),
pertence( M,L ),
precario( F,M,T,_,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,T,Q,receitado,P ) :: ( solucoes( (M,T,Q),(compra( _,M,T,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,T,_,_,_)),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.

