• Nenhum resultado encontrado

Variedades

No documento A semântica formal de MooZ (páginas 85-90)

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.

No documento A semântica formal de MooZ (páginas 85-90)

Documentos relacionados