If one considers the “act” of software development in its entirety, one would realise that we are simply striving to translate an idea conceived in the human mind, into something that can be executed on a computer, i.e. “a program”.
The problem arises because of the vast disparity between two. The human mind is a inconceivably powerful information processor, whereas our current CPUs are simpletons, only capable of churning zeros and ones (binary – i.e. 1GL) in a repetitive manner.
To bridge this cap, we have extended the cognitive (i.e. understanding) abilities of our computers by first introducing the second generation languages (2GL e.g. Assembly Language), and then later our currently used third generation languages (3GL e.g. Java, C#, etc.).
However, a problem still exists in translating our sophisticated mental ideas and constructs, into simple constructs that cab be understood by third generation compliers. So we (i.e. the Software Engineering world) have introduced an intermediate cognitive step, and called it a MODEL, which is intended to provide an appropriate framework in which to think, prior to coding the actual system/solution.
This is also a common practice in other disciplines such as architecture and engineering, where plans or blueprints are drawn up prior to the building of the actual structure.
Secondly, a prototype is simply a mock-up of the envisaged software system/solution – and should always be thrown away and never form the actual code base of the system being developed.
It usually adds value by providing a means to clarify the requirements of the intended system with the users, prior to starting the actual coding of the system.