• Nenhum resultado encontrado

3.2 Regras de Tipos

3.2.11 A¸c˜ao Parametrizada

Uma a¸c˜ao parametrizada est´a bem tipada se a declara¸c˜ao dos parˆametros (Declaration) estiver bem tipada; e se a a¸c˜ao envolvida (Action) tamb´em estiver bem tipada, em um contexto que inclui os parˆametros declarados.

Γ B d : Declaration (Γ ⊕ (params = Decs d)) B a : Action Γ B d • a : Action Parametrised(d)

Assim como ocorre com processos parametrizados, uma a¸c˜ao parametrizada est´a bem tipada se o corpo da a¸c˜ao est´a bem tipado quando o ambiente ´e enriquecido com as defini¸c˜oes dos parˆametros. No entanto, apenas o contexto da a¸c˜ao pode fazer referˆencias a esses parˆametros. No exemplo a seguir, mostramos um caso de inconsistˆencia na referˆencia aos parˆametros de uma a¸c˜ao.

channel out : N process P b= begin ... A b= x , y : N • B; Skip B b= out!x + y → Skip • Skip end

No exemplo, definimos uma a¸c˜ao parametrizada A, cujos os parˆametros s˜ao x : N e y : N. Esta a¸c˜ao referencia uma outra a¸c˜ao B. O problema est´a na a¸c˜ao B, j´a que ela est´a fazendo referˆencias aos parˆametros x e y da a¸c˜ao A. Isto ´e um erro pois o contexto destes parˆametros ´e apenas a a¸c˜ao B; Skip. Refor¸cando o que j´a foi dito na Se¸c˜ao 3.1: cada a¸c˜ao tem seu pr´oprio contexto, e o que for definido em uma a¸c˜ao n˜ao est´a no escopo de nenhuma outra a¸c˜ao.

3.2.12 A¸c˜ao

Action ::= Schema-Exp

Uma express˜ao de esquema bem tipada ´e uma a¸c˜ao bem tipada. Γ B sc : Schema-Exp

Γ B sc : Action

Action ::= N

Uma referˆencia a uma a¸c˜ao est´a bem tipada se o nome N tiver sido declarado antes como uma a¸c˜ao e n˜ao for um nome de a¸c˜ao parametrizada.

n ∈ (Γ.actions) n 6∈ (Γ.parActions) Γ B n : Action

Considerando o mesmo exemplo da regra de a¸c˜ao parametrizada, caso a a¸c˜ao principal fosse uma chamada `a a¸c˜ao A, sem a passagem de argumentos, ter´ıamos erro de tipos pois A ´e uma a¸c˜ao parametrizada, e exige argumento na sua instancia¸c˜ao.

Action ::= ParCommand

Um comando parametrizado ´e uma a¸c˜ao. Ele est´a bem tipado, como uma a¸c˜ao, se for um comando bem tipado.

Γ B c : ParCommand Γ B c : Action

Action ::= Action[N+:= N+]

A substitui¸c˜ao de a¸c˜ao se assemelha bastante com a renomea¸c˜ao de processo. A diferen¸ca ´e que, al´em de estarmos tratando com a¸c˜oes, os nomes envolvidos na substitui¸c˜ao devem ser nomes de vari´aveis locais j´a declaradas no processo que cont´em a a¸c˜ao.

De forma semelhante, uma substitui¸c˜ao de a¸c˜ao est´a bem tipada se a a¸c˜ao envolvida (Action) estiver bem tipada; os nomes das listas da substitui¸c˜ao tiverem sido declarados antes e apresentarem a mesma quantidade de elementos; e os nomes do lado direito da substitui¸c˜ao tiverem o mesmo tipo da vari´avel correspondente do lado esquerdo.

Γ B a : Action ]ln1 == ]ln2 (Into ln1 dom(Γ.localVars))

(Into ln2 dom(Γ.localVars)) (CheckVarsRenaming ln1 ln2 Γ)

A condi¸c˜ao CheckVarsRenaming requer que cada nome contido na segunda lista da subs- titui¸c˜ao (ln2) possua o mesmo tipo da vari´avel correspondente da primeira lista (ln1).

Action ::= Skip | Stop | Chaos

A¸c˜oes b´asicas est˜ao sempre bem tipadas.

Γ B Skip : Action Γ B Stop : Action Γ B Chaos : Action

Action ::= Communication → Action

Um prefixing est´a bem tipado se a comunica¸c˜ao estiver bem tipada e a a¸c˜ao envolvida tamb´em estiver bem tipada, em um ambiente estendido pelas vari´aveis de entrada da co- munica¸c˜ao. Os tipos das vari´aveis de entrada s˜ao determinados pelo tipo do canal usado para comunica¸c˜ao.

Γ B c : Communication (Γ ⊕ VarsC c Γ) B a : Action Γ B c → a : Action

A fun¸c˜ao VarsC , aplicada `a comunica¸c˜ao e ao ambiente de tipos corrente, retorna um outro ambiente contendo todas as vari´aveis de entrada de uma comunica¸c˜ao associadas aos tipos extra´ıdos a partir do tipo do canal. O ambiente retornado tamb´em cont´em as varia¸c˜oes das vari´aveis de entrada extra´ıdas. Por exemplo, se foi identificada a vari´avel de entrada x : T , o ambiente tamb´em conter´a x0 : T , x ? : T e x ! : T . Os valores

