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