A declaration is code that declares an identifier and its type. A function declaration is a declaration of a function. In other words a function declaration declares the name of the function and the type of what it returns. You must declare an identifier before you can use it.
A function prototype is a declaration of a function that declares the types of the function’s parameters. These days, that’s most, if not all of them. In early versions of C, you were allowed (required) to declare a function with empty parentheses, even if the function required one or more parameters. If you did this, it was up to the programmer (you) to ensure the function was called properly, with the correct number of parameters each having the correct type. Since the C90 standard, there has been no reason to do so in new code. If the function is called in the presence of a prototype, the compiler checks to ensure the parameters are correct. The ability to declare functions the older way has been retained to support legacy code.
A function definition defines the function itself. It also acts as a declaration, and if the declaration includes the types of its parameters, a prototype as well.