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