%--------------------------------- - - - - - - - - - -  -  -  -  -   -
% PROG. LOGICA, CONHECIMENTO E RACIOCINIO - MIEB/4

%--------------------------------- - - - - - - - - - -  -  -  -  -   -
%Trabalho de Grupo - Sistema de representação de conhecimento e raciocínio com
%	capacidade para caracterizar um universo de discurso de âmbito farmacêutico

%Grupo - Fábio França nº 61785
%		 Filipe Fernandes nº 61754
%--------------------------------- - - - - - - - - - -  -  -  -  -   -

% 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( 900,xfy,'::' ).
:- dynamic '-'/1.
:- dynamic medicamento/1.
:- dynamic tipo_medicamento/2.
:- dynamic aplicacao_clinica/2.
:- dynamic principio_activo/2.
:- dynamic apresentacao_farmaceutica/2.
:- dynamic preco_recomendado/3.
:- dynamic preco_publico/3.
:- dynamic regime_especial/4.
:- dynamic data_validade/5.
:- dynamic data_introducao/5.
:- dynamic contra_indicacao/2.
:- dynamic armazem/2.


%--------------------------------- - - - - - - - - - -  -  -  -  -   -					 Medicamento
%--------------------------------- - - - - - - - - - -  -  -  -  -   -
% Extensao do predicado medicamento: Medicamento -> {V,F}

medicamento('ben-u-ron').
medicamento('buscopan').
medicamento('brufen').
medicamento('cegripe').
medicamento('neosoro').
medicamento('microvlar').
medicamento('plavix').

%---------------	Invariantes

%--------------- 	Não permitir a inserção de conhecimento repetido

+medicamento(M) :: (solucoes( (M),(medicamento(M)),S),
comprimento(S,N), N==1).


%--------------- 	Não permitir a remoção de um medicamento se existirem dependências sobre este

-medicamento(M) :: (-tipo_medicamento(M, T), -aplicacao_clinica(M, A),
 -principio_activo(M,P),
-apresentacao_farmaceutica(M,Ap), -preco_recomendado(M,A,P), -preco_publico(M,A,P),
-regime_especial(M,A,E,P), -contra_indicacao(M,C), -data_validade(M,Ap,Dia,Mes,Ano),
 -data_introducao(M,Ap,Dia,Mes,Ano)).


% Conhecimento Negativo

-medicamento(M) :- nao(medicamento(M)), nao(excepcao(medicamento(M))).

%--------------------------------- - - - - - - - - - -  -  -  -  -   -					Tipo de medicamento
%--------------------------------- - - - - - - - - - -  -  -  -  -   -

% Extensao do predicado tipo_medicamento: Medicamento,Tipo-> {V,F,D}

tipo_medicamento('ben-u-ron','analgesico').
tipo_medicamento('buscopan','analgesico').
tipo_medicamento('brufen','anti-inflamatorio').
tipo_medicamento('cegripe','tipo_nulo').
tipo_medicamento('neosoro','descongestionante').
tipo_medicamento('microvlar','contraceptivo').
tipo_medicamento('plavix','antiplaquetar').

%	Invariantes

%---------------	Medicamento tem de existir

+tipo_medicamento(M,T) :: medicamento(M).

%--------------- 	Não permitir a inserção de conhecimento repetido

+tipo_medicamento(M,T) :: (solucoes( (M,T),(tipo_medicamento(M,T)),S),
comprimento(S,N), N==1).

%---------------     Não permitir a inserção de conhecimento relativo ao cegripe

+tipo_medicamento(M, T) :: (solucoes(X, (tipo_medicamento(cegripe, X), nao(nulo(X))), [])).

% Conhecimento Negativo

-tipo_medicamento(M,T) :- nao(tipo_medicamento(M,T)), nao(excepcao(tipo_medicamento(M,T))).

% Excepções

excepcao(tipo_medicamento(M,T)) :- tipo_medicamento(cegripe, tipo_nulo).

%--------------------------------- - - - - - - - - - -  -  -  -  -   -					Aplicação Clínica
%--------------------------------- - - - - - - - - - -  -  -  -  -   -

