پس از تغییرِ یک نمایه یا روشِ امتیازدهی، دو فهرستِ کوتاه از شناسهٔ سندها در اختیار داریم. آیا خروجی‌ها نزدیک‌اند؟ مقایسهٔ اعضای نهایی، جایگاه‌های اول را نادیده می‌گیرد؛ مقایسهٔ صرفِ ترتیب نیز ممکن است برای سندهایی که فقط در یک فهرست دیده شده‌اند تعریف مناسبی نداشته باشد. این درس یک تشخیصِ محدود و قابلِ حسابرسی می‌سازد: توافقِ پیشوندهای دو فهرست را با وزنِ عمق جمع می‌کنیم و سهمِ نامعلومِ ادامه را جدا نگه می‌داریم. داده‌ها تألیفی‌اند و هیچ موتورِ جست‌وجو یا کاربرِ واقعی آزمایش نمی‌شود.

۱. شباهتِ فهرست را با کیفیتِ نتیجه اشتباه نگیریم

دو سینیِ مرتب از کارت‌های سند با چند نشان مشترک و چند نشان متفاوت
تصویر مفهومی: دو سینیِ مرتب از کارت‌های سند با چند نشان مشترک و چند نشان متفاوت؛ بدون مقیاس عددی و مستقل از نتایج اجرای کد.

شناسه‌های یک، دو، سه و چهار فقط برچسبِ سندهای فرضی‌اند؛ بزرگیِ عدد، رتبه یا ارتباط را تعیین نمی‌کند. ترتیبِ tuple رتبه را مشخص می‌کند. دو ورودیِ اصلیِ ما، یک‌ـ‌دو‌ـ‌سه و یک‌ـ‌سه‌ـ‌چهار هستند. سندِ یک در صدرِ هردو دیده می‌شود، اما ترکیبِ دو جایگاهِ بعدی متفاوت است. لازم نیست اعضای دو فهرست یکسان باشند؛ هویتِ مشترک باید در هر دو ورودی به همان سند اشاره کند.

در درسِ هم‌بستگیِ رتبه‌ای و تساویِ امتیازها، دو بردارِ امتیاز برای همان سندهای جفت‌شده داشتیم. اینجا امتیازِ عددی یا ضریبِ هم‌بستگی نداریم؛ عضویت در پیشوندِ هر عمق را مقایسه می‌کنیم. همچنین خروجی، فهرستِ ادغام‌شدهٔ تازه نمی‌سازد و روشِ انتخابِ نتیجهٔ برتر نیست. کاربردِ آن، توصیفِ یک جنبه از تغییرِ دو خروجیِ داده‌شده است.

توافقِ زیاد، ارتباطِ بهتر را ثابت نمی‌کند؛ دو فهرستِ کاملاً نامرتبط هم می‌توانند یکسان باشند. برای کیفیت، قضاوتِ مستقل دربارهٔ نیازِ پرسش و سند لازم است؛ آموزشِ Precision، Recall و nDCG آن مسئله را جدا بررسی می‌کند. پیوندهای مرتبط از نسخه‌های ذخیره‌شده خوانده شده‌اند؛ این اشاره، ادعای بررسیِ تازهٔ دسترس‌پذیریِ سایت نیست. مثالِ فعلی نیز ارتباط، تازگی، مجوزِ دسترسی یا درستیِ محتوای سند را نمی‌سنجد.

۲. توافقِ هر پیشوند و وزنِ عمق را تعریف کنیم

لایه‌های شفاف روی دو ردیف کارت که بخش‌های عمیق‌تر را به‌تدریج آشکار می‌کنند
تصویر مفهومی: لایه‌های شفاف روی دو ردیف کارت که بخش‌های عمیق‌تر را به‌تدریج آشکار می‌کنند؛ بدون مقیاس عددی و مستقل از نتایج اجرای کد.

در عمقِ d، مجموعهٔ d شناسهٔ نخستِ هر فهرست را می‌گیریم. تعدادِ اعضای مشترک را بر d تقسیم می‌کنیم تا توافقِ همان عمق به دست آید. این مخرج، اندازهٔ اجتماعِ دو مجموعه نیست؛ بنابراین معیارِ جاکارد محاسبه نمی‌شود. برای دو ورودیِ اصلی، توافق‌ها به‌ترتیب یک، یک‌دوم و دوسوم‌اند. حضورِ دوبارهٔ یک سند در عمق‌های بعدی طبیعی است، اما تکرارِ شناسه داخلِ خودِ فهرست مجاز نیست.

