• Nenhum resultado encontrado

Fun¸c˜ao que checa o uso de canais dentro de uma lista de PParagraph e retorna um conjunto com os nomes dos canais utilizados.

FindCPP : PParList 7→TEnv 7→ P NAME FindCPP par Γ = ∅

FindCPP(nameset n == ns) Γ = ∅ FindCPP(n b= a) Γ = (FindCA a Γ)

FindCPP(p pl) Γ = (FindCPP p Γ) ∪ (FindCPP pl Γ)

B.36

Fun¸c˜ao FindImplicitChans

Fun¸c˜ao que extrai todas as defini¸c˜oes de canais impl´ıcitos de um processo. Retorna um conjunto de pares cujo primeiro elemento de cada par cont´em o nome de um canal encontrado, e o segundo elemento cont´em o tipo do canal.

FindImplicitChans : ProcDef 7→TEnv 7→ P(NAME 7→ T ) FindImplicitChans(d ¯ p) Γ = ImplicitChans d p Γ FindImplicitChans(d • p) Γ = FindImplicitChans p Γ FindImplicitChans(begin pp1 state s pp2 • a) Γ = ∅

FindImplicitChans(n) Γ = ∅

FindImplicitChans(p1 sym0 p2) Γ = (FindImplicitChans p1 Γ) ∪

∪ (FindImplicitChans p2 Γ)

FindImplicitChans(p \ cs) Γ = FindImplicitChans p Γ FindImplicitChans((d • p)(le)) Γ = FindImplicitChans p Γ FindImplicitChans(n(le)) Γ = ∅

FindImplicitChans(n[le1](le2)) Γ = ∅

FindImplicitChans((d ¯ p)blec)) Γ = (FindImplicitChans (d ¯ p) Γ) FindImplicitChans(nblec)) Γ = ∅ FindImplicitChans(n[le1]ble2c)) Γ = ∅ FindImplicitChans(p[ln1:= ln2]) Γ = chansProc ∪ ∪ (ImplicitRenameChans chansProc ln1 ln2 Γ) FindImplicitChans(n[le]) Γ = ∅ FindImplicitChans(left d • p) Γ = FindImplicitChans p Γ where : sym0= ; | 2 | u | ||| | |[cs]|, left = o 9 | 2 | u | ||| | |[ cs]|, chansProc = (FindImplicitChans p Γ)

B.37

Fun¸c˜ao FiniteDecs

Fun¸c˜ao que recebe uma declara¸c˜ao e verifica se as vari´aveis desta declara¸c˜ao possuem como tipos conjuntos finitos.

FiniteDecs : Dec 7→Bool

FiniteDecs (x : t) ⇔ (IsFinite t) FiniteDecs (x , xs : t) ⇔ (IsFinite t)

B.38

Fun¸c˜ao GenChans

Fun¸c˜ao que recebe uma lista de nomes de canais e um conjunto de parˆametros gen´ericos e retorna um conjunto que associa cada nome de canal ao conjunto de parˆametros gen´ericos.

GenChans : SeqName → P(NAME × T ) → P(NAME × P(NAME × T )) GenChans n gl = {n 7→ gl}

GenChans (n, ln) gl = (GenChans n gl) ∪ (GenChans ln gl)

B.39

Fun¸c˜ao GetTypeHead

Fun¸c˜ao que extrai o primeiro tipo simples de uma tupla de tipos.

GetTypeHead : T → T GetTypeHead t = t GetTypeHead (t × tl) = t

B.40

Fun¸c˜ao GetTypeTail

Fun¸c˜ao que retorna um tipo sem o primeiro tipo simples de uma tupla de tipos.

GetTypeTail : T → T GetTypeTail (t × tl) = tl

B.41

Fun¸c˜ao ImplicitChans

Fun¸c˜ao que extrai os canais impl´ıcitos de um processo indexado. Retorna um conjunto contendo os canais impl´ıcitos encontrados e seus tipos correspondentes.

ImplicitChans : Dec 7→ ProcDef 7→TEnv 7→ P(NAME × T )

ImplicitChans(d, p, Γ) ={N : NAME ; n : NAME | N ∈ (FindCP p Γ) ∧

n = MakeName(N , d) • n 7→ MakeType(Γ.channels N , d)}

B.42

Fun¸c˜ao ImplicitRenameChans

Fun¸c˜ao que extrai da lista de nomes de canais (do lado direito de uma renomea¸c˜ao de processo) aqueles canais que renomeiam os canais impl´ıcitos do processo. Recebe como parˆametros o conjunto de canais impl´ıcitos do processo, a lista de nomes dos canais que ser˜ao renomeados, a lista de nomes dos canais que ir˜ao substituir e o ambiente.

