Scopo
La specificità è un punteggio numerico che misura quanto è vincolato un URN. Viene usata per:
- il ranking fra i candidati validi per il dispatch
- lo spareggio quando più candidati corrispondono
- 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:
- specificità della dimensione di input
- specificità della dimensione di output
- 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:
- Produrre cose diverse è la differenza semantica più grande fra due cap: non sono sostituibili per i consumatori a valle.
- Consumare cose diverse viene dopo: stesso artefatto, produttori alternativi; il planner fa il ranking fra di essi.
- 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
- Corrispondenza esatta del punteggio (dist = 0): la preferita fra i candidati validi per il dispatch con lo stesso punteggio
- Raffinamento (dist > 0): il candidato specializza la richiesta
- 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), mentreeffectresta un filtro strutturale esatto al di fuori del punteggio numerico - Questo dà a
outeinpriorità lessicografica suy, 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.