 			return name == old
 				? self
 				: .Abstraction(name, body.rename(old, new))
-		case let .Constructor(syntax):
+		case let .Identity(syntax):
 			return .Constructor(syntax.map { $0.rename(old, new) })
 		}
 	}

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

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 {