do ambiente retornado pela fun¸c˜ao atualizam o ambiente de tipos corrente atrav´es da aplica¸c˜ao da fun¸c˜ao overriding (⊕). Para exemplificar a extra¸c˜ao das vari´aveis de entrada, consideremos o programa a seguir.

[T ] channel c : N × T × N process P b= begin A b= c?a?b!a → Skip B b= c?x ?y → Stop C b= c?z → Skip • A; B; C end

As vari´aveis de entrada extra´ıdas da comunica¸c˜ao da a¸c˜ao A ser˜ao: a : N, a0 : N, a? : N,

a! : N, b : T , b0 : T , b? : T e b! : T . A vari´avel a, por ser o primeiro parˆametro da comu-

nica¸c˜ao, assumir´a o tipo do primeiro elemento que comp˜oe o tipo do canal, no caso, N. O mesmo racioc´ınio serve para o parˆametro de comunica¸c˜ao b, mas neste caso, ele assumir´a o tipo do segundo elemento que comp˜oe o tipo do canal. No caso da comunica¸c˜ao da a¸c˜ao B, as vari´aveis de entrada extra´ıdas ser˜ao: x : N (e suas varia¸c˜oes) e y : T × N (e suas varia¸c˜oes). Como temos apenas dois parˆametros de comunica¸c˜ao, o tipo do ´ultimo parˆametro ´e a tupla T × N. Finalmente, no caso da comunica¸c˜ao da a¸c˜ao C , como o canal c est´a comunicando um ´unico parˆametro, e este ´e de entrada, ele assume o tipo completo do canal. Portanto, as vari´aveis de entrada extra´ıdas s˜ao: z : N × T × N, z0 : N × T × N, z ? : N × T × N e z ! : N × T × N.

Action ::= Predicate & Action

Uma a¸c˜ao guardada est´a bem tipada se a guarda (Predicate) e a a¸c˜ao envolvida (Action) estiverem bem tipadas.

Γ B p : Predicate Γ B a : Action Γ B p & a : Action

Action ::= Action ; Action | Action ||| Action | Action u Action | Action 2 Action

A verifica¸c˜ao de uma combina¸c˜ao de a¸c˜oes ´e semelhante `a verifica¸c˜ao de uma combina¸c˜ao de processos: verificamos se as a¸c˜oes envolvidas est˜ao bem tipadas.

Γ B a1 : Action Γ B a2 : Action

Γ B a1 2 a2 : Action

Refor¸cando a id´eia de contexto: as vari´aveis definidas na a¸c˜ao (a1) n˜ao atualizam o

ambiente da a¸c˜ao (a2). Desta forma, no exemplo de a¸c˜ao abaixo, teremos um erro.

A b= (c?x → c?y → c!x + y → Skip) 2

(c!x + x → Stop)

Seja c um canal definido com o tipo N, a primeira a¸c˜ao da escolha externa do exemplo acima define as vari´aveis locais x e y do tipo N (e suas varia¸c˜oes). No entanto, a a¸c˜ao posterior da escolha externa faz referˆencia `a vari´avel x . Se x n˜ao foi definida globalmente ou dentro do processo como sendo do tipo N, teremos erro na a¸c˜ao do exemplo pois, c!x + x → Skip faz referˆencia a um nome que n˜ao est´a no seu escopo.

