In questa sezione

Scopo

La specificità è un punteggio numerico che misura quanto è vincolato un URN. Viene usata per:

  1. il ranking fra i candidati validi per il dispatch
  2. lo spareggio quando più candidati corrispondono
  3. il calcolo della distanza per l’ordinamento di preferenza

La specificità NON viene usata per la validità del dispatch. Un candidato con specificità maggiore non è automaticamente idoneo al dispatch.


Specificità dei tagged URN

Definizione

spec_U : U → ℕ

La specificità di un tagged URN è la somma dei punteggi dei singoli tag.

Punteggio per tag

L’alfabeto dei vincoli ha sei forme canoniche. Ciascuna contribuisce con un intero fisso al punteggio di specificità dell’URN:

Alias scritto Canonica Valore memorizzato Punteggio Lettura
?x ≡ x? ≡ x=? ?x "?" 0 nessun vincolo
?x=v ≡ x?=v ≡ x=?v x?=v "?=v" 1 assente OPPURE (presente e diverso da v)
x ≡ x=* x "*" 2 presente con qualsiasi valore (must-have-any)
!x=v ≡ x!=v ≡ x=!v x!=v "!=v" 3 presente e diverso da v
x=v x=v "v" 4 presente ed esattamente v
!x ≡ x! ≡ x=! !x "!" 5 assente (must-not-have)

Punteggi distinti per ogni forma aiutano a disambiguare quando altrimenti si avrebbero pareggi. La scala è monotona all’interno di ciascun ramo:

  • Catena positiva (affermazioni di presenza): ?x (0) → x (2) → x=v (4), dall’assenza di vincoli all’identificazione esatta.
  • Catena negativa (affermazioni di assenza/esclusione): ?x (0) → x?=v (1) → x!=v (3) → !x (5), dall’assenza di vincoli all’assenza imposta.

Una chiave mancante nella mappa dei tag vale 0 (come l’esplicito ?x); il parser tratta ?x, x? e x=? come alias esatti di “nessun vincolo”, e la serializzazione emette sempre la forma canonica ?x.

Formula

spec_U(u) = Σ score(tag) for all tags in u

Esempi

media:                           → 0        # nessun tag
media:bytes                      → 2        # bytes=* (tag nudo = must-have-any)
media:bytes;pdf                  → 2 + 2 = 4
media:pdf;v=2.0                  → 2 + 4 = 6  # pdf=*, v=2.0 (esatto)
media:pdf;v=2.0;!compressed      → 2 + 4 + 5 = 11
media:image;record;numeric       → 2 + 2 + 2 = 6
media:pdf;v?=draft               → 2 + 1 = 3  # assente OPPURE diverso da draft
media:pdf;v!=draft               → 2 + 3 = 5  # presente e diverso da draft

Specificità dei cap URN

Definizione

spec_C : C → ℕ

I cap URN hanno quattro coordinate strutturali (in, out, y, effect), ma il punteggio numerico di specificità è la somma pesata delle tre coordinate che portano tag:

  1. specificità della dimensione di input
  2. specificità della dimensione di output
  3. specificità dei tag non direzionali

La coordinata effect è strutturale e partecipa al dispatch, alla conformità e all’inferenza dell’output a runtime, ma non fa parte del punteggio numerico di specificità. Le differenze di effetto sono trattate come distinzioni strutturali esatte, non come una scala di raffinamento più forte o più debole.

Formula

spec_C(c) = WEIGHT_OUT * spec_U(c.out)
          + WEIGHT_IN  * spec_U(c.in)
          + spec_U(c.y)

WEIGHT_OUT = 10_000
WEIGHT_IN  =    100

Le tre coordinate pesate non hanno lo stesso peso. Due ordini di grandezza separano ciascuna dalla successiva, producendo un unico intero le cui cifre codificano (out, in, y) per una decodifica a vista (40205 si legge come out=4, in=2, y=5). La priorità lessicografica (out, in, y) riflette l’intento di instradamento:

  1. Produrre cose diverse è la differenza semantica più grande fra due cap: non sono sostituibili per i consumatori a valle.
  2. Consumare cose diverse viene dopo: stesso artefatto, produttori alternativi; il planner fa il ranking fra di essi.
  3. Differire nei metadati dell’asse y è la differenza più piccola: y è descrittivo, non strutturale.

spec_U è la stessa funzione di specificità dei tagged URN definita in Specificità dei tagged URN. Tutte e tre le coordinate pesate (in, out e y) passano per un identico punteggio per tag; non c’è alcun caso speciale per asse né alcuna chiave di tag privilegiata. I pesi degli assi si applicano dopo il calcolo delle somme per asse.

