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