Action ::= Action |[ NSExpresion | CSExpression | NSExpression ]| Action

A verifica¸c˜ao de tipos de um paralelismo de a¸c˜oes se assemelha `a verifica¸c˜ao anterior. Adicionalmente, temos que verificar se a express˜ao do conjunto de canais (CSExpression) tamb´em est´a bem tipada.

Γ B a1 : Action Γ B a2 : Action Γ B ns1 : NSExpression

Γ B ns2 : NSExpression Γ B cs : CSExpression

Γ B a1|[ ns1| cs | ns2]| a2 : Action

Action ::= N(Expression+)

A verifica¸c˜ao de uma instancia¸c˜ao de a¸c˜ao parametrizada se assemelha `a verifica¸c˜ao de uma instancia¸c˜ao de processo parametrizado, sendo que ao inv´es de lidar com processos, aqui tratamos com a¸c˜oes.

n ∈ dom(Γ.parActions) Γ B le : ExpressionList(T ) (Check (Γ.parActions n) T )

Γ B n(le) : Action

Action ::= µ N • Action

Uma a¸c˜ao recursiva est´a bem tipada se a a¸c˜ao envolvida (Action) estiver bem tipada, podendo usar o nome N como um nome de a¸c˜ao.

(Γ ⊕ (definedActs = {n})) B a : Action Γ B µ n • a : Action

Mesmo o nome N sendo inclu´ıdo no ambiente como uma a¸c˜ao, vale ressaltar que o con- texto deste novo nome de a¸c˜ao ser´a apenas a a¸c˜ao a indicada na regra acima. Consider- emos o exemplo a seguir para explicar melhor esta observa¸c˜ao.

A b= (µ X • B; X ) B b= (µ Y • A); Y

No exemplo, definimos duas a¸c˜oes recursivas. Na a¸c˜ao A, o contexto do nome X ´e a composi¸c˜ao sequencial de a¸c˜oes: B; X . Desta forma, est´a correta a referˆencia de X como a¸c˜ao neste caso. J´a na a¸c˜ao B, o contexto do nome Y ´e apenas a referˆencia `a a¸c˜ao A. Portanto, esta a¸c˜ao apresenta um erro, pois Y est´a sendo usado como nome de a¸c˜ao fora do contexto da recurs˜ao.

Action ::= o

9Declaration • Action | ||| Declaration • Action

A verifica¸c˜ao de tipos de uma parametriza¸c˜ao iterativa de a¸c˜oes ´e semelhante `a verifica¸c˜ao de parametriza¸c˜ao iterativa de processos, sendo que aqui estamos tratando com a¸c˜oes. Da mesma forma, aqui os parˆametros declarados entram no contexto da a¸c˜ao.

Γ B d : Declaration (FiniteDecs d ) (Γ ⊕ (params = Decs d )) B a : Action

Γ B o

9 d • a : Action

Action ::= ||| Declaration • k[NSExpression]kAction

