ELIMINATE(EQNS,VARS):=BLOCK([TEQNS,SV,SE,L,FLAG,DISPFLAG], MODEDECLARE([L,I],fixnum,FLAG,BOOLEAN),FLAG:DISPFLAG:FALSE, IF NOT (LISTP(EQNS) AND LISTP(VARS)) THEN ERROR("THE ARGUMENTS MUST BOTH BE LISTS"), IF LENGTH(VARS)>L:LENGTH(EQNS) THEN ERROR("MORE VARIABLES THEN EQUATIONS"), IF L=1 THEN ERROR("CAN'T ELIMINATE FROM ONLY ONE EQUATION"), IF LENGTH(VARS)=L THEN (VARS:REVERSE(VARS),SV:VARS[1], VARS:REVERSE(REST(VARS)),FLAG:TRUE), /* ?meqhk turns [a=b] into [a-b] */ EQNS:MAP('?MEQHK,EQNS), FOR V IN VARS DO ( TEQNS:[], FOR J:1 THRU L WHILE(FREEOF(V,FIRST(EQNS))) DO( TEQNS:CONS(FIRST(EQNS),TEQNS), EQNS:REST(EQNS)), IF EQNS=[] THEN EQNS:TEQNS ELSE (TEQNS:APPEND(TEQNS,REST(EQNS)), EQNS:FIRST(EQNS), L:L-1, SE:[], FOR J:1 THRU L DO SE:CONS(RESULTANT(EQNS,TEQNS[J],V),SE), EQNS:SE)), IF FLAG THEN [RHS(apply('EV,[LAST(SOLVE(EQNS[1],SV)),EVAL]))] ELSE EQNS)$