Take two concrete strings: "anni" and "taz".
Feed them to CONCAT: CONCAT ("anni", "taz"
.
Concat maps this pair of points to the string "annitaz".
(Let's just say for arguments sake that I've got it back to front, though. ie. The mapping is actually to "tazanni". Even in this case, if you misused it consistently I'm pretty sure the examiners would be reasonable and agree to notice that you'd redefined the function to suit yourself - as long as you misused it consistently).
OK. Now we have a recursive definition, and lets say the generators are ab and ba.
Then further words could be made up using the function CONCAT. So you could have a word that's in your L like say "ababababab", but to generalise, let's call w any such word.
CONCAT(w,ba) could build you a new word. 'w'ab
If your string had been the one above, the new word would be "ababababab
ba".
You could also make CONCAT(ba,w) a way to generate new words. It all depends on how you want your words to look. Similarly (if necessary), CONCAT(w, some-other-concrete-generator) could be brought in (or vice versa.)
This isn't really any clearer than the answers we got back from the assignments, so it's probably not helping?