ImplicitRenameChans : P(NAME × T ) 7→ SeqName 7→SeqName 7→ TEnv 7→ P(NAME × T ) ImplicitRenameChans set n1 n2 Γ = if (n1∈ set) then {n27→ Γ.channels n2}

else ∅

ImplicitRenameChans set (n1, ln1) (n2, ln2) Γ = (ImplicitRenameChans set n1 n2 Γ) ∪

B.43

Fun¸c˜ao InstantiateTypesGenChan

Fun¸c˜ao que atualiza o ambiente substituindo os tipos gen´ericos de um canal pelos tipos passados como parˆametros. Recebe como parˆametros o conjunto de tipos gen´ericos de um canal, a lista dos novos tipos, o nome do canal gen´erico e o tipo deste canal.

InstantiateTypesGenChan : P(NAME × T ) 7→ SeqType 7→ NAME 7→ T 7→ TEnv InstantiateTypesGenChan{n : k } t c T = (channels = {c 7→ (ReplaceChanType n t T )}) InstantiateTypesGenChan {n : k , ns} (t, ts) c T = (InstantiateTypesGenChan {n : k } t c T ) ⊕ (InstantiateTypesGenChan {ns} ts c T )

B.44

Fun¸c˜ao Into

Fun¸c˜ao que checa se os elementos de uma lista est˜ao todos contidos num conjunto fornecido.

Into : SeqName → P NAME → Bool Into n set ⇔ (n ∈ set)

Into (n, ln) set ⇔ (n ∈ set) ∧ (Into ln set)

B.45

Fun¸c˜ao IsFinite

Fun¸c˜ao que checa se um tipo ´e finito. Como um tipo ´e um conjunto de poss´ıveis valores que uma vari´avel pode assumir, a fun¸c˜ao verifica se este tipo ´e um conjunto finito.

IsFinite : T → Bool

IsFinite t ⇔ (t = ∅) ∨ (∃ n : N; ∃ f : {k ∈ N; k ≤ n} → t • true)

B.46

Fun¸c˜ao IsNormalProc

Fun¸c˜ao que checa se um nome de processo passado como parˆametro n˜ao ´e um nome de processo parametrizado, nem indexado e nem gen´erico.

IsNormalProc : NAME 7→ TEnv 7→ Bool

IsNormalProc n Γ ⇔ (n 6∈ dom(Γ.parProcesses)) ∧ (n 6∈ dom(indexProcesses)) ∧ ∧ (n 6∈ dom(genProcesses))

B.47

Fun¸c˜ao MakeName

Fun¸c˜ao que constr´oi o nome de um canal impl´ıcito a partir do nome do canal original e das vari´aveis declaradas.

MakeName : NAME →Dec → NAME MakeName(N , i : t) = N i

MakeName(N , (i, is : t)) = MakeName(N i, is : t)

B.48

Fun¸c˜ao MakeType

Fun¸c˜ao que constr´oi e retorna o tipo, possivelmente composto, de uma canal impl´ıcito a partir do tipo original do canal e dos tipos das vari´aveis declaradas.

MakeType : T →Dec → T

MakeType t d = (MakeTypeChan d) × t

B.49

Fun¸c˜ao MakeTypeChan

Fun¸c˜ao que constr´oi um tipo composto a partir dos tipos de uma declara¸c˜ao.

MakeTypeChan : Dec →T MakeTypeChan (x : t) = t

MakeTypeChan (x , xs : t) = t × (MakeTypeChan (xs : t))

MakeTypeChan (d; ds) = (MakeTypeChan d) × (MakeTypeChan ds)

B.50

Fun¸c˜ao NewChans

Fun¸c˜ao que verifica se o conjunto de declara¸c˜oes de canais passado como parˆametro declaram canais novos, que ainda n˜ao existam no ambiente; ou caso j´a existam, tˆem os mesmos tipos.

NewChans : P(NAME × T ) 7→ TEnv 7→ Bool NewChans {x : t} Γ ⇔ x 6∈ dom(Γ.defNames) ∨

∨ (x ∈ dom(Γ.channels) ∧ t == Γ.channels x ) NewChans {x : t, xs} Γ ⇔ (NewChans {x : t} Γ) ∧ (NewChans xs Γ)

B.51

Fun¸c˜ao NewDefs

Fun¸c˜ao que verifica se os nomes definidos num par´agrafo de Z n˜ao est˜ao contidos num conjunto passado como parˆametro. Retorna true caso os nomes definidos sejam novos; e false em caso contr´ario.

NewDefs : ZPar 7→ P NAME 7→ Bool

NewDefs(ZED [ln] END) ns ⇔ (dom(ExtractGivenTypes ln) ∩ ns) = ∅ NewDefs(AX d | p END) ns ⇔ (dom(Decs d) ∩ ns) = ∅

NewDefs(SCH n st END) ns ⇔ n 6∈ ns