مقالهٔ وبر، موفات و زوبل دربارهٔ RBO، توافقِ عمق‌ها را با وزن‌های هندسیِ همگرا ترکیب می‌کند. ما برای عمقِ یک وزنِ «یک‌منهای p» و برای هر عمقِ بعدی، p برابرِ وزنِ قبلی را به کار می‌بریم. p میانِ صفر و یک است؛ کوچک‌تر بودنش وزنِ بیشتری به عمق‌های نخست می‌دهد. این پارامتر در مثال، قراردادی انتخاب می‌شود و از رفتارِ کاربران برآورد نشده است.

جمعِ محدودِ سهم‌های دیده‌شده را B می‌نامیم. با p برابرِ یک‌دوم، وزن‌ها یک‌دوم، یک‌چهارم و یک‌هشتم‌اند؛ سهم‌ها یک‌دوم، یک‌هشتم و یک‌دوازدهم می‌شوند و B برابرِ هفده‌بیست‌وچهارم است. همهٔ این مقدارها بی‌واحدند. مقاله برای ادامهٔ نادیده، کران‌های دقیق‌تری نیز می‌سازد؛ B در کدِ ما نامِ آن کرانِ کمینه یا «base» مقاله نیست. فقط جمعِ متناهیِ تعریفِ وزن‌دار را نگه می‌داریم.

۳. کدِ کامل و مرجعِ مستقلِ سهمِ سندها

دو چیدمان مستقل برای بررسی پیشوندها و سهم کارت‌های مشترک
تصویر مفهومی: دو چیدمان مستقل برای بررسی پیشوندها و سهم کارت‌های مشترک؛ بدون مقیاس عددی و مستقل از نتایج اجرای کد.

رابطِ rank_prefix_report دو tuple دقیق و هم‌اندازه با طولِ صفر تا هشت می‌گیرد. شناسه باید int دقیق از صفر تا ۳۱ و در هر ورودی یکتا باشد. پارامترِ persistence باید Fraction دقیق، میانِ صفر و یک و با مخرجِ ساده‌شدهٔ حداکثرِ ۱۶ باشد. bool، float، زیرکلاس، فهرست و تکرار رد می‌شوند؛ تبدیلِ ضمنی، مرتب‌سازی یا حذفِ تکرار نداریم. این کران‌ها انتخابِ آموزشیِ خودمان‌اند، نه محدودیتِ تعریفِ RBO.

تمامِ ورودی پیش از ساختِ مجموعه‌های پیشوند و رکوردهای نتیجه بررسی می‌شود. سپس مسیرِ اصلی، دو مجموعه را به‌تدریج گسترش می‌دهد و اشتراکشان را می‌شمارد. رکوردهای خروجی و سطرهای هر عمق تغییرناپذیرند. از Fraction استفاده می‌کنیم تا تساوی و کران‌ها به گردکردنِ اعشاری وابسته نباشند؛ نه برای ادعای سرعتِ بهتر. فایل زیر را با نامِ rank_prefix_overlap_bound.py ذخیره کنید؛ فقط کتابخانهٔ استانداردِ پایتون لازم است.

"""Authored finite ranking-prefix agreement; no search engine is executed."""
from dataclasses import dataclass, FrozenInstanceError
from fractions import Fraction
from itertools import permutations, product
import json
import platform
import sys

AUTHOR_MAIN_ENABLED = True


@dataclass(frozen=True)
class PrefixStep:
    depth: int
    overlap: int
    agreement: Fraction
    depth_weight: Fraction
    contribution: Fraction


@dataclass(frozen=True)
class PrefixReport:
    depth: int
    persistence: Fraction
    steps: tuple
    observed_contribution: Fraction
    remaining_depth_mass: Fraction
    conservative_upper: Fraction


