# ImplicationScopeLink

An **ImplicationScopeLink** is used by OpenCog to express **if...then...** relations. The structure of an ImplicationScopeLink is a set of predicates to be anded together (disjunct normal form), followed by one or more implicands. ImplicationScopeLinks may contain variables that are bound for the scope of the implication. They may be thought of as expressions in first-order logic; *i.e.* VariableNodes may only be grounded by nodes, not links; grounding by links is discussed below.

ImplicationLinks encode basic logical implication *P->Q*, *i.e.* **if** *P* **then** *Q* as:

## Definition

ImplicationScopeLink<variables> <implicant-predicate-body> <implicand-predicate-body>

which is equivalent to

ImplicationLink LambdaLink <variables> <implicant-predicate-body> LambdaLink <variables> <implicand-predicate-body>

Where the LambdaLinks are used as predicate constructors.

## Theory

The ArrowLink is the Curry–Howard correspondent to the ImplicationLink. That is, the ImplicationLink is designed to work with predicates, whereas the ArrowLink is designed to work with atoms in general. More narrowly, the ArrowLink is a type constructor, used to define the function type. See also currying.

## Example

Consider the English language sentence "Fido is a dog". A dependency parse of this sentence would result in the dependency graph "_subj(be,Fido) _obj(be,dog)". Suppose that, given this dependency parse, we want to conclude that "isa(dog,Fido)". In FrameNet notion, this would be:

# IF _subj(be,$var0) ^ _obj(be,$var1) THEN isa($var1, $var0)

When written out in OpenCog format, this becomes an ImplicationScopeLink

ImplicationScopeLinkVariableList TypedVariableLink VariableNode "$var0" TypeNode "ConceptNode" TypedVariableLink VariableNode "$var1" TypeNode "ConceptNode" AndLink EvaluationLink PredicateNode "_subj" ListLink ConceptNode "be" VariableNode "$var0" EvaluationLink PredicateNode "_obj" ListLink ConceptNode "be" VariableNode "$var1" EvaluationLink PredicateNode "isa" ListLink VariableNode "$var1" VariableNode "$var0"

Note that each triple was expressed in terms of EvaluationLinks. A perl script that will convert the first, short form, into the second, can be found in the source tree, at `opencog/nlp/chatbot-old/triples/rules-to-implications.pl`. Additional documentation can be found in `opencog/nlp/chatbot-old/triples/README`.

## PLN Semantics

As stated above

ImplicationScopeLink<variables> <implicant-predicate-body> <implicand-predicate-body>

is equivalent to

ImplicationLink LambdaLink <variables> <implicant-predicate-body> LambdaLink <variables> <implicand-predicate-body>

By virtue of the ImplicationLink being an extension/intensional mixed implication, it is also equivalent to

OrLink ExtensionalImplicationScopeLink <variables> <implicant-predicate-body> <implicand-predicate-body> IntensionalImplicationScopeLink <variables> <implicant-predicate-body> <implicand-predicate-body>

## Universal Conditioned Instantiation

One can directly use an ImplicationScopeLink a universal quantifier with a precondition (the implicant). The implicant indicates the domain of the quantifier, and the TV on the ImplicationLink indicates the degree of its universality within that domain.

Implication instantiation rules can be used to generate implicand instances so that the implicant instances are true (at least to some extend). The TV of the implicand is by default obtained via the PLN implication instantiation rule (TODO: create a wikipage for that rule).