public static AuTerm defaultMap(AuTerm in, Map func) {
		if(in instanceof AuMeta) {
			return in;
		}else if(in instanceof AuVar) {
			AuVar term = (AuVar)in;
			return mkVarExt(term.getAnnotation(), term.getDepth(),
					func.map(term.getType()));
		}else if(in instanceof AuPi) {
			AuPi term = (AuPi)in;
			return mkPiExt(term.getAnnotation(),
					func.map(term.getBound()),
					func.map(term.getCodomain()));
		}else if(in instanceof AuLambda) {
			AuLambda term = (AuLambda)in;
			return mkLambdaExt(term.getAnnotation(),
					func.map(term.getBound()),
					func.map(term.getExpr()));
		}else if(in instanceof AuApply) {
			AuApply term = (AuApply)in;
			return mkApplyExt(term.getAnnotation(),
					func.map(term.getFunction()),
					func.map(term.getArgument()));
		}else if(in instanceof AuOperator) {
			AuOperator term = (AuOperator)in;
			AuTerm[] new_args = new AuTerm[term.numArguments()];
			for(int i = 0; i < term.numArguments(); i++)
				new_args[i] = func.map(term.getArgument(i));
			return mkOperatorExt(term.getAnnotation(),
					term.getDescriptor(), new_args);
		}else if(in instanceof AuConstant) {
			return in;
		}else throw new AssertionError("Illegal term " + in);
	}