Metadata-Version: 2.4
Name: pyagentprolog
Version: 1.0.1
Summary: A Prolog engine in Python with agents, tracing, and semantic unification.
Author-email: Andrey Vorfolomeev <binom0x@proton.me>
License-Expression: MIT
Project-URL: Homepage, https://github.com/binom0x/pyagentprolog
Project-URL: Repository, https://github.com/binom0x/pyagentprolog.git
Keywords: prolog,logic-programming,ai,agents,expert-system
Classifier: Development Status :: 4 - Beta
Classifier: Intended Audience :: Developers
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Requires-Python: >=3.10
Description-Content-Type: text/markdown
License-File: LICENSE
Requires-Dist: numpy<2.0,>=1.26.4
Provides-Extra: numba
Requires-Dist: numba>=0.67.0; extra == "numba"
Provides-Extra: langchain
Requires-Dist: langchain-core<2.0,>=1.4.8; extra == "langchain"
Provides-Extra: embeddings
Requires-Dist: sentence-transformers<7.0,>=6.0.1; extra == "embeddings"
Requires-Dist: langchain-ollama<2.0,>=1.0.1; extra == "embeddings"
Provides-Extra: gradio
Requires-Dist: gradio<7.0,>=6.28.0; extra == "gradio"
Provides-Extra: expert
Requires-Dist: pymorphy3<3.0,>=2.0.6; extra == "expert"
Provides-Extra: all
Requires-Dist: numba>=0.67.0; extra == "all"
Requires-Dist: langchain-core<2.0,>=1.4.8; extra == "all"
Requires-Dist: sentence-transformers<7.0,>=6.0.1; extra == "all"
Requires-Dist: langchain-ollama<2.0,>=1.0.1; extra == "all"
Requires-Dist: gradio<7.0,>=6.28.0; extra == "all"
Requires-Dist: pymorphy3<3.0,>=2.0.6; extra == "all"
Dynamic: license-file

# PyAgentProlog

A Prolog engine in Python with proof tracing, agents based on Python actions, an expert system, and semantic unification on embeddings.

[![Python](https://img.shields.io/badge/python-3.9%2B-blue)](https://www.python.org/)
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)

## Author

Andrey Vorfolomeev

## Features

- **Prolog core**: parser, iterative solver with TCO (tail-call optimization),
  cut (`!`), `if-then-else`, rule indexing by the first argument.
- **Proof tracing** — an inference tree with unifications and rules.
- **Numba-accelerated arithmetic** — a non-recursive stack machine, runs on ARM/Raspberry Pi.
- **Agents** — Python functions as built-in predicates (`@simple_action`,
  `@effector_action`, `@generator_action`).
- **Expert system** — interactive mode, extraction of conditions from natural language
  via `pymorphy3`, contradiction resolution, glossary.
- **Semantic unification** — matching atoms via embeddings
 (Ollama or sentence-transformers).
- **Integration with LangChain** — `PrologChain` as `Runnable` in LCEL chains.
- **Gradio sessions** — for interactive UIs.

## Installation

### Basic (core only)

```bash
pip install pyagentprolog
```

### With additional features

```bash
# Numba acceleration for arithmetic
pip install pyagentprolog[numba]

# Semantic unification
pip install pyagentprolog[embeddings]

# LangChain
pip install pyagentprolog[langchain]

# Expert system (pymorphy2)
pip install pyagentprolog[expert]

# Everything at once
pip install pyagentprolog[all]
```

## Quick start

### Simple query

```python
from prolog import Solver

program = """
parent(ivan, alexey).
parent(alexey, petr).

grandfather(D, V) :-
    parent(D, R),
    parent(R, V).
"""

solver = Solver(program)
solutions = solver.find_solutions("grandfather(ivan, X).")
print(solutions)  # [{'X': 'petr'}]
```

### Proof trace

```python
solutions, explanation = solver.find_solutions("grandfather(ivan, X).",
                                                with_explanation=True)
print(solver.get_explanation())
```

### Agent with Python actions

```python
from prolog import Agent, simple_action

@simple_action('add', 3, output_arg=2)
def add(a, b, context=None):
    return a + b

agent = Agent(program="run(X) :- add(2, 3, X).")
agent.register_action(add)
print(agent.query_one("run(X)."))  # {'X': 5}

### Expert System

Requires pyagentprolog[expert]

```python
from prolog import Expert

expert = Expert(domain_file="knowledge.pl", use_pymorphy=True)
answer = expert.ask("I want to learn programming")
print(answer)
```

## Requirements

- Python 3.9+
- Mandatory: `numpy`
- Optional: `numba`, `langchain-core`, `sentence-transformers`,
  `langchain-ollama`, `gradio`, `pymorphy2`

## License

MIT — see the [LICENSE](LICENSE) file.
