This document discusses abstract data types (ADTs). It defines ADTs as programmer defined data types that specify a set of values and operations that can be performed on those values, independent of implementation. Simple data types like integers are primitive, while complex types like lists can contain other values. ADTs provide abstraction by hiding implementation details and focusing on what operations can be performed. Common abstractions are procedural (using functions without knowing how) and data (separating properties from implementation). The benefits of ADTs include focusing on problem solving instead of implementation and allowing changes without modifying dependent code.