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

شناسههای یک، دو، سه و چهار فقط برچسبِ سندهای فرضیاند؛ بزرگیِ عدد، رتبه یا ارتباط را تعیین نمیکند. ترتیبِ 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 مورخِ ۱۱ ژوئنِ ۲۰۲۴ است؛ تاریخِ دسترسیِ ۱ آبانِ ۱۴۰۵، تاریخِ انتشارِ تازه یا آزمایشِ محصول نیست.
منابع و مطالعهٔ بیشتر
- وبر، موفات و زوبل؛ توافقِ وزندارِ پیشوند و تفاوتِ وزنِ عمق و جایگاه
- کورسی و اوربانو؛ تعریفِ RBO و مرزِ تساوی در ترتیبها
بررسی منابع: ۱ آبان ۱۴۰۵. تحلیلها و پیشنهادهای اجرایی، جمعبندی نویسندهاند.

