The recursive definition of a string: A string is either - empty (no characters) - a pair (x,s) where x is in Sigma and s is a string over Sigma Write epsilon for the empty string len(epsilon) = 0 len((x,s)) = 1 + len(s) --- Back to the array-like definition. How do we implement concatenation? We need to define the "index deference function" for the concatenation of two strings (w and v, say) to give the concatenated string c. Example concatenation: "black" "dog" --> "blackdog" w_0 ... w_{n-1} v_0 ... v_{k-1} c(i) = { w(i) if i < n { v(i-n) if i >= n