Gf1.1v1 | Gf1.1v2 | Gf1.1v3 | Gf1.1v3'
#T: 12 12 12 12
#N: 11 5 13 6
#P: 15 9 18 11
#PI: 6 0 6 0
RHS (min,max,med):
0,9,1.9 0,10,2.3 0,8,1.8 0,9,2.0
Alt (min,max,med)
2,2,2 ......
Alt/N: 8/11 8/5 10/13 10/6
TRec: LRec .......
#Q: 28 22 32 25
PGs ::= PGlist "." ;
PGlist ::= PG [ {";" PGList } ];
PG ::= IdOrient Tipo CoOrient Aluno "("Titulo")" Inic Fim;
IdOrient ::= alpha ;
Tipo ::= "PHD" | "MSC" ;
CoOrient ::= [ "CO-ORIENT" Nome ] ;
Aluno ::= Nome ;
Titulo ::= string;
Nome ::= string;
Inic ::= "INI" Ano ;
Fim ::= [ "FIM" Ano ] ;
Ano ::= numeric ;
string ::= quotedstring;
p1: PGList -> PG PGCont
p2: PGCont -> &
p3: | ";" PG PGCont
p1': PGList -> PG PGCont
p2': PGCont -> &
p3': | ";" PGList
verificou-se que a primeira (p1,p2,p3) era preferível por diminuir a dependência entre símbolos.
PGs : PGlist .
PGlist : PGlist PG
_epsilon_
PG : IdOrient Tipo CoOrient Aluno ( Titulo ) Inic Fim
IdOrient : ID
Tipo : PHD
MSC
CoOrient : _epsilon_
CO-ORIENT Nome
Aluno : Nome
Titulo : STRING
Nome : STRING
Inic : INI Ano
Fim : _epsilon_
FIM Ano
Ano : NUMBER
p1: Index : INDICE Entradas FINDICE
p2: Entradas : Entrada
p3: | Entradas Entrada
p4: Entrada : IdPag ":" LstPals
p5: LstPals : pal
p6: : LstaPals "," pal
p7: IdPag : num
a) criar uma lista de números de páginas
Rp2: Es0.lp = ins(E1.pg, nil)
Rp3: Es0.lp = ins(E2.pg, Es1.lp)
Rp4: E0.pg = IdPag1.pg
Rp7: IdPag0.pg = num1.val
b) contar as Entradas
Rp2: Es0.cnt = 1
Rp3: Es0.cnt = 1 + Es1.cnt
c) garantir que as Páginas aparecem por ordem crescente
Cp3: ( E2.pg > Es1.ult )
Rp2: Es0.ult = E1.pg
Rp3: Es0.ult = E2.pg
d) Garanta que não ha nenhuma Palavra repetida
Sol d1)
Cp3: ( testaRepete(Es1.lpal,E2.lpal) ) //operação mt pesada e desnecessaria
Rp3: Es0.lpal = concat(Es1.lpal,E2.lpal) //operação mt pesada
Rp4: E0.lpal = LstPals2.lpal
Pp5/Rp6: LstPals0.lpal = ins(...)
Sol d2)
Cp5: ( !existe(pal1.val,LstPals0.inlpal) ) //operação mt simples
Cp6: ( !existe(pal2.val,LstPals1.pal) )
Pp5: LstPals0.lpal = ins(pal1.val,LstPals0.inlpal) //operação igual/ simples
Rp6: LstPals0.lpal = ins(pal2.val,LstPals1.lpal); LstPals1.inlpal = LstPals0.inlpal
Rp4: LstPals2.inlpal = Entrada0.inlpal; Entrada0.lpal = LstPals2.lpal
Rp2: Entrada1.inlpal = nil; Entradas0.lpal = Entrada1.lpal
Rp3: Entrada2.inlpal = Entradas1.lpal; Entradas0.lpal = Entrada2.lpal
e) (ignorar restrição da alínea e)criar uma Lista de Pals com uma Lista de Pags
//de novo se coloca a mm situação da Sol d1)
//então vamos avançar logo para a Sol do tipo d2) com AHerdados
Rp4: LstPals2.inpg = IdPag1.pg;
LstPals2.inlpal = Entrada0.inlpal; Entrada0.lpal = LstPals2.lpal
Rp5: LstPals0.lpal = update( mkpair(pal1.val,LstPals0.inpg), LstPals0.inlpal)
//insere o par se Pal não existe, acrescenta Pag a ListaPags se Pal ja existe
Rp6: LstPals0.lpal = update( mkpair(pal2.val,LstPals0.inpg), LstPals1.lpal)
LstPals1.inlpal = LstPals0.inlpal
Rp2: Entradas0.lpal = Entrada1.lpal; Entrada1.inlpal = nil;
Rp3: Entradas0.lpal = Entrada2.lpal; Entrada2.inlpal = Entradas1.lpal
p1: Candidatura : Dados Entidades Proj
p2: Dados : IdCand data Eixo Prog
p3: Entidades : Entid
p4: | Entidades Entid
p5: Entid : CodE
p6: Entid : NOVA CodE Nome Morad Resp
p7: Proj : Desc Inic Fim Fases
p8: Fases : Fase
p9: : Fases Fase
p10: Fase : CodE Desc Inic Fim Custo
p..: Eixo : e1 | e2 | ... en
p..: Prog : p1 | p2 | ... pk