A VariableNode is a kind of AnyNode used to represent a named "variable". It is meant to correspond to the ordinary notion of a "variable" symbol as commonly understood in term algebra, lambda calculus, first-orderlogic or model theory. VariableNodes are not like variables in C, C++, perl, python, java, scheme or lisp: they do not hold or contain values. Instead, they are declarative place-holders, used to locate or indicate a spot within whatever Link contains them. By definition, VariableNodes provide a name (a label) for the location that they indicate. Variables are almost always typed; truly untyped labels should use AnyNode instead. Anonymous (un-named, but typed) variables can be declared with the SignNode.
By itself, a VariableNode is untyped, and so can be thought of implicitly ranging over all possible values in some universe. Note, however, that VariableNodes don't actually, explicitly range over anything; they are just symbols that are not constants. The semantics of the symbol depends on the context, and on the evaluator that is manipulating the expressions that contain variables in them. So, for example, when used in a RuleLink, a VariableNode plays more-or-less the same role that a 'bound variable' does in lambda calculus or proof theory.
VariableNodes can be converted into constants by quoting them with a QuoteLink.
There are currently several different subsystems in OpenCog that use variables, these are:
- The query engine, which evaluates QueryLinks to find groundings for variables.
- The PLN evaluator, which works with fixed formulas that set truth values when evaluating ForAllLinks and ExistsLinks.
- The microplanner, for assembling natural-language sentences.
- The Relex2Logic layer, for converting natural-language sentences into logic expressions.
Each of these systems give a different semantics to VariableNodes.