def _admit(left, right, persistence):
    if type(left) is not tuple or type(right) is not tuple:
        raise TypeError("Exact builtin tuples required")
    if len(left) != len(right) or not 0 <= len(left) <= 8:
        raise ValueError("Equal prefix lengths0..8 required")
    for ranking in (left, right):
        for document in ranking:
            if type(document) is not int:
                raise TypeError("Exact builtin integer document IDs required")
            if not 0 <= document <= 31:
                raise ValueError("Document ID outside own0..31 profile")
    if type(persistence) is not Fraction:
        raise TypeError("Exact Fraction persistence required")
    if not 0 < persistence < 1 or persistence.denominator > 16:
        raise ValueError("Persistence must be in(0,1), denominator at most16")
    # No prefix set is allocated until the complete declaration is admitted.
    for ranking in (left, right):
        if any(ranking[i] == ranking[j]
               for i in range(len(ranking)) for j in range(i)):
            raise ValueError("Duplicate ID inside one ranking")


def _new_prefix_set():
    return set()


def rank_prefix_report(left, right, persistence):
    """A conservative enclosure, not sharp RBO_MIN/MAX or an estimate."""
    _admit(left, right, persistence)
    seen_left, seen_right = _new_prefix_set(), _new_prefix_set()
    rows = []
    observed = Fraction(0)
    power = Fraction(1)
    for depth, (a, b) in enumerate(zip(left, right, strict=True), 1):
        seen_left.add(a)
        seen_right.add(b)
        overlap = len(seen_left & seen_right)
        agreement = Fraction(overlap, depth)
        depth_weight = (1 - persistence) * power
        contribution = depth_weight * agreement
        observed += contribution
        rows.append(PrefixStep(depth, overlap, agreement,
                               depth_weight, contribution))
        power *= persistence
    return PrefixReport(len(left), persistence, tuple(rows), observed,
                        power, observed + power)


def item_threshold_reference(left, right, persistence):
    """Independent valid-fixture oracle; no sets or public/private API calls.

    Each shared identity begins contributing at the larger of its two ranks.
    Sum contributions identity-first rather than intersecting prefix sets.
    """
    shared_positions = []
    for left_rank, document in enumerate(left, 1):
        for right_rank, candidate in enumerate(right, 1):
            if document == candidate:
                shared_positions.append((left_rank, right_rank))
    total = Fraction(0)
    for first_rank, second_rank in shared_positions:
        for depth in range(max(first_rank, second_rank), len(left) + 1):
            total += ((1 - persistence) * persistence ** (depth - 1)
                      / depth)
    counts = tuple(sum(a <= depth and b <= depth
                       for a, b in shared_positions)
                   for depth in range(1, len(left) + 1))
    return counts, total, persistence ** len(left)


def _rejected(error, left, right, persistence):
    try:
        rank_prefix_report(left, right, persistence)
    except error:
        return True
    return False


def _packed(value):
    if type(value) is Fraction:
        return str(value)
    if type(value) in (PrefixReport, PrefixStep):
        return {name: _packed(getattr(value, name))
                for name in value.__dataclass_fields__}
    if type(value) is dict:
        return {key: _packed(item) for key, item in value.items()}
    if type(value) in (tuple, list):
        return [_packed(item) for item in value]
    return value


