6. Linear Temporal Logic (LTL)

Propaganda
Lógica Temporal
Addson A. Costa1, Silvio Romero A. Costa1, Luana Wandecy P. Silva2, Rosana
Caetano F. Monteiro2, Igor Linnik C. Araújo1, Marcos Aurélio C. Santos2
1
Departamento de Informática e Matemática Aplicada – Universidade Federal do Rio
Grande do Norte (UFRN)
Natal – RN – Brasil
2
Centro de Tecnologia – Universidade Federal do Rio Grande do Norte (UFRN)
Natal – RN – Brasil
{addcosta, silviorome, luanawandecy, marcos.acsantosrn,}@gmail.com,
[email protected], [email protected]
Resumo. Este trabalho apresenta um estudo detalhado sobre Lógica
Temporal. De forma geral, as lógicas temporais são lógicas não clássicas
interessadas em realizar inferências sobre a validade de proposições em um
mundo quadrimensional, por se preocupar com o espaço e tempo na qual as
proposições têm validade.
1. Introdução
Quando falamos em Lógica, num contexto de ciência, estamos, geralmente, nos
referindo à Lógica Formal, também chamada lógica clássica ou de Aristóteles. Nela, as
afirmações consideradas e estudadas - as proposições - são restritas àquelas passíveis de
receber um, e apenas um, entre dois valores-de-verdade: falso ou verdadeiro. Trata-se,
assim, de um sistema bivalente, embasado, primordialmente, em dois princípios: o da
não-contradição ("Uma proposição não pode ser falsa e verdadeira, simultaneamente.")
e o do terceiro excluído ("Uma proposição ou é falsa, ou é verdadeira, não havendo uma
terceira possibilidade.").
Além disso, a lógica formal é atemporal: as proposições são avaliadas
abstraindo-se o tempo e, como o próprio nome indica, apenas a forma com que elas
conectam-se entre si determina seu valor de verdade ou a validade de uma argumentação
da qual essas proposições façam parte.
Considerar o tempo em que se enuncia uma proposição ou negar algum dos
princípios da lógica formal pode conduzir a um outro sistema lógico coerente, ainda que
bem diferente do sistema formal, numa analogia perfeita com o que ocorre na relação
entre a geometria euclidiana e as geometrias não-euclidianas. As lógicas temporais são,
portanto, lógicas não clássicas por considerar o tempo.
2. Histórico
As lógicas temporais são estudos recentes, da década de 1960, para cá, nos quais se
destacam as propostas de dois autores, o filósofo americano Willard V. O. Quine (19082000) e o neo-zelandês Arthur N. Prior (1914-1969), este último, considerado o
fundador da lógica temporal.
Quine propõe que o discurso temporal seja representado dentro do aparato
clássico; na verdade, ele elimina o tempo verbal. Para isso, propôs a reescrita dos
argumentos informais em simbolismo formal, por meio de uma variável "t", que varia
entre épocas. Uma época é uma parcela do espaço-tempo, de qualquer duração - uma
"fatia" de um mundo quadridimensional, e dois acontecimentos são considerados
idênticos se e somente se possuem a mesma localização no espaço e no tempo.
Prior, em 1968, formulou uma lógica temporal para a linguagem natural. Para
sistematizar a representação de variação verbal, e a atribuição de valor de verdade às
sentenças, criou operadores temporais, que possibilitam a reescrita de uma sentença no
presente do indicativo numa do futuro do indicativo (operador F) ou numa do pretérito
(operador P).
3. Motivação
Sistemas de hardware e software são amplamente utilizados em aplicações onde falhas
são inaceitáveis, como comércio eletrônico, redes de telefonia, sistemas de controle de
tráfego aéreo, instrumentos cirúrgicos e muitos outros.
Em grande parte, nossas vidas dependem do funcionamento perfeito, contínuo e
ininterrupto destas aplicações. A detecção de erros no curso de operação delas pode ser
trágico. E mesmo em casos onde não haja risco de vida, desligá-las e substituir código
de funcionamento crítico é muitas vezes economicamente inviável, como é o caso de
sistemas reativos tais como sistemas de controle.
Para verificar erros em sistemas desse porte, a lógica surge como um meio capaz
de verificar a existência de erros na formalização do sistema, porém a lógica clássica
não abrange a possibilidade de verificar a validade de proposições em instantes do
tempo. Para que isso seja possível, torna-se necessário recorrer à lógica temporal.
A lógica Temporal, como o nome sugere se preocupa em analisar a validade de
fórmulas de acordo com momento da avaliação. Por exemplo, conhecendo o
comportamento de um sistema, existe alguma seqüência de estados no programa que
possa causar deadlock?
Sistemas reativos têm como características básicas estados e transições. Estado é
a descrição do sistema em um dado instante de tempo, ou seja, os valores associados as
suas variáveis naquele instante e transição é uma relação entre dois estados.
Tipicamente, as afirmações sobre o comportamento do sistema incluem as
propriedades de segurança, definindo o que deve sempre ser verdadeiro em um sistema
e um conjunto de propriedades de vivacidade (liveness), refletindo circunstâncias que
um sistema deve satisfazer. As propriedades a serem verificadas em um sistema reativo
são expressas como fórmulas, que especificam os comportamentos desejados.
Para facilitar o trabalho de verificação de propriedades em sistemas, a lógica
temporal formaliza um modelo e operadores capazes de distinguir o valor de uma
proposição em momentos do tempo, podendo então ser usada para verificar o
funcionamento de um sistema.
4. Estrutura de Kripke
Para que seja possível representar e analisar a validade de proposições no tempo, é
adotado como modelo de representação, uma máquina de estados finitos, onde cada
estado representa um intervalo do tempo e as relações entre os estados informam quais
são os possíveis próximos instantes de tempo. Deve existir no modelo também uma
função capaz de nomear cada estado e mapear quais são as proposições válidas para o
estado. O conjunto de estados, relação total entre os estados, estado inicial e uma função
capaz de mapear um conjunto de proposições válidas para cada estado é denominada de
estrutura de Kripke.
A estrutura de Kripke é usada para que a semântica da lógica temporal seja
padronizada. Desta forma as técnicas de especificação e verificação de propriedades
podem ser apresentadas independentemente do modelo formal adotado em uma
implementação. Formalmente, uma estrutura de Kripke é definida como sendo a tupla
(S, i , R, L), onde:
 S é um conjunto finito de estados;
 i є S é o estado inicial;
 R C S × S é uma relação de transição total, ou seja, que para todos os estados
s pertencentes ao conjunto S, existe no mínimo uma relação pertencente a R entre ele e
um outro estado s’ pertencente a S.
 L : S → P (P) é uma função que etiqueta cada estado com o conjunto de
fórmulas atômicas válidas nesse estado.
5. Fluxo do tempo
Na lógica temporal, o tempo não é mencionado explicitamente em termos de valores de
tempo ou intervalos de tempo, mas visto como possíveis seqüências de estados
associados às suas transições. Estado é a descrição do sistema em um dado instante de
tempo, ou seja, os valores associados às suas variáveis naquele instante. Transição é
uma relação entre dois estados. De maneira típica, as afirmações sobre o comportamento
do sistema em um determinado estado são feitas através de propriedades que devem ser
verificadas, e estas por sua vez são expressas como fórmulas de uma linguagem de
lógica temporal, que especificam os comportamentos desejados. A forma como é
representado esse tempo nas propriedades, isto é, de maneira linear ou ramificada, faz
com que haja dois modelos básicos de lógicas temporais: Linear Temporal Logic (LTL)
e Computation Tree Logic (CTL), respectivamente que serão detalhados mais adiante.
O tempo linear é aquele em que o comportamento do sistema consiste no
conjunto de traços infinitos que começam no estado inicial i. Já no tempo ramificado,
todo o comportamento do sistema é representado por uma árvore de computação de
profundidade ilimitada cuja raiz é o estado inicial i. Ambos os modelos podem ser
calculados a partir de estrutura de Kripke, no entanto, o segundo modelo ( tempo
ramificado ) nos permite ter mais informações sobre o sistema em questão. Veja os
exemplos abaixo:
Figura 1. Exemplo de tempo linear.
Figure 2. Exemplo de tempo ramificado
6. Linear Temporal Logic (LTL)
LTL é uma lógica temporal de tempo linear que interpreta fórmulas sobre
funcionamentos do sistema, e faz a caracterização de cada caminho linear
proporcionado pelas máquinas de estados finitos. A lógica LTL considera que há
somente um único estado sucessor, ou seja, um único futuro possível, a cada momento
do tempo. As fórmulas LTL são avaliadas sobre caminhos lineares, e uma fórmula
somente é considerada verdadeira em um modelo se ela é verdadeira para todos os
caminhos iniciando num dos estados iniciais daquele modelo.
6.1. Sintaxe
Uma fórmula LTL sintaticamente válida é formada pelas variáveis proposicionais p1,
p2, (...), os conectivos usuais da lógica proposicional (, , ,  ), e os seguintes
operadores temporais:
Next: X  -  é verdadeiro no próximo estado;
Future: F  -  é eventualmente válida (em algum estado do caminho);
Globally: G  -  é sempre válida (em todo estado no caminho);
Until:  U  -  é verdadeira no caminho até que  seja verdadeira;
Release:  R  - quando a ocorrência de um estado onde  é válida liberta  de o
ser;
Exists: E  -  é verdadeiro num caminho S se existe um caminho começando
em um estado S
All: A  -  é verdadeiro para todo caminho começando no estado S.
Os conectivos X, F e G são usados através dos símbolos , , ,
respectivamente.
6.2. Caminho
Um caminho em M é uma sequência infinita de estados S0, S1, S2,..., tal que S0 ∈ I E ( SI,
SI+1 ∈ R PARA TODO I ≥ 0). Ou seja, é uma seqüência infinita de estados que representa
uma possível execução do sistema a partir do seu estado inicial.
6.3. Semântica
Sejam p ∈ AP uma proposição atômica, σ caminho infinito e φ, ψ fórmulas LTL, a
relação “satisfaz”, denotada por |=, é definida por:
σ |= p
⇔
p ∈ Label(σ[0])
σ |= ¬φ
σ |= φ ∧ ψ
⇔
⇔
not(σ |= φ)
(σ |= φ) and (σ |= ψ)
σ |=Xφ
⇔ σ 1 |= φ
σ |= φUψ
⇔ ∃j ≥ 0, (σ j |= ψ and(∀0 ≤ k < j, σ k |= φ))
Figura 3. Exemplo de lógica temporal linear.
6.4. Padrões
Usados para exprimir requisitos de existência ou ausência de determinadas condições
(padrões) em períodos bem definidos da execução. Os períodos especificam o contexto
da ocorrência do padrão e correspondem a segmentos dos caminhos delimitados por
certos eventos.
Os padrões mais freqüentes são:
 Ausência: quando no contexto se pretende que não ocorram certos eventos ou
estados.
 Universalidade: quando se pretende que em todo o contexto certa propriedade
se verifique.
 Existência: quando se pretende que uma propriedade ocorra alguma vez no
contexto.
 Resposta: dentro do contexto a ocorrência de certo evento (causa) deve ser
seguida da ocorrência de outro (efeito).
6.5. Axiomas
Com a adição de novos conectores temporais, novos axiomas foram acrescentados
também. São eles:
 Leis de distribuitividade
X (  )  X   X 
X (  )  X   X 
X   X 
F (  )  F   F 
F   G 
G(  )  G   G 
G   F 
(  ) U   ( U )  ( U )
 U (  )  ( U )  ( U )
 Leis de idempotência
FF   F 
GG   G 
FGF   GF 
GFG   FG 
 U ( U )   U 
 Leis de expansão
F     XF 
G    XG 
 U     (  X ( U ))
6.6. Verificação de modelos usando LTL
Dado um modelo M formalmente representado pela estrutura de Kripke M = ( S, I, R,
Label) e uma fórmula LTL φ:
M |= φ se e somente se ∀s ∈ I, (∀ Caminhos(s), σ |= φ)
Na Lógica LTL a validação das propriedades pode ser formulada através de um
autômato de Buchi, mas devido a complexidade deste autômato, geralmente se nega a
propriedade a provar e verifica se a mesma é verdadeira ou falsa.
7. CTL* - Full Computation Tree Logic
A lógica LTL – Linear Temporal Logic, considera a existência de apenas um estado
sucessor, um único estado futuro possível a cada instante de tempo. Com o intuito de
retirar essa “restrição”, em meados dos anos 80, Clarke e Emerson propuseram uma
lógica capaz de considerar diferentes futuros possíveis, utilizando a idéia de tempo
ramificado. Quantificam-se todas as possibilidades de execução de um programa através
da noção de caminhos que existem no espaço dos estados do sistema. Daí em diante,
pode-se avaliar as propriedades em relação a alguma execução ou em relação a todas as
execuções. Essa lógica é utilizada em vários verificadores de modelos.
Utilizando esta lógica verifica-se ser possível descrever a evolução de uma
máquina de estados finita como uma árvore infinita, onde todos os nós são estados da
MEF e as arestas correspondem às transições entre os estados. É possível, também,
expressar propriedades que devem ser satisfeitas para todos os caminhos iniciando em
um estado, assim como propriedades que devem ser satisfeitas apenas para alguns dos
caminhos. A Full Computation Tree Logic descreve propriedades de árvores de
computações que são obtidas a partir de um estado através do desdobramento de uma
estrutura de Kripke em uma árvore de computação infinita.
A linguagem da CTL* é composta pelas fórmulas de Estados (ФS) e pelas
fórmulas de Caminhos (ФP), acrescentando à LTL os quantificadores de caminho A
(universal) e E (existencial).
As fórmulas de Estados ФS descrevem propriedades que são avaliadas sobre
estados:
Eα – é verdadeira em um estado s se existe um caminho começando em s tal que
α é verdadeira neste caminho;
Aα – é verdadeira em um estado s se para todo um caminho começando em s, α é
verdadeira neste caminho.
As fórmulas de caminhos ФP descrevem propriedades que são avaliadas sobre
caminhos. Tem como operadores: X, F, G e U.
α
Figura 4. Exemplo, Xα
é verdadeira em um caminho π, se no próximo
estado do caminho α é verdadeira
α
Figura 5. Exemplo, Fα
é verdadeira em um caminho π, se em algum estado
no caminho α é verdadeira
α
α
Figura 6. Exemplo, Gα
α
α
é verdadeira em um caminho π, se em todo estado no
caminho α é verdadeira
α
α
β
Figura 7. Exemplo, αUβ
é verdadeira em um caminho π, se α é verdadeira
no caminho até que β seja verdadeira
A definição da Liguagem de CTL*: Sejam П um conjunto de letras
proposicionais e P ∈ П uma letra proposicional. A linguagem de CTL* é gerada pela
seguinte BNF:
ФS ::= P | (¬ФS) | (ФS ∧ ФS) | (ФS ∨ ФS) | (ФS → ФS) | (EФP) | (AФP)
ФP ::= ФS | (¬ФP) | (ФP ∧ ФP) | (ФP ∨ ФP) | (ФP → ФP) | (XФP) | (FФP) | (GФP) |
(ФP U ФP)
A semântica da CTL* é dada pela definição de satisfação ⊨ de CTL, que é dada
em duas partes:
Seja α uma fórmula de estado da linguagem Фs, escrevemos K ⊨s α para dizer
que a fórmula α é satisfeita na estrutura K no estado s.
Seja α uma fórmula de caminho da linguagem Фp, escrevemos K ⊨π α para dizer
que a fórmula α é satisfeita na estrutura K no caminho s.
Satisfação em Estado: Semântica de CTL*
K ⊨s P ⇔ P ∈ L(s)
K ⊨s (¬α) ⇔ NOT K ⊨s α
K ⊨s (α ∧ β) ⇔ K ⊨s α E K ⊨s β
K ⊨s (α ∨ β) ⇔ K ⊨s α OU K ⊨s β
K ⊨s (α → β) ⇔ SE K ⊨s α ENTÃO K ⊨s β
K ⊨s (Eα) ⇔ Existe um caminho π a partir de s tal que K ⊨π α
K ⊨s (Aα) ⇔ Para todo caminho π a partir de s vale que K ⊨π α
Satisfação em Caminho: Semântica de CTL*
K ⊨π α ⇔ se α é uma fórmula da linguagem Фs, K ⊨π0 α
K ⊨π (¬α) ⇔ NOT K ⊨π α
K ⊨π (α ∧ β) ⇔ K ⊨π α E K ⊨π β
K ⊨π (α ∨ β) ⇔ K ⊨π α OU K ⊨π β
K ⊨s (α → β) ⇔ SE K ⊨π α ENTÃO K ⊨π β
K ⊨π (Xα) ⇔ K ⊨π1,∞ α
K ⊨π (Fα) ⇔ Existe um k ≥ 0 tal que K ⊨πk,∞ α
K ⊨π (Gα) ⇔ Para todo k ≥ 0 vale que K ⊨πk,∞ α
K ⊨π (αUβ) ⇔ Existe k ≥ 0 tal que K ⊨πk,∞ β e para todo 0 ≤ l < k vale que K
⊨πl,∞ α
A Computation Tree Logic é um subconjunto da Full Computation Tree Logic,
onde um operador temporal tem que ser imediatamente precedido por um quantificador
de caminho. Sua semântica e seus operadores são definidos de forma idêntica à lógica
CTL*.
Linguagem de CTL:
[EX]α – existe um caminho tal que no próximo estado vale α
[AX]α – para todo caminho no próximo estado vale α
[EF]α – existe um caminho tal que no futuro vale α
[AF]α – para todo caminho no futuro vale α
[EG]α – existe um caminho tal que sempre vale α
[AG]α – para todo caminho vale sempre α
E(αUβ) – existe um caminho tal que vale α até que vale β
A(αUβ) – para todo caminho vale α até que vale β
Esta lógica possui um mecanismo de verificação de modelos muito eficiente.
8. Expressividade
8.1. LTL x CTL
Existe uma discussão sobre a melhor lógica para expressar propriedades, LTL ou CTL.
Contudo, as propriedades usualmente utilizadas na verificação de tais sistemas podem
ser expressas nas duas lógicas. Propriedades podem ser descritas em uma lógica e não
podem na outra, e vice-versa. Por exemplo, a invertibilidade apenas pode ser expressa
em CTL: (AG EF i). Propriedades existenciais não podem ser expressas na lógica LTL.
Este tipo de propriedade é muito útil na procura de possíveis deadlocks em um sistema.
Já a lógica CTL, não é capaz de expressar algumas propriedades de razoabilidade
(fairness). A maior parte das propriedades pode ser expressa quer em CTL quer em
LTL.
“AG p vs G p” e “AG (p ⊃ AF q) vs G (p ⊃ F q)”. Cada uma destas lógicas é
usada em situações diferentes, pois o uso de uma lógica ou da outra depende do tipo de
propriedade que se quer verificar.
A propriedade AF AX p também não pode ser expressa em LTL com semântica
equivalente. Esta propriedade distingue as duas estruturas de Kripke seguintes, enquanto
que a propriedade FX p é válida em ambas.
Figura 8. Estruturas.
Embora uma árvore de computação inclua todos os possíveis traços de uma
estrutura de Kripke, a forma como a semântica está definida faz com que haja
propriedades que apenas podem ser expressas em LTL.
O quantificador existencial (E) foi incluso na lógica CTL, mas isso não faz com
que a mesma tenha um poder de expressividade maior do que a lógica LTL. Inclusive o
poder de expressividade da lógica LTL não é um subconjunto do poder de
expressividade da lógica CTL. As expressividades de LTL e CTL são incomparáveis.
Figura 9. Relação entre as lógicas LTL e CTL
9. Aplicações
A principal aplicação da lógica temporal é na formalização de sentenças envolvendo o
tempo em linguagens naturais, como o português ou inglês, por exemplo. Na lógica de
predicados não é possível a formalização de sentenças temporais em linguagens
naturais.
Aplicações de lógica temporal incluem a sua utilização como ferramenta para
esclarecer questões filosóficas a respeito do tempo, bem como um quadro dentro do qual
se pode definir a semântica de expressões temporais das linguagens naturais. Utilizamse também como um modo de codificar os conhecimentos temporais em inteligência
artificial e como um instrumento para a manipulação os aspectos temporais da
execução de programas de computador.
A lógica temporal vem desempenhando importante papel nos sistemas de
segurança crítica, que são aqueles sistemas onde o tempo é essencial e uma única falha
pode provocar a morte de pessoas. A lógica Temporal permite a verificação da corretude
desses sistemas. Alguns exemplos desses sistemas são:
. Sistema de controle de uma aeronave;
. Sistema de controle de uma usina nuclear;
. Sistema de controle de tráfego.
Em sistemas críticos de comercialização, onde um erro pode causar grandes
prejuízos aos produtores ou consumidores, a lógica temporal também desempenha papel
importante ao permitir a verificação desses sistemas. Como um exemplo, a produção em
massa de produtos eletrônicos.
10. Verificação de modelos
Existem várias formas de verificar a corretude de sistemas, as principais são Simulação,
testes, verificação Dedutiva (Prova Matemática) e verificação de modelos. Neste
trabalho abordaremos a verificação de modelos.
Verificação de modelos é uma técnica automática para a verificação de sistemas
concorrentes com número finito de estados, mas para que a verificação possa ser feita
deve existir um verificador capaz de verificar se um modelo satisfaz um conjunto de
propriedades desejadas especificadas pelo usuário. Essas propriedades podem ser
definidas utilizando-se duas lógicas temporais: Lógica de Árvore de Computação, ou
Computation Tree Logic (CTL); e Lógica Temporal Linear, ou Linear Temporal Logic
(LTL).
Tais lógicas se referem à noção de seqüências de estados, e não precisamente a
valores ou intervalos de tempo, pois se deseja tratar de comportamentos de sistemas
não-determinísticos que envolvem diferentes caminhos. Isto é, cada estado pode ter
vários sucessores em termos de ramificação ou o comportamento é dado por um
conjunto de caminhos que são lineares.
O processo para verificar se um modelo está correto é baseado em uma busca
exaustiva percorrendo todo o espaço de estados para determinar se uma resposta é
verdadeira ou falsa, mas apesar disso, a implementação é feita com algoritmos de
eficiência razoável, podendo ser executada em computadores de potencial moderado e é
automática em quase toda sua totalidade. Um exemplo de forma de um verificador é um
autômato.
Exemplos de implementações de verificação de modelos:
 SMV: Symbolic Model Verifier
 SMVNu: software livre
 SPIN
 UPPAAL: trata de tempo-real
 HYTECH: autômatos híbridos
 PRISM: autômatos estocásticos
11. Conclusão
A lógica temporal é adequada para modelar expressões lógicas envolvendo o
tempo. Na lógica temporal, um modelo bem definido é usado, o modelo de Kripke onde
é possível fazer inferências sobre a validade de proposições no passado ou futuro.
Referências
http://pt.wikipedia.org/wiki/L%C3%B3gica_modal
http://poesiagnosticaefilosofia.blogspot.com/2006/05/lgica-temporal-algo-descartavelfrente_12.html
http://www.inst-informatica.pt/cgi-bin/koha/opacsearch.pl?op=do_search&marclist=bibliosubject.subject&and_or=and&operator=con
tains&value=L%C3%93GICA%20TEMPORAL
http://www.inst-informatica.pt/cgi-bin/koha/opacsearch.pl?op=do_search&marclist=bibliosubject.subject&and_or=and&operator=con
tains&value=L%C3%93GICA%20TEMPORAL
http://es.wikipedia.org/wiki/L%C3%B3gica_temporal
http://pt.wikipedia.org/w/index.php?title=Especial%3ABusca&search=l%C3%B3gica+
n%C3%A3o+cl%C3%A1ssica&go=Ir
http://pt.wikipedia.org/wiki/L%C3%B3gica_proposicional
http://pt.wikipedia.org/wiki/Regra_de_infer%C3%AAncia
http://pt.wikipedia.org/wiki/Intelig%C3%AAncia_artificial
http://en.wikipedia.org/wiki/Temporal_logic
http://plato.stanford.edu/entries/logic-temporal/
http://www.geocities.com/logicfuzby/index.htm
http://www.geocities.com/logicas2000/Outras.html
http://pt.wikibooks.org/wiki/L%C3%B3gica:_L%C3%B3gicas_N%C3%A3ocl%C3%A1ssicas:_Introdu%C3%A7%C3%A3o
http://books.google.com.br/books?id=ZFY3S8iinfMC&pg=PA2842&lpg=PA2842&dq
=l%C3%B3gica+temporal&source=bl&ots=MomERmQf3j&sig=_bbRg7A7GNx8Tr
8tZkvQNAgBXkQ&hl=ptBR&ei=HGB3SqCbMcmptgfVgc2WCQ&sa=X&oi=book_result&ct=result&resnum
=9#v=onepage&q=l%C3%B3gica%20temporal&f=false
http://www.itl.nist.gov/div897/sqg/dads/HTML/temporllogic.html
http://lat.inf.tu-dresden.de/teaching/ss2006/tl/
http://books.google.com.br/books?id=ghy2CMU2FIoC&pg=PA995&lpg=PA995&dq=E.+
Allen+Emerson:+Temporal+and+Modal+Logic.+In+J.+van+Leeuwen&source=bl&ots=
5dMvWy4Aih&sig=XyaR2rJ-KHN7C4pTcbGgRioOM5o&hl=pt-BR&ei=Rox4SuBLYajtgfFh92WCQ&sa=X&oi=book_result&ct=result&resnum=1#v=onepage&q=&f=
false
Download