Probabilistic Logic Networks
PLN is a novel conceptual, mathematical and computational approach to uncertain inference. In order to carry out effective reasoning in real-world circumstances, AI software must robustly handle uncertainty. However, previous approaches to uncertain inference do not have the breadth of scope required to provide an integrated treatment of the disparate forms of cognitively critical uncertainty as they manifest themselves within the various forms of pragmatic inference. Going beyond prior probabilistic approaches to uncertain inference, PLN is able to encompass within uncertain logic such ideas as induction, abduction, analogy, fuzziness and speculation, and reasoning about time and causality.
The goal underlying the theoretical development of PLN has been the creation of practical software systems carrying out complex, useful inferences based on uncertain knowledge and drawing uncertain conclusions. PLN has been designed to to allow basic probabilistic inference to interact with other kinds of inference such as intensional inference, fuzzy inference, and higher-order inference using quantifiers, variables, and combinators, and be a more convenient approach than Bayes nets (or other conventional approaches) for the purpose of interfacing basic probabilistic inference with these other sorts of inference.
PLN begins with a term logic foundation, and then adds on elements of probabilistic and combinatory logic, as well as some aspects of predicate logic, to form a complete inference system, tailored for easy integration with software components embodying other (not explicitly logical) aspects of intelligence.
PLN was developed by Ben Goertzel, Matt Ikle', Izabela Goertzel and Ari Heljakka for use as a cognitive algorithm used by MindAgents within the OpenCog Core. PLN was developed originally for use within the Novamente Cognition Engine.
PLN represents truth values as intervals, but with different semantics than in Imprecise Probability Theory.
The basic goal of PLN is to provide reasonably accurate probabilistic inference in a way that is compatible with both Term Logic and Predicate Logic, and scales up to operate in real time on large dynamic knowledge bases.
The current version of PLN has been used in narrrow-AI applications such as the inference of biological hypothesis from knowledge extracted from biological texts by language processing, and to assist reinforcement learning of an embodied agent, in a simple virtual world, figure out how to play "fetch".
PLN was previously known as PTL or "Probabilistic Term Logic".
For a more thorough discussion of PLN, see Publications#PLN
The code base for PLN was written by Ari Heljakka in 2006. In 2008 Joel Pitt (with assistance with Cesar Mercondes during GSoC) have ported it from Novamente to OpenCog. Since then Nil, Jared, and others have been steadily improving it from somewhat messy research code to a stable inference engine.
In 2011, Jared implemented the algorithm in Python, which is expected to largely replace the C++ implementation moving forward. (The python implementation is sufficiently performant under cython and PyPy to do so efficiently.) See: opencog/python/logic.py
What follows will be description of the implementation as our own understanding of it grows, which will hopefully help others who wish to explore the inner workings of PLN. This is not a substitute for code documentation however!
Briefly, what each class's purpose is:
- Formula takes TruthValues as input and returns a TruthValue, and generally each is associated with a Rule.
- Rules inputs Vertexes (Handles) and returns a Vertex (Handle).
- BITNodeRoot is the main class of the backward chainer which is a Vertex Tree along with variable binding and other fancy functionality.
- The PLN_Forward_Chainer does forward chaining, using the Back Inference Tree internally.
The AtomTable and it's descendants
- DirectATW is the direct route to AtomTable.
- NormalizingATW normalizes the atoms before they are inserted to AT.
- Mindshadow is possibly obsolete.
- MindDBProxy is a NM construct, refer to NM core code docs. It should be replaced by the TLB.
- LocalATW is IIRC for debugging, and obsolete.