A regra de interleaving iterativo de a¸c˜oes ´e semelhante `as regras de parametriza¸c˜ao ite- rativa de a¸c˜oes, descritas anteriormente, acrescentando-se a condi¸c˜ao de que a express˜ao de conjunto de nomes (NSExpression) tamb´em deve estar bem tipada.

Γ B d : Declaration (Γ ⊕ (params = Decs d)) B a : Action (FiniteDecs d) Γ B ns : NSExpression

Γ B ||| d • k[ns]ka : Action

3.2.13 Comunica¸c˜ao Communication ::= N

Uma sincroniza¸c˜ao est´a bem tipada se o nome N tiver sido declarado antes como um canal de sincroniza¸c˜ao.

n ∈ dom(Γ.channels) Γ.channels n == wt Γ B n : Communication

O que determina se um canal ´e de sincroniza¸c˜ao ´e a ausˆencia de tipo associado ao canal. Como vimos na Se¸c˜ao 3.1, a ausˆencia de tipos de um canal ´e representado pelo s´ımbolo wt. A condi¸c˜ao n ∈ dom(Γ.channels) da regra acima ´e verdadeira apenas se o nome do canal estiver contido no ambiente, o que significa que ele foi declarado. J´a a condi¸c˜ao Γ.channels n == wt ´e verdadeira se, e somente se, o canal for de sincroniza¸c˜ao.

Communication ::= N CParameter+

Uma comunica¸c˜ao que envolve passagem de valores est´a bem tipada se o nome N tiver sido declarado antes como um canal com tipo; e se cada um dos parˆametros de comu- nica¸c˜ao (CParameter) envolvidos estiverem bem tipados. O n´umero de elementos da lista de parˆametros deve ser menor ou igual ao n´umero de elementos que comp˜oem o tipo do canal envolvido na comunica¸c˜ao. Consideramos que um tipo ´e composto de mais de um

elemento quando assume a forma de um produto cartesiano. n ∈ dom(Γ.channels)

((Γ.channels n) 6= wt) ]cpl ≤ (NumTypesChan (Γ.channels n)) (NoConflicts (Extract cpl T )) Γ B cpl : CParameterList(T )

Γ B n cpl : Communication where T = Γ.channels n

A fun¸c˜ao NumTypesChan recebe como argumento o tipo do canal envolvido na comu- nica¸c˜ao, e retorna a quantidade de componentes dele. J´a a fun¸c˜ao Extract recebe como argumentos a lista de parˆametros da comunica¸c˜ao e o tipo do canal. Ela retorna um conjunto contendo todas as vari´aveis de entrada da comunica¸c˜ao e suas varia¸c˜oes. Este conjunto, por sua vez, ´e passado como argumento para a fun¸c˜ao NoConflicts e ela resulta em verdadeiro se, e somente se, n˜ao existirem redeclara¸c˜oes de nomes com tipos diferentes.

Communication ::= N [Expression+] CParameter+

Uma comunica¸c˜ao atrav´es de uma instancia¸c˜ao de um canal gen´erico est´a bem tipada se: ˆ o nome N tiver sido declarado antes como um canal gen´erico;

ˆ as express˜oes envolvidas (Expression+) estiverem bem tipadas, e forem do tipo con-

junto;

ˆ o n´umero de express˜oes for igual ao n´umero de parˆametros gen´ericos do canal; ˆ cada um dos parˆametros de comunica¸c˜ao (CParameter) envolvidos estiverem bem

tipados, em um contexto onde o tipo do canal gen´erico usado na comunica¸c˜ao for instanciado pelos tipos passados atrav´es da lista de express˜oes;

ˆ e o n´umero de elementos da lista de parˆametros for menor ou igual ao n´umero de elementos que comp˜oem o tipo do canal.

n ∈ dom(Γ.genericChannels) Γ B le : ExpressionList(P T0)

]le == ](Γ.genericChannels n) ]cpl ≤ (NumTypesChan (Γ.channels n)) (NoConflicts (Extract cpl T )) Γ0 B cpl : CParameterList(T )

Γ B n[le]cpl : Communication

where Γ0 = Γ ⊕ (InstantiateTypesGenChan (Γ.genericsChannels n) le n T ),

T = Γ.channels n

a regra de comunica¸c˜ao, com condi¸c˜oes adicionais: a lista de express˜oes precisa estar bem tipada e a condi¸c˜ao ]le == ](Γ.genericChannels n) requer que o n´umero de elementos da lista de express˜oes seja igual ao n´umero de parˆametros gen´ericos do canal. O detalhe desta regra ´e que o ambiente de tipos para a verifica¸c˜ao dos parˆametros da comunica¸c˜ao (Γ0) ´e atualizado com o canal instanciado. A fun¸c˜ao InstantiateTypesGenChan recebe

como argumentos o conjunto com os parˆametros gen´ericos do canal, a lista de express˜oes que ir˜ao instanciar os tipos gen´ericos do canal, o nome do canal e seu tipo. Ela retorna um ambiente com o canal em quest˜ao instanciado. Vejamos como isso ocorre no exemplo a seguir.

channel c1 : N

channel [X ]c2 : X

process P b= begin • c1?v → c2[N]!v → Skip end

No exemplo acima, temos a defini¸c˜ao de um canal gen´erico c2 de tipo X . O processo P

possui na sua a¸c˜ao principal uma instancia¸c˜ao a este canal gen´erico: o parˆametro gen´erico X est´a sendo instanciado com o tipo N. Pela regra de tipos, o ambiente do parˆametro de comunica¸c˜ao !v cont´em o canal c2 instanciado com o tipo N. Como v ´e do tipo N

(extra¸c˜ao da vari´avel a partir da comunica¸c˜ao c1?v ), a instancia¸c˜ao da comunica¸c˜ao est´a,

portanto, bem tipada.

3.2.14 Parˆametros de Comunica¸c˜ao

Uma lista de parˆametros de comunica¸c˜ao est´a bem tipada se cada parˆametro de co- munica¸c˜ao envolvido estiver bem tipado. O ambiente de tipos de um parˆametro de comunica¸c˜ao ´e atualizado pelas vari´aveis de entrada (e suas varia¸c˜oes) dos parˆametros de comunica¸c˜ao imediatamente anteriores a ele.

Γ B cp : CParameter(GetTypeHead T )

(Γ ⊕ (ExtractVarsCP cp T )) B cpl : CParameterList(GetTypeTail T ) Γ B cp cpl : CParameterList(T )

As fun¸c˜oes GetTypeHead e GetTypeTail recebem como argumento o tipo do canal. A primeira fun¸c˜ao retorna o primeiro elemento que comp˜oe o tipo do canal, e a segunda fun¸c˜ao retorna um tipo sem o primeiro elemento que comp˜oe o tipo do canal. Por exemplo, se o tipo do canal for N × T × U , a fun¸c˜ao GetTypeHead retorna o tipo N, e a fun¸c˜ao GetTypeTail retorna o tipo T × U .

A fun¸c˜ao ExtractVarsCP recebe como argumentos um parˆametro de comunica¸c˜ao e o tipo deste parˆametro, e retorna um ambiente contendo todas as vari´aveis de entrada com suas varia¸c˜oes. Este ambiente atualiza o ambiente Γ, atrav´es da fun¸c˜ao overriding, e isto permite que os demais parˆametros de comunica¸c˜ao sejam verificados com as informa¸c˜oes

destas vari´aveis extra´ıdas, conforme apresentamos no exemplo a seguir. channel c : N × N × N process P b= begin ... A b= c?x ?y!x + y → Stop • A end

Na a¸c˜ao A deste exemplo, a express˜ao do terceiro parˆametro da comunica¸c˜ao (x + y) utiliza as vari´aveis de entrada dos parˆametros anteriores. Isto s´o ´e poss´ıvel devido `a extens˜ao do contexto das vari´aveis de entrada dos parˆametros de comunica¸c˜ao.

