graf.pro



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