/************************************************************************ 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******************************\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(""),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??????????????"),!. 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,_):-!.