def run_example():
    half = Fraction(1, 2)
    left, right = (1, 2, 3), (1, 3, 4)
    manual = rank_prefix_report(left, right, half)
    reverse = rank_prefix_report(left, (3, 2, 1), half)
    identical = rank_prefix_report(left, left, half)
    empty = rank_prefix_report((), (), half)
    disjoint = rank_prefix_report((0, 1, 2), (3, 4, 5), half)
    checks = {}
    checks["manual_partial_overlap_exact_contributions_and_interval"] = (
        tuple(row.overlap for row in manual.steps) == (1, 1, 2)
        and tuple(row.agreement for row in manual.steps)
        == (Fraction(1), half, Fraction(2, 3))
        and tuple(row.contribution for row in manual.steps)
        == (half, Fraction(1, 8), Fraction(1, 12))
        and manual.observed_contribution == Fraction(17, 24)
        and manual.remaining_depth_mass == Fraction(1, 8)
        and manual.conservative_upper == Fraction(5, 6))
    checks["same_final_membership_different_order_changes_prefix_agreement"] = (
        tuple(row.agreement for row in reverse.steps)
        == (Fraction(0), half, Fraction(1))
        and reverse.observed_contribution == Fraction(1, 4)
        and reverse.conservative_upper == Fraction(3, 8)
        and identical.observed_contribution == Fraction(7, 8))
    checks["empty_prefix_has_no_observed_evidence_and_full_coarse_interval"] = (
        empty.depth == 0 and empty.steps == ()
        and empty.observed_contribution == 0
        and empty.remaining_depth_mass == empty.conservative_upper == 1)
    checks["identical_observed_prefix_is_not_an_exact_complete_similarity_one"] = (
        all(row.agreement == 1 for row in identical.steps)
        and identical.observed_contribution == 1 - half ** 3
        and identical.conservative_upper == 1
        and identical.observed_contribution < identical.conservative_upper)
    checks["disjoint_prefix_zero_contribution_keeps_unseen_depth_uncertainty"] = (
        all(row.overlap == 0 for row in disjoint.steps)
        and disjoint.observed_contribution == 0
        and disjoint.conservative_upper == Fraction(1, 8))

    profiles, agreement_rows, oracle_ok = 0, 0, True
    for length in range(5):
        rankings = tuple(permutations(range(4), length))
        for a, b, p in product(rankings, rankings,
                               (half, Fraction(2, 3), Fraction(3, 4))):
            actual = rank_prefix_report(a, b, p)
            counts, total, tail = item_threshold_reference(a, b, p)
            oracle_ok = bool(oracle_ok
                and tuple(row.overlap for row in actual.steps) == counts
                and actual.observed_contribution == total
                and actual.remaining_depth_mass == tail
                and actual.conservative_upper == total + tail
                and 0 <= total <= total + tail <= 1)
            profiles += 1
            agreement_rows += length
    checks["independent_identity_threshold_reference_ONE_finite_family"] = bool(
        oracle_ok and profiles == 3939)

    chain_left, chain_right = (1, 2, 3, 5), (1, 3, 4, 2)
    chain = tuple(rank_prefix_report(chain_left[:k], chain_right[:k],
                                    Fraction(2, 3)) for k in range(5))
    checks["consistent_prefix_extensions_nest_coarse_intervals"] = all(
        a.observed_contribution <= b.observed_contribution
        and b.conservative_upper <= a.conservative_upper
        and b.conservative_upper - b.observed_contribution
        == Fraction(2, 3) ** b.depth
        for a, b in zip(chain, chain[1:]))
    checks["swapping_rankings_preserves_the_whole_report"] = all(
        rank_prefix_report(a, b, p) == rank_prefix_report(b, a, p)
        for a, b, p in ((left, right, half), (left, (3, 2, 1), half),
                        ((), (), Fraction(1, 16)),
                        ((0, 31), (31, 1), Fraction(15, 16))))
    renamed = rank_prefix_report(tuple(x + 10 for x in left),
                                 tuple(x + 10 for x in right), half)
    checks["bijective_document_ID_renaming_preserves_the_report"] = renamed == manual
    checks["normalized_depth_weights_and_remaining_mass_sum_to_one"] = all(
        sum((row.depth_weight for row in report.steps), Fraction(0))
        + report.remaining_depth_mass == 1
        and sum((row.contribution for row in report.steps), Fraction(0))
        == report.observed_contribution
        for report in (manual, reverse, identical, empty, disjoint) + chain)
    deeper = rank_prefix_report(left, right, Fraction(3, 4))
    checks["persistence_changes_depth_weights_without_a_quality_claim"] = (
        manual.steps[0].depth_weight == half
        and deeper.steps[0].depth_weight == Fraction(1, 4)
        and deeper.remaining_depth_mass > manual.remaining_depth_mass
        and manual.steps[0].agreement == deeper.steps[0].agreement
        and manual.observed_contribution != deeper.observed_contribution)

    class IntChild(int):
        def __eq__(self, other):
            raise AssertionError("Excluded identity hooks must not run")
    class TupleChild(tuple):
        def __len__(self):
            raise AssertionError("Excluded shape hooks must not run")
    class FractionChild(Fraction):
        def __lt__(self, other):
            raise AssertionError("Excluded numeric hooks must not run")
    invalid_types = (
        ([1], (1,), half), ((1,), [1], half),
        (TupleChild((1,)), (1,), half), ((1,), TupleChild((1,)), half),
        ((True,), (1,), half), ((1,), (False,), half),
        ((1.0,), (1,), half), ((Fraction(1),), (1,), half),
        ((IntChild(1),), (1,), half), ((1,), (None,), half),
        ((1,), ("1",), half), ((1,), (b"1",), half),
        ((1,), (1,), 0.5), ((1,), (1,), 1), ((1,), (1,), True),
        ((1,), (1,), FractionChild(1, 2)),
        ((1,), (1,), None), (iter((1,)), (1,), half))
    invalid_values = (
        ((1,), (), half), ((), (1,), half),
        (tuple(range(9)), tuple(range(9)), half),
        ((-1,), (1,), half), ((1,), (32,), half),
        ((10 ** 100,), (1,), half),
        ((1, 1), (1, 2), half), ((1, 2), (2, 2), half),
        ((1,), (1,), Fraction(0)), ((1,), (1,), Fraction(1)),
        ((1,), (1,), Fraction(-1, 2)),
        ((1,), (1,), Fraction(1, 17)))
    checks["strict_exact_types_shapes_duplicates_and_bounds_rejected"] = (
        all(_rejected(TypeError, *args) for args in invalid_types)
        and all(_rejected(ValueError, *args) for args in invalid_values))

    global _new_prefix_set
    original_factory = _new_prefix_set
    def forbidden_factory():
        raise AssertionError("Processing began before whole admission")
    _new_prefix_set = forbidden_factory
    try:
        late_invalids = (((1, 2), (1, True), half),
                         ((1, 2), (1, 32), half),
                         ((1, 2), (1, 1), half),
                         ((1, 2), (1, 2), Fraction(1, 17)))
        late_types = (TypeError, ValueError, ValueError, ValueError)
        late_ok = all(_rejected(error, *args)
                      for error, args in zip(late_types, late_invalids, strict=True))
    finally:
        _new_prefix_set = original_factory
    endpoint = rank_prefix_report(tuple(range(8)),
                                   tuple(reversed(range(8))), Fraction(15, 16))
    checks["whole_late_admission_precedes_prefix_allocation_and_caps_are_inclusive"] = (
        late_ok and endpoint.depth == 8
        and rank_prefix_report((0, 31), (31, 0), Fraction(1, 16)).depth == 2)
    again = rank_prefix_report(left, right, half)
    frozen_report, frozen_step = False, False
    try:
        again.depth = 100
    except FrozenInstanceError:
        frozen_report = True
    try:
        again.steps[0].overlap = 100
    except FrozenInstanceError:
        frozen_step = True
    checks["fresh_immutable_outputs_and_original_inputs_preserved"] = (
        again == manual and again is not manual
        and again.steps is not manual.steps and again.steps[0] is not manual.steps[0]
        and frozen_report and frozen_step
        and left == (1, 2, 3) and right == (1, 3, 4))
    assert len(checks) == 14
    assert all(type(value) is bool and value for value in checks.values()), checks
    return _packed({
        "python": platform.python_version(),
        "implementation": platform.python_implementation(),
        "scope": "Authored strict ranking prefixes; no search engine or user data",
        "definition": "Finite normalized geometric DEPTH-agreement sum only",
        "bound_policy": "Conservative [observed, observed+p**k], not sharp RBO_MIN/MAX",
        "remaining_mass_is_not_item_rank_weight": True,
        "full_RBO_estimate_or_relevance_quality_reported": False,
        "profile": "Equal exact tuples0..8, unique exact int IDs0..31; exact Fraction0<p<1 denominator<=16",
        "manual_left": left, "manual_right": right, "manual": manual,
        "same_members_reverse": reverse,
        "identical_prefix": identical, "empty_prefix": empty,
        "disjoint_prefix": disjoint,
        "independent_family_profiles_ONE_group": profiles,
        "independent_family_depth_rows": agreement_rows,
        "invalid_type_cases": len(invalid_types),
        "invalid_value_cases": len(invalid_values),
        "late_preallocation_cases": len(late_invalids),
        "unique_check_groups": len(checks), "checks": checks,
        "third_party_RBO_library_model_or_network_executed": False})


