NONZEROANDFREEOF(XARGUMENTX, BARGUMENTE) := IS(EARGUMENTE # 0 AND FREEOF(XARGUMENTX, EARGUMENTE))$ MATCHDECLARE(AARGUMENTA, NONZEROANDFREEOF(XARGUMENTX), BARGUMENTB, FREEOF(XARGUMENTX))$ DEFMATCH(LINEAR, AARGUMENTA*XARGUMENTX+BARGUMENTB, XARGUMENTX)$ ANTID(FN, VAR, UNK) := BLOCK( [LCLVARIABLELCL, DVARIABLED, AARGUMENTA, BARGUMENTB, TVARIABLET, UVARIABLEU, KILLER], DVARIABLED : DERIVDEGREE(FN, UNK, VAR), IF DVARIABLED = 0 THEN ( TVARIABLET : INTEGRATE(FN, VAR), IF NOT FREEOF(NOUNIFY(INTEGRATE), TVARIABLET) THEN RETURN([0, FN]) ELSE RETURN([TVARIABLET, 0]) ), UVARIABLEU : DIFF(UNK, VAR, DVARIABLED), KILLER(EARGUMENTE) := IF HIPOW(EARGUMENTE, UVARIABLEU) <= 1 THEN EARGUMENTE ELSE 0, IF LINEAR(FN, UVARIABLEU) = FALSE THEN ( TVARIABLET : EXPAND(FN), IF PART(TVARIABLET, 0) # "+" THEN RETURN([0, TVARIABLET]), AARGUMENTA : MAP(KILLER, TVARIABLET), RETURN(ANTID(AARGUMENTA, VAR, UNK)+[0, RATSIMP(FN-AARGUMENTA)]) ), TVARIABLET : SUBST(DIFF(UNK, VAR, DVARIABLED-1), LCLVARIABLELCL, INTEGRATE(SUBST(LCLVARIABLELCL, DIFF(UNK, VAR, DVARIABLED-1), EXPAND(AARGUMENTA)), LCLVARIABLELCL)), IF NOT FREEOF(NOUNIFY(INTEGRATE), TVARIABLET) THEN RETURN([0, AARGUMENTA*UVARIABLEU]+ANTID(BARGUMENTB, VAR, UNK)), RETURN([TVARIABLET, 0]+ANTID(RATSIMP(FN-DIFF(TVARIABLET, VAR)), VAR, UNK)) )$ ANTIDIFF(FN, VAR, UNK) := BLOCK( [TVARIABLET], TVARIABLET : ANTID(FN, VAR, UNK), RETURN(PART(TVARIABLET, 1)+'INTEGRATE(PART(TVARIABLET, 2), VAR)) )$