TTYOFF:TRUE$
PFAFFIAN(INTEG,LIST):=BLOCK([SGN:-1,ANS:0,PDUM,LDUM],
  IF NOT (LISTP(LIST)
	  AND INTEGERP(INTEG)
	  AND INTEG>0
	  AND LENGTH(LIST)=INTEG*(INTEG+1)/2)
  THEN ERROR((ERREXP:[INTEG,LIST],"Invalid arg to PFAFFIAN.MERREXP holds the offending expression.")),
  IF INTEG =1 THEN RETURN(FIRST(LIST)),
  IF EVENP(INTEG)
  THEN RETURN(0),
  IF INTEG = 3
  THEN RETURN(LIST[1]*LIST[6]-LIST[2]*LIST[5]+LIST[3]*LIST[4])
  ELSE FOR KZERO THRU INTEG DO
	ANS:ANS+
	    INPART(LIST,KZERO)*(SGN:-SGN)*
		PFAFFIAN(INTEG-2,
			 REST(INPART(LIST,
				     APPLY(ALLBUT,
					   IF LISTP(PDUM:PFAFFM[INTEG,KZERO])
					   THEN PDUM
					   ELSE PFAFFM[INTEG,KZERO]:(LDUM:(KZERO+1)*(2*INTEG-KZERO)/2,
								     PDUM:[],
								     IF KZERO#1 THEN FOR MDUM:2 THRU KZERO DO
								       PDUM:ENDCONS(KZERO+(MDUM-1)*(2*INTEG-MDUM)/2,PDUM),
								     FOR MDUM:KZERO*(2*INTEG-KZERO+1)/2+1 THRU LDUM DO
								       PDUM:ENDCONS(MDUM,PDUM),
								     PDUM))),INTEG)),
  ANS)$
TTYOFF:FALSE$