if __name__ == "__main__":
    if not AUTHOR_MAIN_ENABLED:
        raise SystemExit("Author main remains disabled pending ROOT authorization")
    sys.stdout.reconfigure(encoding="utf-8", newline="\n")
    print(json.dumps(run_example(), ensure_ascii=True, indent=2, allow_nan=False))

مرجعِ مستقل، به‌جایِ اشتراکِ مجموعه‌ها، سندهای مشترک را یکی‌یکی دنبال می‌کند. هر سند از بزرگ‌ترِ دو جایگاهِ خودش به بعد، در تمامِ توافق‌های بعدی حضور دارد. مرجع، سهمِ این حضور را تا پایانِ بخشِ دیده‌شده جمع می‌کند؛ جمعِ سهمِ سندها باید با جمعِ سهمِ عمق‌ها برابر شود. این جابه‌جاییِ ترتیبِ جمع، مسیرِ انتظار را از پیاده‌سازیِ اصلی جدا می‌کند، هرچند تعریفِ ریاضیِ مسئله مشترک است.

خانوادهٔ محدودِ آزمون، همهٔ ترتیب‌های بدونِ تکرار با طولِ صفر تا چهار از چهار شناسه و سه مقدارِ قراردادیِ p را مقایسه می‌کند. این خانواده یک گروهِ بررسی است؛ هر ورودی، گروهِ مستقل به حساب نمی‌آید. شاهدِ دستی، تقارن، تغییرِ نامِ شناسه، گسترشِ سازگارِ پیشوند، ردِ ورودیِ دیرهنگام و تغییرناپذیری جدا بررسی می‌شوند. تعدادها و نسخهٔ اجرای واقعی در خروجیِ ثبت‌شده می‌آیند؛ این کنترل‌ها آزمونِ موتورِ جست‌وجو یا زمان‌سنجی نیستند.