% Extensao do predicado aplicacao_clinica: Medicamento, aplicação -> {V,F,D}

aplicacao_clinica('ben-u-ron','Dores de cabeca').
aplicacao_clinica('ben-u-ron','Sindromes gripais').
aplicacao_clinica('ben-u-ron','Febre').
aplicacao_clinica('ben-u-ron','Dores de dentes').
aplicacao_clinica('buscopan','Dores abdominais').
aplicacao_clinica('brufen','Febre').
aplicacao_clinica('brufen','Osteoartrose').
aplicacao_clinica('brufen','Traumatismos').
aplicacao_clinica('cegripe','Sindromes gripais').
aplicacao_clinica('cegripe','Constipacoes').
aplicacao_clinica('cegripe','Perturbacoes alergicas da nasofaringe').
aplicacao_clinica('neosoro','aplicacao_incerta').
aplicacao_clinica('microvlar','anti-concepcional').
aplicacao_clinica('plavix','Prevencao da trombose arterial').

-aplicacao_clinica('neosoro','Traumatismos').
-aplicacao_clinica('neosoro','Febre').
-aplicacao_clinica('neosoro','Sindromes gripais').

%Excepções


excepcao(aplicacao_clinica('neosoro',C)) :- aplicacao_clinica('neosoro',aplicacao_incerta).


%	Invariantes

%---------------	Medicamento tem de existir

+aplicacao_clinica(M,A) :: medicamento(M).

%--------------- 	Não permitir a inserção de conhecimento repetido

+tipo_medicamento(M,A) :: (solucoes( (M,A),(tipo_medicamento(M,A)),S),
comprimento(S,N), N==1).

% Conhecimento Negativo

-aplicacao_clinica(M,A) :- nao(aplicacao_clinica(M,A)), nao(excepcao(aplicacao_clinica(M,T))).


%--------------------------------- - - - - - - - - - -  -  -  -  -   -					Princípio Ativo
%--------------------------------- - - - - - - - - - -  -  -  -  -   -

% Extensao do predicado principio_activo: Medicamento, Princípio Ativo -> {V,F,D}

principio_activo('ben-u-ron','paracetamol').
principio_activo('buscopan','duboisia').
principio_activo('brufen','ibuprofen').
principio_activo('ben-u-ron','paracetamol').
principio_activo('cegripe','paracetamol').
principio_activo('neosoro',principio_incerto).
principio_activo('plavix','clopidrogel').

-principio_activo('neosoro','paracetamol').
-principio_activo('neosoro','ibuprofen').

% Excepções

excepcao(principio_activo('neosoro',P)) :- 
						principio_activo('neosoro',principio_incerto).

excepcao(principio_activo('microvlar','levonorgestrel')).
excepcao(principio_activo('microvlar','etinilestradiol')).

%	Invariantes

%---------------	Medicamento tem de existir

+principio_activo(M,P) :: medicamento(M).

%--------------- 	Não permitir a inserção de conhecimento repetido

+principio_activo(M,P) :: (solucoes( (M,P),(principio_activo(M,P)),S),
comprimento(S,N), N==1).

% Conhecimento Negativo

-principio_activo(M,P) :- nao(principio_activo(M,P)), nao(excepcao(principio_activo(M,P))).



%--------------------------------- - - - - - - - - - -  -  -  -  -   -				Apresentação farmaceutica
%--------------------------------- - - - - - - - - - -  -  -  -  -   -

% Extensao do predicado apresentacao_farmaceutica: Medicamento,Apresentacao -> {V,F,D}


apresentacao_farmaceutica('ben-u-ron','comprimidos').
apresentacao_farmaceutica('ben-u-ron','xarope').
apresentacao_farmaceutica('buscopan','ampolas').
apresentacao_farmaceutica('brufen','comprimidos').
apresentacao_farmaceutica('brufen','xarope').
apresentacao_farmaceutica('cegripe','comprimidos').
apresentacao_farmaceutica('neosoro','solucao nasal').
apresentacao_farmaceutica('microvlar','comprimidos').
apresentacao_farmaceutica('plavix','comprimidos').

