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