۴. از سهمِ دیده‌شده تا بازهٔ ادامهٔ نادیده

کارت‌های دیده‌شده در جلوی پوشش ماتِ ادامهٔ دو فهرست
تصویر مفهومی: کارت‌های دیده‌شده در جلوی پوشش ماتِ ادامهٔ دو فهرست؛ بدون مقیاس عددی و مستقل از نتایج اجرای کد.

مجموعِ وزنِ عمق‌های پس از k، برابرِ p به‌توانِ k است. چون توافقِ هر عمق میانِ صفر و یک قرار می‌گیرد، ادامه نمی‌تواند سهمِ منفی یا بیش از این وزن اضافه کند. بنابراین امتیازِ تعریف‌شده برای هر ادامهٔ نامتناهیِ سازگار، در بازهٔ بستهٔ B تا B به‌علاوهٔ p به‌توانِ k است. این یک پوشِ محافظه‌کارانه است؛ تضمین نمی‌کنیم هیچ ادامه‌ای دقیقاً به دو سرِ آن برسد.

در شاهدِ سه‌جایگاهی، وزنِ باقی‌مانده یک‌هشتم است و بازه از هفده‌بیست‌وچهارم تا پنج‌ششم می‌رود. سندهای مشترکِ دیده‌شده در عمق‌های بعد هم حضور دارند؛ به همین دلیل، پایینِ این بازه معمولاً کرانِ تیز و دست‌یافتنی نیست. کد، فرمول‌های دقیق‌ترِ مقاله، برون‌یابیِ توافقِ ثابت یا یک تخمینِ کاملِ RBO را اجرا نمی‌کند. برچسبِ خروجی نیز «سهمِ دیده‌شده» است تا جمعِ ناقص، امتیازِ نهایی معرفی نشود.

