/*************************************************************************** MODELO "HIPOTETICO" Ejemplo: premisas = c1 c2 c3 BASE DE CONOCIMIENTO PARA EL MODELO HIPOTETICO S1,S2 --> E1 S1,S5,C6 --> E2,E6 S2,S4 --> E3 S3,S4,C7 --> E1,E4 S1,S2,S4 --> E5 C1,C2,C3 --> S1 C2,C4 --> S2 C2,C3 --> S3,S5 C1,C2,C5 --> S4 E1 --> T1,T6 E2 --> T1,T2,T5 E3,E6 --> T3 E4 --> T4 E5 --> T5 E6 --> T6 ADRIAN SILA ULLOA GONZALO VILLARREAL FARAH ****************************************************************************/ DOMAINS lista_s = s* s=symbol i = integer DATABASE - chek chek(i) consultado(s) %--------------------------------% DATABASE - traza % Base de Hechos t(s) % %--------------------------------% PREDICATES % Base Modelo Hipot‚tico base2(i,lista_s,lista_s) % Modelo Hipot‚tico hipotetico hipo(lista_s) preguntar(s) en_base(s) % - - - - - - Herramientas agrega(lista_s,lista_s) pertenece(s,lista_s) GOAL retractall(_,traza),retractall(_,chek), assertz(t(c1),traza), % assertz(t(c2),traza), % Premisas assertz(t(c3),traza), % clearwindow, hipotetico; nl,nl, t(Te),write(Te," "),fail. CLAUSES %********************************** BASE CONOCIMIENTO base2(5,[s1,s2],[e1]). base2(6,[s1,s5,c6],[e2,e6]). base2(7,[s2,s4],[e3]). base2(8,[s3,s4,c7],[e1,e4]). base2(9,[s1,s2,s4],[e5]). base2(1,[c1,c2,c3],[s1]). base2(2,[c2,c4],[s2]). base2(3,[c2,c3],[s3,s5]). base2(4,[c1,c2,c5],[s4]). base2(10,[e1],[t1,t6]). base2(11,[e2],[t1,t2,t5]). base2(12,[e3,e6],[t3]). base2(13,[e4],[t4]). base2(14,[e5],[t5]). base2(15,[e6],[t6]). %*********************** MOTOR DE INFERENCIA ************************ hipotetico:- base2(N,La,Lb), not(chek(N)),asserta(chek(N),chek), hipo(La),agrega(La,Lb),fail. hipo([]):-!. hipo([X|L]):-t(X),!,hipo(L). hipo([X|L]):-base2(N,La,Lb),not(chek(N)),pertenece(X,Lb), asserta(chek(N),chek),hipo(La),agrega(La,Lb), !,hipo(L). hipo([X|L]):- not(t(X)), not(consultado(X)), not(en_base(X)), preguntar(X),!,hipo(L). preguntar(X):- asserta(consultado(X),chek), write("\n\t\t\t\t\t\t Ud. tiene ",X," ? (s/n) "),readchar(S), !,S='s',write("si"),assertz(t(X),traza). en_base(X):-base2(_,_,Lb),pertenece(X,Lb),!. % -------------------------------------------- Herramientas agrega(La,[]):-write("\n Por tener: ",La,"...enter."),readchar(_),!. agrega(La,[X|L]):- not(t(X)),assertz(t(X),traza), write("\n Se deduce: ",X),!,agrega(La,L). agrega(La,[_|L]):-!,agrega(La,L). pertenece(X,[X|_]):-!. pertenece(X,[_|L]):-!,pertenece(X,L).