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

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,_):-!.