{
  "python": "3.14.5",
  "implementation": "CPython",
  "scope": "Authored strict ranking prefixes; no search engine or user data",
  "definition": "Finite normalized geometric DEPTH-agreement sum only",
  "bound_policy": "Conservative [observed, observed+p**k], not sharp RBO_MIN/MAX",
  "remaining_mass_is_not_item_rank_weight": true,
  "full_RBO_estimate_or_relevance_quality_reported": false,
  "profile": "Equal exact tuples0..8, unique exact int IDs0..31; exact Fraction0<p<1 denominator<=16",
  "manual_left": [
    1,
    2,
    3
  ],
  "manual_right": [
    1,
    3,
    4
  ],
  "manual": {
    "depth": 3,
    "persistence": "1/2",
    "steps": [
      {
        "depth": 1,
        "overlap": 1,
        "agreement": "1",
        "depth_weight": "1/2",
        "contribution": "1/2"
      },
      {
        "depth": 2,
        "overlap": 1,
        "agreement": "1/2",
        "depth_weight": "1/4",
        "contribution": "1/8"
      },
      {
        "depth": 3,
        "overlap": 2,
        "agreement": "2/3",
        "depth_weight": "1/8",
        "contribution": "1/12"
      }
    ],
    "observed_contribution": "17/24",
    "remaining_depth_mass": "1/8",
    "conservative_upper": "5/6"
  },
  "same_members_reverse": {
    "depth": 3,
    "persistence": "1/2",
    "steps": [
      {
        "depth": 1,
        "overlap": 0,
        "agreement": "0",
        "depth_weight": "1/2",
        "contribution": "0"
      },
      {
        "depth": 2,
        "overlap": 1,
        "agreement": "1/2",
        "depth_weight": "1/4",
        "contribution": "1/8"
      },
      {
        "depth": 3,
        "overlap": 3,
        "agreement": "1",
        "depth_weight": "1/8",
        "contribution": "1/8"
      }
    ],
    "observed_contribution": "1/4",
    "remaining_depth_mass": "1/8",
    "conservative_upper": "3/8"
  },
  "identical_prefix": {
    "depth": 3,
    "persistence": "1/2",
    "steps": [
      {
        "depth": 1,
        "overlap": 1,
        "agreement": "1",
        "depth_weight": "1/2",
        "contribution": "1/2"
      },
      {
        "depth": 2,
        "overlap": 2,
        "agreement": "1",
        "depth_weight": "1/4",
        "contribution": "1/4"
      },
      {
        "depth": 3,
        "overlap": 3,
        "agreement": "1",
        "depth_weight": "1/8",
        "contribution": "1/8"
      }
    ],
    "observed_contribution": "7/8",
    "remaining_depth_mass": "1/8",
    "conservative_upper": "1"
  },
  "empty_prefix": {
    "depth": 0,
    "persistence": "1/2",
    "steps": [],
    "observed_contribution": "0",
    "remaining_depth_mass": "1",
    "conservative_upper": "1"
  },
  "disjoint_prefix": {
    "depth": 3,
    "persistence": "1/2",
    "steps": [
      {
        "depth": 1,
        "overlap": 0,
        "agreement": "0",
        "depth_weight": "1/2",
        "contribution": "0"
      },
      {
        "depth": 2,
        "overlap": 0,
        "agreement": "0",
        "depth_weight": "1/4",
        "contribution": "0"
      },
      {
        "depth": 3,
        "overlap": 0,
        "agreement": "0",
        "depth_weight": "1/8",
        "contribution": "0"
      }
    ],
    "observed_contribution": "0",
    "remaining_depth_mass": "1/8",
    "conservative_upper": "1/8"
  },
  "independent_family_profiles_ONE_group": 3939,
  "independent_family_depth_rows": 13008,
  "invalid_type_cases": 18,
  "invalid_value_cases": 12,
  "late_preallocation_cases": 4,
  "unique_check_groups": 14,
  "checks": {
    "manual_partial_overlap_exact_contributions_and_interval": true,
    "same_final_membership_different_order_changes_prefix_agreement": true,
    "empty_prefix_has_no_observed_evidence_and_full_coarse_interval": true,
    "identical_observed_prefix_is_not_an_exact_complete_similarity_one": true,
    "disjoint_prefix_zero_contribution_keeps_unseen_depth_uncertainty": true,
    "independent_identity_threshold_reference_ONE_finite_family": true,
    "consistent_prefix_extensions_nest_coarse_intervals": true,
    "swapping_rankings_preserves_the_whole_report": true,
    "bijective_document_ID_renaming_preserves_the_report": true,
    "normalized_depth_weights_and_remaining_mass_sum_to_one": true,
    "persistence_changes_depth_weights_without_a_quality_claim": true,
    "strict_exact_types_shapes_duplicates_and_bounds_rejected": true,
    "whole_late_admission_precedes_prefix_allocation_and_caps_are_inclusive": true,
    "fresh_immutable_outputs_and_original_inputs_preserved": true
  },
  "third_party_RBO_library_model_or_network_executed": false
}

p به‌توانِ k، جرمِ باقی‌ماندهٔ وزنِ «توافقِ عمق‌ها» است؛ آن را درصدِ سندهای دیده‌نشده یا وزنِ خودِ جایگاه‌های سند ننامیم. مقاله در بخشِ ۴٫۳ این دو وزن را جدا می‌کند، چون یک سند در چند توافقِ بعدی سهم دارد. اگر در همان دو فهرست یک جایگاهِ تازه آشکار کنیم و p ثابت بماند، پایینِ پوش کاهش نمی‌یابد و بالای آن افزایش نمی‌یابد؛ این خاصیت برای پیشوندهای سازگار است، نه دو ورودیِ دلخواه و متفاوت.

