# lawref.evaluator.query_shape

*module*

Форма ВОПРОСА до вычисления — errata E-0102 ([§172](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/25-part-xxiv-queries-and-results.ru.md#172-standard-queries), `spec/schema/query.schema.json`).

Зачем это здесь, а не только в схеме. Схема нормативна и полностью
проверяется воротами векторов (`run_vectors.py`), но у движка `law-eval`
валидатора JSON Schema нет, и обе реализации обязаны отвергать один и тот же
вход одними и теми же байтами. Поэтому структурное ядро схемы — ровно то, от
чего зависит СМЫСЛ ответа, — повторено здесь и зеркально в
`law-eval/src/query_shape.rs`, а сообщения совпадают дословно.

Что именно ловится и почему это смысл, а не форма. У литерала в движке две
тождественности: ключ атома (`support.literal_key`: predicate + args) и
унификация с головой правила (`whynot.unify_head`: требует `kind:
"literal"`). Вопрос без `kind` находил свой атом по первой и НЕ находил ни
одного правила по второй — блокеров нет, запроса судье нет, и тот же вопрос
отвечал COMPUTED вместо REQUIRES_JUDGMENT. Ни одна диагностика этого не
называла. Теперь вопрос вне формы Literal не отвечается вовсе.

Здесь же — арность атома вопроса против сигнатуры [§38](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/08-part-viii-type-system.ru.md#38-enums) предъявленной
программы (errata E-0168): форма вопроса её не выражает, потому что арность
известна не вопросу, а программе, которой он задан. До errata `truth(P(a))`
к отношению арности два отвечался NEITHER — «не установлено», неотличимое
от ответа права.

## lawref.evaluator.query_shape.LITERAL_KINDS

*attribute* · *module attribute*

```python
LITERAL_KINDS = ('truth', 'focused_truth', 'why_not', 'argumentation', 'precedent')
```

[View source](https://github.com-arxohq/arxo-io/law/blob/2edc2b92ce22b52e03f4081d2769a58229684379/engines/lawref/lawref/evaluator/query_shape.py#L29-L29)

## lawref.evaluator.query_shape.QueryError

*class*

```python
class QueryError(Exception)
```

Bases: `Exception`

Вопрос вне схемы query.schema.json; code — QUERY_INVALID (E-0102).

[View source](https://github.com-arxohq/arxo-io/law/blob/2edc2b92ce22b52e03f4081d2769a58229684379/engines/lawref/lawref/evaluator/query_shape.py#L34-L41)

### lawref.evaluator.query_shape.QueryError.code

*attribute* · *class attribute* · *instance attribute*

```python
code = 'QUERY_INVALID'
```

[View source](https://github.com-arxohq/arxo-io/law/blob/2edc2b92ce22b52e03f4081d2769a58229684379/engines/lawref/lawref/evaluator/query_shape.py#L37-L37)

### lawref.evaluator.query_shape.QueryError.message

*attribute* · *instance attribute*

```python
message = message
```

[View source](https://github.com-arxohq/arxo-io/law/blob/2edc2b92ce22b52e03f4081d2769a58229684379/engines/lawref/lawref/evaluator/query_shape.py#L41-L41)

## lawref.evaluator.query_shape.check_query

*function*

```python
def check_query(query: Any, nodes: Any = ()) -> None
```

Отказ `QueryError` на вопросе вне структурного ядра схемы либо вне
сигнатуры предъявленной программы (E-0168); иначе None.

Порядок проверок и формулировки — байтовый контракт с `law-eval`. Форма
проверяется ПЕРВОЙ: у литерала без `predicate` сверять арность не с чем,
и второй отказ назвал бы следствие вместо причины.

[View source](https://github.com-arxohq/arxo-io/law/blob/2edc2b92ce22b52e03f4081d2769a58229684379/engines/lawref/lawref/evaluator/query_shape.py#L114-L148)

## lawref.evaluator.query_shape.check_signature

*function*

```python
def check_signature(query: dict, query_id: str, nodes: Any) -> None
```

Арность атома вопроса против сигнатуры [§38](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/08-part-viii-type-system.ru.md#38-enums)/[§45.1](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/08-part-viii-type-system.ru.md#451-relation-keys) — errata E-0168.

Тот же контракт, что у утверждения дела (E-0046): несогласованный вход не
принимается, причина названа. Разница в исходе — у утверждения остаётся
дело, которое ещё можно вычислить, а у вопроса вычислять нечего: вопрос
неверной арности отвергается ДО вычисления, как вопрос вне схемы [§172](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/25-part-xxiv-queries-and-results.ru.md#172-standard-queries).
Предикат, которого программа не объявляет, не судится — открытый мир [§62](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/10-part-x-propositions-and-four-valued-support.ru.md#62-support-pair)
делает вопрос о неизвестном законным (`NEITHER` — ответ, а не пробел).

[View source](https://github.com-arxohq/arxo-io/law/blob/2edc2b92ce22b52e03f4081d2769a58229684379/engines/lawref/lawref/evaluator/query_shape.py#L87-L111)

## lawref.evaluator.query_shape.relation_arity

*function*

```python
def relation_arity(nodes: Any) -> dict[str, int]
```

Арность объявленных отношений [§38](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/08-part-viii-type-system.ru.md#38-enums) предъявленной программы.

Состав тот же, что у `facts._signature_index` (`symbol_decl` вида
`relation`); здесь нужны только числа, и строится он ДО приёма дела —
проверка формы вопроса идёт раньше всего ([§172](https://github.com/arxohq/law/blob/master/spec/SPEC.ru/25-part-xxiv-queries-and-results.ru.md#172-standard-queries)).

[View source](https://github.com-arxohq/arxo-io/law/blob/2edc2b92ce22b52e03f4081d2769a58229684379/engines/lawref/lawref/evaluator/query_shape.py#L50-L63)