%	Invariantes

%---------------	Medicamento tem de existir

+apresentacao_farmaceutica(M,A) :: medicamento(M).

%--------------- 	Não permitir a inserção de conhecimento repetido

+apresentacao_farmaceutica(M,A) :: (solucoes( (M,A),(apresentacao_farmaceutica(M,A)),S),
comprimento(S,N), N==1).


%--------------------------------- - - - - - - - - - -  -  -  -  -   -			Preço Recomendado
%--------------------------------- - - - - - - - - - -  -  -  -  -   -

% Extensao do predicado preco_recomendado: Medicamento, Apresentacao,
% Preco -> {V,F,D}

preco_recomendado('ben-u-ron','comprimidos',9).
preco_recomendado('ben-u-ron','xarope',11).
preco_recomendado('buscopan','ampolas',precor_incerto).
preco_recomendado('brufen','xarope',10).
preco_recomendado('neosoro','solucao nasal',preco_nulo).
preco_recomendado('microvlar','comprimidos',5).
preco_recomendado('plavix','comprimidos',25).


excepcao(preco_recomendado('brufen', 'comprimidos', P)) :- P>=6, P=<9 .

excepcao(preco_recomendado('neosoro','solucao nasal', P)) 
				:- preco_recomendado('neosoro','solucao nasal',preco_nulo).

excepcao(preco_recomendado('buscopan','ampolas',P)) :- 
				preco_recomendado('buscopan','ampolas',precor_incerto).

%	Invariantes

%---------------	Medicamento e correspondente apresentação farmaçêutica têm de existir

+preco_recomendado(M,A,P) :: (medicamento(M), apresentacao_farmaceutica(M,A)).

%--------------- 	Não permitir a inserção de conhecimento repetido

+preco_recomendado(M,A,P) :: (solucoes( (M,A,P),(preco_recomendado(M,A,P)),S),
comprimento(S,N), N==1).

%--------------- 	Não permitir a inserção de preço recomendado para o Medicamento neosoro

+preco_recomendado(M, A, P) :: (solucoes(Ps, (preco_recomendado('neosoro', 'solucao nasal', Ps),
 nao(nulo(Ps))), [])).


% Conhecimento Negativo

-preco_recomendado(M,A,P) :- nao(preco_recomendado(M,A,P)), 
		nao(excepcao(preco_recomendado(M,A,P))).



%--------------------------------- - - - - - - - - - -  -  -  -  -   -				Preço Público
%--------------------------------- - - - - - - - - - -  -  -  -  -   -

% Estensao do predicado preco_publico: Medicamento, Apresentacao, Preco -> {V,F,D}

preco_publico('ben-u-ron','comprimidos',precop_incerto).
preco_publico('buscopan','ampolas',4).
preco_publico('brufen','xarope',preco_nulo).
preco_publico('brufen','comprimidos',10).
preco_publico('neosoro','solucao nasal',4).
preco_publico('plavix','comprimidos',27).

% Excepções

excepcao(preco_publico('ben-u-ron', 'xarope', P)) :- P>=12, P=<13.
excepcao(preco_publico('microvlar', 'comprimidos', P)) :- P>=5, P=<7.

excepcao(preco_publico('brufen','xarope',P)) :-
			 preco_publico('brufen','xarope', preco_nulo).
excepcao(preco_publico('ben-u-ron','comprimidos',P)) :-
	 preco_publico('ben-u-ron','comprimidos',precop_incerto).


%	Invariantes

%---------------	Medicamento e correspondente apresentação farmaçêutica têm de existir

+preco_publico(M,A,P) :: (medicamento(M), apresentacao_farmaceutica(M,A)).

%--------------- 	Não permitir a inserção de conhecimento repetido

+preco_publico(M,A,P) :: (solucoes( (M,A,P),(preco_publico(M,A,P)),S),
comprimento(S,N), N==1).

%--------------- 	Não permitir a inserção de preço recomendado para o Medicamento neosoro

