/***************************************************************************
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).