# Reasoning This section provides several illustrative reasoning examples using the LNN. Each problem consists of the natural language description of the background knowledge and the query. The logical representations of the background knowledge and query follows in First-order Logic. Finally, code snippets showing the direct mapping to the LNN representation are provided. There are examples typically found in the theorem proving literature. The goal is to prove that the background knowledge entails the query. The problems can be parsed into First-order Logic using any semantic parsing modules. The output of semantic parsing is facts and rules. We extract predicates , `constants` (or `objects`) and logical connectives (→, ∀, etc.). Facts are made of predicates and `constants`. Here, we manually parse each text into FOL to illustrative theorem proving. ## Simple Geometry reasoning example The first example shows how to apply theorem proving, and LNN in particular, on a simple geometric example. The background knowledge contains some general rules about shapes of objects, and facts about some given objects. The goal is to prove geometrical properties of existing objects. ### Problem in Natural Language **Background knowledge:** All square objects are rectangular. All rectangular objects have four sides. The object `c` is a square. The object `k` is a square. **Query:** Is there any object with four sides? We extract the following predicates: `Square`, `Rectangle` and `Fourside`; and two objects (constants): `c` and `k`. ### Problem in First-order Logic **Background knowledge** ``Square(c)`` ``Square(k)`` ∀x ``Square(x) `` → ``Rectangle(x)`` ∀x ``Rectangle(x) `` → ``Fourside(x)`` **Query** ∃x ``Fourside(x)``? ### LNN Code Since the LNN has a one-to-one mapping with First-order Logic, the problem can be directly translated to the LNN representation. The following code snippet shows how to build an LNN model for the above problem and performance inference to answer queries. ```python from lnn import (Predicate, Variable, Exists, Implies, Forall, Model, Fact, World) model = Model() # Variablle x = Variable('x') # Predicate declarations square = Predicate('square') rectangle = Predicate('rectangle') foursides = Predicate('foursides') # Axioms declarations square_rect = Forall(x, Implies(square(x), rectangle(x))) rect_foursides = Forall(x, Implies(rectangle(x), foursides(x))) # Query query = Exists(x, foursides(x)) # Add predicates and rules to the model model.add_knowledge(square, rectangle, square_rect, rect_foursides, query) # Add facts to the model model.add_data({square: {'c': Fact.TRUE, 'k': Fact.TRUE}}) # Perform inference steps, facts_inferred = model.infer() # Inspect the query node print(model['foursided_objects'].true_groundings) ``` Expected output: `{'c', 'k'}` ## More complex reasoning example ### Problem in Natural Language **Background knowledge:** The law says that it is a crime for an American to sell weapons to hostile nations. The country `Nono`, an enemy of `America`, and other countries `Gotham` and `Wakanda` all have some missiles. `Nono`’s missiles were sold to it by `Colonel West`, who is American. **Query:** Prove that `Colonel West` is a criminal. We manually extract the following predicates: `Owns`, `Missile`, `American`, `Enemy`, `Weapon`, `Sells`, and `Hostile`; and the following objects: `nono`, `m1`, `m2`, `m3`, `west` and`america`. Below is the problem in FOL. ### Problem in First-order Logic `Owns(nono,m1)` `Missile(m1)` `Missile(m2)` `Missile(m3)` `American(west)` `Enemy(nono,america)` `Enemy(wakanda,america)` `Enemy(gotham,america)` ∀ x,y,z `American(x)` ∧ `Weapon(y)` ∧ `Sells(x,y,z)` ∧ `Hostile(z)` → `Criminal(x)` ∀ x `Missile(x)` ∧ `Owns(nono,x)` → `Sells(west,x,nono)` ∀ x `Missile(x)` → `Weapon(x)` ∀ x `Enemy(x,america)` → `Hostile(x)` ### LNN Code The code snippet below shows the declaration of the model and all the predicates. ```python from lnn import (Predicate, Variable, Join, And, Exists, Implies, Forall, Model, Fact, World) model = Model() # Instantiate a model. x, y, z, w = map(Variable, ['x', 'y', 'z', 'w']) # Define and add predicates to the model. owns = model['owns'] = Predicate('owns', 2) # binary predicate missile = model['missile'] = Predicate('missile') american = model['american'] = Predicate('american') enemy = model['enemy'] = Predicate('enemy', 2) hostile = model['hostile'] = Predicate('hostile') criminal = model['criminal'] = Predicate('criminal') weapon = model['weapon'] = Predicate('weapon') sells = model['sells'] = Predicate('sells', 3) # ternary predicate ``` The code snippet below shows an example of adding the background knowledge into the model. All the other rules can be added to the model similarly. ```python # Define and add the background knowledge to the model. america_enemies = ( Forall(x, Implies(enemy(x, (y, 'America')), hostile(x), ), world=World.AXIOM) ) model.add_knowledge(america_enemies) ``` The code snippet below shows how to add the query into the model. ```python # Define queries query = Exists(x, criminal(x)) model.add_knowledge(query) ``` Finally, we can add facts into the model. ```python # Add facts to model. model.set_facts({ owns: {('Nono', 'M1'): Fact.TRUE}, missile: {'M1': Fact.TRUE}, american: {'West': Fact.TRUE}, enemy: {('Nono', 'America'): Fact.TRUE}, }) ``` Then we are ready to perform inference and answer queries (aka theorem proving): ```python model.infer() print(model[query].true_groundings) ``` Expected output: `{west}`.