
DELINT(EXPR,VAR,[LIMITS]):=BLOCK([ARG,ARGLIST,ISD],
ARGLIST:CONS(VAR,LIMITS),
IF LENGTH(LIMITS)#0 AND LENGTH(LIMITS)#2 THEN ERROR(
"Wrong number of arguments to delint"),
IF NOT ATOM(EXPR) THEN
IF PART(EXPR,0)="+" OR (PART(EXPR,0)="-" AND LENGTH(EXPR)>1) THEN
	RETURN((APPLY(DELINT,CONS(PART(EXPR,1),ARGLIST))+APPLY
	(DELINT,CONS(EXPR-PART(EXPR,1),ARGLIST)))),
ISD:ISDELTAP(EXPR),
IF ISD=FALSE THEN RETURN(APPLY(INTEGRATE,CONS(EXPR,ARGLIST))),
ARG:RHS(PART(ISD,2)),
IF FREEOF(VAR,ARG) THEN RETURN(APPLY(INTEGRATE,CONS(EXPR,ARGLIST))),
APPLY(DELINTD,CONS(EXPR,CONS(ARG,ARGLIST))))$LOADFILE(UTILS,FASL,MPS)$

MATCHDECLARE([DUM1,DUM2],TRUE)$


DEFMATCH(ISDELTAP,DUM1*DELTA(DUM2))$
DELINTD(GRAND,ARG,VAR,[L]):=
BLOCK([PREDERROR:FALSE,PROGRAMMODE:TRUE,REST,NSOL,SOLNS,JAC,ANS],
SOLNS:MAP(RHS,SOLVE(ARG,VAR)),
IF (NSOL:LENGTH(SOLNS))=0 THEN RETURN(0)
,SOLNS:REMOVEIMAG(SOLNS),
IF LENGTH(L)=2 THEN SOLNS:REM_OUT_OF_RANGE(SOLNS,L[1],L[2]),
IF (NSOL:LENGTH(SOLNS))=0 THEN RETURN(0),
REST:GRAND/DELTA(ARG),
JAC:ABS(DIFF(ARG,VAR)),
IF LENGTH(L)=2 THEN SUM(SUBST((SOLNS[N]),VAR,REST/JAC),N,1,NSOL)
	ELSE SUM(SUBST(SOLNS[N],VAR,REST/JAC)*THETA(VAR-SOLNS[N]),N,1,NSOL))$
