% trace domains file = valores r = real lr = r* i = integer s = symbol st = string li = i* lst = st* key = arr;aba;der;izq;ins;del;f(i);esc;otro;enter % ___________________________________________________________________________ % --------- -- -------------- database - act activa(i) act(r,r,r,r,r,r,r,r) % -(xa1,ya1,xa2,ya2,xb1,yb1,xb2,yb2) act1(i) % -(i) [contador auxiliar para las intersecciones] database - vxy % -[Datos de los ejes coordenados] vxy(i,r,r) % -(#, Vx, Vy)- predicates inter(i,i) pos(i,i) cuenta(i,i) min1(i,i,i) for(i,i,i,i) inter1 valor_n(i,i,i) cruce1 cuenta1 resta revisa_m(r,r) % (i,i) (Ma,Mb) (revisa si las rectas se cruzan) recorta(i,st,st) goal trace(off), makewindow(1,7,7,"",0,0,25,80), retractall(_,act), retractall(_,vxy), consult("val1.{v}",vxy), consult("val2.{v}",vxy), not(inter(1,2)), trace(on), inter1, readchar(_). clauses inter(K1,K2):- cuenta(K1,M1), cuenta(K2,M2), min1(M1,M2,M), vxy(K1,X1,Y1), vxy(K2,X2,Y2), retractall(act(_,_,_,_,_,_,_,_),act), asserta(act(X1,Y1,X1,Y1,X2,Y2,X2,Y2),act), !, for(2,M,N,1), valor_n(K1,N,1), valor_n(K2,N,2), cruce1, fail. cuenta(K,_):- retractall(act1(_),act), asserta(act1(0),act), vxy(K,_,_), cuenta1, fail. cuenta(_,M):- act1(M), !, retractall(act1(_),act). cuenta(_,0):- !. cuenta1:- act1(N), N + 1 = N1, retractall(act1(_),act), asserta(act1(N1),act), !. valor_n(K,N,1):- retractall(act1(_),act), asserta(act1(N),act), vxy(K,X,Y), resta, !, act(_,_,X1,Y1,X2,Y2,X3,Y3), retractall(act(_,_,_,_,_,_,_,_),act), asserta(act(X1,Y1,X,Y,X2,Y2,X3,Y3),act). valor_n(K,N,2):- retractall(act1(_),act), asserta(act1(N),act), vxy(K,X,Y), resta, !, act(X1,Y1,X2,Y2,_,_,X3,Y3), retractall(act(_,_,_,_,_,_,_,_),act), asserta(act(X1,Y1,X2,Y2,X3,Y3,X,Y),act). resta:- act1(N), N - 1 = N1, retractall(act1(_),act), asserta(act1(N1),act), N1 = 0, !. cruce1:- act(Xa1,Ya1,Xa2,Ya2,Xb1,Yb1,Xb2,Yb2), (Ya2 -Ya1) / (Xa2 - Xa1) = Ma, (Yb2 -Yb1) / (Xb2 - Xb1) = Mb, revisa_m(Ma,Mb), Ca = Xa2*Ya1 - Xa1*Ya2, Cb = Xb2*Yb1 - Xb1*Yb2, Aa = Ya2 - Ya1, Ba = Xa2 - Xa1, Ab = Yb2 - Yb1, Bb = Xb2 - Xb1, Y = ( Ab * Ca - Aa * Cb) / ( Ab * Ba - Aa * Bb ), X = ( Y * Ba - Ca ) / Aa, revisa_x(Xa1,Xa2,Xb1,Xb2,X), assertz(cruce(X,Y),act), !. min1(A,B,M):- A < B, !, M = A; B < A, !, M = B; B = A, !, M = A. for(Val,_,Val,_). % enteros for(Val,Max,I,Inc):- Val2=Val+Inc, Val2 <= Max, for(Val2,Max,I,Inc). revisa_m(Ma,Mb):- Ma = 0, Mb > 0, !; Ma = 0, Mb < 0, !; Ma < 0, Mb = 0, !; Ma < 0, Mb > 0, !; Ma > 0, Mb = 0, !; Ma > 0, Mb < 0, !. revisa_x(Xa1,Xa2,Xb1,Xb2,X):- X > Xa1, X > Xb1, X < Xa2, X < Xb2, !. inter1:- retractall(act1(_),act), asserta(act1(0),act), cruce(X,Y), cuenta1, act1(N), pos(N,R), str_real(Xst,X), str_real(Yst,Y), recorta(8,Xst,Xr), recorta(8,Yst,Yr), cursor(R,15),write(Xr), cursor(R,25), write(Yr), fail. pos(1,3):-!. pos(2,5):-!. pos(3,7):-!. pos(4,15):-!. recorta(Dig, T, T) :- str_len(T,L), L <= Dig, !. recorta(Dig,Tin,Tout) :- frontstr(Dig,Tin,Tout,_), !. % ___________________________________________________________________________ % ___________________________________________________________________________