Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
cmake_minimum_required(VERSION 3.20 FATAL_ERROR)
message( "Configuring: ${CMAKE_CURRENT_SOURCE_DIR}")

set(CMAKE_PROJECT_VERSION 0.0.2 )
set(CMAKE_PROJECT_VERSION 0.0.3 )

# Project name
project( avm
Expand Down
30 changes: 24 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -45,22 +45,24 @@ The Associative Relations Model (ARM) is a mathematical model for storing and pr
- Logical operations (NOT, AND, OR) defined as truth tables in entity maps
- Relative addressing operator `[]` for evaluating functions via `eval()`
- Multi-dimensional relative addressing for passing arguments
- Expression interpreter `interpret()` for evaluating logical expressions from JSON

### Current Status

**Version: 0.0.2** (Alpha)
**Version: 0.0.3** (Alpha)

Implemented:
- JSON null, boolean, array, number (unsigned, integer, float), string, object serialization/deserialization
- Base vocabulary initialization (R, E, True, False, Unsigned, Integer, Float, String, Object, Not, And, Or)
- Logical operations NOT, AND, OR with truth tables via entity map
- Relative addressing operator `[]` via `eval()` function for computing logical functions
- 99 unit tests + 16 JSON roundtrip tests
- Expression interpreter for evaluating logical expressions from JSON (e.g. `{"Not": [true]}` → `false`)
- 125 unit tests + 16 JSON roundtrip tests
- CI/CD pipeline (GitHub Actions) for Linux, macOS, Windows

In Progress:
- Expression interpreter for evaluating logical expressions in ARM
- Persistent storage integration with LinksPlatform
- CRUD API for programmatic use

### Documentation

Expand Down Expand Up @@ -99,6 +101,13 @@ cmake --build .

The application reads a JSON file, converts it to ARM representation, and saves the result to `res.json`.

If the input JSON is a logical expression (e.g. `{"Not": [true]}`), the expression interpreter evaluates it and saves the result:
```bash
echo '{"Not": [{"And": [true, false]}]}' > expr.json
./avm expr.json
cat res.json # true
```

### Dependencies

- C++20 compatible compiler
Expand Down Expand Up @@ -147,22 +156,24 @@ AVM (Associative Virtual Machine) — проект, реализующий ви
- Логические операции (NOT, AND, OR), определённые как таблицы истинности в entity map
- Оператор относительной адресации `[]` для вычисления функций через `eval()`
- Многомерная относительная адресация для передачи аргументов
- Интерпретатор выражений `interpret()` для вычисления логических выражений из JSON

### Текущее состояние

**Версия: 0.0.2** (Альфа)
**Версия: 0.0.3** (Альфа)

Реализовано:
- Сериализация/десериализация JSON null, boolean, array, number (unsigned, integer, float), string, object
- Инициализация базового словаря (R, E, True, False, Unsigned, Integer, Float, String, Object, Not, And, Or)
- Логические операции NOT, AND, OR с таблицами истинности через entity map
- Оператор относительной адресации `[]` через функцию `eval()` для вычисления логических функций
- 99 модульных тестов + 16 JSON roundtrip тестов
- Интерпретатор выражений для вычисления логических выражений из JSON (например `{"Not": [true]}` → `false`)
- 125 модульных тестов + 16 JSON roundtrip тестов
- CI/CD пайплайн (GitHub Actions) для Linux, macOS, Windows

В разработке:
- Интерпретатор выражений для выполнения логических выражений в МАО
- Персистентное хранение — интеграция с LinksPlatform
- CRUD API для программного использования

### Документация

Expand Down Expand Up @@ -201,6 +212,13 @@ cmake --build .

Приложение читает JSON файл, преобразует его в представление МАО и сохраняет результат в `res.json`.

Если входной JSON является логическим выражением (например `{"Not": [true]}`), интерпретатор вычисляет его и сохраняет результат:
```bash
echo '{"Not": [{"And": [true, false]}]}' > expr.json
./avm expr.json
cat res.json # true
```

### Зависимости

- Компилятор с поддержкой C++20
Expand Down
28 changes: 14 additions & 14 deletions analysis.md
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ AVM (Associative Virtual Machine) — это проект, реализующи
### 1. Функциональные недостатки

#### 1.1. Незавершённые направления
- **Интерпретатор выражений** — выполнение логических выражений из JSON в МАО ещё не реализовано
- ~~**Интерпретатор выражений**~~ ✅ — реализован `interpret()` для вычисления логических выражений из JSON
- **Персистентное хранение** — интеграция с LinksPlatform не завершена
- Нет CRUD API для программного использования

Expand Down Expand Up @@ -99,7 +99,7 @@ AVM (Associative Virtual Machine) — это проект, реализующи
- Жёстко закодированные пути файлов (`"res.json"`)

#### 2.3. Тестирование
- ~~Нет автоматических unit-тестов~~ ✅ 99 модульных тестов
- ~~Нет автоматических unit-тестов~~ ✅ 125 модульных тестов
- ~~Нет интеграционных тестов~~ ✅ 16 JSON roundtrip тестов через CTest
- ~~CMake настроен с `enable_testing()`, но тесты не определены~~ ✅ 17 тестов в CTest
- ~~Нет CI/CD конфигурации (GitHub Actions)~~ ✅ GitHub Actions для 3 платформ
Expand Down Expand Up @@ -128,12 +128,12 @@ AVM (Associative Virtual Machine) — это проект, реализующи
|---------|----------|
| Язык программирования | C++ (стандарт C++20) |
| Система сборки | CMake 3.20+ |
| Основной файл кода | ~550 строк (main.cpp) |
| Заголовочный файл | ~406 строк (avm.h) |
| Основной файл кода | ~562 строки (main.cpp) |
| Заголовочный файл | ~463 строки (avm.h) |
| Внешние зависимости | nlohmann/json, LinksPlatform, str_switch |
| Лицензия | MIT |
| Unit-тесты | 99 модульных тестов |
| Тестовые файлы | 17 JSON файлов |
| Unit-тесты | 125 модульных тестов |
| Тестовые файлы | 21 JSON файл |

---

Expand All @@ -142,9 +142,9 @@ AVM (Associative Virtual Machine) — это проект, реализующи
Проект находится на стадии альфа-версии:

- **Концепция**: Хорошо проработана теоретически
- **Реализация**: JSON roundtrip полностью работает, логические операции реализованы
- **Реализация**: JSON roundtrip полностью работает, логические операции реализованы, интерпретатор выражений работает
- **Документация**: Двуязычная документация, описание алгоритма сериализации
- **Тестирование**: 99 модульных тестов + 16 интеграционных, CI/CD на 3 платформах
- **Тестирование**: 125 модульных тестов + 16 интеграционных, CI/CD на 3 платформах
- **Готовность к использованию**: Прототип с работающей базовой функциональностью

---
Expand All @@ -154,14 +154,14 @@ AVM (Associative Virtual Machine) — это проект, реализующи
AVM представляет собой интересный исследовательский проект, демонстрирующий применение Модели Ассоциативных Отношений для представления и обработки данных. Проект имеет солидную теоретическую базу и работающий прототип, однако требует значительной доработки для достижения production-ready состояния.

Основные направления для дальнейшего улучшения:
1. Создание интерпретатора выражений для МАО
2. Интеграция персистентного хранения (LinksPlatform)
3. Создание публичного API для CRUD операций
4. Примеры использования и руководства
5. Пакеты для менеджеров зависимостей (vcpkg, Conan)
1. Интеграция персистентного хранения (LinksPlatform)
2. Создание публичного API для CRUD операций
3. Примеры использования и руководства
4. Пакеты для менеджеров зависимостей (vcpkg, Conan)
5. Условные конструкции и рекурсия в интерпретаторе

---

*Дата анализа: январь 2026*
*Последнее обновление: февраль 2026*
*Версия проекта: 0.0.2*
*Версия проекта: 0.0.3*
7 changes: 4 additions & 3 deletions plan.md
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@
#### Высокий приоритет
1. ~~**Реализовать логические операции**~~ ✅ — NOT, AND, OR реализованы в базовом словаре через entity map (PR #19)
2. ~~**Добавить механизм вычисления функций**~~ ✅ — относительная адресация через функцию `eval()` (PR #19)
3. **Создать интерпретатор выражений** — выполнение логических выражений в МАО
3. ~~**Создать интерпретатор выражений**~~ ✅ — интерпретация логических выражений из JSON в МАО (PR #20)

#### Средний приоритет
4. **Реализовать условные конструкции** — if-then-else через ассоциативные структуры
Expand Down Expand Up @@ -135,7 +135,7 @@
### Задачи по приоритетам

#### Критический приоритет (сделать в первую очередь)
1. ~~**Добавить unit-тесты**~~ ✅ — 99 модульных тестов (PR #9, #19)
1. ~~**Добавить unit-тесты**~~ ✅ — 125 модульных тестов (PR #9, #19, #20)
2. ~~**Настроить CI/CD**~~ ✅ — GitHub Actions для Ubuntu, Windows, macOS (PR #6)
3. ~~**Обеспечить кроссплатформенность**~~ ✅ — сборка для Linux, macOS, Windows (PR #6, #14)
4. ~~**Улучшить README**~~ ✅ — двуязычная документация (PR #2)
Expand Down Expand Up @@ -179,6 +179,7 @@

### Фаза 2: Функциональность (текущая)
- ~~Логические операции и вычисления~~ ✅ NOT, AND, OR + оператор `eval()` (PR #19)
- ~~Интерпретатор выражений~~ ✅ вычисление логических выражений из JSON через `interpret()` (PR #20)
- Персистентное хранение
- API для программного использования
- Примеры и руководства
Expand Down Expand Up @@ -207,4 +208,4 @@

*Дата создания: январь 2026*
*Последнее обновление: февраль 2026*
*Версия плана: 1.1*
*Версия плана: 1.2*
95 changes: 89 additions & 6 deletions src/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -181,6 +181,79 @@ rel_t *import_json(const json &j)
}
}

// Интерпретатор выражений / Expression interpreter
// Вычисляет логические выражения, представленные как JSON, в МАО
// Формат выражений:
// true, false, null — примитивные значения
// {"Not": [expr]} — логическое НЕ
// {"And": [expr1, expr2]} — логическое И
// {"Or": [expr1, expr2]} — логическое ИЛИ
// Вложенные выражения: {"Not": [{"And": [true, false]}]} = NOT[AND[True][False]] = True
//
// Поиск оператора по имени в базовом словаре
rel_t *resolve_operator(const string &name)
{
if (name == "Not")
return rel_t::Not;
if (name == "And")
return rel_t::And;
if (name == "Or")
return rel_t::Or;
return nullptr;
}

// Рекурсивная интерпретация JSON-выражения
// Возвращает результат вычисления как ARM-сущность
rel_t *interpret(const json &expr)
{
switch (expr.type())
{
case json::value_t::null:
return rel_t::E;

case json::value_t::boolean:
return expr.get<bool>() ? rel_t::True : rel_t::False;

case json::value_t::object:
{
// Объект с одним ключом — оператор с аргументами
// {"Not": [true]} или {"And": [true, false]}
if (expr.size() != 1)
return rel_t::E; // некорректное выражение

auto it = expr.begin();
const string &op_name = it.key();
const json &args = it.value();

rel_t *op = resolve_operator(op_name);
if (!op)
return rel_t::E; // неизвестный оператор

if (!args.is_array() || args.empty())
return rel_t::E; // аргументы должны быть непустым массивом

// Вычисляем аргументы рекурсивно и применяем оператор
// Унарный оператор: func[arg]
if (args.size() == 1)
return eval(op, interpret(args[0]));

// Бинарный оператор: func[arg1][arg2]
if (args.size() == 2)
return eval(op, interpret(args[0]), interpret(args[1]));

// N-арный оператор: последовательное применение func[a1][a2]...[aN]
rel_t *result = eval(op, interpret(args[0]));
for (size_t i = 1; i < args.size(); ++i)
result = eval(result, interpret(args[i]));
return result;
}

default:
// Для остальных типов (числа, строки, массивы) — импортируем как данные
return import_json(expr);
}
}

void export_json(const rel_t *ent, json &j);

void export_object_chain(const rel_t *node, json &j)
Expand Down Expand Up @@ -411,7 +484,7 @@ int main(int argc, char *argv[])
break;
default:
cout << R"(https://github.com/netkeep80/avm
Associative Virtual Machine [Version 0.0.2]
Associative Virtual Machine [Version 0.0.3]
_____________
/ \
/ \
Expand Down Expand Up @@ -449,13 +522,23 @@ Copyright (c) 2022 Vertushkin Roman Pavlovich <https://vk.com/earthbirthbook>
get_json(root, entry_point);
res = json::object();
// parse_json(root, res);
// импортируем в корневой контекст
auto root_ent = import_json(root);
// cout << root.dump() << endl;
// Проверяем, является ли вход выражением для интерпретации
// Выражение — JSON объект с одним ключом-оператором (Not, And, Or)
bool is_expression = root.is_object() && root.size() == 1 &&
resolve_operator(root.begin().key()) != nullptr;
rel_t *root_ent;
if (is_expression)
{
// Интерпретируем выражение
root_ent = interpret(root);
}
else
{
// Импортируем как данные
root_ent = import_json(root);
}
export_json(root_ent, res);
// cout << res.dump() << endl;
add_json(res, "res.json"s);
//add_json(json(export_string(root_ent)), "res.txt"s);
std::cout << "rel_t::created() = " << rel_t::created() << std::endl;
return 0; // ok
}
Expand Down
1 change: 1 addition & 0 deletions test/expr_and.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"And": [true, false]}
1 change: 1 addition & 0 deletions test/expr_nested.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"Not": [{"And": [true, false]}]}
1 change: 1 addition & 0 deletions test/expr_not.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"Not": [true]}
1 change: 1 addition & 0 deletions test/expr_or.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"Or": [false, true]}
Loading
Loading