+preco_publico(M, A, P) :: (solucoes(Ps, (preco_publico('brufen', 'xarope', Ps), 
		nao(nulo(Ps))), [])).


% Conhecimento Negativo

-preco_publico(M,A,P) :- nao(preco_publico(M,A,P)), nao(excepcao(preco_publico(M,A,P))).

% Excepções




%--------------------------------- - - - - - - - - - -  -  -  -  -   -				Regime Especial
%--------------------------------- - - - - - - - - - -  -  -  -  -   -

% Estensao do predicado regime_especial: Medicamento, Apresentacao, Escalao, Preco -> {V,F,D}


regime_especial('ben-u-ron','comprimidos',a, 2).
regime_especial('ben-u-ron','comprimidos',b, regime_incerto).
regime_especial('ben-u-ron','xarope',b, regime_incerto).
regime_especial('brufen','comprimidos',b, 3).
regime_especial('brufen','xarope',c, preco_nulo).

regime_especial('buscopan','ampolas',c, 2).


% não existe regime especial para o medicamento neosoro

regime_especial('microvlar','comprimidos',b,3).
regime_especial('plavix','comprimidos',a,3).
regime_especial('plavix','comprimidos',b,regime_incerto).

% Excepções

excepcao(regime_especial('ben-u-ron', 'xarope', c, P)) :- P>=7, P=<9.
excepcao(regime_especial('buscopan', 'ampolas', b, P)) :- P>=1, P=<3.
excepcao(regime_especial('plavix', 'comprimidos', c, P)) :- P>=17, P=<20.


excepcao(regime_especial('brufen', 'xarope',c,P)) :- 
			regime_especial('brufen', 'xarope', c, preco_nulo).

excepcao(regime_especial('plavix', 'comprimidos', b,P)) :-
			 regime_especial('plavix', 'comprimidos', b, regime_incerto).
excepcao(regime_especial('ben-u-ron','comprimidos',b,P)) :-
			 regime_especial('ben-u-ron','comprimidos',b, regime_incerto).
excepcao(regime_especial('ben-u-ron','xarope',b,P)) :- 
			regime_especial('ben-u-ron','xarope',b, regime_incerto).

%	Invariantes

%---------------	Medicamento e correspondente apresentação farmaçêutica têm de existir

+regime_especial(M,A,E,P) :: (medicamento(M), apresentacao_farmaceutica(M,A)).

%--------------- 	Não permitir a inserção de conhecimento repetido

+regime_especial(M,A,E,P) :: (solucoes( (M,A,E,P),(regime_especial(M,A,E,P)),S),
comprimento(S,N), N==1).

%--------------- 	Não permitir a inserção de regime especial com Escalão C para o Medicamento Brufen em Xarope

+regime_especial(M,A,E,P) :: (solucoes(Ps, (regime_especial('brufen', 'xarope', c, Ps), nao(nulo(Ps))), [])).


% Conhecimento Negativo

-regime_especial(M,A,E,P) :- nao(regime_especial(M,A,E,P)), nao(excepcao(regime_especial(M,A,E,P))).



%--------------------------------- - - - - - - - - - -  -  -  -  -   -			Data de validade
%--------------------------------- - - - - - - - - - -  -  -  -  -   -


%--------------------------------- - - - - - - - - - -  -  -  -  -   -
%--------------------------------- - - - - - - - - - -  -  -  -  -   -				Contra Indicação

% Estensao do predicado contra_indicacao: Medicamento, Contra Indicação ou Problemas do paciente -> {V,F,D}

contra_indicacao('ben-u-ron','doenca hepatica grave').
contra_indicacao('ben-u-ron','hipersensibilidade ao paracetamol').
contra_indicacao('brufen','hipersensibilidade ao ibuprofeno').
contra_indicacao('brufen','insuficiencia cardiaca grave').
contra_indicacao('brufen','alteracoes de coagulacao').
contra_indicacao('brufen','hemorrogia gastrointestinal').
contra_indicacao('buscopan',cindicacao_incerta).
contra_indicacao('microvlar','insuficiencia hepatica grave').
contra_indicacao('microvlar','antecedentes de ictericia').
contra_indicacao('microvlar','carcinoma de mama').
contra_indicacao('microvlar','diabetes mellitus grave').
contra_indicacao('neosoro',c_indicacao_nula).
contra_indicacao('plavix','intolerancia a galactose').
contra_indicacao('plavix','hipersensibilidade ao clopidrogel').