Uma lista de parˆametros de comunica¸c˜ao pode ser composta por apenas um parˆametro. Neste caso, a lista est´a bem tipada se este parˆametro estiver bem tipado.

Γ B cp : CParameter(T ) Γ B cp : CParameterList(T )

CParameter ::= ?N

Um parˆametro de entrada est´a bem tipado. N ´e uma vari´avel nova, e seu tipo ´e definido a partir do tipo do canal, conforme vimos nas regras anteriores.

Γ B ?cp : CParameter(T )

CParameter ::= ?N : Predicate

Um parˆametro de entrada com restri¸c˜ao est´a bem tipado se o predicado que define a res- tri¸c˜ao estiver bem tipado, podendo usar as vari´aveis de entrada extra´ıdas do parˆametro de comunica¸c˜ao. N ´e uma vari´avel nova, cujo tipo ´e igual ao tipo do canal ou ao tipo do componente correspondente a N no produto cartesiano que define o tipo do canal.

(Γ ⊕ (ExtractCP cp T )) B p : Predicate Γ B (?cp : p) : CParameter(T )

Um parˆametro de sa´ıda est´a bem tipado se a express˜ao (Expression) envolvida estiver bem tipada, e for do tipo do canal ou do componente correspondente `a express˜ao no produto cartesiano que define o tipo do canal.

Γ B e : Expression(T0) T0 == T

Γ B !e : CParameter(T )

3.2.15 Comando Parametrizado ParCommand ::= Command

Um comando simples ´e um comando parametrizado, e ele est´a bem tipado, como um comando parametrizado, se for um comando bem tipado.

Γ B c : Command Γ B c : ParCommand

ParCommand ::= (QualifiedDecl • Command)

Neste caso, o comando parametrizado est´a bem tipado se a declara¸c˜ao de parˆametros (QualifiedDecl) estiver bem tipada e se o comando envolvido (Command) tamb´em estiver bem tipado, em um contexto que inclui os parˆametros declarados.

Γ B pd : QualifiedDeclaration (Γ ⊕ (VarsParDec pd)) B c : Command Γ B pd • c : ParCommand(pd)

Esta regra se assemelha `as demais regras de processos e a¸c˜oes parametrizadas. Da mesma forma, os parˆametros entram no contexto da verifica¸c˜ao do comando. Isso significa que os nomes dos parˆametros podem ser usados livremente dentro do comando, desde que sejam obedecidas as regras de tipo. No entanto, no caso de um comando parametrizado, os parˆametros podem ser usados como vari´aveis, diferentemente dos parˆametros de processos e a¸c˜oes.

