3.3 Assinaturas, Estruturas e Variedades
3.3.4 Variedades
O significado de um esquema pode ser definido como a assinatura do esquema com o conjunto de estruturas que satisfazem `a assinatura:
SchemaVariety sig : SchemaSIG
models : P schemaStruct models ⊆ struct(sig)
Devido `a presen¸ca dos axiomas, certas estruturas deixam de ser modelo do esquema, pois n˜ao satisfazem as propriedades expressas atrav´es dos axiomas.
Uma variedade de esquema V1 ´e uma subvariedade de V2 se V1.sig for uma subassina-
tura de V2.sig e as estruturas obtidas atrav´es da restri¸c˜ao dos modelos de V2 `a assinatura
de V1 forem modelos de V1:
schemaSubVar : SchemaVariety ↔ SchemaVariety
V1 schemaSubVar V2 ⇔
V1.sig schemaSubSIG V2.sig ∧
restrict V1.sig (|V2.models|) ⊆ V1.models
Dessa forma, V2 possui todos os nomes introduzidos por V1 e as propriedades compartilhadas
pelos modelos de V1 s˜ao mantidas pelos modelos de V2.
A opera¸c˜ao que renomeia os nomes dos given sets, classes e vari´aveis presentes na variedade de um esquema, pode ser definida como:
3.3. Assinaturas, Estruturas e Variedades 74
renameSchemaVar : (NAME 7½ NAME ) × (NAME 7½ NAME ) × (NAME 7½ NAME ) → (SchemaVariety 7→ SchemaVariety) renameSchemaVar (cm, gm, vm) = λ v : SchemaVariety | v .sig.classes = dom cm v .sig.given = dom gm v .sig.vars = dom vm • µ v0 : SchemaVariety | v0.sig.classes = cm(|v .sig.classes|) v0.sig.given = gm(|v .sig.given|) v0.sig.vars = vm(|v .sig.vars|)
v0.sig.type ◦ vm = (tsubst ((classT ◦ cm) ⊕ (givenT ◦ gm)))◦
v .sig.type v0.models = {M0 : struct(v0.sig) |
∃ M : v .models • M .gset = M0.gset ◦ (gm ∪ cm)
M .val = M0.val ◦ vm}
As fun¸c˜oes cm, gm e vm (utilizadas para a renomea¸c˜ao) s˜ao assumidas injetivas, a fim de evitar problemas decorrentes do conflito de nomes. Os nomes das classes, given sets e vari´aveis s˜ao renomeados e os tipos das novas vari´aveis s˜ao obtidos atrav´es da substitui¸c˜ao dos nomes dos tipos das vari´aveis anteriores pelos nomes dos novos given sets e classes. Para cada modelo anterior, um novo modelo para a nova variedade ´e obtido pela composi¸c˜ao das fun¸c˜oes gset e val com as fun¸c˜oes utilizadas na renomea¸c˜ao.
O fato de que os valores das vari´aveis nos novos modelos s˜ao realmente elementos do seu tipo, pode ser demonstrado atrav´es da seguinte prova:
Prova:
Sejam M e M0 como definidos em renameSchemaVar, ent˜ao:
1. M .gset = M0.gset ◦ (gm ∪ cm) ;def. da fun¸c˜ao renameSchemaVar
2. M .val = M0.val ◦ vm ;def. da fun¸c˜ao renameSchemaVar
Para todo X : v0.sig.given, tem-se que (I):
M0.gset X = Carrier M0.gset (givenT X ) ⇒
M0.gset = (Carrier M0.gset) ◦ givenT ;def. do operador “◦”
Da mesma forma, para todo X : v0.sig.class, tem-se que (II):
M0.gset X = Carrier M0.gset (classT X ) ⇒
M0.gset = (Carrier M0.gset) ◦ classT ;def. do operador “◦”
M0.val a0
= M0.val (vm a) ;pois a0 = vm a
= M .val a ;por 2.
E Carrier M .gset (v .sig.type a) ;def. da fun¸c˜ao struct
= Carrier (M0.gset ◦ (gm ∪ cm)) (v .sig.type a) ;por 1.
= Carrier ((Carrier M0.get) ◦ ((givenT ◦ gm) ⊕
(classT ◦ cm))) (v .sig.type a) ;por (I) e (II)
= (Carrier M0.gset) ◦ (tsubst ((givenT ◦ gm) ⊕
(classT ◦ cm)) (v .sig.type a)) ;prop. 3 da fun¸c˜ao tsubst
= Carrier M0.gset (v0.sig.type (vm a)) ;def. de v0.sig.type em
renameSchemaVar
= Carrier M0.gset (v0.sig.type a0) ;pois vm a = a0
portanto, M0.val a0 E Carrier M0.gset (v0.sig.type a0)
¥
A fun¸c˜ao de funcionalidade inversa38 `a restrict pode ser definida da seguinte forma: extend : SchemaSIG × SchemaVariety 7→ schemaStruct 7→ P schemaStruct extend =
λ Σ : SchemaSIG; V : SchemaVariety | Σ schemaSubSIG V .sig • λ M : struct (Σ) •
{M0 : V .models | restrict Σ M0 = M }
Na defini¸c˜ao de um esquema ´e poss´ıvel introduzir parˆametros formais gen´ericos, sendo
o esquema denominado de esquema gen´erico. Dessa forma, o significado de um esquema
´e dado por:
SchemaMeaning local : SchemaVariety
fparam : seq IDENT
fparam−1 ∈ (localids(local.sig.given) ½ N)
(1) ↓
local.sig.classes ∪ local.sig.given ∪ local.sig.vars ⊆
basenames(local.sig) ∪ localnames(local.sig)
(2) ↓
local.sig ∈ dom basis
local ´e a variedade do esquema e fparam registra a ordem dos parˆametros formais do
38Observe que a “funcionalidade” ´e inversa, n˜ao a fun¸c˜ao, pois a extens˜ao de uma estrutura resulta em
3.3. Assinaturas, Estruturas e Variedades 76 esquema39. A assinatura da variedade local cont´em, al´em das vari´aveis e constantes lo-
cais do esquema, as constantes globais e vari´aveis do estado da classe onde o esquema foi introduzido.
A parte axiom´atica garante que:
(1). Os nomes presentes na assinatura do esquema s˜ao locais (n´ıvel 1) ou globais (n´ıvel 0); (2). Os nomes associados ao n´ıvel 0 formam uma assinatura v´alida.
Al´em de esquemas gen´ericos, MooZ permite a introdu¸c˜ao de defini¸c˜oes gen´ericas. A semˆantica de uma defini¸c˜ao gen´erica ´e especificada como:
GenDefMeaning = SchemaMeaningb
ou seja, o significado de uma defini¸c˜ao gen´erica ´e o mesmo do esquema que introduz a defini¸c˜ao. Entretanto, como ilustrado em [Spivey88, p´ag. 83–89], ´e necess´ario garantir a condi¸c˜ao de unicidade da defini¸c˜ao gen´erica, ou seja, ´e necess´ario garantir que existe um ´
unico modelo do esquema que introduz a defini¸c˜ao gen´erica para cada modelo da variedade que registra os componentes do estado e valor atribu´ıdo aos seus parˆametros gen´ericos, evitando a inconsistˆencia por existir mais de um modelo ou mesmo nenhum modelo para a defini¸c˜ao gen´erica:
gmeaning : SchemaVariety → P GenDefMeaning gmeaning V =
{G : GenDefMeaning |
basis(G.local.sig) schemaSubSIG V .sig
(∀ M : V .models; aparam : seq W | #aparam = #G.fparam •
∃1M0 : G.local.models •
restrict (basis(G.local.sig)) M =
restrict (basis(G.local.sig)) M0
M0.gset ◦ (Tag 1) ◦ G.fparam = aparam)}
A parte axiom´atica garante que para cada modelo M da variedade do esquema que representa as vari´aveis de estado, given sets da classe e as constantes j´a definidas, e para cada valor atribu´ıdo aos parˆametros gen´ericos, existe um ´unico modelo M0 para a defini¸c˜ao
gen´erica onde os identificadores e valores associados ao n´ıvel 0 s˜ao os mesmos atribu´ıdos por
M e mais, os valores atribu´ıdos aos nomes que representam os parˆametros formais em M0s˜ao
39E interessante observar que devido `a forma expl´ıcita adotada para instancia¸c˜oes em MooZ (se¸c˜ao 2.4.1),´
n˜ao ´e necess´ario registrar a ordem dos parˆametros formais, basta que sejam registrados os nomes dos parˆametros formais. Entretanto, o processo descrito na se¸c˜ao 3.5.3 requer que a ordem seja tamb´em captu- rada, com o objetivo de facilitar a defini¸c˜ao das fun¸c˜oes semˆanticas.
iguais aos parˆametros reais fornecidos. A condi¸c˜ao de unicidade garante que o esquema que introduz a defini¸c˜ao gen´erica tem um ´unico modelo para cada conjunto de valores fornecidos como parˆametros reais. Como exemplo de defini¸c˜oes gen´ericas, considere os opera¸c˜oes de composi¸c˜ao de rela¸c˜oes “o
9” e “◦” definidas na classe Relation (confira na se¸c˜ao 2.3.1).
A semˆantica de uma classe deve conter a sintaxe da classe, que introduz os given sets, as superclasses, as constantes, as vari´aveis do estado e os m´etodos da classe. O significado das vari´aveis do estado e constantes da classe ´e capturado atrav´es de uma variedade de esquema e dois mapeamentos s˜ao necess´arios para mapear cada defini¸c˜ao em seu significado:
ClassVariety
sig : ClassSIG
state : SchemaVariety
sdict : WORD 7→ SchemaMeaning
gdict : WORD 7→ GenDefMeaning
models : P schemaStruct sig.state = state.sig
dom sdict ∩ dom gdict = ∅
dom(sig.opers) = dom sdict ∪ dom gdict
models = state.models ∀ w : dom sdict •
(sdict w ).local.sig = (sig.opers w )
basis((sdict w ).local.sig) schemaSubSIG state.sig ∀ w : dom gdict •
(gdict w ).local.sig = (sig.opers w )
basis((gdict w ).local.sig) schemaSubSIG state.sig
(gdict w ) ∈ gmeaning(state)
(paint w blank ) ∈ localids((gdict w ).local.sig.vars)
A fun¸c˜ao gdict corresponde ao mapeamento do nome de cada defini¸c˜ao gen´erica em seu significado, dado atrav´es de GenDefMeaning, enquanto a fun¸c˜ao sdict associa as outras defini¸c˜oes ao seu significado atrav´es de SchemaMeaning. A princ´ıpio, a fun¸c˜ao gdict poderia ser do tipo IDENT 7→ GenDefMeaning, entretanto, com o objetivo de evitar a possibilidade de declarar m´etodos decorados, esta defini¸c˜ao n˜ao ´e utilizada.