Escolar Documentos
Profissional Documentos
Cultura Documentos
RECIFE/2015
Orientador:
Silvio Romero de Lemos Meira
Recife
2015
Catalogao na fonte
Bibliotecria Joana DArc Leo Salvador CRB4-532
A663o
UFPE-MEI 2015-107
______________________________________________
Prof. Augusto Czar Alves Sampaio
Centro de Informtica/UFPE
______________________________________________
Prof. Jones Oliveira de Albuquerque
Departamento de Estatstica e Informtica / UFRPE
_________________________________________________
Prof. Silvio Romero de Lemos Meira
Centro de Informtica / UFPE
Agradecimentos
Quero agradecer, em primeiro lugar, minha esposa, Karina. Sem o seu apoio
incondicional, no teria ido to longe. Agradeo tambm minha filha, Alice. Sua chegada,
no incio desta pesquisa, encheu-nos de alegria.
Diversos outros agradecimentos so devidos. Ao meu pai, Stelio, que me apresentou
ao computador e, ainda mais importante, ao violo, quando eu ainda era criana. minha
me, Henrriete, que foi minha primeira professora de Matemtica e, portanto, de Cincia
da Computao. minha irm Stella, que deu, por mim, o primeiro passo para que esta
pesquisa fosse possvel. minha sogra Tnia, que, assim como meus pais, nos ajudou a
cuidar de Alice.
Ao meu amigo e, agora, orientador, Silvio. Quase duas dcadas depois de nossa
primeira colaborao, seu entusiasmo continua sendo uma poderosa fora motriz para
mim. Aos professores Kiev e Nelson, cuja participao foi fundamental para a publicao
de alguns dos resultados alcanados nesta pesquisa. Ao professor Airton, que, com muita
pacincia, me ensinou Anlise Real.
Aos meus grandes amigos Fbio, Idevan, Celso e Humberto. Esta pesquisa ,
tambm, fruto de tudo o que aprendemos juntos na NEWStorm e na Pitang.
Por fim, gostaria de agradecer ao Banco Central do Brasil, que patrocinou esta
pesquisa, e aos colegas com quem trabalho, os quais assumiram minhas funes durante
minha ausncia.
Resumo
ORMs (Object-Relational Mappers) so bastante populares porque eles reduzem o esforo
de desenvolvimento de camadas de acesso a dados ao permitir, entre outras coisas, que
sistemas manipulem objetos transientes e persistentes de maneira similar. Em particular,
ORMs permitem que sistemas naveguem por objetos de ambos os tipos exatamente
da mesma maneira. Infelizmente, entretanto, navegar por objetos persistentes muito
mais lento do que navegar por objetos transientes. Para atenuar este problema, ORMs
pr-carregam objetos executando consultas SQL (Structured Query Language) que, no
lugar de carregar os atributos de um nico objeto, tal como ocorre quando objetos so
carregados sob demanda, carregam os atributos de vrios objetos. Em muitos casos, estas
consultas podem ser executadas concorrentemente. Entretanto, a maioria dos ORMs
executa consultas apenas sequencialmente.
Esta pesquisa visa aumentar o desempenho de sistemas baseados em ORMs. Para tanto,
ela define uma DSL (Domain-Specific Language) de especificao de navegaes por objetos
chamada Litoral. Tambm integra esta pesquisa o projeto e a implementao de um
interpretador de especificaes Litoral. O interpretador navega por objetos transientes
(aqueles que existem apenas na memria primria) e persistentes (aqueles que armazenados
em um banco de dados relacional) e pr-carrega os do segundo tipo executando consultas
sequencialmente ou concorrentemente.
A estratgia desta pesquisa foi avaliada com os benchmarks sintticos Emeio e OO7,
desenvolvidos, respectivamente, no contexto desta pesquisa e por terceiros. No primeiro,
pr-carregar objetos executando consultas concorrentemente aumentou a velocidade de
execuo em at 323,6%. No segundo, o aumento foi de at 245,7%. Os benchmarks
tambm foram implementados com os ORMs Hibernate e EcliseLink JPA, os quais
aderem especificao JPA (Java Persistence Architecture). O primeiro foi escolhido
por ser bastante popular. O segundo foi escolhido por ser a implementao de referncia
desta especificao. As implementaes baseadas no Hibernate e EclipseLink JPA foram
significativamente otimizadas. Entretanto, em todos os cenrios de Emeio e OO7 que
oferecem oportunidades para pr-carregar objetos executando consultas concorrentemente,
o desempenho delas foi inferior ao da implementao baseada no interpretador de Litoral.
Palavras-chaves: Mapeamento objeto-relacional. Pr-carregamento. Concorrncia.
Abstract
ORMs (Object-Relational Mappers) are quite popular because they reduce the effort of
developing data access layers by allowing, among other things, systems manipulate transient
and persistent objects in similar ways. In particular, ORMs allow systems navigate through
objects of both types exactly the same way. Unfortunately, however, navigating through
persistent objects is much slower than navigating through transient ones. To alleviate this
problem, ORMs prefetch objects executing SQL (Structured Query Language) queries
that fetch the attributes of multiple objects. In many cases, these queries can be executed
concurrently. However, most ORMs execute queries sequentially only.
In this research, we aim to increase the performance of ORM based systems. To this
end, we define a DSL (Domain-Specific Language) for specifying navigations through
objects called Litoral. We also implement a Litoral interpreter that navigates through
transient (objects that exist only in the primary memory) and persistent objects (objects
stored in a relational database) and prefetches the second type with queries executed
sequentially or concurrently.
We evaluated our strategy with the synthetic benchmarks Emeio and OO7. In the first
one, prefetching objects with queries concurrently executed increased execution speed up
to 323.6%. In the second one, the increase was up to 245.7%. We also implemented the
benchmarks with the Hibernate and EcliseLink JPA ORMs, which adhere to the JPA (Java
Persistence Architecture) specification. We chose the first one because it is quite popular
and the second one because it is the reference implementation of JPA. We optimized
the implementations based on Hibernate and EclipseLink JPA extensively. However, in
all scenarios of Emeio and OO7 that offer opportunities for prefetching objects with
queries concurrently executed, their performance was inferior to the performance of the
implementations based on the Litoral interpreter.
Lista de ilustraes
Figura 1 Trecho de cdigo Java que navega por objetos. . . . . . . . . . . . . . .
Figura 2 Especificao Litoral que declara navegaes de mensagens para seus
remetentes e destinatrios. . . . . . . . . . . . . . . . . . . . . . . . . .
Figura 3 Trecho de cdigo Java que pr-carrega objetos com o interpretador de
Litoral. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Figura 4 Trecho de cdigo Java que requisita objetos especificando o predicado
que eles devem satisfazer. . . . . . . . . . . . . . . . . . . . . . . . . .
Figura 5 Consultas SQL que ORMs executam para carregar sob demanda os
atributos de mensagens manipulados pelo trecho de cdigo da Figura 4.
Figura 6 Consulta SQL que pr-carrega todos os atributos do primeiro tipo de
uma mensagem. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Figura 7 Consulta SQL que pr-carrega todos os atributos do tipo I de uma
mensagem e, atravs de uma juno, tambm seu remetente. . . . . . .
Figura 8 Consulta SQL que pr-carrega todos os atributos de uma mensagem. .
Figura 9 Consultas que pr-carregam os destinatrios e os remetentes de vrias
mensagens atravs do operador in de SQL. . . . . . . . . . . . . . . . .
Figura 10 Trecho de cdigo Java que informa a ORMs compatveis com a especificao JPA quais objetos eles devem pr-carregar. . . . . . . . . . . . .
Figura 11 Mtodo Java que carrega as mensagens enviadas por um usurio. . . .
Figura 12 Mtodo Java que carrega as mensagens enviadas por um usurio e
pr-carrega seus remetentes. . . . . . . . . . . . . . . . . . . . . . . . .
Figura 13 Gramtica de Litoral em notao EBNF e em diagramas de sintaxe.
Figura 14 Trecho de cdigo Java que navega por objetos. . . . . . . . . . . . . . .
Figura 15 Especificao Litoral que navega atravs de um nico atributo. . . .
Figura 16 Gerao da especificao da Figura 15 a partir da gramtica de Litoral.
Figura 17 Especificao Litoral que navega atravs de colees de objetos. . . .
Figura 18 Especificao Litoral que navega atravs de mais de um atributo. . .
Figura 19 Gerao da especificao da Figura 18 a partir da gramtica de Litoral.
Figura 20 Especificao Litoral que navega por um nico atributo. . . . . . . .
Figura 21 Especificao Litoral que navega indiretamente. . . . . . . . . . . . .
Figura 22 Especificao Litoral que encadeia navegaes indiretas. . . . . . . .
Figura 23 Especificao Litoral que replica uma navegao. . . . . . . . . . . .
Figura 24 Especificao Litoral que define uma travessia. . . . . . . . . . . . .
Figura 25 Gerao da especificao da Figura 24 a partir da gramtica de Litoral.
Figura 26 Especificao Litoral que define uma travessia recursiva. . . . . . . .
Figura 27 Representao de classes e objetos no interpretador definidor. . . . . .
17
18
18
26
26
27
27
29
29
30
33
33
34
35
36
36
36
37
37
37
38
38
39
39
40
41
42
Figura
Figura
Figura
Figura
Figura
Figura
Figura
Figura
Figura
Figura
Figura
Figura
Figura
Figura
Figura
Figura
Figura
28
29
30
31
31
31
31
32
33
33
33
34
35
36
37
38
39
Figura 40
Figura 41
Figura
Figura
Figura
Figura
Figura
Figura
Figura
Figura
Figura
Figura
Figura
Figura
42
43
44
45
46
47
48
49
50
51
52
53
43
43
44
45
46
47
48
50
51
52
53
54
55
55
55
56
57
57
58
59
63
64
65
66
66
67
67
67
68
68
69
69
69
71
72
72
73
73
74
75
76
77
78
80
81
82
86
87
87
88
89
91
93
93
94
95
96
111
114
AST
BCB
CAD
CAM
CASE
DSL
Domain-Specific Language
EBNF
E/S
Entrada/Sada
JPA
JPQL
ORM
Object-Relational Mapper
OODBMS
REST
RMI
SGBD
SOAP
SQL
VLSI
XPath
XML
Sumrio
1
1.1
1.2
1.3
1.4
1.4.1
1.4.2
1.5
1.6
INTRODUO
Objetivo . . . .
ORMs . . . . .
Hiptese . . . .
Estratgia . . .
Viabilidade . . .
Generalidade . .
Avaliao . . .
Organizao . .
2
2.1
2.2
2.2.1
2.2.2
2.2.3
.
.
.
.
.
.
.
.
.
16
16
16
17
18
19
19
20
20
. . .
. . .
. . .
. . .
. . .
. . .
. . .
. . .
. . .
em
. . .
. . .
. . .
. . .
. . .
. . .
. . .
. . .
22
22
23
23
23
23
2.3.1
2.3.2
2.3.3
2.3.4
2.3.5
2.3.6
2.4
CONCEITOS BSICOS . . . . . . . . . . . . . . . . . . . . . .
Sistemas Intensivos em Processamento e em E/S . . . . . . . .
Otimizao de Sistemas Intensivos em E/S . . . . . . . . . . .
Caching . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Agregao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Carregamento sob Demanda e Pr-carregamento . . . . . . . . . . .
Pr-carregamento Informado e Especulativo . . . . . . . . . . . . . . . . .
Compresso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Concorrncia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Carregamento sob Demanda, Pr-carregamento e Agregao
ORMs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Tipos de Atributo . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Carregamento de Atributos do Tipo I . . . . . . . . . . . . . . . . .
Carregamento de Atributos do Tipo II que Referenciam Objetos . . .
Carregamento de Atributos do Tipo II que Referenciam Colees . . .
Pr-carregamento Informado . . . . . . . . . . . . . . . . . . . . . .
Pr-carregamento Especulativo . . . . . . . . . . . . . . . . . . . . .
Hiptese . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3
3.1
3.2
3.3
3.3.1
3.3.2
3.3.3
LITORAL . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Requisitos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Sintaxe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Semntica Informal . . . . . . . . . . . . . . . . . . . . . . . . .
Navegando Atravs de um nico Atributo . . . . . . . . . . . . . .
Navegando Atravs de mais de um Atributo . . . . . . . . . . . . .
Navegando Indiretamente . . . . . . . . . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
32
32
34
35
36
36
37
2.2.3.1
2.2.4
2.2.5
2.3
. .
. . .
. . .
. . .
. . .
. . .
. . .
. . .
. . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
. . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
24
24
24
25
25
27
27
28
28
30
30
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
39
39
41
42
43
43
50
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
61
61
62
62
63
65
65
66
67
67
68
70
70
71
74
74
76
78
4.3.3.2
INTERPRETADOR . . . . . . . . . . . . . . . . . . . . . . .
Afluentes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Modelo de Programao . . . . . . . . . . . . . . . . . . . . . . .
Funes Sncronas . . . . . . . . . . . . . . . . . . . . . . . . . .
Funes Assncronas . . . . . . . . . . . . . . . . . . . . . . . . .
Avaliadores, Avaliaes e Processo de Avaliao . . . . . . . . . . .
Representando Funes Sncronas . . . . . . . . . . . . . . . . . .
Callbacks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Representando Funes Assncronas . . . . . . . . . . . . . . . . .
Avaliaes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Avaliadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Funes sobre Listas . . . . . . . . . . . . . . . . . . . . . . . . .
Avaliadores de Funes sobre Listas . . . . . . . . . . . . . . . . .
Projeto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Implementao . . . . . . . . . . . . . . . . . . . . . . . . . . .
Anlise Lxica e Sinttica . . . . . . . . . . . . . . . . . . . . . . .
Anlise Semntica . . . . . . . . . . . . . . . . . . . . . . . . . .
Interpretao . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Ns que Atuam Sobre Objetos . . . . . . . . . . . . . . . . . . . . . .
Ns que Atuam Sobre Listas . . . . . . . . . . . . . . . . . . . . . . .
5
5.1
5.1.1
5.1.2
5.1.3
5.1.4
AVALIAO . . . . . . . . . . . . . . . . . . . . . . . . . . .
Emeio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Implementao Baseada no Hibernate . . . . . . . . . . . . . . . .
Implementao Baseada no EclipseLink JPA . . . . . . . . . . . . .
Implementao Baseada no Interpretador de Litoral . . . . . . .
Resultados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
83
84
85
89
89
90
3.3.4
3.3.5
3.4
3.4.1
3.4.2
3.4.3
3.4.4
3.4.4.1
3.4.4.2
3.4.4.3
3.4.4.4
3.4.4.5
4
4.1
4.1.1
4.1.2
4.1.3
4.1.4
4.1.5
4.1.6
4.1.7
4.1.8
4.1.9
4.1.10
4.1.11
4.2
4.3
4.3.1
4.3.2
4.3.3
4.3.3.1
Travessias . . . . . . . . . . . . . . . . . .
Travessias Recursivas . . . . . . . . . . . .
Interpretador Definidor . . . . . . . . .
Representao de Classes e Objetos . . . .
Representao de Especificaes Litoral
Anlise Semntica . . . . . . . . . . . . .
Interpretao . . . . . . . . . . . . . . . .
Argumentos S, filter e s . . . . . . . . . . . .
Semntica 1 . . . . . . . . . . . . . . . . .
Semntica 2 . . . . . . . . . . . . . . . . .
Semntica 3 . . . . . . . . . . . . . . . . .
Escolha de uma Semntica . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
53
54
56
58
60
78
79
5.2
5.2.1
5.2.2
5.2.3
5.2.4
OO7 . . . . . . . . . . .
Implementao Baseada no
Implementao Baseada no
Implementao Baseada no
Resultados . . . . . . . .
. . . . . . . . .
Hibernate . . .
EclipseLink JPA
Interpretador de
. . . . . . . . .
. . . . . .
. . . . . .
. . . . . .
Litoral
. . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
92
93
94
94
94
6
6.1
6.2
6.3
6.4
TRABALHOS RELACIONADOS . . . . . . . . . . . . . . . .
Program Summaries . . . . . . . . . . . . . . . . . . . . . . . .
Scalpel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
AutoFetch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Outros Trabalhos sobre Pr-carregamento Especulativo . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
96
96
98
99
100
7
7.1
7.2
CONCLUSO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
Contribuies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
Trabalhos Futuros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
Referncias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
A.1
A.2
B.1
B.2
C.1
C.2
C.3
C.4
C.5
C.6
C.7
C.8
C.9
APNDICE C DEMONSTRAES . . . . . . . . . . . . .
Seq . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
NatSeq . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
ListSeq . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Lim . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
ListOptionSeq . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Sublist . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
LitoralFacts . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
AnalyzeSpecFacts . . . . . . . . . . . . . . . . . . . . . . . . .
InterpretSpecFacts . . . . . . . . . . . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
115
115
115
118
120
121
125
135
143
151
16
1 Introduo
Sistemas computacionais so pervasivos em nossa sociedade. Em boa parte, isto se
deve maior eficcia e eficincia observadas quando a sociedade executa diferentes processos
de negcio apoiada por tais sistemas. No Brasil, por exemplo, o uso da computao permite
que eleitores conheam os resultados de eleies apenas algumas horas depois de encerradas
as votaes. Antes das urnas eletrnicas, a apurao de votos durava vrios dias. Alm disto,
como votos eram computados manualmente, esta etapa do processo eleitoral estava mais
sujeita a erros e fraudes. A otimizao de sistemas computacionais, portanto, contribui,
em ltima anlise, para uma sociedade mais eficaz e eficiente.
Muitos sistemas sobre os quais a sociedade se apia so construdos em linguagens
orientadas a objetos e manipulam dados armazenados em bancos de dados relacionais
atravs de ORMs (Object-Relational Mappers). No BCB (Banco Central do Brasil), por
exemplo, existe a diretriz de que todos os sistemas devem ser desenvolvidos em linguagens
orientadas a objetos, devem armazenar dados em bancos relacionais e, por fim, devem
interagir com estes bancos de dados atravs de ORMs. Esta diretriz se aplica no s aos
sistemas corporativos (utilizados por mais de um departamento do BCB) como tambm
aos departamentais (utilizados por um nico departamento), independentemente destes
sistemas serem desenvolvidos pelo prprio BCB ou contratados a terceiros.
1.1 Objetivo
Dada a sua importncia para a sociedade, esta pesquisa visa aumentar o desempenho
de sistemas baseados em ORMs.
1.2 ORMs
ORMs so populares porque eles reduzem o esforo de desenvolvimento de camadas
de acesso a dados ao permitir, entre outras coisas, que sistemas manipulem objetos
transientes e persistentes de maneira similar. Em particular, ORMs permitem que sistemas
naveguem por objetos de ambos os tipos exatamente da mesma maneira. Por exemplo, o
trecho de cdigo Java (GOSLING et al., 2014) da Figura 1 navega de mensagens para seus
remetentes (linha 4) e destinatrios (linha 5), no importando se estes objetos existem
apenas na memria primria (ou seja, so transientes) ou se um banco de dados relacional
os armazena (ou seja, so persistentes). Infelizmente, este trecho de cdigo muito mais
lento no segundo caso porque, para que ele navegue de uma mensagem para um objeto
destino, ORMs precisam primeiro carregar o objeto destino do banco de dados.
Captulo 1. Introduo
1
2
3
4
5
6
7
8
17
L i s t <Message> me ssa ge s = g e t M e s s a g e s ( ) ;
f o r ( Message message : m ess age s ) {
p r i n t M e s s a g e ( message ) ;
p r i n t U s e r ( message . g e t S e n d e r ( ) ) ;
f o r ( User r e c i p i e n t : message . g e t R e c i p i e n t s ( ) ) {
printUser ( recipient ) ;
}
}
1.3 Hiptese
Esta pesquisa parte da hiptese de que o pr-carregamento, em muitos casos,
tambm d a ORMs a chance de executar consultas concorrentemente e que, combinando
esta otimizao com consultas que carregam vrios objetos, ORMs podem reduzir tc ainda
mais.
Captulo 1. Introduo
18
[ sender r e c i p i e n t s ]
Figura 2 Especificao Litoral que declara navegaes de mensagens para seus remetentes e destinatrios.
1
L i s t <Message> me ssa ge s = g e t M e s s a g e s ( ) ;
2
3
4
5
6
7
8
Figura 3 Trecho de cdigo Java que pr-carrega objetos com o interpretador de Litoral.
1.4 Estratgia
Esta pesquisa define uma DSL (Domain-Specific Language) (DEURSEN; KLINT;
VISSER, 2000) de especificao de navegaes por objetos chamada Litoral. A Figura
2, por exemplo, exibe uma especificao Litoral que declara navegaes de mensagens
para seus remetentes e destinatrios.
Tambm faz parte desta pesquisa o projeto e a implementao de um interpretador
que executa especificaes Litoral. O interpretador navega por objetos transientes e
persistentes e pr-carrega os do segundo tipo executando consultas concorrentemente. O
interpretador foi projetado de forma a absorver todas as questes relativas concorrncia,
delegando a ORMs questes relativas interao com bancos de dados. Graas a esta
diviso de responsabilidades, qualquer ORM pode embutir o interpretador e assim prcarregar objetos executando consultas concorrentemente. A Figura 3, por exemplo, exibe
o trecho de cdigo previamente exibido na Figura 1 modificado para usar o interpretador.
A linha 4 instancia o interpretador a partir da especificao Litoral contida na
linha 3. A linha 5 executa o interpretador passando-lhe como parmetro uma lista de
mensagens. Quando a execuo da linha 5 chega ao fim, o interpretador ter pr-carregado
os remetentes e destinatrios das mensagens. A grande diferena entre os trechos de cdigo
exibidos nas Figuras 1 e 3 que no primeiro, que no faz uso do interpretador, ORMs
pr-carregam objetos executando consultas sequencialmente, enquanto que no segundo o
interpretador pr-carrega objetos executando consultas concorrentemente.
Um aspecto positivo desta estratgia que ela permite que programadores desenvolvam sistemas que pr-carregam objetos executando consultas concorrentemente sem,
contudo, lidar com programao concorrente, reconhecidamente difcil (NANZ; WEST;
SILVEIRA, 2013).
Captulo 1. Introduo
19
Outro aspecto que merece destaque nesta estratgia que ela pode ser adotada
pontualmente e tambm a posteriori. O trecho de cdigo da Figura 3, por exemplo,
funcionalmente idntico com ou sem o interpretador. A diferena nestes dois casos apenas
no-funcional. Com o interpretador, o trecho de cdigo executado mais rapidamente.
Portanto, pode-se identificar em cdigos preexistentes os pontos que oferecem maiores
oportunidades para pr-carregar objetos executando consultas concorrentemente e adotar
o interpretador apenas nestes pontos.
1.4.1 Viabilidade
Existe um debate em torno da viabilidade de programadores especificarem navegaes. De um lado do debate, (IBRAHIM; COOK, 2006) argumenta que difcil especificar
navegaes corretamente. Adicionalmente, manutenes evolutivas e corretivas podem
invalidar especificaes previamente vlidas. Estes trabalhos propem mtodos que permitam a ORMs especular quais navegaes sistemas executam, eliminando a necessidade de
programadores especificarem navegaes.
Do outro lado do debate, (GUHIS; GOASDOU-THION; RIGAUX, 2009) defende
que programadores especialistas podem especificar navegaes com relativa facilidade e
que o aumento de desempenho obtido a partir delas compensa seus custos. Uma evidncia
de que esta opinio no mnimo razovel que ORMs bastante populares (BLAKELEY et al., 2006; ADYA et al., 2007; CASTRO; MELNIK; ADYA, 2007; LINSKEY;
PRUDHOMMEAUX, 2007; ONEIL, 2008) oferecem mecanismos para que programadores
especifiquem navegaes. Alm disto, como os mtodos de especulao so falveis, eles
podem resultar no pr-carregamento de mais ou menos objetos do que o necessrio, prejudicando o desempenho dos sistemas que os adotam. Portanto, pelo menos nestes casos,
preciso um mecanismo que permita ao programador sobrepor as especulaes dos mtodos.
Apesar desta pesquisa se alinhar aos trabalhos que defendem que os benefcios
superam os custos, ela continuar vlida mesmo que esta hiptese no se confirme. Isto
acontece porque a otimizao que ela prope, ou seja, pr-carregar objetos executando
consultas concorrentemente, pode ser implementada a partir de navegaes especificadas
automaticamente ou manualmente.
1.4.2 Generalidade
O projeto do interpretador genrico o bastante para que ele possa delegar a
interao com o repositrio de objetos no s a um ORM (caso os objetos estejam
armazenados em um banco de dados relacional), mas tambm a qualquer outro mecanismo
de acesso a objetos, independentemente de qual o repositrio subjacente. possvel,
por exemplo, usar o interpretador para pr-carregar concorrentemente objetos que esto
Captulo 1. Introduo
20
1.5 Avaliao
A estratgia da Seo 1.4 foi avaliada com os benchmarks sintticos (CURNOW;
WICHMANN, 1976) Emeio, desenvolvido no contexto desta pesquisa, e OO7 (CAREY;
DEWITT; NAUGHTON, 1993; CAREY et al., 1994). No primeiro, pr-carregar objetos
executando consultas concorrentemente aumentou a velocidade de execuo em at 323,6%.
No segundo, o aumento foi de at 245,7%.
Os benchmarks tambm foram implementados com os ORMs Hibernate (ONEIL,
2008) e EcliseLink JPA (KEITH; SCHINCARIOL, 2009), os quais aderem especificao
JPA (Java Persistence Architecture) (GROUP, 2013). O primeiro foi escolhido por ser
bastante popular. O segundo foi escolhido por ser a implementao de referncia desta
especificao (FOUNDATION, 2008). As implementaes baseadas no Hibernate e EclipseLink JPA foram significativamente otimizadas. Entretanto, em todos os cenrios de
Emeio e OO7 que oferecem oportunidades para pr-carregar objetos executando consultas concorrentemente, o desempenho delas foi inferior ao da implementao baseada no
interpretador de Litoral.
1.6 Organizao
O restante desta dissertao est organizado nos seguintes captulos:
o Captulo 2 discute conceitos bsicos para o entendimento desta pesquisa e, a partir
deles, justifica a hiptese da Seo 1.3;
o Captulo 3 apresenta a sintaxe de Litoral em notao EBNF (Extended BackusNaur Form) e sua semntica atravs de exemplos e de um interpretador definidor
(definitional interpreter) (REYNOLDS, 1972) desenvolvido com o assistente de provas
(GEUVERS, 2009) Coq (BERTOT; CASTRAN, 2004);
o Captulo 4 apresenta o projeto e a implementao do interpretador de Litoral, o qual foi construdo sobre o framework Afluentes (ARAUJO et al., 2014),
desenvolvido no contexto desta pesquisa e tambm apresentado neste captulo;
Captulo 1. Introduo
21
22
2 Conceitos Bsicos
Este captulo discute conceitos bsicos para o entendimento da presente pesquisa e,
a partir deles, justifica a hiptese da Seo 1.3.
23
2.2.1 Caching
Caching consiste em armazenar na memria primria o resultado das operaes
de entrada que um sistema executa repetidas vezes. Desta forma, quando um sistema
precisa, pela primeira vez, de um dado que no est na memria primria, uma operao
de entrada executada. Quando o sistema precisar novamente do mesmo dado, ele j se
encontrar na memria primria, no sendo necessrio efetuar uma operao de entrada
novamente.
2.2.2 Agregao
Operaes de E/S exibem uma latncia significativa. Ou seja, o intervalo de tempo
transcorrido entre o incio e o fim de uma operao de E/S no desprezvel, mesmo
quando o volume de dados transferidos o menor possvel (um bloco de um disco, por
exemplo). Agregando diversas operaes de E/S em uma nica operao que produz os
mesmos efeitos das operaes agregadas, a latncia das operaes de E/S incide sobre um
sistema uma nica vez ao invs de diversas vezes.
24
2.2.4 Compresso
O tempo de execuo de operaes de E/S uma funo monotnica no-decrescente
do volume de dados transferidos. Portanto, comprimindo dados antes de transferi-los, reduzse potencialmente o tempo de execuo de operaes de E/S. necessrio descomprimir
os dados aps transferi-los, o que aumenta tp . Este aumento, entretanto, no costuma ser
significativo frente reduo no tempo de execuo das operaes de E/S, fazendo com
que o saldo final desta estratgia seja positivo.
2.2.5 Concorrncia
Caching, agregao e compresso reduzem te/s otimizando as operaes de E/S que
um sistema executa. Uma estratgia ortogonal s anteriores para reduzir te/s consiste em
executar estas operaes concorrentemente, sem atuar sobre seu desempenho. Por exemplo,
suponha que um sistema executa duas operaes independentes cujos tempos de execuo
so t1 e t2 , respectivamente. Se o sistema executa estas operaes sequencialmente, ento te/s
ser a soma de t1 e t2 . Entretanto, se o sistema executa estas operaes concorrentemente,
ento te/s vai variar do mximo entre t1 e t2 (melhor caso) soma de t1 e t2 (pior caso). O
melhor caso ocorrer se existirem os recursos necessrios execuo paralela das operaes.
No outro extremo, se s existirem recursos suficientes para executar uma operao de cada
vez, ocorrer o pior caso.
O exemplo anterior, apesar de bastante simples, ilustra as condies que um sistema
25
deve satisfazer para que a execuo concorrente de operaes de E/S seja uma otimizao
eficaz:
1. o sistema executa um nmero significativo de operaes independentes;
2. os tempos de execuo das operaes so similares;
3. existem recursos computacionais suficientes para executar as operaes em paralelo.
Se a primeira condio falsa, ento existem poucas oportunidades para executar
operaes de E/S em paralelo. Se a segunda condio no verdadeira, ento a diferena
entre o tempo que o processador espera pela execuo sequencial e paralela das operaes
no significativo. Por fim, se a terceira condio no satisfeita, ento as operaes so
executadas sequencialmente mesmo quando o sistema as requisita concorrentemente.
1
2
3
26
4
5
6
7
User s e n d e r = message . g e t S e n d e r ( ) ;
p r i n t l n ( s e n d e r . getName ( ) ) ;
9
10
11
L i s t <User> r e c i p i e n t s = message . g e t R e c i p i e n t s ( ) ;
f o r ( User r e c i p i e n t : r e c i p i e n t s ) {
p r i n t l n ( r e c i p i e n t . name ) ;
}
12
13
14
15
16
17
18
19
Figura 4 Trecho de cdigo Java que requisita objetos especificando o predicado que eles
devem satisfazer.
2
3
4
5
6
7
8
s e l e c t u s e r _ i d e n t i f i e r from m e s s a g e _ r e c i p i e n t s
where m e s s a g e _ i d e n t i f i e r = / . . . /
9
10
11
s e l e c t f i l e _ i d e n t i f i e r from m e s s a g e _ f i l e
where m e s s a g e _ i d e n t i f i e r = / . . . /
Figura 5 Consultas SQL que ORMs executam para carregar sob demanda os atributos
de mensagens manipulados pelo trecho de cdigo da Figura 4.
27
Figura 6 Consulta SQL que pr-carrega todos os atributos do primeiro tipo de uma
mensagem.
1
2
3
4
select
l e f t join
on
where
Figura 7 Consulta SQL que pr-carrega todos os atributos do tipo I de uma mensagem
e, atravs de uma juno, tambm seu remetente.
Por outro lado, se ORMs pr-carregam especulativamente atributos do tipo I, ento
eles executam a consulta SQL exibida na Figura 6 ao invs das duas primeiras consultas
SQL da Figura 5.
28
1
2
3
29
4
5
6
7
8
l e f t join
on
l e f t join
on
message_recipient
m e s s a g e _ r e c i p i e n t . m e s s a g e _ i d e n t i f i e r = message . i d e n t i f i e r
user_table r e c i p i e n t
r e c i p i e n t . i d e n t i f i e r = message_recipient . r e c i p i e n t _ i d e n t i f i e r
l e f t join
on
l e f t join
on
message_file
m e s s a g e _ f i l e . m e s s a g e _ i d e n t i f i e r = message . i d e n t i f i e r
file
f i l e . i d e n t i f i e r = message_file . f i l e _ i d e n t i f i e r
l e f t join
on
l e f t join
on
where
message_tag
message_tag . m e s s a g e _ i d e n t i f i e r = message . i d e n t i f i e r
tag
t a g . i d e n t i f i e r = message_tag . t a g _ i d e n t i f i e r
message . i d e n t i f i e r = / . . . /
9
10
11
12
13
14
15
16
17
18
19
1
2
3
4
5
6
select
l e f t join
on
l e f t join
on
where
r e c i p i e n t . from message
message_recipient
m e s s a g e _ r e c i p i e n t . m e s s a g e _ i d e n t i f i e r = message . i d e n t i f i e r
user_table r e c i p i e n t
r e c i p i e n t . i d e n t i f i e r = message_recipient . r e c i p i e n t _ i d e n t i f i e r
message . i d e n t i f i e r in ( / . . . / )
select
l e f t join
on
l e f t join
on
where
f i l e . from message
message_file
m e s s a g e _ f i l e . m e s s a g e _ i d e n t i f i e r = message . i d e n t i f i e r
file
f i l e . i d e n t i f i e r = message_file . f i l e _ i d e n t i f i e r
message . i d e n t i f i e r in ( / . . . / )
7
8
9
10
11
12
13
1
2
30
3
4
5
6
7
8
9
10
11
Figura 10 Trecho de cdigo Java que informa a ORMs compatveis com a especificao
JPA quais objetos eles devem pr-carregar.
A Figura 10 exemplifica o primeiro. Ela adiciona ao trecho de cdigo da Figura 4 as linhas
47. Elas requisitam a ORMs compatveis com a especificao JPA o pr-carregamento
dos destinatrios e anexos das mensagens resultantes da consulta JPQL da linha 1.
2.4 Hiptese
A partir das discusses e exemplos das sees anteriores, esta seo justifica a
hiptese de que o tempo que ORMs levam para pr-carregar objetos executando consultas
concorrentemente menor do que sequencialmente.
Sistemas baseados em ORMs adotam o estilo de programao exibido na Figura 4
(IBRAHIM; WIEDERMANN; COOK, 2009). Neste estilo, comum que sistemas, exceto os
31
mais simples, naveguem atravs de dois ou mais atributos do tipo II. Nestes casos, tal como
exemplificado na Subseo 2.3.5, as consultas que pr-carregam os objetos referenciados
pelos atributos so independentes.
As consultas que ORMs executam para pr-carregar objetos referenciados por
atributos do tipo II so bastante simples. Como elas so compostas apenas por restries
sobre chaves primrias e estrangeiras, seus tempos de execuo costumam ser dominados
pelas latncias dos canais de comunicao entre ORMs e bancos de dados (BERNSTEIN;
PAL; SHUTT, 2000). Isto faz com que estes tempos sejam similares.
Sistemas de gerenciamento de banco de dados so executados com frequncia em
instalaes que possuem os recursos necessrios para a execuo paralela de diversas
consultas. O surgimento e a popularizao da computao em nuvem (ARMBRUST et al.,
2010) tm contribudo para que isto ocorra cada vez mais.
Como ORMs executam consultas atravs de operaes de E/S, as ltimas gozam
das propriedades das primeiras. Por exemplo, se duas consultas so independentes, ento
as operaes de E/S atravs das quais elas so executadas tambm so independentes.
Conclui-se, portanto, que, em muitos casos, ORMs pr-carregam objetos executando
operaes de E/S independentes, cujos tempos de execuo so similares e existem recursos
computacionais suficientes para executar estas operaes em paralelo. Ou seja, o prcarregamento de objetos executado por ORMs satisfaz as condies discutidas na seo
2.2.5 para que a execuo concorrente de operaes de E/S seja uma otimizao eficaz.
32
3 Litoral
Este captulo apresenta Litoral, uma DSL para especificao de navegaes por
objetos.
3.1 Requisitos
A fase de anlise (MERNIK; HEERING; SLOANE, 2005) do desenvolvimento de
Litoral, determinou que a linguagem deveria atender os requisitos a seguir.
Embarque: deve ser possvel embutir Litoral em linguagens orientadas a objetos
que suportam reflexo. Mais especificamente, que permitem a sistemas, em tempo de
execuo, descobrir a classe de um objeto e obter o valor de um atributo a partir do seu
nome.
Independncia: Litoral deve ser independente de mecanismos de acesso a dados,
ou seja, ela deve ser capaz de especificar navegaes por objetos armazenados em bancos
de dados (relacionais ou no), sistemas de arquivos, outros sistemas, etc.
Agregao: tal como ocorre em linguagens orientadas a colees (SIPELSTEIN;
BLELLOCH, 1991), as construes de Litoral devem operar sobre agregaes de outros
tipos de dados. Litoral satisfaz este requisito tratando objetos como colees unitrias e
oferecendo construes que operam apenas sobre colees.
Recurso: Litoral deve ser capaz de especificar navegaes iterativas e recursivas.
O conceito de travessia, apresentado nas sees 3.3.4 e 3.3.5, cumpre esta demanda.
Conciso: especificaes Litoral sero tipicamente armazenadas em variveis
ou passadas como parmetros em linguagens orientadas a objetos, da a importncia delas
ocuparem poucas linhas de cdigo.
Segurana: erros do tipo null pointer (HOVEMEYER; SPACCO; PUGH, 2005)
no devem ocorrer. Para atender este requisito, Litoral verifica se possvel navegar
atravs de um atributo, ou seja, se ele referencia algum objeto. Em caso positivo, a
navegao executada, caso contrrio ela interrompida.
Declarao: Litoral deve ser uma linguagem declarativa, ou seja, ela deve
oferecer construes que permitem especificar navegaes sem entrar nos detalhes de como
elas devem ser executadas.
Concorrncia: especificaes Litoral devem codificar tanto dependncias entre
navegaes, ou seja, quando uma segunda navegao s pode ser executada aps uma
primeira, quanto as oportunidades para que elas sejam executadas concorrentemente.
Captulo 3. Litoral
1
2
3
4
5
33
L i s t <Message> g e t M e s s a g e s ( int u s e r I d ) {
S t r i n g j p q l = " s e l e c t m from Message m where m. s e n d e r . i d = " + u s e r I d ;
TypedQuery<Message> query = orm . c r e a t e Q u e r y ( j p q l , Message . c l a s s ) ;
return query . g e t R e s u l t L i s t ( ) ;
}
L i s t <Message> g e t M e s s a g e s ( int u s e r I d ) {
S t r i n g j p q l = " s e l e c t m from Message m where m. s e n d e r . i d = " + u s e r I d ;
4
5
6
7
8
9
10
Figura 12 Mtodo Java que carrega as mensagens enviadas por um usurio e pr-carrega
seus remetentes.
Por independerem de mecanismos de acesso a dados, especificaes Litoral podem
ser facilmente incorporadas a qualquer camada (apresentao, negcio, acesso a dados,
etc.) de um sistema. Para perceber porque isto importante, suponha que o mtodo
g e t M e s s a g e s exibido na Figura 11 pertena camada de acesso a dados de um sistema.
Suponha tambm que um desenvolvedor identificou que, aps invocar g e t M e s s a g e s , uma
parte do sistema navega das mensagens retornadas por este mtodo para seus remetentes.
A partir desta constatao, o desenvolvedor decide modificar o mtodo g e t M e s s a g e s para
que ele, alm de carregar as mensagens enviadas por um usurio, tambm pr-carregue
seus remetentes. Esta modificao pode ser vista nas linhas 45 e 8 da segunda verso do
mtodo g e t M e s s a g e s exibida na Figura 12.
A segunda verso de g e t M e s s a g e s aumenta o desempenho da parte do sistema que
o desenvolvedor analisou. Isto acontece porque o ORM, fazendo uso de junes, carrega
as mensagens e seus remetentes executando uma nica consulta SQL enquanto que na
primeira verso de g e t M e s s a g e s , o ORM executa no mnimo duas consultas, uma para
carregar as mensagens e outra para carregar seus remetentes. A primeira executada
imediatamente. A segunda executada apenas quando o sistema navega para os remetentes.
Infelizmente, a segunda verso de g e t M e s s a g e s reduz o desempenho de outras
partes do sistema que tambm utilizam este mtodo mas que no navegam das mensagens
para seus remetentes. Nestes casos, a segunda verso de g e t M e s s a g e s pr-carrega os remetentes desnecessariamente. Para evitar esta perda de desempenho, resta ao desenvolvedor
Captulo 3. Litoral
34
(a)
(b)
3.2 Sintaxe
A figura 13 apresenta a gramtica de Litoral em notao EBNF (Extended
BackusNaur Form) e tambm atravs de diagramas de sintaxe. Os smbolos s p e c i f i c a t i o n ,
t r a v e r s a l , path e s t e p so no-terminais. ID e os smbolos entre aspas simples so
terminais. s p e c i f i c a t i o n o smbolo inicial. A expresso regular [ azAZ ] [ azAZ0 9]
gera ID, ou seja, um ID formado por uma letra seguida de outras letras ou nmeros.
Captulo 3. Litoral
1
2
3
4
35
p r i n t U s e r ( message . g e t S e n d e r ( ) ) ;
6
7
f o r ( User r e c i p i e n t : message . g e t R e c i p i e n t s ( ) ) {
printUser ( recipient ) ;
}
8
9
10
11
12
13
14
15
16
17
f o r ( Message r e p l y : message . g e t R e p l i e s ( ) ) {
printMessage ( reply ) ;
}
18
19
20
21
22
23
24
void p r i n t U s e r ( User u s e r ) {
p r i n t l n ( u s e r . getName ( ) ) ;
25
26
27
28
29
30
void p r i n t F i l e ( F i l e f i l e ) {
p r i n t l n ( f i l e . getName ( ) ) ;
31
printMediaType ( f i l e . getMediaType ( ) ) ;
32
33
34
35
36
37
38
Captulo 3. Litoral
1
36
sender
specification
t r a v e r s a l path
path
s t e p | [ s t e p +]
step
ID | ID . path | ID ( )
ID
sender
//
//
//
//
//
//
//
//
smbolo i n i c i a l
s u b s t i t u i o de s p e c i f i c a t i o n
traversal opcional
s u b s t i t u i o de p a t h
e s c o l h a do p r i m e i r o ramo
s u b s t i t u i o de s t e p
e s c o l h a do p r i m e i r o ramo
ID g e r a s e n d e r
recipients
Captulo 3. Litoral
1
[
sender
recipients
attachments
2
3
4
5
37
path
s t e p | [ s t e p +]
[ s t e p +]
[ step step step ]
//
//
//
//
traversal opcional
s u b s t i t u i o de p a t h
e s c o l h a do segundo ramo
s u b s t i t u i o de s t e p+
// e s p a o s em branco e c a r a c t e r e s
// de nova l i n h a so i g n o r a d o s
5
6
step
step
step
7
8
9
10
11
12
[
sender
recipients
attachments
13
14
15
16
// s t e p g e r a sender , r e c i p i e n t s
// e a t t a c h m e n t s
[ sender ]
Captulo 3. Litoral
1
[
sender
recipients
a t t a c h m e n t s . mediaType
2
3
4
5
38
[
s e n d e r . p i c t u r e . mediaType
recipients
a t t a c h m e n t s . mediaType
2
3
4
5
Captulo 3. Litoral
1
[
s e n d e r . p i c t u r e . mediaType
r e c i p i e n t s . p i c t u r e . mediaType
a t t a c h m e n t s . mediaType
2
3
4
5
39
v i s i t U s e r = p i c t u r e . mediaType
[
sender . v i s i t U s e r ()
recipients . visitUser ()
a t t a c h m e n t s . mediaType
]
3.3.4 Travessias
O mtodo p r i n t M e s s a g e da Figura 14 navega no s de uma mensagem at o
tipo da fotografia do seu remetente, mas tambm at o tipo da fotografia de cada um dos
destinatrios desta mensagem. A linha 3 da especificao Litoral exibida na Figura 23
incorpora esta ltima navegao.
Apesar de correta, a especificao da Figura 23 possui uma replicao indesejvel,
pois mudanas no mtodo p r i n t U s e r da Figura 14 precisaro ser refletidas nela duas
vezes. Litoral permite que replicaes deste tipo sejam eliminadas com travessias, que
nada mais so do que caminhos nomeados. Uma vez definida, pode-se usar o nome de uma
travessia para percorrer o seu caminho, iniciando a partir de diferentes objetos, quantas
vezes for necessrio. A linha 1 da Figura 24, por exemplo, define uma travessia chamada
v i s i t U s e r cujo caminho p i c t u r e . mediaType . As linhas 4 e 5 iniciam esta travessia a
partir do remetente e dos destinatrios de uma mensagem, respectivamente.
A Figura 25 mostra como gerar esta especificao a partir da gramtica de Litoral.
Captulo 3. Litoral
1
2
3
4
40
specification
t r a v e r s a l path
t r a v e r s a l path
ID=path path
//
//
//
//
smbolo i n i c i a l
s u b s t i t u i o de program
s u b s t i t u i o de t r a v e r s a l
s u b s t i t u i o de t r a v e r s a l
ID=path
path
// e s p a o s em branco so i g n o r a d o s
v i s i t U s e r=path
path
// ID g e r a v i s i t U s e r
v i s i t U s e r=p i c t u r e . mediaType
[
sender . step
r e c i p i e n t s . step
]
// p a t h g e r a p i c t u r e . mediaType
// p a t h g e r a [
//
sender . step
//
recipients . step
//
]
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
v i s i t U s e r=p i c t u r e . mediaType
[
s e n d e r . ( ID | ID . path | ID ( ) )
// s u b s t i t u i o de s t e p
r e c i p i e n t s . ( ID | ID . path | ID ( ) ) // s u b s t i t u i o de s t e p
]
23
24
25
26
27
28
v i s i t U s e r=p i c t u r e . mediaType
[
s e n d e r . ID ( )
r e c i p i e n t s . ID ( )
]
// e s c o l h a do t e r c e i r o ramo
// e s c o l h a do t e r c e i r o ramo
29
30
31
32
33
34
v i s i t U s e r=p i c t u r e . mediaType
[
sender . v i s i t U s e r ()
recipients . visitUser ()
]
// ID g e r a v i s i t U s e r
// ID g e r a v i s i t U s e r
Captulo 3. Litoral
1
41
v i s i t U s e r = p i c t u r e . mediaType
2
3
4
5
6
visitMessage = [
sender . v i s i t U s e r ()
recipients . visitUser ()
a t t a c h m e n t s . mediaType
r e p l i e s . visitMessage ()
8
9
10
11
visitMessage ()
Captulo 3. Litoral
1
42
2
3
Uma funo f chamada de total quando para todo elemento x de seu domnio existe um elemento y
de seu contradomnio tal que f (x) = y, caso contrrio, f chamada de parcial.
Captulo 3. Litoral
1
2
3
4
5
6
7
43
Definition c l a s s e s := [
C l a s s " MediaType " [ ] ;
C l a s s " F i l e " [ ( " mediaType " , " MediaType " ) ]
C l a s s " User " [ ( " p i c t u r e " , " F i l e " ) ] ;
C l a s s " Message " [ ( " s e n d e r " , " User " ) ; ( " r e c i p i e n t s " , " User " ) ;
( " r e p l i e s " , " Message " ) ] ;
].
Definition ID := s t r i n g .
2
3
4
Inductive STEP :=
L a s t S t e p : ID > STEP | Step : ID > PATH > STEP | I n i t : ID > STEP
5
6
7
8
9
10
Captulo 3. Litoral
1
2
3
4
5
6
7
8
9
10
11
44
Definition s p e c := Spec [
Trav " v i s i t U s e r " ( Path 0 [
Step " p i c t u r e " ( Path 0 [ L a s t S t e p " mediaType " ] )
]);
Trav " v i s i t M e s s a g e " ( Path 0 [
Step " s e n d e r " ( Path 0 [ I n i t " v i s i t U s e r " ] ) ;
Step " r e c i p i e n t s " ( Path 0 [ I n i t " v i s i t U s e r " ] ) ;
Step " a t t a c h m e n t s " ( Path 0 [ L a s t S t e p " mediaType " ] ) ;
Step " r e p l i e s " ( Path 0 [ I n i t " v i s i t M e s s a g e " ] )
])
] ( Path 0 [ I n i t " v i s i t M e s s a g e " ] ) .
Captulo 3. Litoral
1
2
3
4
5
6
7
8
45
Fixpoint i n d e x S t e p s t e p i d x :=
match s t e p with
| L a s t S t e p nm => ( L a s t S t e p nm, idx , [ ] )
| Step nm path =>
l e t ( path , idx , p a t h s ) := indexPath path i d x in
( Step nm path , idx , p a t h s )
| I n i t nm => ( I n i t nm, idx , [ ] )
end
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
Definition indexTrav t r a v i d x :=
l e t Trav i d path := t r a v in
l e t ( path , idx , p a t h s ) := indexPath path i d x in
( Trav i d path , idx , p a t h s ) .
30
31
32
33
34
35
36
37
38
Fixpoint i n d e x T r a v s t r a v s i d x :=
match t r a v s with
| [ ] => ( [ ] , idx , [ ] )
| t r a v : : t r a v s =>
l e t ( t r a v s , idx , p a t h s ) := i n d e x T r a v s t r a v s i d x in
l e t ( trav , idx , paths ) := indexTrav t r a v idx in
( trav : : t r a v s , idx , paths ++ p a t h s )
end .
39
40
41
42
43
44
Definition i n d e x S p e c s p e c :=
l e t Spec t r a v s path := s p e c in
l e t ( t r a v s , idx , p a t h s ) := i n d e x T r a v s t r a v s 0 in
l e t ( path , idx , paths ) := indexPath path i d x in
( Spec t r a v s path , idx , paths ++ p a t h s ) .
(a)
Captulo 3. Litoral
1
46
Definition s t r E q x y := i f s t r i n g _ d e c x y then t r u e e l s e f a l s e .
2
3
4
5
6
7
8
9
10
Definition getPath t r a v s nm :=
let
f t r a v := l e t Trav nm _ := t r a v in s t r E q nm nm
in
match f i n d f t r a v s with
| None => None
| Some ( Trav _ path ) => Some path
end .
11
12
13
14
15
Definition g e t C l a s s c l a s s e s nm :=
f i n d ( fun c l a s s => l e t C l a s s nm _ := c l a s s in s t r E q nm nm) c l a s s e s .
16
17
18
19
20
21
Definition g e t C l a s s A t t r c l a s s nm :=
let
f ( a t t r : s t r i n g s t r i n g ) := l e t (nm , _) := a t t r in s t r E q nm nm
in
l e t C l a s s _ a t t r s := c l a s s in f i n d f a t t r s .
22
23
24
25
26
27
Definition g e t A t t r C l a s s c l a s s e s c l a s s nm :=
match g e t C l a s s A t t r c l a s s nm with
| None => None
| Some (_, nm ) => g e t C l a s s c l a s s e s nm
end .
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
Definition a n a l y z e S t e p c l a s s e s t r a v s c l a s s s t e p :=
l e t g e t A t t r C l a s s H e l p e r nm path :=
match g e t A t t r C l a s s c l a s s e s c l a s s nm with
| None => None
| Some c l a s s => Some ( c l a s s , path )
end
in
match s t e p with
| L a s t S t e p nm => g e t A t t r C l a s s H e l p e r nm emptyPath
| Step nm path => g e t A t t r C l a s s H e l p e r nm path
| I n i t nm =>
match getPath t r a v s nm with
| None => None
| Some path => Some ( c l a s s , path )
end
end .
(b)
Captulo 3. Litoral
1
2
3
4
5
6
7
8
9
10
11
12
13
47
Fixpoint a n a l y z e S t e p s c l a s s e s t r a v s c l a s s s t e p s :=
match s t e p s with
| [ ] => Some [ ]
| s t e p : : s t e p s =>
match a n a l y z e S t e p s c l a s s e s t r a v s c l a s s s t e p s with
| None => None
| Some c l a s s P a t h s =>
match a n a l y z e S t e p c l a s s e s t r a v s c l a s s s t e p with
| None => None
| Some c l a s s P a t h => Some ( c l a s s P a t h : : c l a s s P a t h s )
end
end
end .
14
15
16
Definition a n a l y z e P a t h c l a s s e s t r a v s c l a s s path :=
l e t Path _ s t e p s := path in a n a l y z e S t e p s c l a s s e s t r a v s c l a s s s t e p s .
17
18
19
20
21
22
23
24
25
26
Definition c l a s s E q c l a s s c l a s s :=
l e t C l a s s nm _ := c l a s s in
l e t C l a s s nm _ := c l a s s in s t r E q nm nm .
27
28
29
30
31
32
33
34
Definition c o u n t C l a s s P a t h c l a s s P a t h s c l a s s P a t h :=
count c l a s s P a t h E q c l a s s P a t h s c l a s s P a t h .
35
36
37
Definition c o n t a i n s C l a s s P a t h c l a s s P a t h s c l a s s P a t h :=
contains classPathEq classPaths classPath .
(c)
Captulo 3. Litoral
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
48
Fixpoint a n a l y z e C l a s s P a t h s c l a s s e s p a t h s t r a v s s c l a s s P a t h s n :=
match n with
| 0 => ( s , Some c l a s s P a t h s )
| S n =>
match a n a l y z e C l a s s P a t h s c l a s s e s p a t h s t r a v s s c l a s s P a t h s n with
| ( s , None ) => ( s , None )
| ( s , Some [ ] ) => ( s , Some [ ] )
| ( s , Some ( c l a s s P a t h : : c l a s s P a t h s ) ) =>
i f c o n t a i n s C l a s s P a t h s c l a s s P a t h then ( s , Some c l a s s P a t h s )
else
if
containsClassPath ( l i s t _ p r o d c l a s s e s paths ) classPath
then
l e t s := c l a s s P a t h : : s in
l e t ( c l a s s , path ) := c l a s s P a t h in
match a n a l y z e P a t h c l a s s e s t r a v s c l a s s path with
| None => ( s , None )
| Some c l a s s P a t h s =>
( s , Some ( c l a s s P a t h s ++ c l a s s P a t h s ) )
end
else
( s , Some c l a s s P a t h s )
end
end .
25
26
Definition a n a l y z e T r a v s ( t r a v s : l i s t TRAV) := t r u e .
27
28
29
30
31
32
33
Definition a n a l y z e S p e c c l a s s e s c l a s s s p e c n :=
l e t ( spec2 , idx , p a t h s ) := i n d e x S p e c s p e c in
l e t Spec t r a v s path := s p e c 2 in
i f a n a l y z e T r a v s t r a v s then
a n a l y z e C l a s s P a t h s c l a s s e s p a t h s t r a v s [ ] [ ( c l a s s , path ) ] n
e l s e ( [ ] , None ) .
(d)
Captulo 3. Litoral
49
Captulo 3. Litoral
1
2
3
4
5
6
50
Theorem analyzeSpecLim :
f o r a l l c l a s s e s c l a s s spec ,
e x i s t s N,
forall n,
l e t (_, t ) := a n a l y z e S p e c c l a s s e s c l a s s s p e c (N + n ) in
t = None \/ t = Some [ ] .
3.4.4 Interpretao
A funo i n t e r p r e t S p e c exibida na Figura 33c recebe os argumentos S, f i l t e r ,
s , s p e c , a l l O b j s , o b j s e n e retorna uma tripla na qual o primeiro elemento uma lista
de objetos. Esta seo discutir S, f i l t e r e s em breve. Os argumentos s p e c , o b j s ,
a l l O b j s e n, so, respectivamente, uma especificao Litoral, uma lista formada pelos
objetos a partir dos quais s p e c navega, uma lista contendo todos os objetos pelos quais
s p e c navega e o nmero de vezes que a funo i n t e r p r e t O b j s P a t h s invocar a si mesma.
Sejam SVal , f i l t e r V a l e sVal valores apropriados para os argumentos S, f i l t e r
e s , respectivamente. Ento i n t e r p r e t S p e c SVal f i l t e r V a l sVal uma funo que
associa especificaes Litoral a funes que recebem e retornam listas de objetos, ou
seja,
interpretSpec SVal filterVal sVal define uma semntica para Litoral
Mais especificamente, i n t e r p r e t S p e c SVal f i l t e r V a l sVal uma funo que associa
especificaes Litoral a funes que:
recebem os argumentos a l l O b j s , o b j s e n;
Captulo 3. Litoral
1
2
51
Definition getObj a l l i d :=
f i n d ( fun o b j => l e t Obj id _ := o b j in s t r E q id i d ) a l l .
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Fixpoint g e t O b j s a l l i d s :=
match i d s with
| [ ] => Some [ ]
| i d : : i d s =>
match g e t O b j s a l l i d s with
| None => None
| Some o b j s =>
match getObj a l l i d with
| None => None
| Some o b j => Some ( o b j : : o b j s )
end
end
end .
17
18
19
20
21
22
Definition g e t O b j A t t r a t t r s nm :=
let
f ( a t t r : s t r i n g l i s t s t r i n g ) := l e t (nm , _) := a t t r in s t r E q nm nm
in
find f attrs .
23
24
25
26
27
28
29
Definition g e t V a l a l l o b j nm :=
l e t Obj _ a t t r s := o b j in
match g e t O b j A t t r a t t r s nm with
| None => None
| Some (_, v a l ) => g e t O b j s a l l v a l
end .
30
31
32
33
34
35
36
37
38
39
40
41
42
43
Fixpoint g e t V a l s a l l o b j s nm :=
match o b j s with
| [ ] => Some [ ]
| o b j : : o b j s =>
match g e t V a l s a l l o b j s nm with
| None => None
| Some v a l s =>
match g e t V a l a l l o b j nm with
| None => None
| Some v a l => Some ( v a l ++ v a l s )
end
end
end .
(a)
Captulo 3. Litoral
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
52
Definition i n t e r p r e t S t e p t r a v s a l l o b j s s t e p :=
let
g e t V a l s H e l p e r nm path :=
match g e t V a l s a l l o b j s nm with
| None => None
| Some v a l s => Some ( v a l s , path )
end
in
match s t e p with
| L a s t S t e p nm => g e t V a l s H e l p e r nm emptyPath
| Step nm path => g e t V a l s H e l p e r nm path
| I n i t nm =>
match getPath t r a v s nm with
| None => None
| Some path => Some ( o b j s , path )
end
end .
18
19
20
21
22
23
24
25
26
27
28
29
30
31
Fixpoint i n t e r p r e t S t e p s t r a v s a l l o b j s s t e p s :=
match s t e p s with
| [ ] => Some [ ]
| s t e p : : s t e p s =>
match i n t e r p r e t S t e p s t r a v s a l l o b j s s t e p s with
| None => None
| Some objsPath =>
match i n t e r p r e t S t e p t r a v s a l l o b j s s t e p with
| None => None
| Some o b j s P a t h => Some ( o b j s P a t h : : objsPath )
end
end
end .
32
33
34
Definition i n t e r p r e t P a t h t r a v s a l l o b j s path :=
l e t Path _ s t e p s := path in i n t e r p r e t S t e p s t r a v s a l l o b j s s t e p s .
35
36
(b)
Captulo 3. Litoral
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
53
Fixpoint i n t e r p r e t O b j s P a t h s S ( f i l t e r : F i l t e r S ) t r a v s a l l s o b j s P a t h s n :=
match n with
| 0 => ( [ ] , s , Some o b j s P a t h s )
| S n =>
match i n t e r p r e t O b j s P a t h s S f i l t e r t r a v s a l l s o b j s P a t h s n with
| ( o b j s , s , None ) => ( o b j s , s , None )
| ( o b j s , s , Some [ ] ) => ( o b j s , s , Some [ ] )
| ( o b j s , s , Some ( ( o b j s , path ) : : o b j s P a t h s ) ) =>
l e t ( s , o b j s ) := f i l t e r s o b j s path in
match i n t e r p r e t P a t h t r a v s a l l o b j s path with
| None => ( o b j s ++ o b j s , s , None )
| Some o b j s P a t h s =>
( o b j s ++ o b j s , s ,
Some ( o b j s P a t h s ++ o b j s P a t h s ) )
end
end
end .
18
19
20
21
Definition i n t e r p r e t S p e c S ( f i l t e r : F i l t e r S ) s s p e c a l l O b j s o b j s n :=
l e t Spec t r a v s path := s p e c in
i n t e r p r e t O b j s P a t h s S f i l t e r t r a v s a l l O b j s s [ ( o b j s , path ) ] n .
(c)
Captulo 3. Litoral
1
2
54
Captulo 3. Litoral
1
2
55
3
4
5
Definition i n t e r p r e t S p e c 1 :=
i n t e r p r e t S p e c ( S := l i s t OBJ) f i l t e r 1
[].
Figura 35 Semntica 1.
1
2
v i s i t M e s s a g e=r e p l i e s . v i s i t M e s s a g e ( )
visitMessage ()
2
3
4
5
6
7
Captulo 3. Litoral
1
2
3
56
4
5
6
Definition c o n t a i n s O b j o b j s o b j :=
c o n t a i n s objEq o b j s o b j .
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Definition i n t e r p r e t S p e c 2 :=
i n t e r p r e t S p e c ( S := l i s t OBJ) f i l t e r 2
[].
Figura 38 Semntica 2.
Como message uma rplica de si mesma e f i l t e r 1 autoriza a navegao para message
novamente, s p e c 1 retorna configurao inicial:
[ message ] . v i s i t M e s s a g e ( )
3.4.4.3 Semntica 2
A funo i n t e r p r e t S p e c 2 exibida na Figura 38 define uma segunda semntica
para Litoral. Diferentemente da anterior, esta semntica no associa especificaes
Litoral a funes que podem entrar em recurso infinita. Isto acontece porque a funo
f i l t e r 2 , utilizada por i n t e r p r e t S p e c 2 , registra em seu estado os objetos pelos quais
uma especificao Litoral j navegou, impedindo-a de navegar para eles novamente.
Voltando ao exemplo anterior, ao se deparar com
[ message ] . r e p l i e s . v i s i t M e s s a g e ( )
[ ] . visitMessage ()
Captulo 3. Litoral
1
2
3
4
5
6
57
Theorem i n t e r p r e t S p e c 2 L i m :
f o r a l l spec allObjs objs ,
e x i s t s N,
forall n,
l e t (_, _, t ) := i n t e r p r e t S p e c 2 s p e c a l l O b j s o b j s (N + n ) in
t = None \/ t = Some [ ] .
[
sender ,
recipients . picture
2
3
4
Captulo 3. Litoral
1
[
r e c i p i e n t s . picture ,
sender
2
3
4
58
3.4.4.4 Semntica 3
A funo f i l t e r 3 , exibida na Figura 42, refina f i l t e r 2 de forma a eliminar
os problemas da semntica 2. A diferena entre f i l t e r 2 e f i l t e r 3 que a primeira
armazena apenas os objetos para os quais um programa Litoral j navegou, enquanto
f i l t e r 3 armazena tambm o caminho que foi percorrido a partir destes objetos. Com esta
informao adicional, f i l t e r 3 permite que um programa Litoral navegue novamente
para um mesmo objeto, desde que o caminho que ser percorrido a partir deste objeto
ainda no tenha sido percorrido. Este critrio no s preserva a vantagem da semntica 2
sobre a semntica 1, ou seja, no associa programas Litoral a funes que entram em
recurso infinita, como tambm elimina os problemas da semntica 2.
Voltando ao exemplo da seo 3.4.4.2, ao se deparar com
[ message ] . r e p l i e s . v i s i t M e s s a g e ( )
impede que
spec1
[ ] . visitMessage ()
Captulo 3. Litoral
1
2
3
4
59
5
6
7
8
9
10
11
12
Fixpoint c o n t a i n s O b j P a t h o b j P a t h s objPath :=
match o b j P a t h s with
| [ ] => f a l s e
| objPath : : objPaths =>
i f c o n t a i n s O b j P a t h objPaths objPath then t r u e
e l s e objPathEq objPath objPath
end .
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
Definition i n t e r p r e t S p e c 3 s p e c a l l O b j s o b j s n :=
l e t ( spec , _, _) := i n d e x S p e c s p e c in
i n t e r p r e t S p e c ( S := l i s t (OBJ PATH) ) f i l t e r 3
[ ] spec a l l O b j s o b j s n .
Figura 42 Semntica 3.
Portanto, na semntica 3 s p e c 1 no entra em recurso infinita ao navegar a partir de
message .
Voltando ao primeiro exemplo da seo 3.4.4.3, f i l t e r 3 permitir que s p e c 2
navegue novamente de message para u s e r atravs do atributo r e c i p i e n t s , pois s p e c 2
ainda no percorreu o caminho p i c t u r e a partir de u s e r , resultando na lista
[ message , u s e r , u s e r , p i c t u r e ]
Captulo 3. Litoral
60
[ message , u s e r , p i c t u r e , u s e r ]
61
4 Interpretador
A Seo 3.4 mostrou que especificaes Litoral podem ser vistas como funes
que recebem listas de objetos como argumento e tambm retornam listas de objetos. Estas
funes navegam (em um sentido tornado preciso pelo interpretador definidor da seo
3.4) a partir dos objetos da primeira lista, retornando os objetos encontrados durante a
navegao na segunda lista.
Este captulo apresenta um segundo interpretador para Litoral. Enquanto o
anterior navega apenas por objetos que se encontram na memria primria, este tambm
navega por objetos que se encontram em um repositrio (um banco de dados relacional,
por exemplo), carregando-os para a memria primria durante a navegao.
O interpretador1 confere a Litoral uma semntica similar semntica 3 apresentada na Seo 3.4.4.4. Entretanto, como ele carrega objetos executando operaes de E/S
concorrentemente, ele navega pelos mesmos objetos que o interpretador definidor, mas no
necessariamente na mesma ordem.
Para carregar objetos com operaes de E/S concorrentes, o interpretador delega
para algum mecanismo de carregamento de objetos (um ORM, por exemplo) a interao
com o repositrio e para o framework Afluentes (ARAUJO et al., 2014) o gerenciamento
da concorrncia.
O interpretador foi desenvolvido na plataforma Java SE (Standard Edition), pois
ela oferece diversas oportunidades para se avaliar se o objetivo desta pesquisa (Seo 1.1)
foi alcanado. Tais oportunidades so fruto da popularidade dos ORMs nesta plataforma.
Sistemas que executam operaes de E/S concorrentemente podem ser desenvolvidos na plataforma Java SE com diversas combinaes de primitivas de E/S (sncronas e
assncronas (HAROLD, 2006)) e modelos de programao (multithreading (PEIERLS et
al., 2006), fork/join (LEA, 2000) e futuros). Entretanto, todas as combinaes possveis
so de baixo nvel e/ou bastante diferentes da programao sequencial, o que dificulta a implementao destes sistemas e, em particular, do interpretador. O framework Afluentes,
desenvolvido no contexto desta pesquisa, uma soluo para este problema.
4.1 Afluentes
Afluentes um framework para a plataforma Java SE baseado no paradigma de
concorrncia declarativa (ROY et al., 2009). Neste paradigma, o desenvolvedor declara as
1
A partir deste ponto, interpretador se refere ao interpretador deste captulo, enquanto interpretador
definidor se refere ao interpretador da seo 3.4.
Captulo 4. Interpretador
62
dependncias entre tarefas, sejam elas de dados ou temporais, e tambm declara quais
tarefas devem ser executadas em um novo contexto de execuo2 , cabendo ao ambiente de
tempo de execuo gerenciar:
a sincronizao, ou seja, executar as tarefas em uma ordem que respeite suas
dependncias e, quando for o caso, em um novo contexto de execuo (SCOTT,
2006);
a comunicao, isto , disponibilizar para uma tarefa o resultado das tarefas das
quais ela depende (SCOTT, 2006).
Diferentemente de frameworks que foram criados para paralelizar processamento de
dados ((LEA, 2000), por exemplo), Afluentes pode ser utilizado com primitivas de E/S
assncronas, baseadas em callbacks ou multiplexadas, e tambm com primitivas sncronas.
O termo thread foi evitado pois normalmente ele interpretado como um processo leve.
Captulo 4. Interpretador
1
2
3
63
4
5
6
7
8
9
10
11
Captulo 4. Interpretador
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
64
Captulo 4. Interpretador
65
Captulo 4. Interpretador
1
2
3
66
public i n t e r f a c e ISyncFn0<Y> {
Y y();
}
4
5
6
7
8
9
10
11
2
3
4
5
6
4.1.6 Callbacks
Callbacks so objetos cujas classes implementam a interface I C a l l b a c k exibida na
Figura 48. Funes assncronas entregam o resultado de suas avaliaes atravs do mtodo
y e sinalizam a ocorrncia de erros durante suas avaliaes atravs do mtodo t .
Captulo 4. Interpretador
1
2
3
4
67
public i n t e r f a c e I C a l l b a c k <Y> {
void y (Y y ) ;
void t ( Throwable t ) ;
}
public i n t e r f a c e IAsyncFn0<Y> {
void y ( I C a l l b a c k <Y> cb ) ;
}
4
5
6
7
8
9
10
11
4
5
6
7
4.1.8 Avaliaes
Avaliaes so objetos cujas classes implementam a interface I E v a l exibida na
Figura 51. Ao ser invocado pela primeira vez, o mtodo y executa o processo de avaliao
descrito na seo 4.1.4. O resultado deste processo armazenado na avaliao de forma
Captulo 4. Interpretador
1
2
3
68
public i n t e r f a c e IEval<Y> {
Y y();
}
public i n t e r f a c e IFnEval0<Y> {
IEval <? extends Y> y ( ) ;
}
4
5
6
7
8
4.1.9 Avaliadores
Avaliadores so objetos cujas classes implementam uma das interfaces IFnEval0 ,
..., IFnEval16 . A Figura 52 exibe as duas primeiras.
As classes ISyncEval0 , ..., ISyncEval16 e IAsyncEval0 , ..., IAsyncEval16
so adaptadores que transformam funes sncronas e assncronas, respectivamente, em
avaliadores. Elas podem ser vistas em ao nos cdigos das figuras 53 e 54 que calculam
b2 4ac, mas desta vez compondo invocaes de avaliadores de funes sncronas e
assncronas. A comparao destes cdigos concorda com as afirmaes da seo 4.1.3:
a transformao de funes assncronas em avaliadores (linhas 1 a 3 da Figura 54)
permite que suas invocaes sejam compostas (linha 8 da Figura 54) com a mesma
facilidade do caso sncrono (linha 6 da Figura 53);
a transformao de funes sncronas em avaliadores (linhas 1 e 3 da Figura 53 e
linha 5 da Figura 54) permite que os dois tipos de funes sejam misturados em
uma mesma composio de avaliaes (linha 6 da Figura 53).
Apesar dos mtodos d e l t a das figuras 53 e 54 serem idnticos, suas execues so
bastante diferentes. O primeiro executado sequencialmente, pois envolve apenas funes
sncronas. O ltimo executado concorrentemente, pois envolve tanto funes sncronas
quanto assncronas.
Captulo 4. Interpretador
69
2
3
4
5
6
7
4
5
6
7
8
9
(c)
(a)
(b)
(e)
(d)
Captulo 4. Interpretador
70
percorre esta rvore em busca de avaliaes que podem ser executadas. As avaliaes
mul ( b , b ) e mul ( a , c ) satisfazem este critrio. Elas so executadas concorrentemente,
pois esto relacionadas a funes assncronas.
Suponha que mul ( b , b ) seja concluda primeiro, levando a rvore de avaliaes
configurao da Figura 55b. Afluentes percorre esta configurao em busca, novamente,
de avaliaes que podem ser executadas, mas desta vez no encontrar nenhuma.
A Figura 55c exibe a configurao da rvore de avaliaes quando mul ( a , c )
concluda. Neste momento, Afluentes executa uma nova busca e descobre que
mul ( 4 . 0 , mul ( a , c ) ) j pode ser executada. Quando esta avaliao concluda, a rvore
de avaliaes evolui para a configurao da Figura 55d. Uma nova busca revela que a raz
da rvore de avaliaes pode, enfim, ser executada. Quando esta avaliao chega ao fim, a
rvore de avaliaes evolui para a configurao final exibida na Figura 55e.
Captulo 4. Interpretador
71
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Figura 56 Clculo do somatrio dos preos dos produtos de uma lista compondo invocaes de funes sncronas.
L i s t <IEval <? e x t e n d s Product>>.
4.2 Projeto
A fase de implementao (MERNIK; HEERING; SLOANE, 2005) do desenvolvimento de Litoral determinou que seu interpretador deveria atender aos requisitos a
seguir.
Baixo acoplamento: se um sistema usa um mecanismo de carregamento de
objetos que se integra com o interpretador, ento as nicas mudanas no cdigo do sistema
necessrias ao uso do interpretador devem ser sua instanciao e execuo.
Transparncia: o uso do interpretador no deve modificar um sistema funcionalmente. Seu nico efeito deve ser a reduo do tempo de carregamento de objetos.
Independncia: o interpretador deve ser capaz de interagir com qualquer mecanismo de carregamento de objetos.
Captulo 4. Interpretador
1
2
3
72
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Figura 57 Clculo do somatrio dos preos dos produtos de uma lista compondo avaliadores de funes assncronas e de funes sobre listas.
1
2
3
public i n t e r f a c e I E v a l H o l d e r <Y> {
IEval <? extends Y> g e t E v a l ( ) ;
}
Captulo 4. Interpretador
1
2
73
4
5
6
7
void s e t I d ( int i d ) {
eval . y ( ) . setId ( id ) ;
}
8
9
10
11
int g e t I d ( ) {
return e v a l . y ( ) . g e t I d ( ) ;
}
12
13
14
15
// Demais mtodos s e t e g e t
16
17
Captulo 4. Interpretador
1
2
3
74
4
5
6
7
8
9
10
4.3 Implementao
4.3.1 Anlise Lxica e Sinttica
Os analisadores lxico e sinttico do interpretador foram gerados com a verso 3 do
ANTLR (PARR; QUONG, 1995). Alm de possuir excelente documentao (PARR, 2007),
O ANTLR gera analisadores que constroem ASTs a partir de anotaes na gramtica de
uma linguagem, facilitando a implementao do interpretador.
A Figura 62 exibe a gramtica de Litoral na metalinguagem do ANTLR. O
operador ^ (acento circunflexo) promove um token raiz de uma subrvore da AST. O
operador ! (exclamao) exclui um token da AST. O operador > (hfen seguido de maior
Captulo 4. Interpretador
75
2
3
4
s p e c i f i c a t i o n : t r a v e r s a l path >
^(SPECIFICATION^(TRAVERSALS t r a v e r s a l ) ^(PATH path ) ) ;
5
6
traversal
: ID^ = ! path ;
path
: step !
step
ID
: ( a . . z ! A . . Z ) ( a . . z ! A . . Z !
7
8
[ ! s t e p+ ] ! ;
9
10
) > ^( INIT ID ) ;
11
12
0 .. 9 );
regra de reescrita
^(PROGRAM ^(TRAVERSALS t r a v e r s a l ) ^(PATH path ) )
. Esta associao faz com que o smbolo no-terminal program seja mapeado para um
n da AST que contm o token PROGRAM e possui dois filhos. O primeiro um n que
contm o token TRAVERSALS e cujos filhos so as travessias de program ( t r a v e r s a l ). O
segundo um n que contm o token PATH e cujo filho o caminho de program ( path ).
J a linha 10 da Figura 62 associa a alternativa
ID (
regra de reescrita
^( INIT ID )
. Esta associao faz com que o smbolo no terminal s t e p , ao ser produzido pela
alternativa ID ( ) , seja mapeado para um n da AST que contm o token INIT e
cujo filho o identificador da travessia sendo iniciada ( ID).
O ANTLR chama tokens como SPECIFICATION, TRAVERSALS, PATH e INIT de
imaginrios, pois eles no fazem parte da gramtica de uma linguagem, existindo apenas nas
Captulo 4. Interpretador
1
2
76
v i s i t M e s s a g e =[ s e n d e r . p i c t u r e r e p l i e s . v i s i t M e s s a g e ( ) ]
visitMessage ()
Figura 63 Especificao Litoral cuja rvore sinttica e AST so exibidas nas figuras
64a e 64b, respectivamente.
ASTs construdas pelo analisador sinttico gerado pelo ANTLR. Tal como exemplificado
na linha 1 da Figura 62, tokens imaginrios so declarados na metalinguagem do ANTLR
com a palavra chave token .
As figuras 64a e 64b exemplificam o funcionamento do analisador sinttico gerado
pelo ANTLR a partir da gramtica da Figura 62. A primeira mostra a rvore sinttica da
especificao Litoral da Figura 63, enquanto a ltima mostra a sua AST.
Captulo 4. Interpretador
77
(b) AST
Captulo 4. Interpretador
78
(, Message)
(visitMessage, Message)
(visitMessage, List<Message>)
4.3.3 Interpretao
A idia principal por trs da interpretao de especificaes Litoral com Afluentes consiste em construir composies de avaliaes a partir de suas tabelas de smbolos.
As avaliaes navegam por objetos, carregando-os para a memria primria se necessrio.
As tabelas de smbolos contm cpias das subrvores das ASTs das especificaes
Litoral. As composies de avaliaes so construdas medida que os ns das subrvores
so percorridos. Os ns esto anotados com as classes dos objetos sobre os quais eles
atuam. Os objetos podem ser listas de outros objetos, ou seja, suas classes so subclasses
de L i s t .
4.3.3.1 Ns que Atuam Sobre Objetos
Se n um n que atua sobre um objeto, ento n d origem a uma composio de
avaliaes das funes head e e v a l u a t i o n s 1 .
A funo e v a l u a t i o n s 1 recebe como argumentos os filhos de n e um objeto e
retorna uma lista de avaliaes. A primeira avaliao da lista carrega o objeto. Se ele
implementa a interface I E v a l H o l d e r , ento a primeira avaliao a retornada pelo mtodo
g e t E v a l . Caso contrrio, a avaliao da funo identidade aplicada ao objeto. As demais
avaliaes da lista retornada por e v a l u a t i o n s 1 correspondem a avaliaes de funes
que, a partir do objeto recebido como argumento:
navegam atravs dos atributos cujos nomes esto contidos nos filhos de n; ou
iniciam as travessias cujos nomes esto contidos nos netos de n.
Captulo 4. Interpretador
79
A funo head recebe uma lista de objetos como argumento e retorna o primeiro
objeto da lista.
Por exemplo, se a especificao Litoral da Figura 63 for aplicado mensagem
m1 , ento a composio de avaliaes exibida na Subfigura 66a ser construda. Nesta e
nas demais subfiguras da Figura 66, retngulos contornados por linhas slidas, tracejadas
e crculos representam, respectivamente, funes, listas e avaliaes. Por fim, setas representam composies de avaliaes. Para simplificar os diagramas, os ns que e v a l u a t i o n 1
recebe como argumento foram omitidos e uma mesma avaliao pode ter sido desenhada
mais de uma vez (por exemplo, a avaliao associada a m1 ).
As subfiguras 66b, 66d, 66f e 66h mostram o resultado de execues de e v a l u a t i o n s 1 ,
As subfiguras 66i e 66j, por sua vez, mostram o resultado de execues de head .
4.3.3.2 Ns que Atuam Sobre Listas
Ns que atuam sobre listas originam avaliaes da funo e v a l u a t i o n s 2 , a qual
recebe uma lista de objetos como argumento e retorna uma lista de avaliaes. Para produzir
as avaliaes, e v a l u a t i o n s 2 aplica a composio das funes head e e v a l u a t i o n s 1
descritas na seo anterior a cada um dos objetos recebidos como argumento.
Voltando ao exemplo da Figura 66, a Figura 66l mostra o resultado da aplicao
de e v a l u a t i o n s 2 lista [m2 ].
Captulo 4. Interpretador
(a)
80
(b)
(c)
(e)
(d)
Captulo 4. Interpretador
81
(g)
(f)
(i)
(h)
Captulo 4. Interpretador
82
(k)
(j)
(l)
(m)
83
5 Avaliao
A estratgia proposta por esta pesquisa para aumentar o desempenho de sistemas
baseados em ORMs consiste em executar concorrentemente consultas que pr-carregam
objetos. Esta estratgia foi avaliada com os benchmarks sintticos Emeio e OO7 (CAREY;
DEWITT; NAUGHTON, 1993) (CAREY et al., 1994). O primeiro foi desenvolvido no
contexto desta pesquisa e baseado em um sistema no qual o autor atuou como arquiteto de
software. O segundo foi criado para avaliar o desempenho de OODBMSs (Object-Oriented
Database Management Systems) e, alm de ser usado para este fim (BONCZ; KWAKKEL;
KERSTEN, 1995; WITT et al., 1996), tambm usado para avaliar o desempenho de
ORMs (BERNSTEIN; PAL; SHUTT, 2000; HAN; WHANG; MOON, 2005; IBRAHIM;
COOK, 2006; ZYL; KOURIE; BOAKE, 2006; ZYL et al., 2009; ZYL, 2010; GERSEN,
2013), processamento de dados XML (LI et al., 2001), programao paralela (WELC;
JAGANNATHAN; HOSKING, 2005; JR et al., 2011) e memria transacional em software
(GUERRAOUI; KAPALKA; VITEK, 2007; ZIAREK et al., 2008).
Os benchmarks foram implementados com o interpretador de Litoral. Como
ele depende de um mecanismo de carregamento de objetos para funcionar, um ORM
mnimo contendo apenas as funcionalidades requeridas pelos benchmarks foi desenvolvido
e integrado ao interpretador. Tambm foi adicionada ao interpretador a capacidade de
pr-carregar objetos executando consultas sequencialmente. Isto nos permitiu comparar
o tempo de execuo dos benchmarks quando objetos so pr-carregados com consultas
executadas sequencialmente versus concorrentemente.
Caso a avaliao fosse feita apenas com esta comparao, as implementaes
dos benchmarks baseadas no interpretador de Litoral poderiam no adotar outras
otimizaes, diferentes da proposta nesta pesquisa, que ORMs costumam adotar. Isto
faria com que os tempos de execuo dos benchmarks com o interpretador de Litoral
no modo sequencial fossem artificialmente elevados, o que superestimaria o benefcio de
pr-carregar objetos executando consultas concorrentemente, pondo em risco a validade
da avaliao.
Para minimizar este risco, os benchmarks tambm foram implementados com os
ORMs Hibernate e Eclipse Link JPA, os quais aderem especificao JPA. O primeiro
foi escolhido devido sua popularidade. O ltimo foi escolhido por ser a implementao
de referncia de JPA. As implementaes dos benchmarks baseadas no Hibernate e
no EclipseLink JPA adotam as otimizaes disponibilizadas por estes ORMs, as quais
tambm foram, em sua maioria, adotadas pelas implementaes baseadas no interpretador
de Litoral.
Captulo 5. Avaliao
84
5.1 Emeio
Emeio um benchmark baseado em um sistema que permite a seus usurios
enviarem mensagens entre si. Ele avalia o desempenho de navegaes por objetos das
classes exibidas na Seo A.1:
MediaType representa tipos de arquivos (por exemplo, application/pdf, image/jpeg
e image/png);
F i l e representa arquivos. Um arquivo possui um tipo ( MediaType ) ;
User representa os usurios do sistema. Cada usurio possui uma foto ( F i l e ) ;
Tag representa marcaes que os usurios podem adicionar mensagens para
classific-las (por exemplo, famlia, universidade e trabalho);
Message representa as mensagens que os usurios enviam uns aos outros. Cada
mensagem possui um remetente ( User ) , destinatrios ( User ) , anexos ( F i l e ) ,
marcaes ( Tag ) e rplicas ( Message ) .
O mapeamento objeto-relacional foi feito da seguinte maneira:
cada classe mapeada para uma tabela;
os atributos que identificam objetos unicamente so mapeados para chaves primrias;
os demais atributos so mapeados para colunas;
associaes de cardinalidade um para muitos so mapeadas para chaves estrangeiras
nas tabelas das classes que esto no lado muitos das associaes. As chaves
estrangeiras referenciam as tabelas das classes que esto no lado um;
Captulo 5. Avaliao
85
Captulo 5. Avaliao
86
recipients
// A
r e c i p i e n t s tags
// B
r e c i p i e n t s tags f i l e s
// C
sender
// D
sender r e c i p i e n t s
// E
sender r e c i p i e n t s tags
// F
sender r e c i p i e n t s tags f i l e s
// G
visitMessage = [ r e p l i e s . visitMessage ( ) ]
visitMessage ()
// H
// I
// J
// K
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
v i s i t M e s s a g e = [ s e n d e r r e c i p i e n t s t a g s f i l e s r e p l i e s . v i s i t M e s s a g e ( ) ] // L
visitMessage ()
Captulo 5. Avaliao
87
create index on m e s s a g e _ r e c i p i e n t _ v i e w ( r e c i p i e n t _ i d e n t i f i e r ,
m e s s a g e _ i d e n t i f i e r desc ) ;
3
4
5
Captulo 5. Avaliao
88
(a)
(b)
(c)
Captulo 5. Avaliao
89
(d)
(e)
Captulo 5. Avaliao
90
5.1.4 Resultados
As figuras 71a71c exibem o tempo total de execuo das especificaes AL com
as implementaes de Emeio baseadas no Hibernate, EclipseLink JPA e no interpretador
de Litoral.
Em muitos casos, o tempo total de execuo com o interpretador no modo sequencial
menor do que o obtido com o Hibernate e o EclipseLink JPA. bastante provvel que
isto ocorra porque o ORM com o qual o interpretador foi integrado possui apenas as
funcionalidades necessrias implementao dos benchmarks, enquanto o Hibernate e
o EclipseLink JPA implementam uma srie de outras funcionalidades que ajudam o
desenvolvedor, mas, eventualmente, reduzem o desempenho.
O tempo total de execuo das especificaes A, D e H com o interpretador no
modo concorrente foi 0,99,9% maior do que no sequencial. Este aumento ocorre porque a
otimizao 1 da seo 5.1.1 elimina destas especificaes as oportunidades para concorrncia.
Em casos assim, o aumento no tempo de processamento oriundo do gerenciamento da
concorrncia no compensado por uma reduo no tempo de E/S, pois as consultas
so executadas sequencialmente. Esta observao sugere que o interpretador deveria ser
capaz de identificar se uma especificao oferece oportunidades para concorrncia. Em
caso negativo, o interpretador operaria no modo sequencial mesmo quando solicitado a
operar no modo concorrente.
Por outro lado, o tempo total de execuo das demais especificaes com o interpretador no modo concorrente foi 33,369,1% menor do que no sequencial. De maneira
geral, quanto maiores forem as oportunidades para concorrncia (especificaes C, G e L),
maior a reduo no tempo total de execuo.
Em algumas especificaes, o tempo total de execuo com o interpretador no modo
sequencial foi menor do que com as implementaes baseadas no Hibernate (especificaes
AD e GH) e EclipseLink JPA (especificaes AC e G). Em outras, foi maior. O pior
desempenho foi observado na especificao I, na qual o tempo total de execuo mais
que dobrou. Entretanto, em todas as especificaes que oferecem oportunidades para
pr-carregar objetos executando consultas concorrentemente, esta otimizao fez com que
o tempo total de execuo com o interpretador no modo concorrente fosse menor do que
com as implementaes baseadas no Hibernate (862,3%) e EclipseLink JPA (8,156,4%).
Captulo 5. Avaliao
91
(a)
(b)
(c)
Figura 71 Tempo total de execuo das implementaes de Emeio baseadas no interpretador de Litoral, Hibernate e EclipseLink JPA.
Captulo 5. Avaliao
92
5.2 OO7
OO7 um benchmark livremente inspirado em sistemas de CAD (Computer Aided
Design), CAM (Computer Aided Manufacturing) e CASE (Computer Aided Software
Engineering). Ele foi projetado para avaliar o desempenho de navegaes, atualizaes e
consultas em OODBMs. Como o interpretador de Litoral influencia apenas o desempenho
de navegaes, a implementao de OO7 desenvolvida nesta pesquisa, tal como (IBRAHIM;
COOK, 2006), se limita a esta parte do benchmark.
Os principais conceitos modelados por OO7 so:
partes compostas ( CompositePart ) representam primitivas de projeto bsicas como,
por exemplo, um registrador em um sistema VLSI (Very Large Scale Integration)
CAD ou um procedimento em um sistema CASE. Uma parte composta possui uma
parte atmica ( AtomicPart ) raiz;
partes atmicas ( AtomicPart ) representam as unidades que compem as partes
compostas. Em um sistema CASE, por exemplo, elas representariam variveis,
comandos, expresses, etc. Uma parte atmica possui conexes com outras partes
atmicas;
conexes ( Connection ) representam a conexo entre uma parte atmica de origem
e outra de destino;
montagens ( Assembly ) representam construes de projeto de alto nvel como, por
exemplo, uma unidade lgica e aritmtica em um sistema VLSI CAD. Montagens
podem ser formadas por partes compostas, caso em que so chamadas de montagens
base ( BaseAssembly ) , ou por outras montagens, caso em que so chamadas de
montagens complexas ( ComplexAssembly ) ;
mdulos ( Module ) representam hierarquias de montagens complexas. Um mdulo
possui um manual ( Manual ) e uma montagem complexa raiz;
manuais ( Manual ) representam a documentao de um mdulo.
A implementao de OO7 desenvolvida nesta pesquisa adota o banco de dados
(modelo, ndices e dados) da desenvolvida em (ZYL, 2010). A Seo B.2 exibe suas tabelas
principais. A Figura 72 exibe os comandos SQL que criam seus ndices.
OO7 especifica trs tamanhos de banco de dados: pequeno, mdio e grande. Esta
pesquisa, tal como (IBRAHIM; COOK, 2006), adotou o tamanho pequeno. Nele, o banco
de dados populado com 500 partes compostas, 10.000 partes atmicas, 30.000, 60.000 ou
90.000 conexes para cada parte atmica (esta pesquisa adotou 30.000), 729 montagens
bsicas, 365 montagens complexas e 1 mdulo.
Captulo 5. Avaliao
1
2
3
4
5
6
create
create
create
create
create
create
index
index
index
index
index
index
on
on
on
on
on
on
93
assembly ( d e s i g n i d ) ;
atomic_parts ( b u i l d d a t e ) ;
atomic_parts ( d e s i g n i d ) ;
composite_parts ( d e s i g n i d ) ;
document ( t i t l e ) ;
module ( b u i l d d a t e ) ;
v i s i t A t o m i c P a r t=t o C o n n e c t i o n s . t o . v i s i t A t o m i c P a r t ( ) // T1
v i s i t A s s e m b l y =[
subAssemblies . visitAssembly ()
componentsPrivate . rootPart . visitAtomicPart ( )
]
designRoot . visitAssembly ( )
7
8
9
10
11
12
v i s i t A s s e m b l y =[
subAssemblies . visitAssembly ()
componentsPrivate . rootPart
]
designRoot . visitAssembly ( )
// T6
Captulo 5. Avaliao
94
5.2.4 Resultados
A Figura 75 exibe o tempo total de execuo das especificaes T1 e T6 com as
implementaes de OO7 baseadas no Hibernate, EclipseLink JPA e no interpretador de
Litoral. O tempo total de execuo das especificaes T1 e T6 com o interpretador no
modo concorrente foi 49,559,3% menor do que no sequencial.
O tempo total de execuo das especificaes T1 e T6 com o interpretador no
modo sequencial foi menor do que com as implementaes baseadas no Hibernate e
EclipseLink JPA. A nica exceo foi a especificao T6 com o Hibernate. Entretanto, o
tempo total de execuo com o interpretador no modo concorrente foi menor do que com as
implementaes baseadas no Hibernate (52,458,0%) e no EclipseLink JPA (95,296,5%).
Captulo 5. Avaliao
95
Figura 75 Tempo total de execuo das implementaes de Emeio baseadas no interpretador de Litoral, Hibernate e EclipseLink JPA.
No caso do Hibernate, a reduo no tempo total de execuo se deve majoritariamente
execuo concorrente de consultas. Entretanto, no caso do EclipseLink JPA, a contribuio
desta otimizao foi minoritria, pois o tempo total de execuo com o interpretador no
modo sequencial j muito menor (90,491,5%) do que com o EclipseLink JPA.
96
6 Trabalhos Relacionados
Este captulo discute trabalhos (Program Summaries, Scalpel, AutoFetch, etc.) que,
assim como esta pesquisa, visam aumentar o desempenho de sistemas baseados em ORMs.
De maneira geral, eles alcanam este objetivo produzindo consultas SQL que, quando
executadas sequencialmente, minimizam o tempo de pr-carregamento de objetos. Um
aspecto interessante, evidenciado no Captulo 5, que estas consultas, na maioria dos
casos, tambm podem ser executadas concorrentemente, reduzindo ainda mais o tempo de
pr-carregamento de objetos.
Figura 76 Especificao Program Summary que declara navegaes das mensagens enviadas por um usurio para seus remetentes e destinatrios.
97
98
6.2 Scalpel
Scalpel (BOWMAN; SALEM, 2005) intercepta as consultas SQL que um sistema
executa visando identificar padres de aninhamento
Q1 , Q2 (r1 ), ..., Q2 (rn )
, onde Q1 uma consulta cujo resultado formado pelas tuplas r1 , ..., rn e Q2 (r1 ), ..., Q2 (rn )
so instncias da consulta parametrizada Q2 . Estes padres so bastante comuns em
sistemas baseados em ORMs que carregam objetos sob demanda e tambm em sistemas que
acessam bancos de dados relacionais diretamente, inclusive aqueles que so desenvolvidos
em linguagens imperativas.
Ele consegue carregar os mesmos dados que as consultas Q1 , Q2 (r1 ), ..., Q2 (rn )
carregam executando uma nica consulta Qopt e tambm consegue extrair do resultado de
Qo pt os resultados de Q1 , Q2 (r1 ), ..., Q2 (rn ).
Quando o sistema excuta a consulta Q1 , Scalpel especula se as consultas Q2 (r1 ), ...,
Q2 (rn ) sero executadas em seguida. Em caso negativo, ele simplesmente executa Q1 ,
retornando seu resultado para o sistema. Em caso positivo, ele executa a consulta
Qopt , extrai de seu resultado o resultado de Q1 , Q2 (r1 ), ..., Q2 (rn ), armazena o resultado
Q2 (r1 ), ..., Q2 (rn ) e, finalmente, retorna o resultado de Q1 para o sistema. Se Scalpel
especulou corretamente, ento o sistema ir executar as consultas Q2 (r1 ), ..., Q2 (rn ) aps
receber o resultado de Q1 . Neste caso, Scalpel simplesmente retorna os resultados de
Q2 (r1 ), ..., Q2 (rn ) que ele armazenou anteriormente. Caso contrrio, Scalpel executa a
consulta Q3 (Q3 6= Q2 (r1 ) ... Q3 6= Q2 (rn )) que o sistema executou e retorna para o
sistema o resultado de Q3 .
(BOWMAN; SALEM, 2007) amplia Scalpel para tratar lotes de consultas, ou seja,
padres
99
Q1 , ..., Qn
, onde Q1 , ..., Qn so consultas no-aninhadas relacionadas quaisquer.
Provavelmente, a caracterstica mais interessante de Scalpel a transparncia.
Scalpel pode ser implantado entre qualquer sistema e os banco de dados relacionais
que ele acessa. O sistema continuar executando as mesmas consultas e recebendo os
mesmos resultados, s que mais rapidamente. Outra caracterstica distintiva de Scalpel
a generalidade, j que ele aumenta o desempenho de sistemas independentemente deles
serem ou no baseados em ORMs.
Restrigindo ao contexto de ORMs, a principal diferena entre Scalpel e Program
Summaries que o primeiro pr-carrega dados (resultados de consultas) especulativamente,
enquanto que o segundo pr-carrega dados (objetos) a partir de informaes fornecidas
por programadores. Outra diferena importante que o modelo de custos do primeiro
mais sofisticado que o do segundo, fazendo uso, por exemplo, de estimativas de custos
de execuo de consultas fornecidas pelo SGBD (Sistema de Gerenciamento de Banco de
Dados) em tempo de execuo.
Em comum com Program Summaries, Scalpel aumenta o desempenho de sistemas
baseados em ORMs agrupando consultas que so executadas sequencialmente, explorando,
portanto, uma otimizao diferente da proposta nesta pesquisa.
6.3 AutoFetch
AutoFetch (IBRAHIM; COOK, 2006), assim como Scalpel, prope um mtodo para
especular por quais objetos sistemas baseados em ORMs navegam. Uma caracterstica
distintiva de AutoFetch classificar consultas em classes e executar o mtodo para cada
uma das classes. AutoFetch determina a classe de uma consulta Q a partir da prpria
consulta e de um subconjunto do estado da pilha de execuo no momento em que Q
executada. Isto permite que AutoFetch pr-carregue objetos diferentes quando uma mesma
consulta executada em pontos diferentes de um sistema.
Entretanto, diferentemente de Scalpel e tambm de Program Summaries, que
decidem qual estratgia minimiza o tempo de pr-carregamento de objetos e dados,
respectivamente, com modelos de custos, AutoFetch sempre adota uma variao da
estratgia Single da Seo 6.1.
A estratgia Single executa consultas cujo resultado tende a ter um nmero muito
grande de linhas e colunas. AutoFetch lida com esta desvantagem abrindo mo do operador
union , o que reduz o nmero de linhas, e fazendo no mximo uma juno com tabelas
que representam relacionamentos muitos para muitos, o que reduz o nmero de linhas e
colunas.
100
As restries que AutoFetch impe estratgia Single evitam, na maioria dos casos,
que ela execute consultas que aumentam o tempo de pr-carregamento ao invs de reduzilo. Entretanto, por adotar apenas uma variao da estratgia Single, o desempenho de
AutoFetch , provavelmente, pior que o de Program Summaries nos casos em que este ltimo
determina que a estratgia Single no a que minimiza o tempo de pr-carregamento.
Em comum com Program Summaries e Scalpel, AutoFetch aumenta o desempenho
de sistemas baseados em ORMs agrupando consultas que so executadas sequencialmente.
Trata-se, portanto, de um trabalho relacionado, mas que explora uma otimizao diferente
da proposta nesta pesquisa.
101
7 Concluso
Esta pesquisa partiu da hiptese de que ORMs podem aumentar o desempenho de
sistemas executando concorrentemente consultas que pr-carregam objetos e se props a
desenvolver esta otimizao.
As avaliaes descritas no captulo 5 so evidncias de que a hiptese verdadeira e
de que o desenvolvimento da otimizao foi bem sucedido. De fato, no benchmark Emeio,
a execuo concorrente de consultas reduziu o tempo total de execuo em at 69,1%,
ou seja, aumentou a velocidade de execuo em at 323,6%. J no benchmark OO7, o
tempo total de execuo foi reduzido em at 59,3%, ou seja, a velocidade de execuo foi
aumentada em at 245,7%.
Nos dois benchmarks, em todos os cenrios que oferecem oportunidades para a
execuo concorrente de consultas que pr-carregam objetos, o tempo total de execuo com
esta otimizao foi menor do que com importantes ORMs industriais, os quais executam
estas consultas apenas sequencialmente. Este resultado mais uma evidncia de que o
desempenho de sistemas baseados em ORMs ser maior se estes ltimos adotarem a
otimizao proposta e desenvolvida nesta pesquisa.
7.1 Contribuies
As contribuies principais desta pesquisa foram:
1. identificar a oportunidade de pr-carregar objetos pelos quais sistemas baseados em
ORMs navegam executando consultas concorrentemente;
2. produzir evidncias de que, explorando esta oportunidade, pode-se aumentar significativamente o desempenho destes sistemas.
Adicionalmente, a forma como esta pesquisa explorou tal oportunidade produziu
as seguintes contribuies:
3. a DSL Litoral, a qual permite a especificao de navegaes iterativas e recursivas
por objetos;
4. o interpretador definidor de Litoral, o qual se aproxima de uma definio formal
desta DSL;
5. o projeto e a implementao do interpretador de Litoral, o qual pode ser facilmente
integrado a ORMs e outros mecanismos de carregamento de objetos;
Captulo 7. Concluso
102
103
Referncias
ADYA, A. et al. Anatomy of the ado. net entity framework. In: ACM. Proceedings of the
2007 ACM SIGMOD international conference on Management of data. [S.l.], 2007. p.
877888. Citado na pgina 19.
AHO, A. V.; BEERI, C.; ULLMAN, J. D. The theory of joins in relational databases.
ACM Transactions on Database Systems (TODS), ACM, v. 4, n. 3, p. 297314, 1979.
Citado 2 vezes nas pginas 27 e 97.
ARAUJO, S. M. d. et al. Afluentes concurrent i/o made easy with lazy evaluation. In:
IEEE. Parallel, Distributed and Network-Based Processing (PDP), 2014 22nd Euromicro
International Conference on. [S.l.], 2014. p. 279287. Citado 3 vezes nas pginas 20, 61
e 102.
ARMBRUST, M. et al. A view of cloud computing. Communications of the ACM, ACM,
v. 53, n. 4, p. 5058, 2010. Citado na pgina 31.
BERNSTEIN, P. A.; PAL, S.; SHUTT, D. Context-based prefetchan optimization for
implementing objects on relations. The VLDB Journal, Springer-Verlag, v. 9, n. 3, p.
177189, 2000. Citado 5 vezes nas pginas 17, 30, 31, 83 e 100.
BERTOT, Y.; CASTRAN, P. Interactive theorem proving and program development.
[S.l.]: Springer Science & Business Media, 2004. Citado 2 vezes nas pginas 20 e 41.
BLAKELEY, J. A. et al. The ado. net entity framework: making the conceptual level real.
ACM SIGMOD Record, ACM, v. 35, n. 4, p. 3239, 2006. Citado na pgina 19.
BONCZ, P. A.; KWAKKEL, F.; KERSTEN, M. L. High performance support for oo
traversals in monet. CWI (Centre for Mathematics and Computer Science), 1995. Citado
na pgina 83.
BOWMAN, I. T.; SALEM, K. Optimization of query streams using semantic prefetching.
ACM Transactions on Database Systems (TODS), ACM, v. 30, n. 4, p. 10561101, 2005.
Citado na pgina 98.
BOWMAN, I. T.; SALEM, K. Semantic prefetching of correlated query sequences. In:
IEEE. Data Engineering, 2007. ICDE 2007. IEEE 23rd International Conference on.
[S.l.], 2007. p. 12841288. Citado 2 vezes nas pginas 27 e 98.
CAREY, M. J. et al. A status report on the oo7 oodbms benchmarking effort. ACM
SIGPLAN Notices, ACM, v. 29, n. 10, p. 414426, 1994. Citado 2 vezes nas pginas 20
e 83.
CAREY, M. J.; DEWITT, D. J.; NAUGHTON, J. F. The 007 benchmark. [S.l.]: ACM,
1993. Citado 2 vezes nas pginas 20 e 83.
CASTRO, P.; MELNIK, S.; ADYA, A. Ado. net entity framework: raising the level of
abstraction in data programming. In: ACM. Proceedings of the 2007 ACM SIGMOD
international conference on Management of data. [S.l.], 2007. p. 10701072. Citado na
pgina 19.
Referncias
104
CLARK, J.; DEROSE, S. et al. Xml path language (xpath). W3C recommendation, v. 16,
1999. Citado na pgina 96.
CUREWITZ, K. M.; KRISHNAN, P.; VITTER, J. S. Practical prefetching via data
compression. ACM SIGMOD Record, ACM, v. 22, n. 2, p. 257266, 1993. Citado na
pgina 100.
CURNOW, H. J.; WICHMANN, B. A. A synthetic benchmark. The Computer Journal,
Br Computer Soc, v. 19, n. 1, p. 4349, 1976. Citado na pgina 20.
DEURSEN, A. V.; KLINT, P.; VISSER, J. Domain-specific languages: An annotated
bibliography. Sigplan Notices, v. 35, n. 6, p. 2636, 2000. Citado na pgina 18.
EISENBERG, A. et al. Sql: 2003 has been published. ACM SIGMoD Record, ACM, v. 33,
n. 1, p. 119126, 2004. Citado na pgina 17.
FIELDING, R. T.; TAYLOR, R. N. Principled design of the modern web architecture.
ACM Transactions on Internet Technology (TOIT), ACM, v. 2, n. 2, p. 115150, 2002.
Citado na pgina 20.
FOUNDATION, E. Eclipse Announces EclipseLink Project to Deliver JPA 2.0 Reference
Implementation. 2008. Disponvel em: <http://www.eclipse.org/org/press-release/
20080317_Eclipselink.php>. Citado na pgina 20.
GAMMA, E. et al. Design Patterns: Elements of Reusable Object-Oriented
Software. Pearson Education, 1994. ISBN 9780321700698. Disponvel em: <http:
//books.google.com.br/books?id=6oHuKQe3TjQC>. Citado na pgina 28.
GARBATOV, S.; CACHOPO, J. Predicting data access patterns in object-oriented
applications based on markov chains. In: IEEE. Software Engineering Advances (ICSEA),
2010 Fifth International Conference on. [S.l.], 2010. p. 465470. Citado na pgina 100.
GARBATOV, S. et al. Data access pattern analysis and prediction for object-oriented
applications. INFOCOMP Journal of Computer Science, v. 10, n. 4, p. 114, 2011. Citado
na pgina 100.
GERSEN, C. M. ORM Optimization through Automatic Prefetching in WebDSL.
Dissertao (Mestrado) Delft University of Technology, 2013. Citado na pgina 83.
GEUVERS, H. Proof assistants: History, ideas and future. Sadhana, Springer, v. 34, n. 1,
p. 325, 2009. Citado 2 vezes nas pginas 20 e 41.
GOSLING, J. et al. The Java Language Specification, Java SE 8 Edition. Pearson
Education, 2014. ISBN 9780133900798. Disponvel em: <http://books.google.com.br/
books?id=1DaDAwAAQBAJ>. Citado na pgina 16.
GROUP, J. P. . E. JSR 338: JavaTM Persistence API, Version 2.1. 2013. Disponvel em:
<http://download.oracle.com/otndocs/jcp/persistence-2_1-fr-eval-spec/index.html>.
Citado 2 vezes nas pginas 20 e 25.
GUHIS, S.; GOASDOU-THION, V.; RIGAUX, P. Speeding-up data-driven applications
with program summaries. In: ACM. Proceedings of the 2009 International Database
Engineering & Applications Symposium. [S.l.], 2009. p. 6676. Citado 5 vezes nas pginas
19, 96, 97, 98 e 102.
Referncias
105
Referncias
106
Referncias
107
RYMAN, A. Simple object access protocol (soap) and web services. In: IEEE COMPUTER
SOCIETY. Software Engineering, International Conference on. [S.l.], 2001. p. 06890689.
Citado na pgina 20.
SCOTT, M. Programming Language Pragmatics. Morgan Kaufmann, 2006.
(Programming Language Pragmatics, v. 1). ISBN 9780126339512. Disponvel em:
<http://books.google.com.br/books?id=TLbvODF1uIEC>. Citado na pgina 62.
SIPELSTEIN, J. M.; BLELLOCH, G. E. Collection-oriented languages. Proceedings of the
IEEE, IEEE, v. 79, n. 4, p. 504523, 1991. Citado na pgina 32.
SUBRAMANIAM, V. Functional Programming in Java: Harnessing the Power
of Java 8 Lambda Expressions. Pragmatic Programmers, LLC, 2014. (Pragmatic
programmers). ISBN 9781937785468. Disponvel em: <http://books.google.com.br/books?
id=4Y7TngEACAAJ>. Citado na pgina 63.
TANENBAUM, A. Modern Operating Systems. Pearson Prentice Hall, 2008. (GOAL
Series). ISBN 9780136006633. Disponvel em: <http://books.google.com.br/books?id=
DxNiQgAACAAJ>. Citado na pgina 22.
THOMSON, B.; BRUCKNER, J.; BRUCKNER, A. Elementary Real Analysis, Second
Edition. Createspace Independent Pub, 2008. ISBN 9781434843678. Disponvel em:
<http://books.google.com.br/books?id=vA9d57GxCKgC>. Citado 3 vezes nas pginas
50, 57 e 115.
VITTER, J. S.; KRISHNAN, P. Optimal prefetching via data compression. Journal of the
ACM (JACM), ACM, v. 43, n. 5, p. 771793, 1996. Citado na pgina 100.
WALDO, J. Remote procedure calls and java remote method invocation. Concurrency,
IEEE, IEEE, v. 6, n. 3, p. 57, 1998. Citado na pgina 20.
WELC, A.; JAGANNATHAN, S.; HOSKING, A. Safe futures for java. In: ACM. ACM
SIGPLAN Notices. [S.l.], 2005. v. 40, n. 10, p. 439453. Citado na pgina 83.
WITT, D. J. D. et al. Parallelizing oodbms traversals: a performance evaluation. the
VLDB Journal, Springer, v. 5, n. 1, p. 318, 1996. Citado na pgina 83.
ZIAREK, L. et al. A uniform transactional execution environment for java. In: ECOOP
2008Object-Oriented Programming. [S.l.]: Springer, 2008. p. 129154. Citado na pgina
83.
ZYL, P. V. Performance investigation into selected object persistence stores . Dissertao
(Mestrado) University of Pretoria, 2010. Citado 2 vezes nas pginas 83 e 92.
ZYL, P. V.; KOURIE, D. G.; BOAKE, A. Comparing the performance of object
databases and orm tools. In: SOUTH AFRICAN INSTITUTE FOR COMPUTER
SCIENTISTS AND INFORMATION TECHNOLOGISTS. Proceedings of the 2006 annual
research conference of the South African institute of computer scientists and information
technologists on IT research in developing countries. [S.l.], 2006. p. 111. Citado na
pgina 83.
Referncias
108
109
APNDICE A Emeio
A.1 Classes
1
2
import j a v a . u t i l . Date ;
import j a v a . u t i l . L i s t ;
3
4
5
6
7
8
9
10
11
12
13
c l a s s Message {
private int i d ;
private Date d a t e ;
private S t r i n g s u b j e c t ;
private S t r i n g body ;
private User s e n d e r ;
private L i s t <User> r e c i p i e n t s ;
private L i s t <F i l e > a t t a c h m e n t s ;
private L i s t <Message> r e p l i e s ;
private L i s t <Tag> t a g s ;
14
void s e t I d ( int i d ) {
this . id = id ;
}
15
16
17
18
int g e t I d ( ) {
return i d ;
}
19
20
21
22
// Demais mtodos s e t e g e t
23
24
25
26
27
28
29
c l a s s User {
private int i d ;
private S t r i n g name ;
private F i l e p i c t u r e ;
30
// Mtodos s e t e g e t
31
32
33
34
35
36
37
class File {
private int i d ;
private S t r i n g name ;
private MediaType mediaType ;
38
// Mtodos s e t e g e t
39
40
APNDICE A. Emeio
41
42
43
44
45
c l a s s MediaType {
private int i d ;
private S t r i n g type ;
// a p p l i c a t i o n , image , e t c .
private S t r i n g subtype ; // j s o n , xml , j p e g , png , e t c .
46
// Mtodos s e t e g e t
47
48
49
50
51
52
c l a s s Tag {
private int i d ;
private S t r i n g name ;
53
// Mtodos s e t e g e t
54
55
110
APNDICE A. Emeio
A.2 Tabelas
112
APNDICE B OO7
B.1 Classes
1
import j a v a . u t i l . L i s t ;
2
3
4
5
6
7
8
c l a s s CompositePart {
private long c o m p o s i t e P a r t I d ;
private long b u i l d D a t e ;
private int d e s i g n I d ;
private S t r i n g type ;
private AtomicPart r o o t P a r t ;
// Mtodos s e t e g e t
10
11
12
13
14
15
16
17
18
c l a s s AtomicPart {
private long a t o m i c P a r t I d ;
private long b u i l d D a t e ;
private int d e s i g n I d ;
private S t r i n g type ;
private L i s t <Connection> t o C o n n e c t i o n s ;
19
// Mtodos s e t e g e t
20
21
22
23
24
25
26
27
c l a s s Connection {
private long c o n n e c t i o n I d ;
private int l e n g t h ;
private S t r i n g type ;
private AtomicPart t o ;
28
// Mtodos s e t e g e t
29
30
31
32
33
34
35
36
c l a s s Assembly {
private long a s s e m b l y I d ;
private long b u i l d D a t e ;
private int d e s i g n I d ;
private S t r i n g type ;
37
// Mtodos s e t e g e t
38
39
40
APNDICE B. OO7
41
42
43
// Mtodos s e t e g e t
44
45
46
47
48
49
// Mtodos s e t e g e t
50
51
113
APNDICE B. OO7
114
B.2 Tabelas
115
APNDICE C Demonstraes
Este apndice contm as demonstraes verificadas por Coq dos teoremas enunciados
nas sees 3.4.3 e 3.4.4.2. Por serem bastante extensas, as demonstraes foram estruturadas em diversos mdulos. Os mdulos Seq , NatSeq , L i s t S e q , Lim e L i s t O p t i o n S e q
contm definies e teoremas bsicos, os quais foram adaptados da Anlise Real (THOMSON; BRUCKNER; BRUCKNER, 2008) para contextos mais simples tais como nmeros
naturais, listas, etc. O mdulo S u b l i s t contm algumas definies e teoremas bsicos
da lgebra Abstrata (PINTER, 2012). Os mdulos L i t o r a l F a c t s , A n a l y z e S p e c F a c t s e
I n t e r p r e t S p e c F a c t s contm as demonstraes propriamente ditas.
C.1 Seq
1
S e t I m p l i c i t Arguments .
2
3
4
5
6
7
Definition s u f f S e q Y ( f : Seq Y) N n := f (N + n ) .
8
9
C.2 NatSeq
1
S e t I m p l i c i t Arguments .
2
3
4
Require Import C l a s s i c a l .
Require Import Omega .
5
6
7
8
9
10
11
12
13
14
15
Theorem nonDecNatSeqNonDecNatSeq2 :
17
f o r a l l ( f : NatSeq ) , nonDecNatSeq f > nonDecNatSeq2 f .
16
APNDICE C. Demonstraes
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
Proof .
u n f o l d nonDecNatSeq .
u n f o l d nonDecNatSeq2 .
intros .
induction n .
{
assert (n = 0).
{
omega .
}
r e w r i t e H1 .
auto .
}
{
a s s e r t ( n <= n \/ n = S n ) .
{
omega .
}
d e s t r u c t H1 .
{
a s s e r t ( f n <= f n ) .
{
auto .
}
a s s e r t ( f n <= f ( S n ) ) .
{
auto .
}
omega .
}
{
r e w r i t e H1 . auto .
}
}
Qed .
53
54
55
56
57
58
59
60
61
62
63
64
Theorem nonDecBndNatSeqConvSeq :
f o r a l l f , nonDecNatSeq f > bndNatSeq f > convSeq f .
Proof .
u n f o l d bndNatSeq .
u n f o l d convSeq .
u n f o l d consSeq .
unfold suffSeq .
intros .
d e s t r u c t H0 a s [ L ] .
induction L.
{
116
APNDICE C. Demonstraes
exists 0.
intros .
a s s e r t ( f ( 0 + n ) <= 0 ) .
{
auto .
}
a s s e r t ( f ( 0 + S n ) <= 0 ) .
{
auto .
}
omega .
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
}
{
d e s t r u c t ( c l a s s i c ( f o r a l l n : nat , f n <= L ) ) .
{
auto .
}
{
a s s e r t ( e x i s t s N, ~ f N <= L ) .
{
apply not_all_ex_not .
auto .
}
d e s t r u c t H2 a s [N ] .
e x i s t s N.
intros .
a s s e r t ( f N <= f (N + n ) ) .
{
apply nonDecNatSeqNonDecNatSeq2 in H.
u n f o l d nonDecNatSeq2 in H.
a s s e r t (N <= N + n > f N <= f (N + n ) ) .
{
auto .
}
apply H.
omega .
}
a s s e r t ( f (N + n ) <= f (N + S n ) ) .
{
u n f o l d nonDecNatSeq in H.
a s s e r t ( f (N + n ) <= f ( S (N + n ) ) ) .
{
auto .
}
a s s e r t ( S (N + n ) = N + S n ) .
{
omega .
117
APNDICE C. Demonstraes
118
}
r e w r i t e < H5 .
auto .
112
113
114
}
a s s e r t ( f (N + S n ) <= S L ) .
{
auto .
}
omega .
115
116
117
118
119
120
121
}
123 Qed .
122
C.3 ListSeq
1
S e t I m p l i c i t Arguments .
2
3
4
5
6
7
8
Definition L i s t S e q E := Seq ( l i s t E ) .
9
10
Definition s u f f E q L i s t E ( l l : l i s t E) := e x i s t s l , l = l ++ l .
11
12
13
Definition nonDecListSeq E ( f : L i s t S e q E) :=
f o r a l l n , suffEqList ( f n) ( f (S n ) ) .
14
15
Definition l e n g t h S e q E ( f : L i s t S e q E) n := l e n g t h ( f n ) .
16
17
Definition l e n g t h B n d L i s t S e q E ( f : L i s t S e q E) := bndNatSeq ( l e n g t h S e q f ) .
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
Theorem nonDecListSeqNonDecLengthSeq :
f o r a l l E ( f : L i s t S e q E) , nonDecListSeq f > nonDecNatSeq ( l e n g t h S e q f ) .
Proof .
u n f o l d nonDecListSeq .
u n f o l d nonDecNatSeq .
unfold suffEqList .
unfold lengthSeq .
intros .
a s s e r t ( e x i s t s l , f ( S n ) = l ++ f n ) .
{
auto .
}
d e s t r u c t H0 .
r e w r i t e H0 .
APNDICE C. Demonstraes
33
34
35
36
37
38
119
a s s e r t ( l e n g t h ( x ++ f n ) = l e n g t h x + l e n g t h ( f n ) ) .
{
apply app_length .
}
omega .
Qed .
39
40
41
42
43
44
45
46
47
48
49
50
51
Theorem l e n g t h Z e r o E m p t y L i s t : f o r a l l E ( l : l i s t E) , l e n g t h l = 0 > l = [ ] .
Proof .
intros .
u n f o l d l e n g t h in H.
destruct l .
{
auto .
}
{
congruence .
}
Qed .
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
Theorem nonDecLengthBndListSeqConv :
f o r a l l E ( f : L i s t S e q E) ,
nonDecListSeq f > l e n g t h B n d L i s t S e q f > convSeq f .
Proof .
u n f o l d convSeq .
u n f o l d consSeq .
unfold suffSeq .
intros .
a s s e r t ( convSeq ( l e n g t h S e q f ) ) .
{
apply nonDecBndNatSeqConvSeq .
apply nonDecListSeqNonDecLengthSeq .
auto .
auto .
}
u n f o l d convSeq in H1 .
u n f o l d consSeq in H1 .
u n f o l d s u f f S e q in H1 .
u n f o l d l e n g t h S e q in H1 .
d e s t r u c t H1 a s [N ] .
e x i s t s N.
intros .
a s s e r t ( e x i s t s l , f (N + S n ) = l ++ f (N + n ) ) .
{
a s s e r t ( e x i s t s l , f ( S (N + n ) ) = l ++ f (N + n ) ) .
{
u n f o l d nonDecListSeq in H.
APNDICE C. Demonstraes
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
u n f o l d s u f f E q L i s t in H.
auto .
}
a s s e r t ( S (N + n ) = N + S n ) .
omega .
r e w r i t e < H3 .
auto .
}
d e s t r u c t H2 a s [ l ] .
assert ( l = [ ] ) .
{
assert ( length l = 0).
{
a s s e r t ( l e n g t h ( f (N + n ) ) = l e n g t h ( f (N + S n ) ) ) .
{
auto .
}
r e w r i t e H2 in H3 .
r e w r i t e app_length in H3 .
omega .
}
apply l e n g t h Z e r o E m p t y L i s t .
auto .
}
r e w r i t e H3 in H2 .
auto .
Qed .
C.4 Lim
1
S e t I m p l i c i t Arguments .
2
3
4
5
6
7
Definition l i m Y ( f : Seq Y) L := e x i s t s N, f o r a l l n , s u f f S e q f N n = L .
8
9
10
11
12
13
14
15
16
17
Theorem s u f f S e q L i m :
f o r a l l Y ( f : Seq Y) N L , l i m ( s u f f S e q f N) L > l i m f L .
Proof .
unfold lim .
unfold suffSeq .
intros .
d e s t r u c t H as [N ] .
e x i s t s (N + N ) .
intros .
120
APNDICE C. Demonstraes
18
19
20
21
22
23
24
a s s e r t (N + N + n = N + (N + n ) ) .
{
omega .
}
r e w r i t e H0 .
auto .
Qed .
C.5 ListOptionSeq
1
S e t I m p l i c i t Arguments .
2
3
4
Require Import C l a s s i c a l .
Require Import L i s t . Import L i s t N o t a t i o n s .
5
6
7
8
9
10
Definition L i s t O p t i o n S e q E := Seq ( o p t i o n ( l i s t E ) ) .
11
12
13
14
15
16
17
Definition s u f f L i s t O p t i o n E ( l o l o : o p t i o n ( l i s t E ) ) :=
match l o with
| None => l o = None
| Some [ ] => l o = Some [ ]
| Some l => e x i s t s l e , l o = Some l /\ l = e : : l
end .
18
19
20
Definition d e c L i s t O p t i o n S e q E ( f : L i s t O p t i o n S e q E) :=
f o r a l l n , suffListOption ( f (S n)) ( f n ) .
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
Theorem decOptionListSeqLim :
f o r a l l E ( f : L i s t O p t i o n S e q E) ,
d e c L i s t O p t i o n S e q f > l i m f None \/ l i m f ( Some [ ] ) .
Proof .
intros .
d e s t r u c t ( c l a s s i c ( e x i s t s N, f N = None ) ) .
{
left .
unfold lim .
unfold suffSeq .
d e s t r u c t H0 a s [N ] .
e x i s t s N.
induction n .
{
a s s e r t (N + 0 = N ) .
{
121
APNDICE C. Demonstraes
auto .
}
r e w r i t e H1 .
auto .
38
39
40
41
}
{
42
43
a s s e r t (N + S n = S (N + n ) ) .
{
omega .
}
r e w r i t e H1 .
u n f o l d d e c L i s t O p t i o n S e q in H.
u n f o l d s u f f L i s t O p t i o n in H.
s p e c i a l i z e H with (N + n ) .
r e w r i t e IHn in H.
auto .
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
}
{
a s s e r t ( f o r a l l n , f n <> None ) .
{
intros .
d e s t r u c t ( f n ) eqn : E1 .
{
congruence .
}
{
u n f o l d not in H0 .
a s s e r t ( e x i s t s N : nat , f N = None ) .
{
exists n.
auto .
}
contradiction .
}
}
74
75
76
77
78
79
80
81
82
83
84
d e s t r u c t ( f 0 ) eqn : E1 .
{
assert (
f o r a l l n , e x i s t s l , f n = Some l /\ l e n g t h l = l e n g t h l n
).
{
induction n .
{
exists l .
assert ( length l 0 = length l ) .
122
APNDICE C. Demonstraes
85
omega .
86
}
auto .
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
}
{
assert ( length l S n = length l n 1).
{
omega .
}
r e w r i t e H2 .
u n f o l d d e c L i s t O p t i o n S e q in H.
u n f o l d s u f f L i s t O p t i o n in H.
s p e c i a l i z e H with n .
destruct ( f n ).
{
destruct l0 .
{
r e w r i t e H.
exists [ ] .
split .
{
auto .
}
{
d e s t r u c t IHn .
d e s t r u c t H3 .
i n j e c t i o n H3 .
intros .
r e w r i t e < H4 .
r e w r i t e < H5 .
auto .
}
}
{
d e s t r u c t H.
d e s t r u c t H.
d e s t r u c t H.
i n j e c t i o n H3 .
intros .
r e w r i t e H.
exists x.
split .
{
auto .
}
{
123
APNDICE C. Demonstraes
d e s t r u c t IHn .
d e s t r u c t H6 .
i n j e c t i o n H6 .
intros .
r e w r i t e < H4 .
r e w r i t e < H7 .
r e w r i t e < H8 .
simpl .
omega .
132
133
134
135
136
137
138
139
140
141
142
}
{
143
144
congruence .
145
146
147
148
149
150
right .
unfold lim .
e x i s t s ( length l ) .
intros .
s p e c i a l i z e H2 with ( l e n g t h l + n ) .
d e s t r u c t H2 .
d e s t r u c t H2 .
assert ( length x = 0).
{
omega .
}
apply l e n g t h Z e r o E m p t y L i s t in H4 .
r e w r i t e H4 in H2 .
unfold suffSeq .
auto .
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
}
{
congruence .
169
170
}
172 Qed .
171
173
Theorem d e c O p t i o n L i s t S u f f S e q L i m :
f o r a l l E ( f : L i s t O p t i o n S e q E) N,
176
d e c L i s t O p t i o n S e q ( s u f f S e q f N) > l i m f None \/ l i m f ( Some [ ] ) .
177 Proof .
178
intros .
174
175
124
APNDICE C. Demonstraes
179
180
181
182
183
184
185
186
187
188
189
190
191
apply decOptionListSeqLim in H.
d e s t r u c t H.
{
left .
apply s u f f S e q L i m with N.
auto .
}
{
right .
apply s u f f S e q L i m with N.
auto .
}
Qed .
192
Theorem h a s D e c O p t i o n L i s t S u f f S e q L i m :
f o r a l l E ( f : L i s t O p t i o n S e q E) ,
195
( e x i s t s N, d e c L i s t O p t i o n S e q ( s u f f S e q f N) ) > l i m f None \/
196
l i m f ( Some [ ] ) .
197 Proof .
198
intros .
199
d e s t r u c t H a s [N ] .
200
apply d e c O p t i o n L i s t S u f f S e q L i m with N.
201
auto .
202 Qed .
193
194
C.6 Sublist
1
S e t I m p l i c i t Arguments .
2
3
4
5
6
7
8
Require Import L i s t S e q .
Require Import NatSeq .
Require Import Seq .
9
10
11
12
Definition r e f l E ( f : Rel E) := f o r a l l e , f e e = t r u e .
13
14
15
16
17
Definition t r a n s E ( f : Rel E) :=
f o r a l l e e e , f e e = t r u e > f e e = f e e .
18
19
20
125
APNDICE C. Demonstraes
21
22
23
24
25
26
27
126
28
29
30
Definition s u b l i s t E ( r : Rel E) l l :=
f o r a l l e , count r l e <= count r l e .
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
Theorem t a i l S u b l i s t :
f o r a l l E ( r : Rel E) e l l , s u b l i s t r ( e : : l ) l > s u b l i s t r l l .
Proof .
unfold s u b l i s t .
intros .
s p e c i a l i z e H with e0 .
s i m p l in H.
d e s t r u c t ( r e0 e ) .
{
omega .
}
{
auto .
}
Qed .
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
Theorem lengthCountRemove :
f o r a l l E ( r : Rel E) l e , l e n g t h l = count r l e + l e n g t h ( remove r l e ) .
Proof .
intros .
induction l .
{
auto .
}
{
simpl .
destruct ( r e a ).
{
APNDICE C. Demonstraes
omega .
68
}
{
69
70
simpl .
omega .
71
72
73
}
75 Qed .
74
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
Theorem removeLengthLe :
f o r a l l E ( r : Rel E) l e , l e n g t h ( remove r l e ) <= l e n g t h l .
Proof .
intros .
induction l .
{
auto .
}
{
simpl .
destruct ( r e a ).
{
auto .
}
{
simpl .
omega .
}
}
Qed .
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
Theorem removeCount :
f o r a l l E ( r : Rel E) ,
symm r /\ t r a n s r >
forall l e e ,
( r e e = f a l s e > count r ( remove r l e ) e = count r l e ) /\
( r e e = t r u e > count r ( remove r l e ) e = 0 ) .
Proof .
intro .
intro .
intro .
induction l .
{
auto .
}
{
intros e e .
s p e c i a l i z e I H l with e e .
127
APNDICE C. Demonstraes
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
simpl .
d e s t r u c t ( r e a ) eqn : E1 .
{
split .
{
intros .
d e s t r u c t H.
u n f o l d t r a n s in H1 .
s p e c i a l i z e H1 with e a e .
assert ( r a e = r e e ) .
{
auto .
}
r e w r i t e H0 in H2 .
u n f o l d symm in H.
s p e c i a l i z e H with e a .
r e w r i t e H2 in H.
r e w r i t e H.
d e s t r u c t IHl .
auto .
}
{
d e s t r u c t IHl .
auto .
}
}
{
simpl .
d e s t r u c t ( r e a ) eqn : E2 .
{
split .
{
d e s t r u c t IHl .
auto .
}
{
intros .
d e s t r u c t H.
u n f o l d t r a n s in H1 .
s p e c i a l i z e H1 with e e a .
assert ( r e a = r e a ).
{
auto .
}
congruence .
}
}
128
APNDICE C. Demonstraes
162
auto .
163
164
165
166
167
}
Qed .
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
Theorem s u b l i s t L e n g t h L e I n d :
f o r a l l n E ( r : Rel E) l l ,
l e n g t h l <= n > e q u i r > s u b l i s t r l l > l e n g t h l <= l e n g t h l .
Proof .
induction n .
{
intros .
assert ( length l = 0).
{
omega .
}
r e w r i t e H2 .
omega .
}
{
intros .
a s s e r t ( l e n g t h l <= n \/ l e n g t h l = S n ) .
{
omega .
}
d e s t r u c t H2 .
{
s p e c i a l i z e IHn with E r l l .
auto .
}
{
destruct l .
{
simpl .
omega .
}
{
a s s e r t ( IHn := IHn ) .
s p e c i a l i z e IHn with E r l l .
assert ( length l = n ) .
{
auto .
}
a s s e r t ( l e n g t h l <= n ) .
{
129
APNDICE C. Demonstraes
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
omega .
}
a s s e r t (H1 := H1 ) .
apply t a i l S u b l i s t in H1 .
a s s e r t ( l e n g t h l <= l e n g t h l ) .
{
auto .
}
p o s e p r o o f lengthCountRemove .
s p e c i a l i z e H6 with E r ( e : : l ) e .
r e w r i t e H6 .
p o s e p r o o f lengthCountRemove .
s p e c i a l i z e H7 with E r l e .
r e w r i t e H7 .
u n f o l d s u b l i s t in H1 .
s p e c i a l i z e H1 with e .
225
226
227
228
229
230
231
232
233
u n f o l d remove .
f o l d remove .
a s s e r t (H0 := H0 ) .
u n f o l d e q u i in H0 .
d e s t r u c t H0 .
u n f o l d r e f l in H0 .
s p e c i a l i z e H0 with e .
r e w r i t e H0 .
234
235
236
237
238
239
p o s e p r o o f removeLengthLe .
s p e c i a l i z e H9 with E r l e .
r e w r i t e H3 in H9 .
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
assert (
s u b l i s t r ( remove r l e ) ( remove r l e )
).
{
unfold s u b l i s t .
intros .
d e s t r u c t ( r e e0 ) eqn : E1 .
{
a s s e r t ( count r ( remove r l e ) e0 = 0 ) .
{
apply removeCount .
auto .
auto .
}
a s s e r t ( count r ( remove r l e ) e0 = 0 ) .
130
APNDICE C. Demonstraes
256
apply removeCount .
auto .
auto .
257
258
259
}
omega .
260
261
}
{
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
}
290 Qed .
289
291
292
293
294
295
296
297
298
299
300
301
302
Theorem s u b l i s t L e n g t h L e :
f o r a l l E ( r : Rel E) l l ,
e q u i r > s u b l i s t r l l > l e n g t h l <= l e n g t h l .
Proof .
intros .
apply s u b l i s t L e n g t h L e I n d with ( n := l e n g t h l ) ( r := r ) .
auto .
auto .
auto .
Qed .
131
APNDICE C. Demonstraes
303
304
Definition s u b l i s t B n d L i s t S e q E ( f : L i s t S e q E) :=
e x i s t s r l , e q u i r /\ f o r a l l n , s u b l i s t r ( f n ) ( l ) .
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
Theorem nonDecSublistBndListSeqConv :
f o r a l l E ( f : L i s t S e q E) ,
nonDecListSeq f > s u b l i s t B n d L i s t S e q f > convSeq f .
Proof .
intros .
u n f o l d s u b l i s t B n d L i s t S e q in H0 .
d e s t r u c t H0 a s [ r ] .
d e s t r u c t H0 a s [ l ] .
d e s t r u c t H0 .
a s s e r t ( lengthBndListSeq f ) .
{
unfold lengthBndListSeq .
u n f o l d bndNatSeq .
e x i s t s ( length l ) .
unfold lengthSeq .
intros .
apply s u b l i s t L e n g t h L e with ( r := r ) .
auto .
auto .
}
apply nonDecLengthBndListSeqConv .
auto .
auto .
Qed .
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
( Outros )
Theorem sameCount :
f o r a l l E ( r : Rel E) l e e ,
t r a n s r > r e e = t r u e > count r l e = count r l e .
Proof .
intros .
induction l .
{
auto .
}
{
simpl .
u n f o l d t r a n s in H.
assert ( r e a = r e a ).
{
auto .
}
r e w r i t e H1 .
r e w r i t e IHl .
132
APNDICE C. Demonstraes
auto .
350
}
352 Qed .
351
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
Theorem appCount :
f o r a l l E ( r : Rel E) l l e ,
count r ( l ++ l ) e = count r l e + count r l e .
Proof .
induction l .
{
intros .
auto .
}
{
intros .
s p e c i a l i z e I H l with l e .
r e w r i t e < app_comm_cons .
u n f o l d count .
f o l d count .
destruct ( r e a ).
{
omega .
}
{
auto .
}
}
Qed .
378
379
380
381
382
383
384
385
386
Theorem appCountZero :
f o r a l l E ( r : Rel E) l l e ,
count r ( l ++ l ) e = 0 > count r l e = 0 /\ count r l e = 0 .
Proof .
intros .
r e w r i t e appCount in H.
omega .
Qed .
387
388
389
390
391
392
Definition c o n t a i n s E ( r : Rel E) l e :=
match count r l e with
| 0 => f a l s e
| _ => t r u e
end .
393
Theorem sameContains :
395
f o r a l l E ( r : Rel E) l e e ,
396
t r a n s r > r e e = t r u e > c o n t a i n s r l e = c o n t a i n s r l e .
394
133
APNDICE C. Demonstraes
397
398
399
400
401
402
403
404
Proof .
intros .
unfold contains .
r e w r i t e sameCount with ( e := e ) .
auto .
auto .
auto .
Qed .
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
Theorem c o n t a i n s F a l s e C o u n t Z e r o :
f o r a l l E ( r : Rel E) l e ,
c o n t a i n s r l e = f a l s e > count r l e = 0 .
Proof .
intros .
u n f o l d c o n t a i n s in H.
d e s t r u c t ( count r l e ) .
{
auto .
}
{
congruence .
}
Qed .
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
Theorem containsTrueCountNotZero :
f o r a l l E ( r : Rel E) l e ,
c o n t a i n s r l e = t r u e > count r l e <> 0 .
Proof .
intros .
u n f o l d c o n t a i n s in H.
d e s t r u c t ( count r l e ) .
{
congruence .
}
{
auto .
}
Qed .
435
436
437
438
439
440
441
442
443
Theorem a p p C o n t a i n s F a l s e :
f o r a l l E ( r : Rel E) l l e ,
t r a n s r > c o n t a i n s r ( l ++ l ) e = f a l s e >
c o n t a i n s r l e = f a l s e /\ c o n t a i n s r l e = f a l s e .
Proof .
intros .
unfold contains .
apply c o n t a i n s F a l s e C o u n t Z e r o in H0 .
134
APNDICE C. Demonstraes
444
445
446
447
448
449
450
apply appCountZero in H0 .
d e s t r u c t H0 .
r e w r i t e H0 .
r e w r i t e H1 .
auto .
Qed .
( Outros )
C.7 LitoralFacts
1
S e t I m p l i c i t Arguments .
2
3
4
5
6
7
Require Import L i t o r a l .
Require Import S u b l i s t .
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
Theorem strEqEqui : e q u i s t r E q .
Proof .
unfold equi .
split .
{
unfold r e f l .
intros .
unfold strEq .
destruct ( string_dec e e ) .
{
auto .
}
{
congruence .
}
}
{
split .
{
u n f o l d symm .
intros .
unfold strEq .
destruct ( string_dec e e ) .
{
destruct ( string_dec e e ) .
{
auto .
}
{
135
APNDICE C. Demonstraes
congruence .
38
39
}
{
40
41
destruct ( string_dec e e ) .
{
congruence .
}
{
auto .
}
42
43
44
45
46
47
48
49
}
{
50
51
unfold trans .
intros .
unfold strEq .
u n f o l d s t r E q in H.
destruct ( string_dec e e ) .
{
r e w r i t e e0 .
auto .
}
{
destruct ( string_dec e e ) .
{
congruence .
}
{
congruence .
}
}
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
}
72 Qed .
71
73
74
75
76
77
78
79
80
81
82
83
84
136
APNDICE C. Demonstraes
}
{
85
86
congruence .
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
}
{
split .
{
u n f o l d symm .
intros .
u n f o l d natEq .
d e s t r u c t ( eq_nat_dec e e ) .
{
d e s t r u c t ( eq_nat_dec e e ) .
{
auto .
}
{
congruence .
}
}
{
d e s t r u c t ( eq_nat_dec e e ) .
{
congruence .
}
{
auto .
}
}
}
{
unfold trans .
intros .
u n f o l d natEq .
u n f o l d natEq in H.
d e s t r u c t ( eq_nat_dec e e ) .
{
r e w r i t e e0 .
auto .
}
{
d e s t r u c t ( eq_nat_dec e e ) .
{
congruence .
}
{
137
APNDICE C. Demonstraes
congruence .
132
133
134
135
136
137
}
Qed .
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
Theorem c l a s s E q E q u i : e q u i c l a s s E q .
Proof .
unfold equi .
split .
{
unfold r e f l .
intros .
unfold classEq .
destruct e .
p o s e p r o o f strEqEqui .
u n f o l d e q u i in H.
d e s t r u c t H.
u n f o l d r e f l in H.
s p e c i a l i z e H with s .
auto .
}
{
split .
{
u n f o l d symm .
intros .
unfold classEq .
destruct e .
destruct e .
p o s e p r o o f strEqEqui .
u n f o l d e q u i in H.
d e s t r u c t H.
d e s t r u c t H0 .
u n f o l d symm in H0 .
s p e c i a l i z e H0 with s s 0 .
auto .
}
{
unfold trans .
intro .
intro .
intro .
unfold classEq .
destruct e .
destruct e .
138
APNDICE C. Demonstraes
destruct e .
p o s e p r o o f strEqEqui .
u n f o l d e q u i in H.
d e s t r u c t H.
d e s t r u c t H0 .
u n f o l d t r a n s in H1 .
s p e c i a l i z e H1 with s s 0 s 1 .
auto .
179
180
181
182
183
184
185
186
187
}
189 Qed .
188
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
139
APNDICE C. Demonstraes
intro .
intro .
u n f o l d pathEq .
destruct e .
destruct e .
destruct e .
p o s e p r o o f natEqEqui .
u n f o l d e q u i in H.
d e s t r u c t H.
d e s t r u c t H0 .
u n f o l d t r a n s in H1 .
s p e c i a l i z e H1 with n n0 n1 .
auto .
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
}
Qed .
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
Theorem c l a s s P a t h E q E q u i : e q u i c l a s s P a t h E q .
Proof .
unfold equi .
split .
{
unfold r e f l .
intros .
unfold classPathEq .
destruct e .
pose proof classEqEqui .
u n f o l d e q u i in H.
d e s t r u c t H.
u n f o l d r e f l in H.
s p e c i a l i z e H with c .
r e w r i t e H.
p o s e p r o o f pathEqEqui .
u n f o l d e q u i in H1 .
d e s t r u c t H1 .
u n f o l d r e f l in H1 .
s p e c i a l i z e H1 with p .
auto .
}
{
split .
{
u n f o l d symm .
intros .
unfold classPathEq .
destruct e .
destruct e .
140
APNDICE C. Demonstraes
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
}
{
unfold trans .
intros .
unfold classPathEq .
destruct e .
destruct e .
destruct e .
u n f o l d c l a s s P a t h E q in H.
d e s t r u c t ( c l a s s E q c c0 ) eqn : E1 .
{
d e s t r u c t ( pathEq p p0 ) eqn : E2 .
{
pose proof classEqEqui .
u n f o l d e q u i in H0 .
d e s t r u c t H0 .
d e s t r u c t H1 .
u n f o l d t r a n s in H2 .
a s s e r t ( c l a s s E q c0 c1 = c l a s s E q c c1 ) .
{
auto .
}
r e w r i t e H3 .
p o s e p r o o f pathEqEqui .
u n f o l d e q u i in H4 .
d e s t r u c t H4 .
d e s t r u c t H5 .
u n f o l d t r a n s in H6 .
a s s e r t ( pathEq p0 p1 = pathEq p p1 ) .
{
auto .
}
141
APNDICE C. Demonstraes
r e w r i t e H7 .
auto .
320
321
}
{
322
323
congruence .
324
325
}
{
326
327
congruence .
328
329
330
331
332
}
Qed .
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
142
APNDICE C. Demonstraes
unfold trans .
intro .
intro .
intro .
u n f o l d objEq .
destruct e .
destruct e .
destruct e .
p o s e p r o o f strEqEqui .
u n f o l d e q u i in H.
d e s t r u c t H.
d e s t r u c t H0 .
u n f o l d t r a n s in H1 .
s p e c i a l i z e H1 with s s 0 s 1 .
auto .
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
}
384 Qed .
383
C.8 AnalyzeSpecFacts
1
S e t I m p l i c i t Arguments .
2
3
4
5
6
7
8
9
10
11
Require
Require
Require
Require
Require
Require
Require
Import
Import
Import
Import
Import
Import
Import
Lim .
Litoral .
LitoralFacts .
ListOptionSeq .
ListSeq .
Seq .
Sublist .
12
13
14
Definition a n a l y z e S p e c S c l a s s e s c l a s s s p e c n :=
l e t ( s , _) := a n a l y z e S p e c c l a s s e s c l a s s s p e c n in s .
15
16
17
18
19
20
21
22
23
24
25
26
Theorem analyzeSpecS_t1 :
f o r a l l c l a s s e s c l a s s spec ,
nonDecListSeq ( a n a l y z e S p e c S c l a s s e s c l a s s s p e c )
/\ s u b l i s t B n d L i s t S e q ( a n a l y z e S p e c S c l a s s e s c l a s s s p e c ) .
Proof .
intros .
split .
{
u n f o l d nonDecListSeq .
intros .
unfold suffEqList .
143
APNDICE C. Demonstraes
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
unfold analyzeSpecS .
unfold analyzeSpec .
d e s t r u c t ( indexSpec spec ) .
destruct p .
destruct s .
destruct ( analyzeTravs l 0 ) .
{
unfold analyzeClassPaths at 1 .
fold analyzeClassPaths .
destruct ( analyzeClassPaths c l a s s e s l l0 [ ] [ ( class , p ) ] n ) .
destruct o .
destruct l2 .
{
exists [ ] .
auto .
}
{
d e s t r u c t ( c o n t a i n s C l a s s P a t h l 1 p0 ) .
{
exists [ ] .
auto .
}
{
d e s t r u c t ( c o n t a i n s C l a s s P a t h ( l i s t _ p r o d c l a s s e s l ) p0 ) .
{
d e s t r u c t p0 .
d e s t r u c t ( a n a l y z e P a t h c l a s s e s l 0 c p0 ) .
{
e x i s t s [ ( c , p0 ) ] .
auto .
}
{
e x i s t s [ ( c , p0 ) ] .
auto .
}
}
{
exists [ ] .
auto .
}
}
}
{
exists [ ] .
auto .
}
}
144
APNDICE C. Demonstraes
74
exists
auto .
75
76
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
[].
77
78
145
}
{
unfold sublistBndListSeq .
e x i s t s classPathEq .
unfold analyzeSpecS .
unfold analyzeSpec .
d e s t r u c t ( indexSpec spec ) .
exists ( list_prod classes l ) .
split .
{
apply c l a s s P a t h E q E q u i .
}
{
unfold s u b l i s t .
destruct p .
destruct s .
destruct ( analyzeTravs l 0 ) .
{
i n d u c t i o n n0 .
{
intros .
unfold analyzeClassPaths .
simpl .
omega .
}
{
unfold analyzeClassPaths .
fold analyzeClassPaths .
d e s t r u c t ( a n a l y z e C l a s s P a t h s c l a s s e s l l 0 [ ] [ ( c l a s s , p ) ] n0 ) .
destruct o .
{
destruct l2 .
{
auto .
}
{
d e s t r u c t ( c o n t a i n s C l a s s P a t h l 1 p0 ) eqn : E1 .
{
auto .
}
{
d e s t r u c t ( c o n t a i n s C l a s s P a t h ( l i s t _ p r o d c l a s s e s l ) p0 ) eqn : E2 .
{
APNDICE C. Demonstraes
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
intros .
assert (
count c l a s s P a t h E q ( p0 : : l 1 ) e <=
count c l a s s P a t h E q ( l i s t _ p r o d c l a s s e s l ) e
).
{
simpl .
d e s t r u c t ( c l a s s P a t h E q e p0 ) eqn : E3 .
{
u n f o l d c o n t a i n s C l a s s P a t h in E1 .
u n f o l d c o u n t C l a s s P a t h in E1 .
d e s t r u c t ( count c l a s s P a t h E q l 1 p0 ) eqn : E4 .
{
pose proof classPathEqEqui .
u n f o l d e q u i in H.
d e s t r u c t H.
d e s t r u c t H0 .
assert (
count c l a s s P a t h E q l 1 e =
count c l a s s P a t h E q l 1 p0
).
{
apply sameCount .
auto .
auto .
}
r e w r i t e H2 .
r e w r i t e E4 .
assert (
count c l a s s P a t h E q ( l i s t _ p r o d c l a s s e s l ) e =
count c l a s s P a t h E q ( l i s t _ p r o d c l a s s e s l ) p0
).
{
apply sameCount .
auto .
auto .
}
r e w r i t e H3 .
u n f o l d c o n t a i n s C l a s s P a t h in E2 .
u n f o l d c o n t a i n s in E2 .
d e s t r u c t ( count c l a s s P a t h E q
( l i s t _ p r o d c l a s s e s l ) p0 ) eqn : E5 .
{
congruence .
}
{
omega .
146
APNDICE C. Demonstraes
147
168
}
{
169
170
u n f o l d c o n t a i n s in E1 .
d e s t r u c t ( count c l a s s P a t h E q l 1 p0 ) eqn : E6 .
{
congruence .
}
{
congruence .
}
171
172
173
174
175
176
177
178
179
}
{
180
181
auto .
182
183
}
d e s t r u c t p0 .
d e s t r u c t ( a n a l y z e P a t h c l a s s e s l 0 c p0 ) .
{
auto .
}
{
auto .
}
184
185
186
187
188
189
190
191
192
}
{
193
194
auto .
195
196
197
198
}
{
199
200
auto .
201
202
203
}
{
204
205
intros .
simpl .
omega .
206
207
208
209
210
}
212 Qed .
211
213
214
Theorem analyzeSpecS_t2 :
APNDICE C. Demonstraes
215
216
217
218
219
220
221
222
223
224
225
f o r a l l c l a s s e s c l a s s spec ,
convSeq ( a n a l y z e S p e c S c l a s s e s c l a s s s p e c ) .
Proof .
intros .
p o s e p r o o f analyzeSpecS_t1 .
s p e c i a l i z e H with c l a s s e s c l a s s s p e c .
d e s t r u c t H.
apply nonDecSublistBndListSeqConv .
auto .
auto .
Qed .
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
Theorem consNotEqual :
f o r a l l E ( l : l i s t E) ( e : E) , l <> e : : l .
Proof .
intros .
induction l .
{
discriminate .
}
{
injection .
intros .
d e s t r u c t IHl .
r e w r i t e < H1 .
auto .
}
Qed .
243
244
245
Definition analyzeSpecT c l a s s e s c l a s s s p e c n :=
l e t (_, t ) := a n a l y z e S p e c c l a s s e s c l a s s s p e c n in t .
246
247
248
249
250
251
252
Theorem analyzeSpecT_t1 :
f o r a l l c l a s s e s c l a s s spec ,
e x i s t s N,
d e c L i s t O p t i o n S e q ( s u f f S e q ( analyzeSpecT c l a s s e s c l a s s s p e c ) N ) .
Proof .
intros .
253
254
255
256
257
258
p o s e p r o o f analyzeSpecS_t2 .
s p e c i a l i z e H with c l a s s e s c l a s s s p e c .
u n f o l d convSeq in H.
d e s t r u c t H a s [N ] .
e x i s t s N.
259
260
261
unfold decListOptionSeq .
unfold suffListOption .
148
APNDICE C. Demonstraes
262
263
264
265
266
267
268
unfold
unfold
unfold
unfold
unfold
unfold
unfold
suffSeq .
analyzeSpecT .
analyzeSpec .
consSeq in H.
s u f f S e q in H.
a n a l y z e S p e c S in H.
a n a l y z e S p e c in H.
269
270
271
272
273
274
275
276
277
intros .
a s s e r t (N + ( S n ) = S (N + n ) ) .
{
omega .
}
r e w r i t e H0 .
s p e c i a l i z e H with n .
r e w r i t e H0 in H.
278
279
280
281
282
unfold analyzeClassPaths .
fold analyzeClassPaths .
u n f o l d a n a l y z e C l a s s P a t h s in H.
f o l d a n a l y z e C l a s s P a t h s in H.
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
d e s t r u c t ( indexSpec spec ) .
destruct p .
destruct s .
destruct ( analyzeTravs l 0 ) .
{
d e s t r u c t ( a n a l y z e C l a s s P a t h s c l a s s e s l l 0 [ ] [ ( c l a s s , p ) ] (N + n ) ) .
destruct o .
{
destruct l2 .
{
auto .
}
{
d e s t r u c t ( c o n t a i n s C l a s s P a t h l 1 p0 ) .
{
exists l2 .
e x i s t s p0 .
auto .
}
{
destruct ( containsClassPath ( list_prod c l a s s e s l ) ) .
{
d e s t r u c t p0 .
d e s t r u c t ( a n a l y z e P a t h c l a s s e s l 0 c p0 ) .
{
149
APNDICE C. Demonstraes
apply consNotEqual in H.
contradiction .
309
310
}
{
311
312
apply consNotEqual in H.
contradiction .
313
314
315
}
{
316
317
exists l2 .
e x i s t s p0 .
auto .
318
319
320
321
322
323
}
{
324
325
auto .
326
327
328
329
}
{
auto .
330
}
332 Qed .
331
333
334
335
336
337
338
339
340
341
342
343
344
Theorem analyzeSpecTLim :
f o r a l l c l a s s e s c l a s s spec ,
l i m ( analyzeSpecT c l a s s e s c l a s s s p e c ) None \/
l i m ( analyzeSpecT c l a s s e s c l a s s s p e c ) ( Some [ ] ) .
Proof .
intros .
p o s e p r o o f analyzeSpecT_t1 .
s p e c i a l i z e H with c l a s s e s c l a s s s p e c .
apply h a s D e c O p t i o n L i s t S u f f S e q L i m .
auto .
Qed .
345
346
347
348
349
350
351
352
353
354
355
Theorem analyzeSpecLim :
f o r a l l c l a s s e s c l a s s spec ,
e x i s t s N,
forall n,
l e t (_, t ) := a n a l y z e S p e c c l a s s e s c l a s s s p e c (N + n ) in
t = None \/ t = Some [ ] .
Proof .
intros .
p o s e p r o o f analyzeSpecTLim .
s p e c i a l i z e H with c l a s s e s c l a s s s p e c .
150
APNDICE C. Demonstraes
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
151
u n f o l d l i m in H.
u n f o l d s u f f S e q in H.
u n f o l d analyzeSpecT in H.
d e s t r u c t H.
{
d e s t r u c t H a s [N ] .
e x i s t s N.
intros .
s p e c i a l i z e H with n .
d e s t r u c t ( a n a l y z e S p e c c l a s s e s c l a s s s p e c (N + n ) ) .
auto .
}
{
d e s t r u c t H a s [N ] .
e x i s t s N.
intros .
s p e c i a l i z e H with n .
d e s t r u c t ( a n a l y z e S p e c c l a s s e s c l a s s s p e c (N + n ) ) .
auto .
}
Qed .
C.9 InterpretSpecFacts
1
S e t I m p l i c i t Arguments .
2
3
4
5
6
7
8
9
10
11
Require
Require
Require
Require
Require
Require
Require
Import
Import
Import
Import
Import
Import
Import
Lim .
Litoral .
LitoralFacts .
ListOptionSeq .
ListSeq .
Seq .
Sublist .
12
13
14
15
16
17
18
19
20
Theorem f i l t e r 2 _ t 1 :
f o r a l l p a t h s a l l O b j s ( s : l i s t OBJ) o b j s path ,
23
e x i s t s ( s : l i s t OBJ) ,
21
22
APNDICE C. Demonstraes
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
f i l t e r 2 S p a t h s a l l O b j s s o b j s path = s ++ s
/\ ( f o r a l l obj ,
count objEq s o b j = 0 \/
count objEq s o b j = 1 /\
c o n t a i n s objEq a l l O b j s o b j = t r u e /\
c o n t a i n s objEq s o b j = f a l s e )
/\ l e n g t h s = l e n g t h ( f i l t e r 2 R p a t h s a l l O b j s s o b j s path ) .
Proof .
intros .
induction objs .
{
exists [ ] .
auto .
}
{
unfold f i l t e r 2 S .
unfold f i l t e r 2 R .
unfold f i l t e r 2 .
fold f i l t e r 2 .
d e s t r u c t IHobjs .
u n f o l d f i l t e r 2 S in H.
u n f o l d f i l t e r 2 R in H.
d e s t r u c t ( f i l t e r 2 p a t h s a l l O b j s s o b j s path ) .
d e s t r u c t ( c o n t a i n s O b j a l l O b j s a ) eqn : E1 .
{
d e s t r u c t ( c o n t a i n s O b j l a ) eqn : E2 .
{
exists x.
auto .
}
{
d e s t r u c t H.
d e s t r u c t H0 .
r e w r i t e H.
exists (a : : x ).
split .
{
auto .
}
{
split .
{
simpl .
intros .
d e s t r u c t ( objEq o b j a ) eqn : E3 .
{
right .
152
APNDICE C. Demonstraes
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
s p e c i a l i z e H0 with o b j .
a s s e r t ( c o n t a i n s objEq a l l O b j s o b j = t r u e /\
c o n t a i n s objEq s o b j = f a l s e ) .
{
intros .
split .
{
r e w r i t e sameContains with ( e := a ) .
auto .
apply objEqEqui .
auto .
}
{
r e w r i t e H in E2 .
apply a p p C o n t a i n s F a l s e in E2 .
d e s t r u c t E2 .
r e w r i t e sameContains with ( e := a ) .
auto .
apply objEqEqui .
auto .
apply objEqEqui .
}
}
{
d e s t r u c t H0 .
{
auto .
}
{
r e w r i t e H in E2 .
apply a p p C o n t a i n s F a l s e in E2 .
d e s t r u c t E2 .
r e w r i t e sameContains with ( e := o b j ) in H3 .
apply c o n t a i n s F a l s e C o u n t Z e r o in H3 .
d e s t r u c t H0 .
congruence .
apply objEqEqui .
p o s e p r o o f objEqEqui .
d e s t r u c t H5 .
d e s t r u c t H6 .
u n f o l d symm in H6 .
s p e c i a l i z e H6 with a o b j .
r e w r i t e E3 in H6 .
auto .
apply objEqEqui .
}
}
153
APNDICE C. Demonstraes
}
{
118
119
auto .
120
121
}
{
122
123
simpl .
omega .
124
125
126
127
128
}
{
129
130
exists x.
auto .
131
132
133
}
135 Qed .
134
136
137
138
Definition i n t e r p r e t S p e c 2 S s p e c a l l O b j s o b j s n :=
l e t (_, s , _) := i n t e r p r e t S p e c 2 s p e c a l l O b j s o b j s n in s .
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
Theorem i n t e r p r e t S p e c 2 S _ t 1 :
f o r a l l spec allObjs objs ,
nonDecListSeq ( i n t e r p r e t S p e c 2 S s p e c a l l O b j s o b j s )
/\ s u b l i s t B n d L i s t S e q ( i n t e r p r e t S p e c 2 S s p e c a l l O b j s o b j s ) .
Proof .
intros .
split .
{
u n f o l d nonDecListSeq .
unfold interpretSpec2S .
unfold interpretSpec2 .
unfold interpretSpec .
unfold interpretObjsPaths .
fold interpretObjsPaths .
d e s t r u c t ( indexSpec spec ) .
destruct p .
destruct s .
intros .
d e s t r u c t ( i n t e r p r e t O b j s P a t h s f i l t e r 2 l l 0 a l l O b j s [ ] [ ( o b j s , p ) ] n0 ) .
d e s t r u c t p0 .
destruct o .
{
destruct l3 .
{
exists [ ] .
154
APNDICE C. Demonstraes
auto .
165
}
{
166
167
d e s t r u c t p0 .
d e s t r u c t ( f i l t e r 2 l a l l O b j s l 2 l 4 p0 ) eqn : E1 .
pose proof f i l t e r 2 _ t 1 .
s p e c i a l i z e H with l a l l O b j s l 2 l 4 p0 .
d e s t r u c t H.
d e s t r u c t H.
u n f o l d f i l t e r 2 S in H.
r e w r i t e E1 in H.
d e s t r u c t ( i n t e r p r e t P a t h l 0 a l l O b j s l 6 p0 ) .
{
exists x.
auto .
}
{
exists x.
auto .
}
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
}
{
186
187
exists
auto .
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
[].
}
{
unfold sublistBndListSeq .
e x i s t s objEq .
exists allObjs .
split .
{
apply objEqEqui .
}
{
induction n .
{
unfold s u b l i s t .
unfold interpretSpec2S .
unfold interpretSpec2 .
unfold interpretSpec .
d e s t r u c t ( indexSpec spec ) .
destruct p .
destruct s .
unfold interpretObjsPaths .
simpl .
155
APNDICE C. Demonstraes
intros .
omega .
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
156
}
{
u n f o l d i n t e r p r e t S p e c 2 S in IHn .
u n f o l d i n t e r p r e t S p e c 2 in IHn .
u n f o l d i n t e r p r e t S p e c in IHn .
unfold interpretSpec2S .
unfold interpretSpec2 .
unfold interpretSpec .
d e s t r u c t ( indexSpec spec ) .
destruct p .
destruct s .
unfold interpretObjsPaths .
fold interpretObjsPaths .
destruct ( interpretObjsPaths f i l t e r 2 l l 0 allObjs [ ] [ ( objs , p ) ] n ) .
d e s t r u c t p0 .
destruct o .
destruct l3 .
{
auto .
}
{
d e s t r u c t p0 .
d e s t r u c t ( f i l t e r 2 l a l l O b j s l 2 l 4 p0 ) eqn : E1 .
pose proof f i l t e r 2 _ t 1 .
s p e c i a l i z e H with l a l l O b j s l 2 l 4 p0 .
d e s t r u c t H.
d e s t r u c t H.
u n f o l d f i l t e r 2 S in H.
r e w r i t e E1 in H.
a s s e r t ( s u b l i s t objEq l 5 a l l O b j s ) .
{
u n f o l d s u b l i s t in IHn .
unfold s u b l i s t .
intros .
s p e c i a l i z e IHn with e .
r e w r i t e H.
r e w r i t e appCount .
d e s t r u c t H0 .
s p e c i a l i z e H0 with e .
d e s t r u c t H0 .
{
omega .
}
{
d e s t r u c t H0 .
APNDICE C. Demonstraes
d e s t r u c t H1 .
d e s t r u c t H2 .
apply containsTrueCountNotZero in H1 .
apply c o n t a i n s F a l s e C o u n t Z e r o in H2 .
omega .
259
260
261
262
263
264
}
d e s t r u c t ( i n t e r p r e t P a t h l 0 a l l O b j s l 6 p0 ) .
{
destruct l6 .
{
auto .
}
{
auto .
}
}
{
destruct l6 .
{
auto .
}
{
auto .
}
}
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
}
{
285
286
auto .
287
288
289
290
}
292 Qed .
291
293
294
295
296
297
298
299
300
301
302
303
304
305
Theorem i n t e r p r e t S p e c 2 S _ t 2 :
f o r a l l spec allObjs objs ,
convSeq ( i n t e r p r e t S p e c 2 S s p e c a l l O b j s o b j s ) .
Proof .
intros .
pose proof interpretSpec2S_t1 .
s p e c i a l i z e H with s p e c a l l O b j s o b j s .
d e s t r u c t H.
apply nonDecSublistBndListSeqConv .
auto .
auto .
Qed .
157
APNDICE C. Demonstraes
158
306
307
308
Definition i n t e r p r e t S p e c 2 T s p e c a l l O b j s o b j s n :=
l e t (_, _, t ) := i n t e r p r e t S p e c 2 s p e c a l l O b j s o b j s n in t .
309
310
311
312
313
314
315
Theorem i n t e r p r e t S p e c 2 T _ t 1 :
f o r a l l spec allObjs objs ,
e x i s t s N,
decListOptionSeq ( s u f f S e q ( interpretSpec2T spec a l l O b j s objs ) N) .
Proof .
intros .
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
unfold
unfold
unfold
unfold
unfold
unfold
unfold
unfold
unfold
unfold
unfold
decListOptionSeq .
suffListOption .
suffSeq .
interpretSpec2T .
interpretSpec2 .
interpretSpec .
consSeq in H.
s u f f S e q in H.
i n t e r p r e t S p e c 2 S in H.
i n t e r p r e t S p e c 2 in H.
i n t e r p r e t S p e c in H.
333
334
335
336
337
338
339
340
341
intros .
a s s e r t (N + ( S n ) = S (N + n ) ) .
{
omega .
}
r e w r i t e H0 .
s p e c i a l i z e H with n .
r e w r i t e H0 in H.
342
343
344
345
346
unfold interpretObjsPaths .
fold interpretObjsPaths .
u n f o l d i n t e r p r e t O b j s P a t h s in H.
f o l d i n t e r p r e t O b j s P a t h s in H.
347
348
349
350
351
352
destruct
destruct
destruct
destruct
destruct
( indexSpec spec ) .
p.
s.
( i n t e r p r e t O b j s P a t h s f i l t e r 2 l l 0 a l l O b j s [ ] [ ( o b j s , p ) ] (N + n ) ) .
p0 .
APNDICE C. Demonstraes
353
354
355
356
357
358
359
360
destruct o .
{
destruct l3 .
{
auto .
}
{
d e s t r u c t p0 .
361
362
363
364
365
366
367
368
pose proof f i l t e r 2 _ t 1 .
s p e c i a l i z e H1 with l a l l O b j s l 2 l 4 p0 .
u n f o l d f i l t e r 2 S in H1 .
u n f o l d f i l t e r 2 R in H1 .
d e s t r u c t H1 .
d e s t r u c t H1 .
d e s t r u c t H2 .
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
d e s t r u c t ( f i l t e r 2 l a l l O b j s l 2 l 4 p0 ) eqn : E1 .
d e s t r u c t ( i n t e r p r e t P a t h l 0 a l l O b j s l 6 p0 ) eqn : E2 .
{
a s s e r t ( l 5 = [ ] ++ l 5 ) .
{
auto .
}
r e w r i t e H4 in H1 .
r e w r i t e H in H1 .
apply app_inv_tail in H1 .
r e w r i t e < H1 in H3 .
s i m p l in H3 .
symmetry in H3 .
apply l e n g t h Z e r o E m p t y L i s t in H3 .
r e w r i t e H3 in E2 .
u n f o l d i n t e r p r e t P a t h in E2 .
i n j e c t i o n E2 .
intros .
r e w r i t e < H5 .
r e w r i t e app_nil_r .
exists l3 .
e x i s t s ( l 4 , p0 ) .
auto .
}
{
a s s e r t ( l 5 = [ ] ++ l 5 ) .
{
auto .
}
r e w r i t e H4 in H1 .
159
APNDICE C. Demonstraes
r e w r i t e H in H1 .
apply app_inv_tail in H1 .
r e w r i t e < H1 in H3 .
s i m p l in H3 .
symmetry in H3 .
apply l e n g t h Z e r o E m p t y L i s t in H3 .
r e w r i t e H3 in E2 .
u n f o l d i n t e r p r e t P a t h in E2 .
congruence .
400
401
402
403
404
405
406
407
408
409
410
411
412
}
{
auto .
413
414
415
}
Qed .
416
417
418
419
420
421
422
423
424
425
426
427
Theorem i n t e r p r e t S p e c 2 T _ t 2 :
f o r a l l spec allObjs objs ,
l i m ( i n t e r p r e t S p e c 2 T s p e c a l l O b j s o b j s ) None \/
l i m ( i n t e r p r e t S p e c 2 T s p e c a l l O b j s o b j s ) ( Some [ ] ) .
Proof .
intros .
pose proof interpretSpec2T_t1 .
s p e c i a l i z e H with s p e c a l l O b j s o b j s .
apply h a s D e c O p t i o n L i s t S u f f S e q L i m .
auto .
Qed .
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
Theorem i n t e r p r e t S p e c 2 L i m :
f o r a l l spec allObjs objs ,
e x i s t s N,
forall n,
l e t (_, _, t ) := i n t e r p r e t S p e c 2 s p e c a l l O b j s o b j s (N + n ) in
t = None \/ t = Some [ ] .
Proof .
intros .
pose proof interpretSpec2T_t2 .
s p e c i a l i z e H with s p e c a l l O b j s o b j s .
u n f o l d l i m in H.
u n f o l d s u f f S e q in H.
u n f o l d i n t e r p r e t S p e c 2 T in H.
d e s t r u c t H.
{
d e s t r u c t H a s [N ] .
e x i s t s N.
intros .
160
APNDICE C. Demonstraes
s p e c i a l i z e H with n .
d e s t r u c t ( i n t e r p r e t S p e c 2 s p e c a l l O b j s o b j s (N + n ) ) .
destruct p .
auto .
447
448
449
450
451
452
}
{
453
454
455
456
457
458
459
}
461 Qed .
460
d e s t r u c t H a s [N ] .
e x i s t s N.
intros .
s p e c i a l i z e H with n .
d e s t r u c t ( i n t e r p r e t S p e c 2 s p e c a l l O b j s o b j s (N + n ) ) .
destruct p .
auto .
161