NewDefs(GENAX [ln] d | p END) ns ⇔ (dom(Decs d) ∩ ns) = ∅ NewDefs(GENSCH n [ln] st END) ns ⇔ n 6∈ ns

NewDefs(ZED n == e END) ns ⇔ n 6∈ ns NewDefs(ZED n [ln] == e END) ns ⇔ n 6∈ ns

NewDefs(ZED fts END) ns ⇔ (dom(ExtractFreeTypes fts) ∩ ns) = ∅ NewDefs(ZED `? p END) ns ⇔ true

NewDefs(ZED [ln] `? p END) ns ⇔ true NewDefs(ZED ot END) ns ⇔ true

B.52

Fun¸c˜ao NoConflicts

Fun¸c˜ao que verifica se existe redeclara¸c˜ao de nomes com tipos diferentes.

NoConflicts : P(NAME × T ) → Bool NoConflicts set ⇔ ](dom set) == ]set

B.53

Fun¸c˜ao NoRep

Fun¸c˜ao que checa se n˜ao existem nomes repetidos numa lista de nomes. Para isso, transforma a lista num conjunto e verifica se o n´umero de elementos do conjunto gerado ´e o mesmo que o n´umero de elementos da lista.

NoRep : SeqName → Bool NoRep ln ⇔ ](Set ln) == ]ln

B.54

Fun¸c˜ao NotInto

Fun¸c˜ao que verifica se nenhum dos nomes de uma lista de nomes passado como parˆametro est´a contido num conjunto tamb´em passado como parˆametro.

NotInto : SeqName → P NAME → Bool NotInto n set ⇔ (n 6∈ set)

NotInto (n, ln) set ⇔ (n 6∈ set) ∧ (NotInto ln set)

B.55

Fun¸c˜ao NotRedeclare

Fun¸c˜ao que verifica se n˜ao existe redeclara¸c˜ao de vari´aveis contidas em dois conjuntos passados como parˆametro. Retorna true caso n˜ao exista redeclara¸c˜ao e false, caso contr´ario.

NotRedeclare : P NAME → P NAME → Bool NotRedeclare s1 s2 ⇔ ](s1∪ s2) == (]s1+ ]s2)

B.56

Fun¸c˜ao NumTypes

Fun¸c˜ao que retorna o n´umero de tipos simples contidos dentro de um tipo produto cartesiano.

NumTypes : T → Int → Int NumTypes t n = n + 1

NumTypes (t × tl) n = (NumTypes tl (n + 1))

B.57

Fun¸c˜ao NumTypesChan

Fun¸c˜ao que retorna o n´umero de tipos simples contidos dentro de um tipo composto.

NumTypesChan : T → Int

B.58

Fun¸c˜ao RefGenParam

Fun¸c˜ao que recebe uma express˜ao representando um tipo e um conjunto de nomes de parˆametros gen´ericos e verifica se algum parˆametro gen´erico est´a sendo referenciado pela express˜ao.

RefGenParam : Expr → P NAME → Bool RefGenParam t ns ⇔ t ∈ ns

RefGenParam (P t) ns ⇔ (RefGenParam t ns)

RefGenParam (t × ts) ns ⇔ (RefGenParam t ns) ∨ (RefGenParam ts ns) RefGenParam e ns ⇔ false

B.59

Fun¸c˜ao RefState

Fun¸c˜ao que recebe a parte declarativa de um esquema e o ambiente, e verifica se na parte declarativa existe alguma referˆencia ao estado do processo.

RefState : Dec 7→TEnv 7→ Bool RefState n Γ ⇔ n == Γ.state RefState (∆n) Γ ⇔ n == Γ.state RefState (Ξn) Γ ⇔ n == Γ.state

RefState (d; ds) Γ ⇔ (RefState d Γ) ∨ (RefState ds Γ) RefState (n : t) Γ ⇔ false

RefState (n, ns : t) Γ ⇔ false

B.60

Fun¸c˜ao ReplaceChanType

Fun¸c˜ao que retorna o tipo de um canal, substituindo os nomes gen´ericos do tipo pelos novos tipos. Recebe como parˆametros o nome gen´erico, o tipo que substituir´a o nome gen´erico e o tipo do canal. ReplaceChanType : NAME 7→ T 7→T 7→ T ReplaceChanType n nt P t = P(ReplaceChanType n nt t) ReplaceChanType n nt (t × ts) = (ReplaceChanType n nt t) × (ReplaceChanType n nt ts) ReplaceChanType n nt t = if (t == n) then nt else t

B.61

Fun¸c˜ao Set

Fun¸c˜ao que retorna um conjunto de nomes a partir de uma lista de nomes.

Set : SeqName → P NAME Set n = {n}

B.62

Fun¸c˜ao VarsC

Fun¸c˜ao que extrai as vari´aveis de entrada de uma comunica¸c˜ao e retorna tais vari´aveis com seus tipos associados, de acordo com o tipo dos canais que transportam essas vari´aveis.

