/************************************************************************
PROCESAMIENTO
*************************************************************************
BASE DE DATOS EXTERNA
---------------------
PROGRAMA EJEMPLO "SISTEMABASE"
La estructura de la BASE EXTERNA fue concebida con la
intencion de almacenar y administrar informacion relevante
de las actividades laborales del personal de la empresa XXX.
La informacion que describe a cada empleado esta organi-
zada por medio de un Codigo, su Nombre completo y las Obser-
vaciones que especifican su actividad.
Ademas es distribuida esta informacion a traves del
cargo que desempeña cada integrante de la empresa.
BASE EXTERNA
Chains --------> "director"
(cargo) persona(123,"Matias Kaler H.","Dirije las....")
persona(201,"Hernan .... .","Realiza acti....")
Terms ---------> ....
(persona) ....
"coordinador"
Ref = Posicion persona(504,".......","........")
o direccion persona(613,".......","........")
que ocupa un ....
term dentro ....
de un Chain.
"junior"
persona(...,".......","........")
....
....
....
***************************************************************************/
DOMAINS
db_selector = base % Selector, indispensable para una Base Ex. %
personas = persona(codigo,nombre,observacion)
codigo = integer
nombre,observacion = string
lista = cargo*
cargo = string
teclado = enter; esc; arriba; abajo;
derecha; izquierda; letra(CHAR); otro
DATABASE % Uso de una base auxiliar, Base Interna. %
archivo(string)
posicion(integer)
PREDICATES
menu
opcion(char)
datos(char)
dat_b(string)
cargo(lista,teclado,string)
dat_c(cargo,personas,ref)
dat_c2(teclado,personas,ref,personas,ref).
inverso(char)
inv(char,integer)
muestra(personas)
ponl(integer,integer)
lugar(lista,integer,string)
largo(lista,integer)
repite
readkey(teclado)
readkey1(integer,char,teclado)
readkey2(teclado,integer)
GOAL menu.
CLAUSES
menu:- repite, retractall(_),asserta(posicion(1)),
makewindow(1,7,112," SISTEMA - BASES ",6,20,10,40),
write("\n a :- Crea BASE EXTERNA. "),
write("\n b :- Modifica BASE EXTERNA."),
write("\n c :- fin Sistema - Bases. "),
write("\n\n\t Opci¢n: "),
readchar(C),removewindow,opcion(C).
opcion('a'):- makewindow(2,7,7,"",10,20,3,40),
write("Ingrese el nombre: "),readln(A),
db_create(base,A,in_file),
% Crea una Base Ex. in_file (en disco). %
asserta(archivo(A)),removewindow,!,opcion('b').
opcion('b'):- not(archivo(_)),
makewindow(3,7,7," DIRECTORIO ",6,12,13,50),
dir("","e:*.*",A),
% Hacemos uso del directorio incorporado a Prolog. %
db_open(base,A,in_file),
% Abre una Base Ex. que se encuentra en disco. %
asserta(archivo(A)),removewindow,!,opcion('b').
opcion('b'):- archivo(A),makewindow(4,7,7," MANEJO DE DATOS ",8,0,11,38),
write("\n a :- Visualiza ",A,"."),
write("\n b :- Agrega cargo - persona. "),
write("\n c :- Modifica persona. "),
write("\n d :- Borra persona. "),
write("\n e :- Borra cargo. "),
write("\n f :- Men£ principal. "),
write("\n\n Opci¢n: "),
inverso(C),!,datos(C).
opcion('c'):-!.
datos('a'):-makewindow(5,7,112,"",0,39,25,41),
db_statistics(base,NT,MN,ED,_),
% Proporciona informaci¢n actual de la base. %
archivo(A),
write("\n BASE EXTERNA : ",A),
write("\n Numero total de terminos: ",NT),
write("\n Memoria necesaria en RAM: ",MN),
write("\n Bytes de espacio en disco: ",ED),
write("\n\n******************************<Enter>\n"),
readchar(_),
db_chains(base,Cargo),
% Entrega los Chains {Cargo} existentes en base. %
chain_terms(base,Cargo,personas,Persona,_),
% Entrega los terminos {Persona}. %
write("\n Cargo: ",Cargo),
muestra(Persona),
readchar(_),fail.
% Se activa el backtrack, muestra toda la base. %
datos('b'):-makewindow(5,7,112,"",0,39,10,41),
write("\n Ingrese el cargo: "),
dat_b(Cargo),
write("\n Codigo: "),readint(Cod),
write("\n Nombre: "),readln(Nom),
write("\n Obs...."),
makewindow(5,7,112,"",11,39,10,41),
edit("",SO),removewindow,
% Hacemos uso del editor incorporado a Prolog. %
chain_insertz(base,Cargo,personas,persona(Cod,Nom,SO),_),
% Agrega un term al final del chain especificado. %
fail.
datos('c'):-makewindow(5,7,112,"",0,39,5,41),
write("\n Ingrese el cargo: "),
dat_b(Cargo),
dat_c(Cargo,persona(C,N,OBS1),Ref),
makewindow(6,7,112,"",12,39,10,41),
edit(OBS1,OBS2),removewindow,removewindow,
term_replace(base,personas,Ref,persona(C,N,OBS2)),
% Reemplaza el term especificado en el Ref por otro term. %
fail.
datos('d'):-makewindow(5,7,112,"",0,39,5,41),
write("\n Ingrese el cargo: "),
dat_b(Cargo),
dat_c(Cargo,_,Ref),removewindow,
term_delete(base,Cargo,Ref),
% Borra el term indicado por el chain {Cargo} y el Ref. %
fail.
datos('e'):-makewindow(5,7,112,"",0,39,5,41),
dat_b(Cargo),
chain_delete(base,Cargo),
% Elimina un chain determinado con todos los terms incluidos. %
fail.
datos('f'):-write("<Enter>"),db_close(base),
readchar(_),removewindow,!,fail.
datos(_):-removewindow,removewindow,!,opcion('b').
dat_b(Cargo):-findall(X,db_chains(base,X),LC),
posicion(P),lugar(LC,P,Cm),write(Cm),
cursor(0,0),write("[^] [v]"),
cursor(1,19),
repite,readkey(K),cargo(LC,K,Cargo),!;
readln(Cargo),!.
cargo(LC,arriba,""):-posicion(P),Pm=P-1,largo(LC,L),ponl(Pm,L),
lugar(LC,Pm,Cm),write(" "),
cursor(1,19),write(Cm),cursor(1,19),!,fail.
cargo(LC,abajo,""):-posicion(P),Pm=P+1,largo(LC,L),ponl(Pm,L),
lugar(LC,Pm,Cm),write(" "),
cursor(1,19),write(Cm),cursor(1,19),!,fail.
cargo(LC,enter,C):-posicion(P),lugar(LC,P,C),cursor(2,1),!.
cargo(_,letra(_),C):-write(" "),cursor(1,19),
readln(A),C=A,cursor(2,1),!.
dat_c(Cargo,Persona,Ref):-
makewindow(6,7,112,"",6,39,15,41),
chain_first(base,Cargo,R1),
% R1 = primer ref del chain especificado. %
ref_term(base,personas,R1,P1),
% Captura el term P1 por medio del ref R1. %
muestra(P1),write("[<°°] [°°>]"),
readkey(K),
% Clausula que lee el teclado. %
!,dat_c2(K,P1,R1,Persona,Ref).
dat_c2(derecha,_,R1,Persona,Ref):-
chain_next(base,R1,R2),
% R2 es el ref siguiente del ref R1. %
clearwindow,
ref_term(base,personas,R2,P2),
muestra(P2),write("[<°°] [°°>]"),
readkey(K),
!,dat_c2(K,P2,R2,Persona,Ref).
dat_c2(izquierda,_,R1,Persona,Ref):-
chain_prev(base,R1,R2),
% R2 es el ref anterior del ref R1. %
clearwindow,
ref_term(base,personas,R2,P2),
muestra(P2),write("[<°°] [°°>]"),
readkey(K),
!,dat_c2(K,P2,R2,Persona,Ref).
dat_c2(enter,P1,R1,P1,R1):-!.
dat_c2(esc,A,B,A,B):-removewindow,!,fail.
dat_c2(_,P1,R1,Persona,Ref):-readkey(K),
!,dat_c2(K,P1,R1,Persona,Ref).
% - - - - - - - - - - - - - HERRAMIENTAS - - - - - - - - - - - - - - - - - -
inverso(C):-repite,readchar(C),inv(C,F),field_attr(F,1,34,112),!.
inv('a',1):-!. inv('b',2):-!. inv('c',3):-!.
inv('d',4):-!. inv('e',5):-!. inv('f',6):-!.
muestra(persona(Cod,Nom,Obs)):-
write("\n Codigo: ",Cod,"\n Nombre: ",Nom,"\n Obs: \n",Obs),
write("\n??????????????<Enter>"),!.
ponl(P,L):-P>0,P<=L,retractall(posicion(_)),asserta(posicion(P)),!.
lugar([X|_],1,X):-!.
lugar([_|L],N,X):-P=N-1,!,lugar(L,P,X).
largo([],0):-!.
largo([_|L],P):-!,largo(L,R),P=R+1.
repite. % Tecnica que controla el backtracking. %
repite:-repite.
% Lectura del teclado. %
readkey(K):-readchar(A),char_int(A,VAL),readkey1(VAL,A,K),!.
readkey1(0,_,K):-readchar(B),char_int(B,I),readkey2(K,I),!.
readkey1(13,_,enter):-!.
readkey1(_,L,letra(L)):-!.
readkey2(arriba,72):-!.
readkey2(abajo,80):-!.
readkey2(derecha,77):-!.
readkey2(izquierda,75):-!.
readkey2(otro,_):-!.