# lim(y, x=x0) ;
#lim(k_*y_,x_=c_,d_) := If(isfree(k,x), k*lim(y,x=c,d));
#lim(k_+y_,x_=c_,d_) := If(isfree(k,x), k+lim(y,x=c,d));
#lim(y_, x_=oo) := replace(y,x=oo);


lim(y_,x_,c_):=lim(y,x=c);


#lim(a_^b_, x_=c_) := If(isfree(b,x), lim(a,x=c)^b, exp(lim(b*ln(a),x=c)));
lim(a_^b_, x_=c_) := block(f:=lim(a,x=c),g:=lim(b,x=c),if((f<>0 or f<>oo) and g<>0 or (f<>1 and g<>oo), f^g,exp(lim(b*ln(a),x=c)) ));
#lim(a_+b_, x_=c_) := block(f:=lim(a,x=c),g:=lim(b,x=c),if(f<>oo and g<> -oo, f+g ));
#lim(a_*b_, x_=c_) := block(f:=lim(a,x=c),g:=lim(b,x=c),if((f<>0 and g<>oo) or (f<>oo and g<>0), f*g ));
lim(a_*b_, x_=c_) := If(isfree(a,x), a*lim(b,x=c), If(isfree(b,x), b*lim(a,x=c), 
	block(f:=lim(a,x=c),g:=lim(a,x=c),if((f<>0 and g<>oo) or (f<>oo and g<>0), f*g ))));
lim(a_/b_, x_=c_) := If(isfree(a,x), a/lim(b,x=c), If(isfree(b,x), lim(a,x=c)/b, 
	block(f:=lim(d(a,x),x=c),g:=lim(d(b,x),x=c),if((f<>0 and g<>0) or (f<>oo and g<>oo), f/g,lim(d(a,x,2),x=c)/lim(d(b,x,2),x=c) ))));
lim(1/a_*b_, x_=c_) := If(isfree(a,x), lim(b,x=c)/a, If(isfree(b,x), b/lim(a,x=c), 
	block(f:=lim(d(a,x),x=c),g:=lim(d(b,x),x=c),if((f<>0 and g<>0) or (f<>oo and g<>oo), g/f,lim(d(b,x,2),x=c)/lim(d(a,x,2),x=c) ))));
	
lim(x_^n_*y_, x_=0) := if(n<0, d(y,x=0,-n)/(-n)!);
lim(a_*x_^n_, x_=0) := if(n<0, d(a,x=0,-n)/(-n)!);

lim((f(x_+h_)-f(x_))/h_, h_=0) := d(f(x));


lim(sum(y_,k_,a_,n_),n_=oo):=sum(y,k,a,oo);
lim(sums(y_,k_,a_,n_),n_=oo):=sum(y,k,a,oo);

#lim(x_*infsums(y_,k_),k_=oo):= If(isatom(x),x*sum(y,k,oo));
#lim(infsums(y_,k_)/x_,k_=oo):= 1/x*sum(y,k,oo);
#lim(infsums(y_,k_),k_=oo):= infsum(y,k);
#lim(infsums((-1)^(k_-1)*x_^k_/k_),k_=oo) := log(1+x);
#lim(infsums(k_*x_^(k_-1),k_),k_=oo):=1/(x-1)^2;
 
lim(x_^n_,x_=0,left) := If(n<0, If(iseven(n), oo, If(isodd(n), -inf )), If(n>0, 0));
lim(x_^n_,x_=0,right) := If(n<0,oo, If(n>0, 0));
lim(a_/x_,x_=0,left) := If(a>0,-oo,if(a<0,oo));
lim(a_/x_,x_=0,right) := If(a>0,oo,if(a<0,-oo));
lim(1/x_,x_=0) := NaN;
lim(x_/(1+x_),x_=0) := 0;
lim(1/x_*(1+x_),x_=oo) := 1;
lim(x_^x_,x_=0) :=1;
lim(x_^x_,x_=-inf):=0;

lim(x_^sin(x_),x_=0):=1;

lim((1+1/k_)^k_,k_=0,left) :=oo;
lim((1+1/k_)^k_,k_=0,right) :=1;
lim((1+k_)^(a_/k_),k_=0) :=exp(a);
lim((1+k_)^(1/k_),k_=0) :=e;
lim((1+1/k_)^k_,k_=oo) :=e;
lim((1+1/k_)^(k_*a_),k_=oo) :=exp(a);
lim((1+1/k_)^(k_*x_),k_=oo) :=exp(x);
lim((1+1/k_*x_)^(k_*a_),k_=oo) :=exp(a*x);
lim((1+x_/k_)^k_,k_=oo) :=exp(x);
lim((1+a_/k_)^k_,k_=oo) :=exp(a);
lim((1+a_/k_*x_)^k_,k_=oo) :=exp(a*x);

lim(sin(x_)/x_,x_=oo):=0;
lim(sin(1/x_)*x_,x_=oo):=1;
lim(sin(1/x_)*x_,x_=-oo):=1;
lim(sin(a_*x_)/x_,x_=0):=if(hasnot(a,x),a);
lim(sin(a_*x_)/sin(b_*x_),x_=0):=if(hasnot(a,b,x),a/b);
lim(cos(x_)/x_,x_=0,right) := oo;
lim(cos(x_)/x_,x_=0,left) := -inifity;
lim(tan(x_)/x_,x_=pi/2,right) :=-oo;
lim(tan(x_)/x_,x_=pi/2,left) :=oo;

lim(sin(x_)/x_,x_=0):=1;
lim(tan(x_)/x_,x_=0) :=1;
lim(asin(x_)/x_,x_=0):=1;
lim(atan(x_)/x_,x_=0):=1;

lim(sinh(x_)/x_,x_=0):=1;
lim(tanh(x_)/x_,x_=0):=1;
lim(asinh(x_)/x_,x_=0):=1;
lim(atanh(x_)/x_,x_=0):=1;

lim(x_*log(x_),x_=0,right) :=0;
lim(log(x_)/x_,x_=0,right) :=-oo;
lim(log(x_)/x_,x_=oo) :=0;
lim(log(1+x_)/x_,x_=0) :=1;
lim(log(1+x_)/x_,x_=oo) :=0;
lim(log(1+x_)/x_,x_=(-1),right) :=oo;
lim(log(x_),x_=0,right) := -oo;
lim(log(x_),x_=0,left) := -oo;
lim(log(x_),x_=0) := -oo;

lim(exp(x_)/x_,x_=0,right) := oo;
lim(exp(x_)/x_,x_=0,left) := -oo;
lim(exp(1/x_),x_=0,right) := oo;
lim(exp(1/x_),x_=0,left) := 0;
lim(x_*exp(1/x_),x_=0,right) := oo;
lim(x_*exp(1/x_),x_=0,left) := 0;
lim((exp(x_)-1)/x_,x_=0):=1;

lim(sin(x_),x_=c_):=sin(c);
lim(x_,x_=c_):=c;

lim(y_):=lim(y,x=0);