 	public func analysis<T>(
 		ifType: (() -> T)? = nil,
 		ifBound: (Int -> T)? = nil,
+		ifFree: (Int -> T)? = nil,
 		ifPi: ((Value, Value -> Value?) -> T)? = nil,
 		ifSigma: ((Value, Value -> Value?) -> T)? = nil,
 		@noescape otherwise: () -> T) -> T {
 		return analysis(
 			ifType: { ifType?() ?? otherwise() },
 			ifBound: { ifBound?($0) ?? otherwise() },
+			ifFree: { ifFree?($0) ?? otherwise() },
 			ifPi: { ifPi?($0) ?? otherwise() },
 			ifSigma: { ifSigma?($0) ?? otherwise() })
 	}


	case Type
	case Bound(Int)
	case Pi(Box<Value>, Value -> Value?)
	case Sigma(Box<Value>, Value -> Value?)
}

			return ifType()
		case let .Bound(n):
			return ifBound(n)
		case let .Free(n):
			return ifFree(n)
		case let .Pi(type, body):
			return ifPi(type.value, body)
		case let .Sigma(type, body):
