Skip to content

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

NameDescription
CARRIER_CODESNo description.

Functions

NameDescription
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.