A fun¸c˜ao VarsParDec, aplicada `a lista de parˆametros, retorna um novo ambiente con- tendo todos os parˆametros (e suas varia¸c˜oes) associados aos seus tipos correspondentes. As defini¸c˜oes deste ambiente atualizam o ambiente de tipos corrente e permite a veri- fica¸c˜ao de tipos do comando com os parˆametros em escopo.

3.2.16 Declara¸c˜ao de Parˆametros QualifiedDecl ::= val Declaration

| res Declaration | valres Declaration

Uma declara¸c˜ao de parˆametros est´a bem tipada se a parte declarativa (Declaration) es- tiver bem tipada.

Γ B d : Declaration

Γ B val d : QualifiedDeclaration

QualifiedDecl ::= QualifiedDecl; QualifiedDecl

Uma composi¸c˜ao de declara¸c˜ao de parˆametros est´a bem tipada se cada uma das declara¸c˜oes envolvidas (QualifiedDecl) estiverem bem tipadas. O ambiente de cada declara¸c˜ao de parˆametro ´e atualizado pelos parˆametros das declara¸c˜oes anteriores.

Γ B pd1 : QualifiedDeclaration Γ0 B pd2 : QualifiedDeclaration

Γ B pd1; pd2 : QualifiedDeclaration

where Γ0 = Γ ⊕ (VarsParDec pd

1)

3.2.17 Comando

Para exemplificar cada regra de comando descrita nesta se¸c˜ao, vamos considerar o pro- grama abaixo. x : N channel c : N process P b= begin state St b= [s : N | s ≥ 0] A b= z : N • c?y → y : [z > 2, y0 = x ]; (var t : N • t := x ); t := z ;

(val a : N; res b : N • b := a)(3, s) if z = 0 → Skip

[] z > 0 → Stop fi

• A(10) end

Neste programa, o processo P define uma a¸c˜ao parametrizada A, cujo corpo ´e formado pela composi¸c˜ao seq¨uencial de alguns comandos. Nas regras a seguir, faremos referˆencias

a este programa para mostrar os pontos onde a verifica¸c˜ao de tipos dos comandos ocor- rer´a com sucesso ou n˜ao.

Command ::= N+: [Predicate, Predicate]

Um comando de especifica¸c˜ao est´a bem tipado se os predicados (Predicate) envolvidos es- tiverem bem tipados, e se as vari´aveis do quadro (N+) forem distintas entre si e estiverem

em escopo.

(NoRep ln) (Into ln dom(Γ.localVars)) Γ B pre : Predicate Γ B post : Predicate

Γ B ln : [pre, post] : Command

Observando o exemplo do in´ıcio desta se¸c˜ao, o comando de especifica¸c˜ao da a¸c˜ao A est´a bem tipado, pois y ´e uma vari´avel que est´a em escopo, e os predicados est˜ao bem tipados, de acordo com as regras de tipo de Z (lembrando que a vari´avel y0 ´e introduzida no ambi-

ente atrav´es da comunica¸c˜ao c?y). Entretanto, se o comando fosse y, t, y : [z > 2, y0 = x ],

ele n˜ao estaria bem tipado pois al´em de haver repeti¸c˜oes de nomes no quadro, o nome t n˜ao est´a no escopo do comando. E se o comando fosse z : [y > 0, z0 = y], tamb´em n˜ao

estaria bem tipado j´a que z ´e um parˆametro da a¸c˜ao e n˜ao pode ser tratado como uma vari´avel: ele n˜ao pode estar no quadro de uma especifica¸c˜ao e nem ser atribu´ıdo.

Command ::= N+:= Expression+

Um comando de atribui¸c˜ao est´a bem tipado se as express˜oes envolvidas (Expression+) es-

tiverem bem tipadas, e se resultarem em valores dos tipos das vari´aveis do lado esquerdo (N+). Al´em disto, estas vari´aveis j´a devem ter sido declaradas. O n´umero de express˜oes

deve ser igual ao n´umero de vari´aveis do lado esquerdo da atribui¸c˜ao. NoRep ln (Into ln dom(Γ.localVars))

]ln == ]le (Verify ln le Γ) Γ B ln := le : Command

A fun¸c˜ao Verify, aplicada `a lista de nomes, `a lista de express˜oes, e ao ambiente de tipos atual, resulta em verdadeiro se, e somente se, houver consistˆencia de tipos entre as vari´aveis do lado esquerdo do comando de atribui¸c˜ao e os respectivos tipos das express˜oes do lado direito do comando.

No exemplo, os comandos de atribui¸c˜ao t := x e b := a est˜ao bem tipados pois os nomes est˜ao em escopo e possuem os mesmos tipos. Al´em disto, os nomes do lado es- querdo das atribui¸c˜oes s˜ao nomes de vari´aveis. J´a a atribui¸c˜ao t := z n˜ao est´a bem tipada pois a vari´avel t n˜ao est´a no escopo da atribui¸c˜ao.

Um comando de declara¸c˜ao de vari´aveis est´a bem tipado se a parte declarativa (Declaration) estiver bem tipada, e se a a¸c˜ao envolvida tamb´em estiver bem tipada, no contexto das vari´aveis declaradas.

Γ B d : Declaration (Γ ⊕ (VarsDec d)) B a : Action Γ B var d • a : Command

A fun¸c˜ao VarsDec, aplicada `a declara¸c˜ao, retorna um ambiente de tipos contendo todas as vari´aveis declaradas e seus respectivos tipos, como tamb´em, todas as varia¸c˜oes destas vari´aveis. Por exemplo, se for declarada uma vari´avel x do tipo T , a fun¸c˜ao n˜ao apenas ir´a retornar um ambiente contendo esta vari´avel, como tamb´em as vari´aveis x0, x ?, x !

