# Логическое программирование в TensorLanguage (TL)
TL интегрирует мощный движок логического вывода в стиле Prolog непосредственно в свою среду выполнения. Это позволяет определять базы знаний, выполнять логические рассуждения и комбинировать результаты с нейронными сетями.
## 1. Обзор синтаксиса
### Факты
```rust
father(alice, bob). // "alice — отец bob"
```
### Объявления отношений
```rust
relation parent(entity, entity);
```
### Правила
```rust
grandparent(x, z) :- father(x, y), father(y, z).
ancestor(x, y) :- father(x, y).
ancestor(x, y) :- father(x, z), ancestor(z, y).
```
### Запросы
```rust
let is_father = ?father(alice, bob);
let children = ?father(alice, $child);
```
## 2. Символьный вывод
TL автоматически отображает имена сущностей в уникальные целочисленные идентификаторы. При отображении результатов идентификаторы автоматически преобразуются обратно в исходные имена.
## 3. Область видимости и организация файлов
Факты и правила должны быть определены в **глобальной области видимости**. Модульная система (`mod`, `use`) позволяет организацию в нескольких файлах.
## 4. Интеграция с тензорами
Результаты запросов — стандартные тензоры TL, которые можно использовать непосредственно в математических и нейросетевых операциях.
## 5. Отрицание и арифметические сравнения
### Отрицание
```rust
manager(X) :- employee(X), not(has_boss(X)).
```
TL поддерживает стратифицированное отрицание. Отрицательные циклы обнаруживаются и вызывают ошибку компиляции.
### Арифметические сравнения
```rust
adult(X) :- person(X, Age), Age >= 18.
```
Поддерживаемые операторы сравнения: `>`, `<`, `>=`, `<=`, `==`, `!=`