mostra-se e discute-se abaixo a solução final completa deste exercício:
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