nao(Questao) :- Questao, !, fail. nao(Questao). solucoes(X,Y,Z) :- findall(X,Y,Z). comprimento(S,N) :- length(S,N). :- op( 900,xfy,'::' ). :- dynamic medicamento/5. :- dynamic caixa/4. :- dynamic excepcao/1. %--------------------------------- - - - - - - - - - - - - - - - % Extensão de um predicado que permite a demonstração do conhecimento demo(Questao,verdadeiro) :- Questao, nao(excepcao(Questao)). demo(Questao,falso) :- -Questao. demo(Questao,desconhecido) :- nao(Questao), nao(-Questao). demo(Questao,desconhecido) :- excepcao(Questao). demo1([],verdadeiro). demo1([Questao|Resto],verdadeiro) :- Questao, nao(excepcao(Questao)), demo1(Resto,verdadeiro). demo1([Questao|Resto],falso) :- -Questao,!. demo1([Questao|Resto],falso) :- demo1(Resto,falso),!. demo1([Questao|Resto],desconhecido) :- demo1(Resto,desconhecido),!. demo1([Questao|Resto],desconhecido) :- nao(Questao), nao(-Questao),!. demo1([Questao|Resto],desconhecido) :- excepcao(Questao). -medicamento(NC,PA,IT,LAB,AC) :- nao(medicamento(NC,PA,IT,LAB,AC)), nao(excepcao(medicamento(NC,PA,IT,LAB,AC))). -caixa(NC,NUM,DOS,VAL) :- nao(caixa(NC,NUM,DOS,VAL)), nao(excepcao(caixa(NC,NUM,DOS,VAL))). %--------------------------------- - - - - - - - - - - - - - - - %Base do conhecimento para os dias de cada mês dias_mes(1,31). dias_mes(2,28). dias_mes(3,31). dias_mes(4,30). dias_mes(5,31). dias_mes(6,30). dias_mes(7,31). dias_mes(8,31). dias_mes(9,30). dias_mes(10,31). dias_mes(11,30). dias_mes(12,31). %Extensão do predicado dias que converte uma data num total de dias dias(data(Dia,Mes,Ano),Total):- solucoes(Dias,(dias_mes(X,Dias),X0. +caixa(NC,NUM,DOS,data(Dia,Mes,Ano))::(Mes=<12,Mes>0). +caixa(NC,NUM,DOS,data(Dia,Mes,Ano))::Dia=<28 :- Mes=2. +caixa(NC,NUM,DOS,data(Dia,Mes,Ano))::Dia=<31 :- pertence(Mes,[1,3,5,7,8,10,12]). +caixa(NC,NUM,DOS,data(Dia,Mes,Ano))::Dia=<30 :- pertence(Mes,[4,6,9,11]). pertence(X,[X|L]). pertence(X,[Y|L]) :- X \= Y, pertence(X,L). %--------------------------------- - - - - - - - - - - - - - - - % Extensão do predicado que permite a evolucao do conhecimento evolucao( Termo ) :- solucoes( Invariante,+Termo::Invariante,Lista ), insercao( Termo ), teste( Lista ). evolucao1(caixa(NM,NUM,DOS,VAL)) :- excepcao(caixa(NM,NUM,DOS,VAL)), retractall(caixa(_,NUM,_,_)), retractall(excepcao(caixa(_,NUM,_,_))), assert(caixa(NM,NUM,DOS,VAL)), solucoes(Invariante,+caixa(NM,NUM,DOS,VAL)::Invariante,Lista), teste(Lista). evolucao1(medicamento(NC,PA,IT,LAB,AC)) :- excepcao(medicamento(NC,PA,IT,LAB,AC)), retractall(medicamento(NC,_,_,_,_)), retractall(excepcao(medicamento(NC,_,_,_,_))), assert(medicamento(NC,PA,IT,LAB,AC)), solucoes(Invariante,+medicamento(NC,PA,IT,LAB,AC)::Invariante,Lista), teste(Lista). insercao( Termo ) :- assert( Termo ). insercao( Termo ) :- retract( Termo ),!,fail. teste([]). teste( [X|Y] ) :- X, teste( Y ). %--------------------------------- - - - - - - - - - - - - - - - % I medicamento(mycospor,bifonasol,antifungico,bayer_farmaceutical,micoses_cutaneas). caixa(mycospor,1212,50,data(31,03,2011)). %--------------------------------- - - - - - - - - - - - - - - - % II medicamento(vfend,voriconasol,antifungico,pfizer_limited,apergilose_invasiva). caixa(vfend,1234,50,data(12,12,2010)). %--------------------------------- - - - - - - - - - - - - - - - % III nao sabe qual o pricipio activo do aulin medicamento(aulin,incerto,anti-inflamatorio,roche,analgesico_e_antipiretico). excepcao(medicamento(NC,PA,IT,LAB,AC)) :- medicamento(NC,incerto,IT,LAB,AC). %--------------------------------- - - - - - - - - - - - - - - - % IV sabe que a dosagem do enjomin e 100 ou 200 excepcao(caixa(enjomin,1212,100,data(31,01,2011))). excepcao(caixa(enjomin,1212,200,data(31,01,2011))). %--------------------------------- - - - - - - - - - - - - - - - % V Medicamento com um prazo de validade impreciso(conhecimento imperfeito do tipo impreciso) medicamento(ceporexim,cefolexina,antibiotico,eurofarm,sinusite_e_infeccao_urinaria). excepcao(caixa(ceporexim,2222,500,VAL)) :- dias(VAL,Z),dias(data(25,02,2010),Y),Z>Y. +caixa(ceporexim,2222,500,VAL)::(dias(VAL,Z),dias(data(25,02,2010),Y),Z>Y). %--------------------------------- - - - - - - - - - - - - - - - % VI medicamento(magnesona,pidolato_de_magnesio,medicamento_de_nutricao,laboratorios_vitoria_sa,carencia_de_magnesio). excepcao(caixa(magnesona,7878,1500,data(DIA,10,2010))) :- DIA>23,DIA=<31. %--------------------------------- - - - - - - - - - - - - - - - % VII Medicamento com um prazo de validade interdito(conhecimento imperfeito do tipo interdito) medicamento(ben-u-ron,paracetamol,antipiretico_e_analgésico,neo_farmaceutica_sa,febre_e_enxaqueca). caixa(ben-u-ron,1111,500,interdito). excepcao(caixa(NC,NUM,DOS,VAL)) :- caixa(NC,NUM,DOS,interdito). nulo(interdito). %invariante que não permite inserir valores da data de validade +caixa(NC,NUM,DOS,VAL)::(solucoes(INT,(caixa(ben-u-ron,1111,500,INT),nao(nulo(INT))),[])). %--------------------------------- - - - - - - - - - - - - - - - % VIII medicamento(aspirina,acido_acetilsalicilico,antipiretico,bayer_farmaceutical,febre). -caixa(aspirina,3333,250,data(17,07,2010)). caixa(aspirina,3333,naoconhecida,data(17,07,2010)). excepcao(caixa(NC,NUM,DOS,VAL)) :- caixa(NC,NUM,naoconhecida,VAL). %--------------------------------- - - - - - - - - - - - - - - - % IX caixa de pepsamar cuja dosagem nao e 500 mas e entre 250 e 700 -caixa(pepsamar,0000,500,data(17,11,2011)). excepcao(caixa(pepsamar,0000,DOS,data(17,11,2011))) :- DOS>250, DOS<700. %--------------------------------- - - - - - - - - - - - - - - - % X aero-om nao e um antibiotico mas agora ja nao se pode saber qual a categoria -medicamento(aero-om,dimeticone,antibiotico,om_pharma_sa,aerofagia). medicamento(aero-om,dimeticone,impossivel,om_pharma_sa,aerofagia). excepcao(medicamento(NC,PA,IT,LAB,AC)) :- medicamento(NC,PA,impossivel,LAB,AC). nulo(impossivel). +medicamento(NC,PA,IT,LAB,AC) :: solucoes(X,(medicamento(aero-om,dimeticone,X,om_pharma_sa,aerofagia),nao(nulo(X))),[]). %--------------------------------- - - - - - - - - - - - - - - - % XI medicamento(pantomicina,eritromicina,desconhecida,denver_farma,amigdalite). medicamento(pantomicina,eritromicina,desconhecida,denver_farma,otite). caixa(pantomicina,9876,250,data(02,01,2011)). excepcao(medicamento(pantomicina,eritromicina,desconhecida,denver_farma,amigdalite)). excepcao(medicamento(pantomicina,eritromicina,desconhecida,denver_farma,otite)). excepcao(medicamento(NC,PA,IT,LAB,AC)) :- medicamento(NC,PA,desconhecida,LAB,AC). %------------------------------------ - - - - - - - - - % XII Invariante que nao permite a inserção de caixas com numero repetido +caixa(NC,NUM,DOS,VAL)::(solucoes((NUM),caixa(A,NUM,B,C),S),comprimento(S,N),N=<1). %--------------------------------- - - - - - - - - - - - - - - - % XIII Invariante que permite a inserção de apenas 3 caixas diferentes(onde apenas pode variar o numero de caixa, dosagem e data;o nome tem d ser o mesmo-nome inequivoco) +caixa(NC,NUM2,DOS2,VAL2)::(solucoes((NC,NUM,DOS,VAL),caixa(NC,NUM,DOS,VAL),S),comprimento(S,N),N=<3). %--------------------------------- - - - - - - - - - - - - - - - % XIV Invariante que garante que para um dado nome de medicamento, todos os outros argumentos sao iguais, não permitindo que ao mesmo tempo que hajam repetições +medicamento(NC,PA,IT,LAB,AC)::(solucoes((NC,PA,IT,LAB,AC),medicamento(NC,PA,IT,LAB,AC),S),comprimento(S,N),N=<1).