 			return name1 == name2
 		case let (.Abstraction(name1, scope1), .Abstraction(name2, scope2)):
 			return name1 == name2 && termEqual(scope1, scope2)
-		case let (.Constructor(syntax1), .Constructor(syntax2)):
+		case let (.Identity(syntax1), .Identity(syntax2)):
 			return syntaxEqual(syntax1, syntax2)
 		default:
 			return false

	}

	static func Constructor(body: AST<ABTTerm>) -> ABTTerm {
		return .In(body.foldMap { $0.freeVariables }, .Constructor(body))
	}

	var freeVariables: Set<Name> {

enum ABT<Syntax, Term> {
	case Variable(Name)
	case Abstraction(Name, Term)
	case Identity(Syntax)


	static func equal(syntaxEqual syntaxEqual: (Syntax, Syntax) -> Bool, termEqual: (Term, Term) -> Bool)(_ left: ABT, _ right: ABT) -> Bool {
