lawref.evaluator.interpretations
Interpretations §152–§157 — выбор альтернатив и изоляция теорий.
Membership правила: node.interpretations (§101-поле) ∪ interpretation.includes (§152), с композицией extends/excludes §157 (set composition, не mutation). Правило с непустой принадлежностью активно ТОЛЬКО при выбранной интерпретации; пустая принадлежность — base theory, активна всегда.
Выбор — options.selectedInterpretations (семантически активен: попадает в EvaluationInputManifest.interpretations). Группа §155 exactly_one без ровно одного выбранного из alternatives — INTERPRETATION_REQUIRED (§156): правила всех её альтернатив исключаются (результаты НЕ смешиваются), запрос получает evaluationStatus INTERPRETATION_REQUIRED. selection any_of — любое подмножество; compose_explicitly — вне v1 (правила исключаются с предупреждением).
Attributes
| Name | Description |
|---|---|
CARRIER_CODES | No description. |
Functions
| Name | Description |
|---|---|
carrier_issue_scope | §181.2 (errata E-0243, E-0244, E-0245): issue TYPE_ERROR, |
constraint_scope | §181.2 (errata E-0236): от каких из нарушенных ограничений §93 результат |
constraint_seed | Предикаты, которые читает ограничение §93 — scope, when |
dependent_positions | §134/§156 (E-0140, дополнение): зависят ли нормативные позиции от |
dependent_predicates | §156 (errata E-0140): предикаты, чей ответ ЗАВИСИТ от неразрешённой |
forward_closure | Замыкание вперёд по рёбрам предикатного графа §110 — общий ход §181.2. |
key_conflict_scope | §181.2 (errata E-0210): какие из отношений с конфликтом ключа §45.1 |
literal_predicates | Все предикаты литералов внутри произвольного поддерева CLIR — тела |
query_reads | Читает ли вопрос хоть один предикат из tainted — вторая половина |
resolve_interpretations | → (эффективные nodes, sorted selected для манифеста, interpretation_required, |
term_error_scope | §181.2 (errata E-0192, E-0242): от каких из правил, чей терм §58 не |
CARRIER_CODESattributemodule attribute#
CARRIER_CODES = (
'TYPE_ERROR',
'JUDGMENT_AUTHORITY_MISMATCH',
'JUDGMENT_PAYLOAD_MISMATCH',
'PRIORITY_CONFLICT'
)carrier_issue_scopefunction#
def carrier_issue_scope(nodes: list[dict], case: dict, issues: list[dict], query: dict) -> None§181.2 (errata E-0243, E-0244, E-0245): issue TYPE_ERROR,
JUDGMENT_AUTHORITY_MISMATCH, JUDGMENT_PAYLOAD_MISMATCH и
PRIORITY_CONFLICT уровня error блокируют только результат, чей вопрос
читает предикат носителя по графу §110 — тем же замыканием вперёд, что у
E-0192, E-0210 и E-0236. В документе независимого результата issue
сохраняет код, сообщение, relatedNodes и details, но несёт warning.
Разбор по КАЖДОЙ issue отдельно; граница — по ПРОГРАММЕ, а не по делу.
constraint_scopefunction#
def constraint_scope(nodes: list[dict], constraint_ids: set[str], query: dict) -> set[str]§181.2 (errata E-0236): от каких из нарушенных ограничений §93 результат
вопроса ЗАВИСИТ. Возвращает подмножество constraint_ids: их
CONSTRAINT_VIOLATED/CONSTRAINT_CONFLICTED остаётся блокирующей, у
остальных — warning.
Тот же механизм, что у key_conflict_scope (E-0210), с одним отличием —
началом замыкания: у конфликта ключа это само отношение, у ограничения —
множество предикатов его клауз scope, when и require, поэтому вопрос
о любом из них зависим всегда. Разбор по КАЖДОМУ ограничению отдельно:
носитель issue назван relatedNodes, и зависимость от одного ограничения
не делает блокирующей issue другого. Ограничение, которого нет в узлах
(носитель не разобран), считается зависимым — ошибка в безопасную сторону.
Рёбра строятся ОДИН раз на все ограничения; порядок обхода — §208-порядок
идентификаторов, результат от него не зависит (множество).
constraint_seedfunction#
def constraint_seed(node: dict) -> set[str]Предикаты, которые читает ограничение §93 — scope, when
(antecedent) и require (requirement). Обход один и тот же у обеих
реализаций: literal_predicates по каждой из трёх клауз.
dependent_positionsfunction#
def dependent_positions(nodes: list[dict], blocked_interps: set[str], membership: dict[str, set[str]], dependent: set[str]) -> bool§134/§156 (E-0140, дополнение): зависят ли нормативные позиции от
неразрешённой группы. Да, если хотя бы одно правило-производитель позиции
(голова norm_template_ref) заблокировано — под другой альтернативой
позиция существовала бы, — либо активный производитель читает зависимый
предикат: его посылки под другой альтернативой были бы другими.
dependent_predicatesfunction#
def dependent_predicates(nodes: list[dict], blocked_interps: set[str], membership: dict[str, set[str]]) -> set[str]§156 (errata E-0140): предикаты, чей ответ ЗАВИСИТ от неразрешённой группы — замыкание по телам правил от голов узлов заблокированных альтернатив.
Считается над ПОЛНЫМ набором узлов (включая исключённые): зависимость —
свойство программы, а не выбора. Ребро берётся тем же извлекателем, что
у стратификации §110 (rules._predicate_edges: потребитель ← продюсер по
каждому конъюнкту тела, включая негатив, not_known и кванторы), поэтому
«зависит» здесь значит «есть путь по телам правил», и он один у обеих
реализаций.
forward_closurefunction#
def forward_closure(edges: list[tuple], seed: set[str]) -> set[str]Замыкание вперёд по рёбрам предикатного графа §110 — общий ход §181.2.
То же, что у §156 (dependent_predicates): от предикатов seed по рёбрам
(каждый конъюнкт тела, включая негатив, not_known, статус-тесты и
кванторы; голова дефитера §95.3 — поражаемый литерал), вперёд, до
неподвижной точки. seed входит в результат.
key_conflict_scopefunction#
def key_conflict_scope(nodes: list[dict], predicates: set[str], query: dict) -> set[str]§181.2 (errata E-0210): какие из отношений с конфликтом ключа §45.1
результат вопроса ЧИТАЕТ. Возвращает подмножество predicates, от которых
он зависит: их KEY_CONFLICT остаётся блокирующей, у остальных — warning.
Тот же механизм, что у term_error_scope (E-0192), с одним отличием —
началом замыкания: у ошибки терма это голова упавшего правила, у конфликта
ключа само отношение, поэтому вопрос о нём зависим всегда. Разбор по
КАЖДОМУ отношению отдельно: носитель issue — отношение, и зависимость от
одной таблицы не делает блокирующей issue другой. Рёбра строятся ОДИН раз
на все отношения; порядок обхода — §208-порядок предикатов, результат от
него не зависит (множество).
literal_predicatesfunction#
def literal_predicates(value) -> set[str]Все предикаты литералов внутри произвольного поддерева CLIR — тела
правила, comprehension-терма запроса. Обход одинаков у обеих реализаций:
объект с kind == "literal" и строковым predicate даёт предикат, всё
остальное обходится рекурсивно.
query_readsfunction#
def query_reads(query: dict, tainted: set[str]) -> boolЧитает ли вопрос хоть один предикат из tainted — вторая половина
разбора §181.2. truth/why_not/focused_truth — по предикату литерала
(у focused_truth вопрос тот же, что у полного truth, §181.3), collect
и formula — по любому предикату терма вопроса; positions и прочие виды,
у которых зависимость не разбирается, читают всё.
resolve_interpretationsfunction#
def resolve_interpretations(nodes: list[dict], options: dict, issues: list[dict]) -> tuple[list[dict], list[str], bool, set[str], bool]→ (эффективные nodes, sorted selected для манифеста, interpretation_required, зависимые предикаты §156/E-0140, зависимость позиций §134).
Исключает из исполнения узлы с непустой интерпретационной принадлежностью, не покрытой выбором; при неразрешённой exactly_one-группе — исключает все её альтернативы и поднимает флаг §156.
term_error_scopefunction#
def term_error_scope(nodes: list[dict], failed_rules: set[str], query: dict) -> set[str]§181.2 (errata E-0192, E-0242): от каких из правил, чей терм §58 не
вычислился, результат вопроса ЗАВИСИТ. Возвращает подмножество
failed_rules: issue их ошибок остаётся блокирующей, у остальных — warning.
Замыкание — forward_closure от ГОЛОВЫ правила. Разбор по КАЖДОМУ правилу
отдельно (errata E-0242): носитель issue — правило relatedNodes: [R], и
зависимость от одного упавшего правила не делает блокирующей issue другого.
Граница — по ПРОГРАММЕ, не по делу. Правило с головой вне литерала
(производитель позиции §135) и носитель, которого среди правил нет
(позиция §105.2), зависимы для любого вопроса — ошибка в безопасную
сторону; positions и прочие виды вопроса, у которых зависимость не
разбирается, зависимы. Рёбра строятся ОДИН раз, замыкание — один раз на
предикат головы; результат от порядка обхода не зависит (множество).
Documentation for Arxo. Writings — blog.arxo.io.
Anonymous visit counts on stats.arxo.io, no cookies.