VarsC : Comm 7→TEnv 7→ TEnv

VarsC (c cpl) Γ = (localVars = (Extract cpl (Γ.channels c)))

B.63

Fun¸c˜ao VarsDec

Fun¸c˜ao que recebe uma declara¸c˜ao e retorna o ambiente atualizado com as vari´aveis declaradas - e suas varia¸c˜oes (x0, x ?, x !) - associadas aos seus tipos correspondentes.

VarsDec : Dec 7→TEnv

VarsDec (d; ds) = (VarsDec d) ⊕ (VarsDec ds)

VarsDec (x , xs : T ) = (VarsDec (x : T )) ⊕ (VarsDec (xs : T )) VarsDec (x : T ) = (localVars = (ExtractVars x T ))

B.64

Fun¸c˜ao VarsParDec

Fun¸c˜ao que extrai as vari´aveis, e seus tipos correspondentes, de uma declara¸c˜ao de comando parametrizado. Retorna um ambiente contendo as vari´aveis e seus tipos, associados ao nome do processo passado como parˆametro.

VarsParDec : ParDec 7→ TEnv VarsParDec (sym d) = VarsDec d

where : sym = val | res | valres,

B.65

Fun¸c˜ao Verify

Fun¸c˜ao que checa se as express˜oes, contidas na lista de express˜oes passada como parˆametro, est˜ao bem tipadas e possuem o tipo das vari´aveis correspondente, contidas na lista de nomes passada como parˆametro.

Verify : SeqName 7→ SeqExp 7→ TEnv 7→ Bool Verify n e Γ ⇔ Γ B e : Expression(Γ.localVars n)

Verify (n, ln) (e, le) Γ ⇔ (Verify n e Γ) ∧ (Verify ln le Γ)

B.66

Fun¸c˜ao VerifyParDec

Fun¸c˜ao que verifica se os argumentos de uma instancia¸c˜ao de comando parametrizado est˜ao consistentes com os respectivos parˆametros. No caso de parˆametros por resultado ou por valor- resultado, o argumento deve ser uma vari´avel em escopo.

VerifyParDec : ParDec 7→ SeqExp 7→ TEnv 7→ Bool

VerifyParDec (d; ds) (e, es) Γ ⇔ (VerifyParDec d e) ∧ (VerifyParDec ds es) VerifyParDec (val d) e Γ ⇔ true

VerifyParDec (symd) e Γ ⇔ e ∈ Γ.localVars

B.67

Fun¸c˜ao override

Fun¸c˜ao que retorna um ambiente de tipos derivado da sobreposi¸c˜ao entre dois ambientes de tipos passados como parˆametros.

⊕ : TEnv 7→TEnv 7→ TEnv

Γ ⊕ Γ0 =

(channels = Γ.channels ⊕ Γ0.channels,

genericChannels = Γ.genericChannels ⊕ Γ0.genericChannels, chansets = Γ.chansets ⊕ Γ0.chansets,

processes = Γ.processes ∪ Γ0.processes,

definedProcs = Γ.definedProcs ∪ Γ0.definedProcs, parProcesses = Γ.parProcesses ⊕ Γ0.parProcesses,

indexProcesses = Γ.indexProcesses ⊕ Γ0.indexProcesses,

genProcesses = Γ.genProcesses ⊕ Γ0.genProcesses, zDefs = Γ.zDefs ⊕ Γ0.zDefs,

defNames = Γ.defNames ∪ dom(Γ0.channels) ∪ dom(Γ0.chansets) ∪

∪ Γ0.definedProcs ∪ dom(Γ0.zDefs), localVars = Γ.localVars ⊕ Γ0.localVars,

state = Γ0.state,

params = Γ.params ⊕ Γ0.params, namesets = Γ.namesets ∪ Γ0.namesets,

actions = Γ.actions ∪ Γ0.actions,

definedActs = Γ.definedActs ∪ Γ0.definesActs, parActions = Γ.parActions ⊕ Γ0.parActions,

localZDefs = Γ.localZDefs ⊕ Γ0.localZDefs,

localDefNames = Γ.localDefNames ∪ Γ0.localVars ∪ Γ0.namesets ∪

∪ Γ0.definedActs ∪ dom(Γ0.localZDefs) ∪ dom(Γ0.params),

Regras de Tipos de Circus

Neste apˆendice listamos todas as regras de tipos de Circus definidas. As regras est˜ao separadas em grupos sint´aticos da linguagem. O objetivo desta listagem ´e disponibilizar uma referˆencia completa das regras de tipos de Circus, inclusive aquelas n˜ao apresentadas no Cap´ıtulo 3.

C.1

Regra de Programa

(ExtractProcDefs cpl) B cpl : CircusParagraphList Γ∅B cpl : Program