Skip to content

lawref.normstatic

Статический анализ разрешимого фрагмента: поглощения и возможные конфликты.

Ступень 3 связей между актами (DECISION-0010). Рамка задана §105.1: goal incompatibility НЕ выводится по различию текста; статический анализатор вправе сообщить POSSIBLE_NORM_CONFLICT, но defeat/priority-рёбер не порождает — semantic conclusion остаётся за движком. Здесь реализован анализатор ровно этой рамки над фрагментом, где вопросы разрешимы:

Фрагмент (правило вне фрагмента — не ошибка, а явная строка отчёта, принцип «no silent caps»):

  • голова — литерал с аргументами var/значение/entity_ref/const_ref;
  • тело — established-литералы той же формы аргументов и сравнения var ⋈ const над Integer/Decimal §57 (значения — точные рациональные, fractions.Fraction; float в семантическом коде запрещён);
  • в теле нет двух литералов с одинаковым скелетом — иначе сопоставление пары правил перестаёт быть детерминированным;
  • переменные сравнений заякорены в голове либо литералах тела.

Предупреждения — §199 даёт диапазон LDC-Wxxxx без внутренней разметки; здесь занимаются первые коды, зеркалящие тематику E4 (rules/defeasibility):

  • LDC-W4101 — возможный конфликт: головы противоположной полярности унифицируются, тела совместно выполнимы. Сертификат — свидетель: конкретные значения числовых переменных, при которых оба тела удовлетворимы; проверяется подстановкой, а не доверием анализатору;
  • LDC-W4102 — поглощение/дубликат: головы и литералы совпали с точностью до переименования, числовые ограничения одного правила покрывают другое — узкое правило не даёт заключений сверх широкого. Предупреждение, не ошибка: при командной поддержке §109 и defeat §107 узкое правило может быть осмысленным (отдельная мишень приоритета).

Ни при каких находках анализатор не влияет на evaluation: он не входит в байтовый контракт evaluation-документа и не создаёт рёбер §106–107.

Attributes

NameDescription
GROUND_KINDSNo description.
MIRRORNo description.
NUMERIC_TYPESNo description.
POSSIBLE_CONFLICT_CODENo description.
SUBSUMPTION_CODENo description.

Functions

NameDescription
analyze_packageАнализ CLIR-пакета: правила плюс покрытие конфликтов приоритетами
analyze_rulesАнализ набора правил одного пакета; результат детерминирован.
normal_formНормальная форма правила во фрагменте либо (None, причина-вне).

GROUND_KINDSattributemodule attribute#

GROUND_KINDS = ('value', 'entity_ref', 'const_ref')

MIRRORattributemodule attribute#

MIRROR = {'lt': 'gt', 'le': 'ge', 'gt': 'lt', 'ge': 'le', 'eq': 'eq'}

NUMERIC_TYPESattributemodule attribute#

NUMERIC_TYPES = ('urn:law:std#Integer', 'urn:law:std#Decimal')

POSSIBLE_CONFLICT_CODEattributemodule attribute#

POSSIBLE_CONFLICT_CODE = 'LDC-W4101'

SUBSUMPTION_CODEattributemodule attribute#

SUBSUMPTION_CODE = 'LDC-W4102'

analyze_packagefunction#

def analyze_package(ir: dict) -> dict

Анализ CLIR-пакета: правила плюс покрытие конфликтов приоритетами §106 (норм-шаблоны §127 — вне фрагмента по построению).

analyze_rulesfunction#

def analyze_rules(rules: list[dict], priority_rules: list[dict] = ()) -> dict

Анализ набора правил одного пакета; результат детерминирован.

Возвращает {“warnings”, “outside”, “unsatisfiable”, “checkedPairs”}: warnings — W4101/W4102; outside — правила вне фрагмента с причинами; unsatisfiable — правила с пустым числовым guard-ом (не применимы ни при каких значениях — самостоятельная находка).

Возможный конфликт, пара которого покрыта объявленным priority_rule (§106), помечается coveredByPriority: предупреждение остаётся (защита существует и названа), но взгляд ревьюера направляется на НЕпокрытые — именно там движок ответит BOTH/INCOMPARABLE.

normal_formfunction#

def normal_form(rule: dict) -> tuple[dict | None, str | None]

Нормальная форма правила во фрагменте либо (None, причина-вне).

Documentation for Arxo. Writings — blog.arxo.io.

Anonymous visit counts on stats.arxo.io, no cookies.