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
| Name | Description |
|---|---|
GROUND_KINDS | No description. |
MIRROR | No description. |
NUMERIC_TYPES | No description. |
POSSIBLE_CONFLICT_CODE | No description. |
SUBSUMPTION_CODE | No description. |
Functions
| Name | Description |
|---|---|
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) -> dictanalyze_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.