-contra_indicacao('buscopan','inufuciencia cardiaca grave').
-contra_indicacao('buscopan','diabetes mellitus grave').

% Excepções

excepcao(contra_indicacao('neosoro',C)) :- contra_indicacao('neosoro',c_indicacao_nula).

excepcao(contra_indicacao('buscopan',C)) :- contra_indicacao('buscopan',cindicacao_incerta).

%	Invariantes

%---------------	Medicamento tem de existir

+contra_indicacao(M,C) :: medicamento(M).

%---------------  	Não permitir a inserção de conhecimento repetido

+contra_indicacao(M,C) :: (solucoes( (M,C),(contra_indicacao(M,C)),S),
comprimento(S,N), N==1).

%--------------- 	Não permitir a inserção de contra indicações para o medicamento neosoro

+contra_indicacao(M, C) :: (solucoes(Cs, (contra_indicacao('neosoro', Cs), nao(nulo(Cs))), [])).

% Conhecimento Negativo

-contra_indicacao(M,C) :- nao(contra_indicacao(M,C)), nao(excepcao(contra_indicacao(M,C))).



%--------------------------------- - - - - - - - - - -  -  -  -  -   -
% Estensao do predicado data_validade: Medicamento, Apresentacao,
% Dia, Mes, Ano -> {V,F,D}

data_validade('ben-u-ron','comprimidos',16,10,2015).
data_validade('ben-u-ron','xarope',12,8,2015).
data_validade('brufen','comprimidos',dia_incerto,mes_incerto,2016).
data_validade('brufen','xarope',dia_nulo,mes_nulo,ano_nulo).
data_validade('microvlar','comprimidos',dia_incerto,3,2016).
data_validade('neosoro','solucao nasal',4,5,2018).

excepcao(data_validade('plavix', 'comprimidos', D, 7, 2017)) :- D=<21, D>=9.

excepcao(data_validade('brufen','comprimidos',D,M,2016)):- 
	data_validade('brufen','comprimidos',dia_incerto,mes_incerto,2016).

excepcao(data_validade('microvlar','comprimidos',D,3,2016)):- 
	data_validade('microvlar','comprimidos',dia_incerto,3,2016).

excepcao(data_validade('brufen','xarope',D,M,A)) :- 
	data_validade('brufen','xarope',dia_nulo,mes_nulo,ano_nulo).


%Invariantes

% Não permitir a inserção de conhecimento repetido

+data_validade(X,Apr,D,M,A) :: (solucoes((X,Apr,D,M,A),data_validade( X,Apr,D,M,A ), S),comprimento( S,N ), N == 1).

% Medicamento e apresentação farmacêutica têm de existir

+data_validade(X,Apr,D,M,A) :: (medicamento(X), apresentacao_farmaceutica(X, Apr)).

% Não permir a iserção de data de validade para o Medicamento Brufen em Xarope

+data_validade(X,Apr,D,M,A) :: (findall((D_X, M_X, A_X), 
	(data_validade('brufen', 'xarope', D_X, M_X, A_X),
		(nao(nulo(D_X)); nao(nulo(M_X)); nao(nulo(A_X)))), [])).

%Data de validade tem de ser superior à data de introdução

+data_validade( X,Apr,D,M,A ) :: (
( nao(data_introducao(X,Apr,D2,M2,A2)) );
( A>A2 );
( A==A2, M>M2 );
( A==A2, M==M2, D>D2 )).



%Conhecimento Negativo

-data_validade(A,B,C,D,E) :- nao(data_validade(A,B,C,D,E)), nao(excepcao(data_validade(A,B,C,D,E))).


