When software applications communicate with each other, there needs to be some way to ensure that the meaning of what one application accepts as input and output is accurately conveyed to the other application. Since the applications may not use the same terms to mean the same concepts, we need a way for an application to discover what another application means when it communicates. In order for this to happen, every application needs to publicly declare exactly what terms it is using and what these terms mean; this specification is commonly referred to as the application’s ontology. Moreover, this specification must be accessible to other software applications. Thus, we require that the meaning be encoded in a formal language, which enables a given application to use automated reasoning to accurately determine the meaning of other applications’ terms. For example, if application 1 sends a message to application 2, then along with this message is a pointer to application 1’s ontology. Application 2 can look in application 1's ontology to see what the terms mean, the message is successfully communicated and the application’s task is successfully performed. Complete understanding will occur between the applications only if they share the semantics of all the terminology used in the content of the messages that they exchange or the information sources that they access.