% trace % shorttrace pide_limites,pide_real,nselec code = 2000 domains i = integer r = real s = symbol st = string c = char key = ar;ab;ins;del;f(i);esc;otro;enter li = i* lst = st* predicates a_key(key) aviso(s) aviso1(i) clear(li) d2d(st,st) % -convierte a 2 digitos (i,o)- dec(i,i,i) e_tecla(key) fill go go1 hatch inc(i,i,i) nondeterm for(i,i,i) nselec(i) pag(i) pos_sele(i,i,i,i) quita_espacios(st,st) rectifica(i,i) rectifica1(i,i) reenumera(i,i) remove(li) shift(li) sintaxis(st) write1(i,i,st) database - cata1 % - Auxiliar para eliminar duplicaciones database - pos % - Control del cursor pos(i,i) % -(ren_ant, ren_nuevo)- database - ec % - Ecuaciones seleccionadas ec(r,r,r,st,i,st,i) % -(inicio,fin,incremento,ec,#ec,archivo,linea)- database - selec % - Control de la cantidad selec(i) % -(Seleccionadas) database - error % -() error(s) % -(tipo de error) % ------------------------------------------------------------------------ % % Programa: graf.pro % Objetivo: captura y catalogo de ecuaciones % U. M. S. N. H. % ------------------------------------------------------------------------ clauses go:- retractall(_,catalogo), retractall(_,selec), retractall(_,ec), retractall(pos(_,_),pos), pag(0). go1:- shift([5]), a_key(K), e_tecla(K), !, disp, go1. go1:- !. e_tecla(esc) if retractall(_,selec), asserta(selec(0),selec), pide_limites, fail. e_tecla(esc) :- !, save("ec~.~",ec), fail. e_tecla(ar) if pos(_,Ren), Ren > 0, Ren - 1 = Renn, retractall(_,pos), asserta(pos(Ren,Renn),pos), !; !. e_tecla(ab) if pos(_,Ren), catalogo(N,"NADA"), Ren < N - 1, Ren + 1 = Renn, retractall(_,pos), asserta(pos(Ren,Renn),pos), !; !. e_tecla(ins):- catalogo(N,"NADA"), N < 8, aviso(ins), shift([5]), readln(Ec), upper_lower(Ecn1,Ec), remove([6]), Ecn >< "", sintaxis(Ecn), !, retractall(catalogo(N,"NADA"),catalogo), N + 1 = N1, asserta(catalogo(N,Ecn),catalogo), asserta(catalogo(N1,"NADA"),catalogo), pag(N1); catalogo(_,"NADA"),aviso(sintaxis), readchar(_), remove([6]), fail;retractall(_,error),!. e_tecla(del):- catalogo(N,"NADA"), N > 0, aviso(ec), !, pos(_,Ren), retractall(catalogo(Ren,_),catalogo), N2 = N - 2, N - 1 = N1, reenumera(Ren,N2), retractall(catalogo(_,"NADA"),catalogo), asserta(catalogo(N1,"NADA"),catalogo), clear([4]), pag(N1). e_tecla(f(1)):- % ayuda existfile("ayuda.hlp"), !, makewindow(6,7,7,"Ayuda",3,3,20,74,1,255,"ɻȼͺ"), file_str("ayuda.hlp",Str), display(Str),remove([6]). e_tecla(f(2)):- % salvar catalogo(9,Arch), !, aviso(almacena), retractall(catalogo(9,Arch),catalogo), % inicia filtro retractall(_,cata1), catalogo(N,"NADA"), rectifica(0,N), retractall(_,catalogo), rectifica1(0,N), save(Arch,catalogo), asserta(catalogo(9,Arch),catalogo), remove([6]). pos(_,R), catalogo(R,Ec), catalogo(9,Arch), Ec >< "NADA", str_len(Arch,Len), Len - 3 = Len1, frontstr(Len1,Arch,_,N), frontchar(N,Char,_), str_char(Str,Char), d2d(Str,N1), not(ec(0,0,0,Ec,0,_,_)), nselec(Sel), Sel <= 4, !, assertz(ec(0,0,0,Ec,0,N1,R),ec), pos_sele(Sel,Y,X1,X2), shift([2]), cursor(Y,X1), write(N1), cursor(Y,X2), write(R), shift([3]); pos(_,R), catalogo(R,Ec), catalogo(9,Arch), Ec >< "NADA", str_len(Arch,Len), Len - 3 = Len1, frontstr(Len1,Arch,_,N), frontchar(N,Char,_), str_char(Str,Char), d2d(Str,N1), not(ec(_,_,_,Ec,0,_,_)), aviso1(Sel), !, pos_sele(Sel,Y,X1,X2), shift([2]), field_str(Y,X1,2,Arc), field_str(Y,X2,1,Ea), str_int(Ea,E), retractall(ec(0,0,0,_,0,Arc,E),ec), asserta(ec(0,0,0,Ec,0,N1,R),ec), cursor(Y,X1), write(N1), cursor(Y,X2), write(R), shift([3]). retractall(_,catalogo), dir("","*.c",Arch,1,0,1), trap(consult(Arch,catalogo),_,e_tecla(f(14))), consult(Arch,catalogo), asserta(catalogo(9,Arch),catalogo), catalogo(N,"NADA"),!, remove([6]), shift([3]),pag(N); clear([6]),framewindow(112,"Error !!",255,"ɻȼͺ"), !, cursor(7,25),write("Presione cualquier tecla para continuar"), readchar(A),unreadchar(A),remove([6]),shift([3]). e_tecla(f(5)):- % crea un catalogo retractall(_,catalogo), clear([4]), retractall(_,pos), asserta(pos(0,0),pos), asserta(catalogo(0,"NADA"),catalogo), aviso(crea), for(1,100,Sal), str_int(Str,Sal), concat("cat~",Str,A1), concat(A1,".c",Arch), not(existfile(Arch)), !, remove([6]), assertz(catalogo(9,Arch),catalogo). /* OJO Se presiona [F5] y posteriormente se pulsa [INS] */ e_tecla(_):-!. write1(X,Y,M):- cursor(X,Y), write(M),!. d2d(N,N1):- str_len(N,2), N1 = N; concat("0",N,N1). nselec(S):- selec(N), N < 4, !, N + 1 = S, retractall(_,selec), asserta(selec(S),selec); selec(4), !, S = 5; retractall(_,selec), asserta(selec(1),selec), S = 1. pos_sele(N,Y,X1,X2):- N = 1, !, Y = 15, X1 = 9, X2 = 12; N = 2, !, Y = 15, X1 = 22, X2 = 25; N = 3, !, Y = 16, X1 = 9, X2 = 12; N = 4, !, Y = 16, X1 = 22, X2 = 25. reenumera(K,N):- % -(Desde,Hasta) for(K,N,Ren), Ren + 1 = R, catalogo(R,Ec), retractall(catalogo(R,Ec),catalogo), asserta(catalogo(Ren,Ec),catalogo), fail. reenumera(_,_):-!. inc(3,15,7) if !. inc(15,30,7) if !. inc(30,3,5) if !. dec(3,30,7) if !. dec(15,3,5) if !. dec(30,15,7) if !. clear([]):- !. clear([W|T]) if shiftwindow(W) and clearwindow() and !, clear(T). shift([]):- !. shift([W|T]) if shiftwindow(W) and !, shift(T). remove([]):-!. remove([C|T]):- shiftwindow(C), removewindow(),remove(T). disp:- shift([4]), not(catalogo(0,"NADA")), pos(Ra,Rn),field_attr(Ra,1,65,7), field_attr(Rn,1,65,112), !; !. aviso(K):- K = K, makewindow(6,112,112,"",15,40,4,30), fail; "ec" = K, write("Desea en realidad hacerlo?\n"), write(" (S/N) "), readchar(S), remove([6]), !, S = 'S'; "almacena" = K, !, write(" Almacenando los cambios\n"), write(" Un momento por favor ..."), field_attr(1,23,3,135); write(" Un momento por favor ..."), field_attr(1,23,3,135); write(" Termine con enter ..."); "sintaxis" = K, error(Error), !, write(" Error de sintaxis \n"), write(Error), field_attr(1,0,28,135), clear([5]); !, K = K, write(" ... \n"), write(" ... "). aviso1(Sel):- makewindow(6,112,112,"",15,40,4,30), write(" Insertarla en la no. \n"), str_char(Sel2,Sel1), str_int(Sel2,Sel), Sel >=1, Sel <=4, remove([6]); remove([6]), fail. rectifica(0,N):- % - filtra para cata1. for(0,N,K), rectifica(1,K), fail. rectifica(1,K):- catalogo(K,Ec), assertz(cata1(K,Ec),cata1), !. rectifica(_,_):- !. rectifica1(0,N):- for(0,N,K), rectifica1(1,K), fail. rectifica1(1,K):- cata1(K,Ec), assertz(catalogo(K,Ec),catalogo), !. rectifica1(_,_):- !. predicates pide_real(i,r) % - (i,o) - (ventana,valor) clauses pide_limites:- clear([4]), makewindow(10,7,0,"",4,8,2,40), field_str(1,1,28,"======= ==== == ======== ========="), makewindow(7,112,0,"",7,27,1,30), field_str(0,1,14,"Valor inicial:"), makewindow(8,112,0,"",9,27,1,30), field_str(0,1,14,"Valor final :"), makewindow(9,112,0,"",11,27,1,30), field_str(0,1,14,"Incremento :"), fail. pide_limites:- ec(0,0,0,Ecstr,0,A,B), nselec(Num), shift([10]), cursor(0,27), write(Num), shift([7]), pide_real(7,In), shift([8]), pide_real(8,Fin), shift([9]), pide_real(9,Inc), retractall(ec(0,0,0,Ecstr,0,A,B),ec), assertz(ec(In,Fin,Inc,Ecstr,0,A,B),ec), fail. pide_real(Win,Valor):- 7 = Win, clear([7]), field_str(0,1,14,"Valor inicial:"), cursor(0,16), readreal(Valor), !, cursor(0,1), write("Valor inicial: ",Valor); 8 = Win, clear([8]), field_str(0,1,14,"Valor final :"), cursor(0,16), readreal(Valor), !, cursor(0,1), write("Valor final : ",Valor); 9 = Win, clear([9]), field_str(0,1,14,"Incremento :"), cursor(0,16), readreal(Valor), !, cursor(0,1), write("Incremento : ",Valor), clear([7]), field_str(0,1,14,"Valor inicial:"), clear([8]), field_str(0,1,14,"Valor final :"), clear([9]), field_str(0,1,14,"Incremento :"). pide_real(Win,Valor):- !, pide_real(Win,Valor). predicates key(i,key) b_key(i,key) clauses /* ============== Lectura de una tecla ================== */ a_key(Key):- readchar(K), !, char_int(K,Asc), key(Asc,Key). a_key(K_):-!,a_key(K_). key(13,enter) if !. key(27,esc):-!. key(49,f(5)):-!. key(50,ins):-!. key(0,Key) if readchar(T) and char_int(T,Asc) and b_key(Asc,Key). key(_,otro) if !. b_key(72,ar):-!. b_key(80,ab):-!. b_key(77,ab):-!./*derecha*/ b_key(75,ar):-!./*izquierda*/ b_key(N,f(K)):- N >= 59, N <= 68, !, N - 58 = K. b_key(82,ins):-!. b_key(83,del):-!. b_key(_,otro):-!. for(X,_,X). for(A,B,I):- B > A, A + 1 = A1, for(A1,B,I). fill:- existfile("{f}.{f}"), !, file_str("{f}.{f}",Scr), window_str(Scr). fill:- % fill current window. makewindow(_,_,_,_,_,_,ROWS,COLS), RR=ROWS-3, CC=COLS-4, for(0,CC,COL),for(0,RR,ROW), scr_char(ROW,COL,'\176'), fail. fill:- window_str(Scr), file_str("{f}.{f}",Scr). % hatch:-!. hatch:- for(6,74,K), scr_char(11,K,'\32'),fail. hatch:- for(73,74,Col),for(2,10,Ren), scr_char(Ren,Col,'\32'), fail. hatch. /* =================== FIN ========================= */ % ------------------------- Inicio -------------------------------- predicates str_list(st,lst) parentesis(lst) operadores(lst) funciones(lst) grupo(st,lst) database - par par(i,i) % -(abre,cierra) ===> parentesis clauses pag(0):-!. pag(N):- clear([4]), N - 1 = K, for(0,K,Ren), catalogo(Ren,Ec), cursor(Ren,1), write(Ec), fail. pag(_):- retractall(_,pos),asserta(pos(0,0),pos),!. quita_espacios("",""):-!. quita_espacios(In,Out):- frontchar(In,' ',Rest),quita_espacios(Rest,Out), !; frontchar(In,Fchar,Rest), str_char(Fstr,Fchar), quita_espacios(Rest,Out1), !, concat(Fstr,Out1,Out). sintaxis(Ec):- retractall(_,error), str_list(Ec,Lista), retractall(_,par),asserta(par(0,0),par), parentesis(Lista), operadores(Lista), funciones(Lista), !. grupo(Tipo,Lista):- Tipo = "fun", Lista = ["ABS","ACOS","ASEN","ATAN","COS","COSH","EXP", "LOG","LOG10","POW10","ROUND","SEN","SENH", "SQR","SQRT","TAN","TANH","TRUNC"],!; Tipo = "num", Lista = ["1","2","3","4","5","6","7","8","9","0","."],!; Tipo = "var", Lista = ["X"],!; Tipo = "opr", Lista = ["+","-","*","/","^"],!. str_list("",[]):-!. str_list(S,[C|T]):- frontchar(S,C1,Resto), str_char(C,C1), !, str_list(Resto,T). parentesis([]):- par(A,C), asserta(error(" faltan parentesis"),error), A=C, retractall(_,error),!. parentesis(["("|T]):- !, par(A,B), retractall(_,par), 1 + A = A1, asserta(par(A1,B),par), parentesis(T). parentesis([")"|T]):- !, par(A,B), retractall(_,par), 1 + B = B1, asserta(par(A,B1),par), parentesis(T). parentesis([_|T]):- !,parentesis(T). % ===================================================================== operadores(_). funciones(_). % ===================================================================== goal makewindow(1,0,0,"",0,0,25,80), makewindow(20,7,0,"",0,0,1,80), er 1.0"), makewindow(2,7,7,"",1,0,24,80),fill,hatch,write1(18,1,"Consulta:"), field_str(13,5,18,"Ec. Seleccionadas:"), field_str(15,2,12,"(1) (00,0)"),field_str(16,2,12,"(3) (00,0)"), field_str(15,15,12,"(2) (00,0)"),field_str(16,15,12,"(4) (00,0)"), makewindow(3,7,7,"",22,5,3,70), write(" Ayuda: [F1] Salvar: [F2] Seleccionar: [F3] Salir: [esc]"), cursor(0,0),write("> "), cursor(0,1), go, go1, remove([1,20,2,3,4,5,10,7,8,9]).