برای تفسیرِ نامتناهی، ادامه‌ای با هویت‌های کافی و بدونِ تکرار فرض می‌شود؛ کد هیچ ادامه‌ای تولید نمی‌کند. کرانِ شناسهٔ صفر تا ۳۱ فقط دامنهٔ ورودیِ آزمایش است، نه ادعای اینکه جهانِ سندها دقیقاً همین تعداد عضو دارد. برای فهرستِ واقعاً تمام‌شده، باید سیاستِ پایان را جدا تعریف کرد؛ خالی بودنِ ورودیِ این رابط به معنی «هیچ پیشوندی ندیده‌ایم» است و بازهٔ صفر تا یک می‌دهد.

۵. چهار پرسش دربارهٔ ترتیب، تساوی و عمق

فهرست‌های کارت در کنار دفتر بازبینی و ذره‌بین روی یک سند مستقل
تصویر مفهومی: فهرست‌های کارت در کنار دفتر بازبینی و ذره‌بین روی یک سند مستقل؛ بدون مقیاس عددی و مستقل از نتایج اجرای کد.

پرسش اول: برای دو فهرستِ اصلی و p برابرِ یک‌دوم، جمع و پوش را چگونه حساب کنیم؟ پاسخ: توافق‌های یک، یک‌دوم و دوسوم را در وزن‌های یک‌دوم، یک‌چهارم و یک‌هشتم ضرب می‌کنیم. حاصلِ جمع هفده‌بیست‌وچهارم است؛ افزودنِ یک‌هشتم، سقفِ محافظه‌کارانهٔ پنج‌ششم را می‌دهد. این سقف، فرمولِ کرانِ بیشینهٔ دقیقِ مقاله نیست.

پرسش دوم: اگر دو پیشوند کاملاً یکسان باشند، امتیازِ کامل یک است؟ پاسخ: فقط با فرضِ یکسان بودنِ تمامِ ادامه می‌توان چنین گفت. برای پیشوندِ یکسانِ سه‌عضوی و p برابرِ یک‌دوم، سهمِ دیده‌شده هفت‌هشتم و بالای پوش یک است. این فاصله، نادانی دربارهٔ ادامه را نگه می‌دارد؛ پایین‌تر بودنِ جمعِ متناهی، افتِ کیفیتِ جست‌وجو را اثبات نمی‌کند.

پرسش سوم: اگر مجموعهٔ نهاییِ اعضا برابر باشد، ترتیب مهم نیست؟ پاسخ: یک‌ـ‌دو‌ـ‌سه را با سه‌ـ‌دو‌ـ‌یک مقایسه کنید. توافقِ عمق‌ها صفر، یک‌دوم و یک است؛ سهمِ وزن‌دار با p برابرِ یک‌دوم، یک‌چهارم می‌شود. عضویتِ نهایی برابر است، اما صدرِ فهرست فرق دارد. جاکاردِ مجموعهٔ کامل، این تفاوتِ ترتیبی را نشان نمی‌دهد.

پرسش چهارم: آیا می‌توان تساویِ امتیازها را بی‌اثر فرض کرد؟ پاسخ: خیر. مطالعهٔ کورسی و اوربانو دربارهٔ تساوی در RBO نشان می‌دهد معنای تساوی و شکستنِ آن مهم است. رابطِ ما فقط ترتیبِ قطعیِ اعلام‌شده را می‌پذیرد؛ یکتاییِ شناسه‌ها ثابت نمی‌کند امتیازهای اولیه مساوی نبوده‌اند. گونهٔ آگاه از تساوی پیاده نشده است. منبعِ نخست نسخهٔ نویسندگانِ مقالهٔ نوامبرِ ۲۰۱۰ و منبعِ دوم پیش‌چاپِ مشخصِ v1 مورخِ ۱۱ ژوئنِ ۲۰۲۴ است؛ تاریخِ دسترسیِ ۱ آبانِ ۱۴۰۵، تاریخِ انتشارِ تازه یا آزمایشِ محصول نیست.

منابع و مطالعهٔ بیشتر

بررسی منابع: ۱ آبان ۱۴۰۵. تحلیل‌ها و پیشنهادهای اجرایی، جمع‌بندی نویسنده‌اند.