The Concept of Concepts
I once read that Windows Vista would introduced several new system-wide concepts such as “contacts” to better support personal communication. I immediately wondered why Vista didn’t introduce the concept of a concept, so we don’t have to wait years for a new release of Windows to offer another new set of concepts. Microsoft and third-parties would be able to introduce at any time several new concepts, which would still work with existing operating systems. Later, I suspected that Windows Vista had originally planned to do so in the form of WinFS “items,” before it was postponed. For example, one of the standard items is called “Contact.”
In my long-ago post, Human-like Software, I argued that to act like a human, software needed to understand basic human concepts in order to behave intelligent:
If computers seem rigid and mechanical and not smart, today, it's because current software programs don't have these notions of these real world concepts.
I reiterated this point in my recent post “Intelligence versus Intellisense.”
I accurately model the human concepts involved in code to avoid any difference between the computer representation and reality. (A couple good examples in my code include word senses and symbolic expressions.) This often trades off performance for full fidelity.
So, I built several new data types such as words and word senses to represent these concepts, just as existing programming languages have integer and string primitives.
My product also includes a comprehensive machine-readable dictionary, just as the brain stores a myriad of word associations. I make use of the WordNet, which categorizes all English words and maintains dozens of relationships between these words, such as synonymy, hypernymy (dog IS-A animal), meronymy (finger IS-PART-OF hand). The dictionary provides a foundational set of operators to allow the manipulation of natural language algebraically. This lets the software, for instance, take an apple and an orange and refer to them collectively as “fruits.”
I also make heavy use of symbolic programming, neglected by most mainstream programming languages. Symbolic expressions can represent mathematical expressions such “x + y > 2,” which can then be manipulated algebraically. They can also succinctly represent complex naturally language expressions. For instance, I may know the word Mary and the word father, but to express the father of Mary without knowing his name, I merely composed a new expression “Of [father, Mary]” and pass that expression around as if it were a simple symbol, but with all of its relationships automatically inferred from its constituent expressions. Likewise, I can create a new pseudo-word “Anti[Microsoft]” from the parts of an unknown word “anti-Microsoft.” Expressions are very versatile: For instance, one can easily encode the ambiguity so common in natural language as “Amb[x, y].”
Symbolic programming is one of those “back to the future” advances that will eventually find its way into mainstream programming languages and libraries, but probably not until Microsoft incorporates a standard natural language library and ontology.
Symbols & Concepts
Interestingly, while my original reason for adding symbol and word datatypes to my software libraries was to provide an analog to human concepts, symbols and words (being special cases of symbols) themselves are closely related to the notion of concepts. Symbols and words typically only have a name and are used to represent a concept, in the same way that people attach names to concepts to reserve a special place in the mind, where related information is aggregated or linked to.