# opennars/opennars architecture

> Architecture diagram of the GitHub repository opennars/opennars, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-10-01). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/opennars/opennars
- Repository: https://github.com/opennars/opennars

## Overview

OpenNARS is a general-purpose non-axiomatic reasoning engine. Users or environments submit Narsese tasks; the core parses and queues them, cycles through concept and task selection, performs inference, and emits answers or operation results. The README also describes temporal reasoning and goal execution. The graph follows documented control flow and the available source references; several domain branches are represented at directory level because their implementations were not excerpted.

Main entry points: [`src/main/java/org/opennars/main/Nar.java`](https://github.com/opennars/opennars/blob/master/src/main/java/org/opennars/main/Nar.java) (NAR runtime), [`src/main/java/org/opennars/storage/Memory.java`](https://github.com/opennars/opennars/blob/master/src/main/java/org/opennars/storage/Memory.java) (Memory and task buffer), [`src/main/java/org/opennars/control/GeneralInferenceControl.java`](https://github.com/opennars/opennars/blob/master/src/main/java/org/opennars/control/GeneralInferenceControl.java) (Working-cycle control), [`src/main/java/org/opennars/inference/RuleTables.java`](https://github.com/opennars/opennars/blob/master/src/main/java/org/opennars/inference/RuleTables.java) (Inference rules)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_interface["Input and output"]
  node_parser["Narsese parser<br/>[Narsese.java]"]
  node_events["Event system<br/>[EventEmitter.java]"]
  node_output["Answer and text output"]
end

subgraph group_control["Reasoning control"]
  node_nar["NAR runtime<br/>[Nar.java]"]
  node_cycle["Working-cycle control"]
  node_temporal["Temporal control"]
  node_process["Task processing"]
end

subgraph group_inference["Inference"]
  node_context["Derivation context"]
  node_rules["Inference rules<br/>[RuleTables.java]"]
  node_budget["Budget functions"]
  node_truth["Truth functions"]
  node_temprules["Temporal rules<br/>[TemporalRules.java]"]
  node_terms["Narsese term model<br/>[CompoundTerm.java]"]
end

subgraph group_memory["Knowledge memory"]
  node_tasks["Task representations<br/>[Task.java]"]
  node_concept["Concepts and links<br/>[Concept.java]"]
  node_memory[("Memory and task buffer<br/>[Memory.java]")]
  node_bag["Priority selection<br/>[Bag.java]"]
end

subgraph group_extensions["Actions and extensions"]
  node_operator["Operators<br/>[Operator.java]"]
  node_plugins["Plugins<br/>[Plugin.java]"]
  node_mental["Mental plugins"]
  node_perception["Perception channels"]
end

node_user(("User / environment"))

node_user -->|"submits tasks"| node_nar
node_nar -->|"parses input"| node_parser
node_parser -->|"produces tasks"| node_tasks
node_nar -.->|"queues tasks"| node_memory
node_nar -->|"runs cycles"| node_cycle
node_cycle -->|"selects from"| node_memory
node_memory -->|"prioritizes items"| node_bag
node_memory -->|"retrieves concepts"| node_concept
node_cycle -->|"selects task links"| node_concept
node_cycle -->|"sets derivation context"| node_context
node_cycle -->|"dispatches inference"| node_rules
node_rules -.->|"derives tasks"| node_context
node_context -->|"adds derived tasks"| node_memory
node_context -->|"uses truth values"| node_truth
node_rules -->|"uses budgets"| node_budget
node_rules -->|"applies temporal rules"| node_temprules
node_temporal -->|"applies temporal inference"| node_temprules
node_rules -->|"operates on terms"| node_terms
node_concept -->|"processes task types"| node_process
node_nar -->|"emits events"| node_events
node_events -->|"dispatches output"| node_output
node_output -->|"reports answers"| node_user
node_memory -->|"stores operators"| node_operator
node_nar -->|"registers plugins"| node_plugins
node_plugins -.->|"includes implementations"| node_mental
node_nar -->|"accepts sensory channels"| node_perception
node_operator -.->|"executes operations"| node_user

click node_nar "https://github.com/opennars/opennars/blob/master/src/main/java/org/opennars/main/Nar.java"
click node_parser "https://github.com/opennars/opennars/blob/master/src/main/java/org/opennars/io/Narsese.java"
click node_tasks "https://github.com/opennars/opennars/blob/master/src/main/java/org/opennars/entity/Task.java"
click node_cycle "https://github.com/opennars/opennars/blob/master/src/main/java/org/opennars/control/GeneralInferenceControl.java"
click node_temporal "https://github.com/opennars/opennars/blob/master/src/main/java/org/opennars/control/TemporalInferenceControl.java"
click node_concept "https://github.com/opennars/opennars/blob/master/src/main/java/org/opennars/entity/Concept.java"
click node_memory "https://github.com/opennars/opennars/blob/master/src/main/java/org/opennars/storage/Memory.java"
click node_bag "https://github.com/opennars/opennars/blob/master/src/main/java/org/opennars/storage/Bag.java"
click node_context "https://github.com/opennars/opennars/blob/master/src/main/java/org/opennars/control/DerivationContext.java"
click node_rules "https://github.com/opennars/opennars/blob/master/src/main/java/org/opennars/inference/RuleTables.java"
click node_budget "https://github.com/opennars/opennars/blob/master/src/main/java/org/opennars/inference/BudgetFunctions.java"
click node_truth "https://github.com/opennars/opennars/blob/master/src/main/java/org/opennars/inference/TruthFunctions.java"
click node_temprules "https://github.com/opennars/opennars/blob/master/src/main/java/org/opennars/inference/TemporalRules.java"
click node_terms "https://github.com/opennars/opennars/blob/master/src/main/java/org/opennars/language/CompoundTerm.java"
click node_process "https://github.com/opennars/opennars/tree/master/src/main/java/org/opennars/control/concept"
click node_events "https://github.com/opennars/opennars/blob/master/src/main/java/org/opennars/io/events/EventEmitter.java"
click node_output "https://github.com/opennars/opennars/blob/master/src/main/java/org/opennars/io/events/TextOutputHandler.java"
click node_operator "https://github.com/opennars/opennars/blob/master/src/main/java/org/opennars/operator/Operator.java"
click node_plugins "https://github.com/opennars/opennars/blob/master/src/main/java/org/opennars/plugin/Plugin.java"
click node_mental "https://github.com/opennars/opennars/tree/master/src/main/java/org/opennars/plugin/mental"
click node_perception "https://github.com/opennars/opennars/tree/master/src/main/java/org/opennars/plugin/perception"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_parser,node_events,node_output,node_user toneBlue
class node_nar,node_cycle,node_temporal,node_process toneAmber
class node_context,node_rules,node_budget,node_truth,node_temprules,node_terms toneMint
class node_tasks,node_concept,node_memory,node_bag toneRose
class node_operator,node_plugins,node_mental,node_perception toneIndigo
```

## Components

### Input and output

- [Narsese parser](https://github.com/opennars/opennars/blob/master/src/main/java/org/opennars/io/Narsese.java): `src/main/java/org/opennars/io/Narsese.java`
- [Event system](https://github.com/opennars/opennars/blob/master/src/main/java/org/opennars/io/events/EventEmitter.java): `src/main/java/org/opennars/io/events/EventEmitter.java`
- [Answer and text output](https://github.com/opennars/opennars/blob/master/src/main/java/org/opennars/io/events/TextOutputHandler.java): `src/main/java/org/opennars/io/events/TextOutputHandler.java`

### Reasoning control

- [NAR runtime](https://github.com/opennars/opennars/blob/master/src/main/java/org/opennars/main/Nar.java): `src/main/java/org/opennars/main/Nar.java`
- [Working-cycle control](https://github.com/opennars/opennars/blob/master/src/main/java/org/opennars/control/GeneralInferenceControl.java): `src/main/java/org/opennars/control/GeneralInferenceControl.java`
- [Temporal control](https://github.com/opennars/opennars/blob/master/src/main/java/org/opennars/control/TemporalInferenceControl.java): `src/main/java/org/opennars/control/TemporalInferenceControl.java`
- [Task processing](https://github.com/opennars/opennars/tree/master/src/main/java/org/opennars/control/concept): `src/main/java/org/opennars/control/concept`

### Inference

- [Derivation context](https://github.com/opennars/opennars/blob/master/src/main/java/org/opennars/control/DerivationContext.java): `src/main/java/org/opennars/control/DerivationContext.java`
- [Inference rules](https://github.com/opennars/opennars/blob/master/src/main/java/org/opennars/inference/RuleTables.java): `src/main/java/org/opennars/inference/RuleTables.java`
- [Budget functions](https://github.com/opennars/opennars/blob/master/src/main/java/org/opennars/inference/BudgetFunctions.java): `src/main/java/org/opennars/inference/BudgetFunctions.java`
- [Truth functions](https://github.com/opennars/opennars/blob/master/src/main/java/org/opennars/inference/TruthFunctions.java): `src/main/java/org/opennars/inference/TruthFunctions.java`
- [Temporal rules](https://github.com/opennars/opennars/blob/master/src/main/java/org/opennars/inference/TemporalRules.java): `src/main/java/org/opennars/inference/TemporalRules.java`
- [Narsese term model](https://github.com/opennars/opennars/blob/master/src/main/java/org/opennars/language/CompoundTerm.java): `src/main/java/org/opennars/language/CompoundTerm.java`

### Knowledge memory

- [Task representations](https://github.com/opennars/opennars/blob/master/src/main/java/org/opennars/entity/Task.java): `src/main/java/org/opennars/entity/Task.java`
- [Concepts and links](https://github.com/opennars/opennars/blob/master/src/main/java/org/opennars/entity/Concept.java): `src/main/java/org/opennars/entity/Concept.java`
- [Memory and task buffer](https://github.com/opennars/opennars/blob/master/src/main/java/org/opennars/storage/Memory.java): `src/main/java/org/opennars/storage/Memory.java`
- [Priority selection](https://github.com/opennars/opennars/blob/master/src/main/java/org/opennars/storage/Bag.java): `src/main/java/org/opennars/storage/Bag.java`

### Actions and extensions

- [Operators](https://github.com/opennars/opennars/blob/master/src/main/java/org/opennars/operator/Operator.java): `src/main/java/org/opennars/operator/Operator.java`
- [Plugins](https://github.com/opennars/opennars/blob/master/src/main/java/org/opennars/plugin/Plugin.java): `src/main/java/org/opennars/plugin/Plugin.java`
- [Mental plugins](https://github.com/opennars/opennars/tree/master/src/main/java/org/opennars/plugin/mental): `src/main/java/org/opennars/plugin/mental`
- [Perception channels](https://github.com/opennars/opennars/tree/master/src/main/java/org/opennars/plugin/perception): `src/main/java/org/opennars/plugin/perception`

### Other components

- **User / environment**

## Connections

- User / environment → NAR runtime: submits tasks
- NAR runtime → Narsese parser: parses input (evidence: `src/main/java/org/opennars/main/Nar.java`)
- Narsese parser → Task representations: produces tasks
- NAR runtime → Memory and task buffer: queues tasks (evidence: `src/main/java/org/opennars/main/Nar.java`)
- NAR runtime → Working-cycle control: runs cycles (evidence: `src/main/java/org/opennars/control/GeneralInferenceControl.java`)
- Working-cycle control → Memory and task buffer: selects from (evidence: `src/main/java/org/opennars/control/GeneralInferenceControl.java`)
- Memory and task buffer → Priority selection: prioritizes items (evidence: `src/main/java/org/opennars/storage/Memory.java`)
- Memory and task buffer → Concepts and links: retrieves concepts (evidence: `src/main/java/org/opennars/storage/Memory.java`)
- Working-cycle control → Concepts and links: selects task links (evidence: `src/main/java/org/opennars/control/GeneralInferenceControl.java`)
- Working-cycle control → Derivation context: sets derivation context (evidence: `src/main/java/org/opennars/control/GeneralInferenceControl.java`)
- Working-cycle control → Inference rules: dispatches inference (evidence: `src/main/java/org/opennars/control/GeneralInferenceControl.java`)
- Inference rules → Derivation context: derives tasks (evidence: `src/main/java/org/opennars/inference/RuleTables.java`)
- Derivation context → Memory and task buffer: adds derived tasks (evidence: `src/main/java/org/opennars/control/DerivationContext.java`)
- Derivation context → Truth functions: uses truth values (evidence: `src/main/java/org/opennars/control/DerivationContext.java`)
- Inference rules → Budget functions: uses budgets (evidence: `src/main/java/org/opennars/inference/RuleTables.java`)
- Inference rules → Temporal rules: applies temporal rules (evidence: `src/main/java/org/opennars/inference/RuleTables.java`)
- Temporal control → Temporal rules: applies temporal inference (evidence: `src/main/java/org/opennars/control/TemporalInferenceControl.java`)
- Inference rules → Narsese term model: operates on terms (evidence: `src/main/java/org/opennars/inference/RuleTables.java`)
- Concepts and links → Task processing: processes task types (evidence: `src/main/java/org/opennars/entity/Concept.java`)
- NAR runtime → Event system: emits events (evidence: `src/main/java/org/opennars/main/Nar.java`)
- Event system → Answer and text output: dispatches output
- Answer and text output → User / environment: reports answers
- Memory and task buffer → Operators: stores operators (evidence: `src/main/java/org/opennars/storage/Memory.java`)
- NAR runtime → Plugins: registers plugins (evidence: `src/main/java/org/opennars/interfaces/Pluggable.java`)
- Plugins → Mental plugins: includes implementations (evidence: `src/main/java/org/opennars/plugin/mental/InternalExperience.java`)
- NAR runtime → Perception channels: accepts sensory channels (evidence: `src/main/java/org/opennars/main/Nar.java`)
- Operators → User / environment: executes operations
