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))$