excepcao(data_validade('plavix', 'comprimidos', D, 7, 2017)) :- D=<21, D>=9.

excepcao(data_validade('brufen','comprimidos',D,M,2016)):- 
	data_validade('brufen','comprimidos',dia_incerto,mes_incerto,2016).

excepcao(data_validade('microvlar','comprimidos',D,3,2016)):- 
	data_validade('microvlar','comprimidos',mes_incerto,3,2016).

excepcao(data_validade('brufen','xarope',D,M,A)) :- 
	data_validade('brufen','xarope',dia_nulo,mes_nulo,ano_nulo).

%--------------------------------- - - - - - - - - - -  -  -  -  -   -
%--------------------------------- - - - - - - - - - -  -  -  -  -   -
%--------------------------------- - - - - - - - - - -  -  -  -  -   -


% Estensao do predicado data_introducao: Medicamento, Apresentacao, Dia, Mes, Ano -> {V,F,D}

data_introducao('ben-u-ron','comprimidos',7,8,2013).
data_introducao('ben-u-ron','xarope',dia_incerto,mes_incerto,2014).
data_introducao('brufen','comprimidos',dia_incerto,4,2014).
data_introducao('brufen','xarope',dia_nulo,mes_nulo,ano_nulo).
data_introducao('microvlar','comprimidos',dia_incerto,mes_incerto,2014).
data_introducao('neosoro','solucao nasal', 17,12,2015).

%Excepções

excepcao(data_introducao('plavix', 'comprimidos', D2, 9, 2015)) :- D2=<29, D2>=8.

excepcao(data_introducao('ben-u-ron','xarope',D,M,2014)):- 
	data_introducao('ben-u-ron','xarope',dia_incerto,mes_incerto,2014).

excepcao(data_introducao('brufen','comprimidos',D,4,2014)):-
	 data_introducao('brufen','comprimidos',dia_incerto,4,2014).

excepcao(data_introducao('microvlar','comprimidos',D,M,2014)):- 
	data_introducao('microvlar','comprimidos',dia_incerto,mes_incerto,2014).

excepcao(data_validade('brufen','xarope',D,M,A)) :- 
	data_introducao('brufen','xarope',dia_nulo,mes_nulo,ano_nulo).

%	Invariantes

%---------------	Medicamento e correspondente apresentação farmaçêutica têm de existir

+data_introducao(X,Apr,D,M,A) :: ( medicamento(X), apresentacao_farmaceutica(X,Apr) ).


% Não permitir conhecimento repetido

+data_introducao(X,Apr,D,M,A) :: (solucoes((X,Apr,D,M,A),data_introducao( X,Apr,D,M,A ), S),
comprimento( S,N ), N == 1
).

% Data de introdução menor do que data de validade
+data_introducao( X,Apr,D,M,A ) :: (
( nao(data_validade(X,Apr,D2,M2,A2)) );
( A<A2 );
( A==A2, M<M2 );
( A==A2, M==M2, D<D2 )).

% Não permir a iserção de data de validade para o Medicamento Brufen em Xarope

+data_introducao(X,Apr,D,M,A) :: (solucoes((D_X, M_X, A_X),
 (data_introducao('brufen', 'xarope', D_X, M_X, A_X),
(nao(nulo(D_X)); nao(nulo(M_X)); nao(nulo(A_X)))), [])).

%Conhecimento Negativo

-data_introducao(A,B,C,D,E) :- nao(data_introducao(A,B,C,D,E)), nao(excepcao(data_introducao(A,B,C,D,E))).


%--------------------------------- - - - - - - - - - -  -  -  -  -   -

% Extensao do predicado armazem:  Armazem, Tipo de medicamento -> {V,F,D}

armazem(1,'analgesico').
armazem(2,'anti-inflamatorio').
armazem(3,tipo_nulo).
armazem(4,'antiplaquetar').
armazem(5,'contraceptivo').
armazem(6,'antibiotico').
armazem(7,'antidepressivo').
armazem(8,incerto).
armazem(9,'placebo').

% Excepções

