/***************************************************************************

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