La coordinata effect resta fuori da questa aritmetica. Una cap con effect=none non è “più specifica” della stessa (in, out, y) con effect=declared; è una diversa promessa strutturale sull’identità del media a runtime, e il dispatch tratta quella differenza in modo esatto.

Punteggio delle dimensioni direzionali

in e out sono media URN. La specificità è la somma dei punteggi per tag della tabella di verità (Punteggio per tag):

spec_U(media:)                       = 0           (nessun tag, vertice dell'ordine)
spec_U(media:pdf)                    = 2           (pdf=*, must-have-any)
spec_U(media:bytes;pdf)              = 2 + 2 = 4
spec_U(media:pdf;v=2.0)              = 2 + 4 = 6   (pdf=*, v=2.0 esatto)
spec_U(media:pdf;!compressed)        = 2 + 5 = 7   (pdf=*, !compressed must-not-have)
spec_U(media:pdf;?v)                 = 2 + 0 = 2   (pdf=*, v nessun vincolo esplicito)
spec_U(media:void)                   = 2           (marcatore void = must-have-any)

Il tipo top media: porta 0 tag e quindi contribuisce con 0; il tipo unità media:void porta un marcatore (void, valore *) e quindi contribuisce con 2.

Punteggio dei cap-tag

La dimensione dei cap-tag y è a sua volta un tagged URN di tag descrittivi arbitrari. Nessuna chiave in y ha un significato funzionale per il protocollo, ma la forma di ciascun tag riceve un punteggio esattamente come qualsiasi altro tag di un tagged URN (Punteggio per tag):

Forma del tag in y Punteggio Lettura
mancante (chiave assente) 0 nessun vincolo
?key 0 nessun vincolo esplicito
key?=v 1 assente OPPURE (presente e diverso da v)
marcatore nudo (es. extract, valore *) 2 must-have-any
key=* 2 must-have-any (come il marcatore nudo)
key!=v 3 presente e diverso da v
esatto (key=value) 4 deve avere questo valore
!key 5 must-not-have

I segmenti nudi e key=* sono la stessa forma: un tag marcatore scritto extract viene analizzato come extract=*, e contribuisce con 2 come qualsiasi altro tag must-have-any.

La specificità è una proprietà strutturale dell’insieme di tag dell’URN, non dell’asse su cui il tag si trova. Una cap che vincola target=metadata (esatto, punteggio 4) è più specifica di una che dichiara soltanto target=* (must-have-any, punteggio 2), esattamente nello stesso modo in cui media:pdf;v=2.0 è più specifico di media:pdf;v=*.

Esempi

Ogni esempio mostra le somme delle tre coordinate pesate (out, in, y), poi il totale pesato 10000*out + 100*in + y:

cap:effect=none                              → (0, 0, 0)         = 0
# in=media: (0), out=media: (0), y vuoto (0); effect è strutturale, non entra nel punteggio

cap:extract                                   → (0, 0, 2)         = 2
# in=media: (0), out=media: (0), extract=* (must-have-any → 2)

cap:extract;in=media:pdf;out=media:record     → (2, 2, 2)         = 20202
# out: record=* (2); in: pdf=* (2); y: extract=* (2)

cap:in="media:bytes;pdf";extract;out="media:numeric;record"
                                              → (4, 4, 2)         = 40402
# out: numeric=* + record=* (2+2); in: pdf=* + bytes=* (2+2); y: extract=* (2)

cap:in=*;extract;out=*                        → (0, 0, 2)         = 2
# in=* si normalizza in media: (0); out=* si normalizza in media: (0); y: extract=* (2)

cap:extract;target=metadata                   → (0, 0, 6)         = 6
# y: extract=* (2) + target=metadata (esatto → 4)

cap:extract;?target                           → (0, 0, 2)         = 2
# y: extract=* (2) + ?target (nessun vincolo esplicito → 0)

cap:extract;!constrained                      → (0, 0, 7)         = 7
# y: extract=* (2) + !constrained (must-not-have → 5)

cap:in=media:void;out=media:void;ping         → (2, 2, 2)         = 20202
# out: void=* (2); in: void=* (2); y: ping=* (2)

Due cap con lo stesso asse out ma assi in diversi si confrontano sempre sull’asse in prima che sull’asse y, perché WEIGHT_IN = 100 > 1. Due cap con assi out diversi si confrontano sempre prima lì, indipendentemente da in e y.


Proprietà

Non negatività

∀u ∈ U, spec_U(u) ≥ 0
∀c ∈ C, spec_C(c) ≥ 0

L’identità ha specificità zero

spec_U(media:) = 0
spec_C(cap:effect=none) = 0

Più vincoli = più specifico

Aggiungere un qualsiasi tag la cui forma valga più di 0 (tutto tranne ? / mancante) aumenta la specificità:

spec_U(media:)              < spec_U(media:pdf)              # aggiunto un must-have-any
spec_U(media:pdf)           < spec_U(media:bytes;pdf)        # aggiunto un altro must-have-any
spec_U(media:pdf;v=*)       < spec_U(media:pdf;v=2.0)        # ristretto * (2) → esatto (4)
spec_U(media:pdf;v?=draft)  < spec_U(media:pdf;v!=draft)     # ristretto ?=v (1) → !=v (3)
spec_U(media:pdf;v!=draft)  < spec_U(media:pdf;!v)           # ristretto !=v (3) → ! (5)

La scala è monotona all’interno di ciascun ramo:

  • Positivo: ?x (0) → x (2) → x=v (4)
  • Negativo: ?x (0) → x?=v (1) → x!=v (3) → !x (5)

Anche le transizioni fra rami (es. * → !) possono solo aumentare il punteggio, poiché ! (5) > * (2).

La specificità non determina ⪯

Una specificità maggiore non implica la relazione di raffinamento.

spec_U(media:pdf) = 2
spec_U(media:image) = 2

Questi hanno la stessa specificità ma NON sono confrontabili (rami diversi).


Uso

Ranking

Dopo aver stabilito la validità per il dispatch, si fa il ranking dei candidati secondo la distanza di specificità:

dist(candidate, request) = spec_C(candidate) - spec_C(request)

Interpretazione:

  • dist = 0: stesso punteggio numerico di specificità
  • dist > 0: il candidato è più specifico (raffinamento)
  • dist < 0: il candidato è più generico (ripiego)

Priorità di selezione

  1. Corrispondenza esatta del punteggio (dist = 0): la preferita fra i candidati validi per il dispatch con lo stesso punteggio
  2. Raffinamento (dist > 0): il candidato specializza la richiesta
  3. Ripiego (dist < 0): il candidato è generico, usato come ultima risorsa

Vedi Ranking per la politica di ranking completa.


Una sola funzione di punteggio, tre assi pesati

Esiste esattamente una funzione di punteggio per tag (la scala a sei forme in Punteggio per tag). Viene applicata in modo uniforme a ogni tag di ogni asse di ogni URN.

Ciò che differisce fra la specificità dei tagged URN e quella dei cap URN è soltanto il peso degli assi:

  • Tagged URN: un solo asse (l’insieme di tag dell’URN stesso), peso 1.
  • Cap URN: quattro coordinate strutturali; la specificità ordina le tre coordinate pesate (out, in, y) con pesi (10000, 100, 1), mentre effect resta un filtro strutturale esatto al di fuori del punteggio numerico
  • Questo dà a out e in priorità lessicografica su y, riducendo il ranking a un unico intero confrontabile

Stessa scala per tag. Stessa aritmetica. Solo pesi degli assi diversi.


Casi limite

URN vuoto

spec_U(prefix:) = 0
spec_C(cap:effect=none) = 0

L’identità ha specificità zero. cap:effect=none è la forma canonica della cap identità. Le forme top dichiarate nude cap: e cap:in=media:;out=media: non sono ammesse.

Tutti wildcard

spec_U(media:a;b;c) = 2 + 2 + 2 = 6

I marcatori nudi (x ≡ x=*) contribuiscono comunque alla specificità (sono vincoli must-have-any, non assenza).

Must-not-have

spec_U(media:!pdf)        = 5    # !x (must-not-have, vertice della catena negativa)
spec_U(media:pdf;v?=draft) = 2 + 1 = 3   # assente OPPURE diverso da draft (negativo più debole)
spec_U(media:pdf;v!=draft) = 2 + 3 = 5   # presente e diverso da draft

Il ramo negativo (?x=v → x!=v → !x) fornisce una specificità graduata per le affermazioni di assenza/esclusione.


Riepilogo

Concetto Definizione
Spec. tagged URN Σ score(tag) sulla scala a sei forme (0–5)
Spec. cap URN 10000 * spec_U(out) + 100 * spec_U(in) + spec_U(y)
Distanza spec(candidate) - spec(request)
Uso Ranking, non validità

La specificità misura quanto è vincolato un URN. Permette il ranking fra candidati validi ma non determina la validità del dispatch.