excepcao(armazem(8,T)) :- armazem(8,incerto).
excepcao(armazem(3,T)) :- armazem(3,tipo_nulo).

%	Invariantes

%---------------	Medicamento e correspondente tipo tem de existir

%+armazem(Arm,T) ::  (tipo_medicamento(M,T)).


%---------------  	Não permitir a inserção de conhecimento repetido

+armazem(Arm,T) :: (solucoes( (Arm,T),(armazem(Arm,T)),S),
comprimento(S,N), N==1).

%--------------- 	Não permitir a inserção de Tipo de medicamento para o armazém 3

+armazem(Arm, T) :: (solucoes(Ts, (armazem(3, Ts), nao(nulo(Ts))), [])).


%--------------- 	Não permitir mais do que um tipo de medicamento por armazem

+armazem(Arm,T) :: (solucoes( Ts, armazem(Arm, Ts),S),
comprimento(S,N), N==1).



% Conhecimento Negativo

-armazem(Arm,T) :- nao(armazem(Arm,T)), nao(excepcao(armazem(Arm,T))).


%--------------------------------- - - - - - - - - - -  -  -  -  -   -
%--------------------------------- - - - - - - - - - -  -  -  -  -   -
%--------------------------------- - - - - - - - - - -  -  -  -  -   -



% Extensao do meta-predicado nulo: Valor -> {V,F}

nulo(preco_nulo).
nulo(tipo_nulo).
nulo(c_indicacao_nula).
nulo(dia_nulo).
nulo(mes_nulo).
nulo(ano_nulo).



%--------------------------------- - - - - - - - - - -  -  -  -  -   -
% Extensão do predicado que permite a evolucao do conhecimento

evolucao( Termo ) :-
solucoes( Invariante,+Termo::Invariante,Lista ),
insercao( Termo ),
teste( Lista ).

insercao( Termo ) :-
assert( Termo ).
insercao( Termo ) :-
retract( Termo ),!,fail.

teste( [] ).
teste( [R|LR] ) :-
R,
teste( LR ).


% Extensão do predicado que permite Remoção de Conhecimento

remover(Termo) :-
        solucoes( Invariante, -Termo::Invariante, Lista),
        teste( Lista ) ,
        remocao(Termo).
        
remocao(Termo) :-
        retract(Termo).


%--------------------------------- - - - - - - - - - -  -  -  -  -   -
% Extensao do meta-predicado demo: Questao,Resposta -> {V,F}

demo( Questao,verdadeiro ) :-
Questao.
demo( Questao, falso ) :-
-Questao.
demo( Questao,desconhecido ) :-
nao( Questao ),
nao( -Questao ).


%--------------------------------- - - - - - - - - - -  -  -  -  -   -
% Extensao do meta-predicado nao: Questao -> {V,F}

nao( Questao ) :-
Questao, !, fail.
nao( Questao ).


%--------------------------------- - - - - - - - - - -  -  -  -  -   -
% Extensão do predicado eliminarRepetidos: L, R -> {V, F}

eliminarRepetidos([], []) .
eliminarRepetidos([H|T], Res) :-
eliminarElemento(T, H, R_e_elem),
eliminarRepetidos(R_e_elem, R_e_rep),
Res = [H|R_e_rep] .

%--------------------------------- - - - - - - - - - -  -  -  -  -   -
% Extensão do predicado eliminarElemento: L, E, R -> {V, F}
eliminarElemento([], _, []).
eliminarElemento([H|T], H, Res) :-
eliminarElemento(T, H, R_e_elem),
Res = R_e_elem .
eliminarElemento([H|T], E, Res)	:-
H \== E,
eliminarElemento(T, E, R_e_elem),
Res = [H|R_e_elem] .
%--------------------------------- - - - - - - - - - -  -  -  -  -   -
%Extensão do predicado solucoes: X,Y,Z -> {V,F}
solucoes( X,Y,Z ) :-
findall( X,Y,Z ).

%Extensao do predicado comprimento: S,N ->{V,F}
comprimento( S,N ) :-
length( S,N ).