Domains are just a collection of numbers that are within the parameters we want. So lets say you have a dice. That dice domain is 1-6. It's lower limit is 1 and upper limit is 6, these limits are called Bounds. Curves and surfaces have domains. A simple line has a domain of 0 - 1. If I wanted to make make a sub curve of that line, I can tell Grasshopper, I want a subcurve in the domain .3 to .7. This would shorten the curve on both sides.
In math domains are incredibly important and valuable. It is the basis of scaling. Lets imagine we have a dice with 10 sides. You roll the dice 5 times and you get 7, 6, 8, 5, 6. The domain of that dice is 1-10 so we got 5 random numbers in that domain. Now these numbers are relative to each other and their domain. So if I take this information remap it to another domain, let's say 0-100, my numbers will become 70, 60, 80, 50 and 60. Here is an example of what that looks like.
Culling is just removing data you don't want. If we go back to our simple Dice example, we can simplify the concept. I am using a Larger Than component to figure out which numbers are great than 5. This give me a culling pattern I can use to separate the data. I can use the Cull Pattern component to remove all the unwanted numbers. In this case only 5 didn't meet the condition. So once I run it though the Cull Pattern component, my 5 is removed. I can also use a components called Dispatch to separate the list into those who passed and didn't.