examples/familly_tree.livemd

# Family Tree

```elixir
Mix.install([
  {:guesswork, "~> 0.5"},
  {:kino, "~> 0.13"}
],
  consolidate_protocols: false
)
```

## Build Knowledge Base

```elixir
import Guesswork.Ast

alias Guesswork.Ast.And
alias Guesswork.Ast.Fact
alias Guesswork.Answer.Result
```

Start by adding rules and concrete facts to the knowledge base, in this case parent child relationships and grandparents defines as parent relationships.

```elixir
defmodule KB do
  use Guesswork.KnowledgeBase.Collection

  deffact("parent", [:bob, :joe])
  deffact("parent", [:bob, :jean])
  deffact("parent", [:mary, :joe])
  deffact("parent", [:bobby, :jean])

  deffact("parent", [:christy, :bob])
  deffact("parent", [:lance, :bob])

  deffact("parent", [:billy, :christy])
  deffact("parent", [:meg, :lanceb])

  defrule("grandparent", [gp, gc],
    And.new([Fact.new("parent", [gp, p]), Fact.new("parent", [p, gc])]))
end
```

## Query the System

Now you can query the system.
This first query is simplier since it only asks questions of the
concrete facts stored in the knowledge base; in this case what are
bob's children.

```elixir
Guesswork.query(term(Fact.new("parent", [:bob, child])), 10, knowledge_base: KB)
```

You can also ask more complex questions, like what are all the grandparents
of joe.
You should note that the variable internal to the grandparent rule (`p`) is not
part of the final answer set.
This is because `Guesswork` respects lexical scoping of variables.

```elixir
Guesswork.query(term(Fact.new("grandparent", [gp, :joe])), 100, knowledge_base: KB)
```