 
 	public var product: (Term, Term)? {
 		return type.analysis(
-			ifVariable: const(nil),
-			ifUnit: const(nil),
 			ifConstructed: { $0.product },
-			ifUniversal: { $1.product })
+			ifUniversal: { $1.product },
+			otherwise: const(nil))
 	}
 
 	public var universal: (Set<Manifold.Variable>, Term)? {
 		return type.analysis(
-			ifVariable: const(nil),
-			ifUnit: const(nil),
-			ifConstructed: const(nil),
-			ifUniversal: unit)
+			ifUniversal: unit,
+			otherwise: const(nil))
 	}
 
 


	public var function: (Term, Term)? {
		return type.analysis(
			ifVariable: const(nil),
			ifUnit: const(nil),
			ifConstructed: { $0.function },
			ifUniversal: { $1.function })
	}

	public var sum: (Term, Term)? {

					ifSum: binary,
					ifProduct: binary)
			},
			ifUniversal: { $1 },
			otherwise: const([]))
	}

	public func instantiate(_ freshVariable: (() -> Variable)? = nil) -> Term {
		func instantiate(type: Type<Term>) -> Term {
			let binary: (Term, Term) -> (Term, Term) = { ($0.instantiate(freshVariable), $1.instantiate(freshVariable)) }
			return type.analysis(
				ifConstructed: {
					$0.analysis(
						ifUnit: Term(type),