com o mesmo tipo T .

No exemplo do in´ıcio desta se¸c˜ao, a declara¸c˜ao da vari´avel t : N estende o escopo do comando de atribui¸c˜ao t := x . Por isto, ele est´a bem tipado. No entanto, o escopo desta vari´avel declarada n˜ao inclui a atribui¸c˜ao seguinte (t := z ).

Command ::= [Predicate] | {Predicate}

Uma suposi¸c˜ao, ou coer¸c˜ao, est´a bem tipada se o predicado envolvido (Predicate) estiver bem tipado.

Γ B p : Predicate Γ B [p] : Command

Γ B p : Predicate Γ B {p} : Command

Command ::= (QualifiedDecl • Command)(Expression+)

A verifica¸c˜ao de uma instancia¸c˜ao de comando parametrizado ´e semelhante `a verifica¸c˜ao de tipos de instancia¸c˜oes de processos e a¸c˜oes parametrizadas. Sendo que aqui, estaremos tratando com comandos.

Γ B d • c : ParCommand(d)

Γ B le : ExpressionList(T ) Check ((DecsParDec d ) T ) (VerifyParDec (ExtractParDecs d ) le Γ)

Γ B (d • c)(le) : Command

A fun¸c˜ao DecsParDec recebe como argumento uma declara¸c˜ao de parˆametros, e retorna um conjunto contendo todas os nomes dos parˆametros mapeados a seus respectivos tipos. J´a a fun¸c˜ao VerifyParDec, aplicada a uma declara¸c˜ao de parˆametros, a uma lista de express˜oes e ao ambiente de tipos corrente, resulta em verdadeiro se, e somente se, os