CHAPTER 5: CONTESTATIONS
5.5 S UMMARY OF THE MAIN FINDINGS
A relação de conformidade entre modelo e metamodelo estabelece se o primeiro está descrito conforme as regras definidas pelo segundo. Outros formalismos apresentados no capítulo 3 também definem suas relações de conformidade dentro de seus contextos. Essa relação é importante para a construção de ferramentas: assim como um compilador precisa analisar sintaticamente um código-fonte com respeito à gramática da linguagem de programação, uma ferramenta de modelagem precisa garantir que os modelos criados estão de acordo com os respectivos metamodelos desejados. Jackson, Levendovszky e Balasubramanian (2013) definem operadores de construção de modelos que adicionam ou removem elementos de modo que o modelo sempre permanece conforme a cada alteração. Dessa forma, uma ferramenta que aplica esse conceito garante que o modelo em construção está sempre em conformidade ao metamodelo.
99 O conceito de conformidade também é importante para ferramentas de transformação de modelos. É necessário garantir que existe conformidade entre modelo e metamodelo antes de operar sobre o modelo.
Nesta seção é apresentada a relação de conformidade do SBMM. Sejam M um modelo e MM um metamodelo quaisquer tais que:
MM = (nameMM, C, , E, R, descriptorc, descriptore)
M = (nameM, nameMM, I, descriptori)
A relação de conformidade é definida como uma função denominada conformsTo.
conformsTo: UM UMM ℬ
Em que UM representa o universo de modelos, UMM o universo de metamodelos e ℬ
= {true, false} o conjunto de valores booleanos.
Antes de um modelo estar em conformidade com um metamodelo, ele deve ser bem formado por si só. Um modelo é bem formado quando respeita as condições descritas ao longo da seção 4.7, resumidas a seguir:
nameM + : o nome do modelo é uma cadeia não-vazia;
nameMM + : o nome do metamodelo referenciado é uma cadeia não-vazia;
instancenamej + : o nome de toda instância é uma cadeia não-vazia;
ij, ik (ij I) (ik I) (instancenamej = instancenamek) ij = ik : não podem
haver instâncias com o mesmo nome no mesmo modelo;
metaclassnamej + : o nome de toda metaclasse referenciada como tipo
base de instância é uma cadeia não-vazia;
propertynamejx + : o nome de toda propriedade referenciada em slots é
100 (instancename, metaclassname, S) Im(descriptori) (propertyname1,
val1), (propertyname2, val2) S ( (propertyname1 = propertyname2) (val1 =
val2))): não pode haver mais de um slot referenciando o mesmo nome de
propriedade na mesma instância. Im(descriptori) denota o conjunto imagem
da função descriptori;
Por definição, um modelo M está em conformidade com um metamodelo MM se, além de ser bem formado, as quatro seguintes condições forem satisfeitas: (a) existe a metaclasse referenciada como tipo base para todas as instâncias pertencentes a I; (b) existe propriedade correspondente para todos os slots pertencentes aos conjuntos Sj de cada instância de I; (c) os valores de cada slot são válidos conforme
o tipo base da instância; (d) M satisfaz todas as restrições de R.
A avaliação de cada restrição de R, bem como sua representação, já foi discutida na seção 4.6. Serão, então, detalhadas as condições (a), (b) e (c).
A condição (a) pode ser representada através da seguinte sentença, uma vez que os tipos das instâncias ii I são referenciados por uma cadeia de símbolos que indica o
nome identificador da metaclasse no metamodelo. Com as definições e notação das seções 4.2 e 4.7 em mente, tem-se:
(instancename, metaclassname, S) Im(descriptori)
( (w, P) Im(descriptorc) (metaclassname = w))
Interpretação: para todo descritor de instância de I (instancename, metaclassname, S), pertencente, portanto, ao conjunto imagem de descriptori, existe um par (w, P)
que é descritor de alguma metaclasse de C tal que o nome do tipo referenciado por metaclassname é igual ao nome w da metaclasse.
A condição (b), por sua vez, requer a introdução da função auxiliar metaclass(MM, metaclassname), que toma um metamodelo e uma cadeia não-vazia para retornar o objeto correspondente à metaclasse de mesmo nome que existe dentro do metamodelo. Essa função pode ser definida pela expressão da eq. (20).
101 metaclass(MM, metaclassname) =
{ c | (c C) ((w, P) = descriptorc(c)) (metaclassname = w)}
(20)
Em um metamodelo bem formado, não há metaclasses com nomes repetidos e, portanto, a função metaclass retorna um conjunto unitário quando existir metaclasse com o nome metaclassname, ou o conjunto vazio quando não existir. A condição (b) pode então ser estabelecida por:
(instancename, metaclassname, S) Im(descriptori)
( (propertyname, val) S ( (w, t, m) PEFCMM(metaclass(MM, metaclassname))))
Interpretação: Para todo slot (propertyname, val) de todo descritor de instância (instancename, metaclassname, S), existe uma tripla (w, t, m) que é propriedade efetiva da metaclasse referenciada por metaclassname. Ou seja, o slot pode conter valor de uma propriedade direta da metaclasse ou de uma de suas supermetaclasses, transitivamente. A função PEFCMM foi definida pela eq. (7).
Observa-se aqui que a função metaclass retorna um conjunto unitário cujo elemento é uma metaclasse. Esse conjunto foi utilizado como argumento da função PEFCMM.
Subentende-se que é este único elemento que está sendo passado de fato para a função, já que o domínio de PEFCMM é o conjunto de metaclasses C conforme a eq.
(6).
Por fim, a condição (c) determina que todos os valores em slots devem ser válidos de acordo com os tipos no metamodelo. Se o tipo for uma enumeração, o valor deve ser uma cadeia codificada que representa um conjunto cujos valores pertencem ao conjunto de valores permitidos da enumeração. Se o tipo for uma metaclasse, o valor deve ser um conjunto de instâncias de tipo (não necessariamente o tipo base) dessa metaclasse. Também deve ser respeitada a multiplicidade de valores permitida pela propriedade.
Introduz-se a função auxiliar property(MM, metaclassname, propertyname), dada pela eq. (21), que retorna a propriedade efetiva de nome propertyname da metaclasse de nome metaclassname do metamodelo MM.
102
property(MM, metaclassname, propertyname) = { (w, t, m) | ( (w, t, m) PEFCMM(metaclass(MM, metaclassname))) (propertyname = w) }
(21)
Em um metamodelo bem formado, não há propriedades com nomes repetidos dentro da mesma metaclasse e, portanto, a função acima retorna um conjunto unitário quando existir propriedade com o nome propertyname na metaclasse de nome metaclassname, ou o conjunto vazio quando não existir. Assim como no caso da função metaclass, em que seu resultado foi subentendido como o único elemento de seu conjunto unitário, o mesmo será feito para property, de modo a simplificar a expressão. A condição (c) pode então ser denotada por:
(instancename, metaclassname, S) Im(descriptori) ( (propertyname, val) S
((propertyname, propertytype, mult) = property(MM, metaclassname, propertyname) (sc1 sc2 sc3 sc4)))
Interpretação: Para todo slot ou par (propertyname, val) de todo descritor de instância ou tripla (instancename, metaclassname, S), a propriedade efetiva (propertyname, propertytype, mult) correspondente ao slot deve atender a uma das subcondições sc1, sc2, sc3 ou sc4, sendo sc1 definida por:
(propertytype E) (descriptore(propertytype) = (enumname, L))
(mult = (lower, upper)) (upper *) (val *) (decodeMM(val) L*)
(|decodeMM(val)| lower) (|decodeMM(val)| upper)
Interpretação: Se o tipo propertytype for uma enumeração descrita por (enumname, L) com multiplicidade (lower, upper), então o valor decodificado do slot deve pertencer a uma lista finita, eventualmente vazia, de elementos de L, que são os valores permitidos para a enumeração propertytype. O número de elementos deve estar entre lower e upper. A função decodeMM foi definida pela eq. (18).
103
(propertytype E) (descriptore(propertytype) = (enumname, L))
(mult = (lower, *)) (val *) (decodeMM(val) L*)
(|decodeMM(val)| lower)
Interpretação: Caso similar ao da subcondição sc1, mas se aplica quando a
multiplicidade da propriedade do slot possui limite superior infinito. Nesse caso, não é verificado o limite superior do número de elementos do valor.
Para as subcondições seguintes, convém definir a função auxiliar types, que toma um metamodelo, um modelo e uma instância do modelo para retornar o conjunto de metaclasses que são tipos dessa instância. Lembrando que os tipos de uma instância são seu tipo base mais suas supermetaclasses. Essa função pode ser definida pela expressão da eq. (22):
types(MM, M, i) = {c | (c C)
(descriptori(i) = (instancename, metaclassname, S))
((c = metaclass(MM, metaclassname)) (((metaclass(MM, metaclassname), c) +))}
(22)
Seja então a subcondição sc3:
(propertytype C) (mult = (lower, upper)) (y *) (val { i | (i I) (propertytype types(MM, M, i))})
(|val| lower) (|val| upper)
Interpretação: Se o tipo propertytype for uma metaclasse com multiplicidade (lower, upper), então o valor do slot deve ser um conjunto finito, eventualmente vazio, contido no subconjunto das instâncias de I em que propertytype é um de seus tipos, que são os valores permitidos para a metaclasse propertytype. O número de elementos deve estar entre lower e upper.
104 Por fim, a subcondição sc4 é dada por:
(propertytype C) (mult = (lower, *))
(val { i | (i I) (propertytype types(MM, M, i))}) (|val| lower)
Interpretação: Caso similar ao da subcondição sc3, mas se aplica para quando a
multiplicidade da propriedade do slot possui limite superior infinito. Nesse caso, não é verificado o limite superior do número de instâncias no conjunto val.
O conjunto de todos os modelos possíveis conformes a um metamodelo MM é denotado por MMM, enquanto o conjunto de todas as possíveis instâncias da
metaclasse c C de MM é denotado por IMM(c). Algumas vezes é conveniente usar
IMM(c) para obter o conjunto de todas as possíveis instâncias de um conjunto de metaclasses. Assim, usar um conjunto de metaclasses como argumento de IMM(c),
sem alterar a notação, também é aceito.