LÓGICA E PROVA

RAUL H.C.LOPES

1. Introdução

As provas listadas nestas notas e em outras presentadas ao longo do curso baseiam-se no formalismo equacional^{1} para a lógica clássica, usada também em [2]. Algumas dessas regras são apresentadas abaixo. Você pode usar os sistemas de prova, como Dedução Natural ou Sequent Calculus, ou sistema de Hilbert. O importante é que use um sistema de forma coerente e apresente referência para as fontes de suas regras para que não restem dúvidas sobre quaisquer passos de suas provas.

Notação 1. O símbolo =^{△} é usado para introduzir nomes como abreviações de fórmulas, ou seja, introduzir nomes/símbolos via definiçãológica. Por exemplo,

P =^{△} 0 ≤ k ≤ m ∧ S = (+i : 0 ≤ i < k : v.i)

introduz o símbolo P como nome para a fórmula

0 ≤ k ≤ m ∧ S = (+i : 0 ≤ i < k : v.i)

Notação 2. A definição indutiva do conjunto de fórmulas da lógica clássica pode ser encontrada em textos como [2] ou [3]. Vale notar que serão usados:

• (¬p): negação de p.

• (p ∧ q): conjunção de p e q.

• (p ∨ q): disjunção de p e q.

• (p ⇒ q): p implica q.

• (p = q): equivalência lógica.

• (∀x : P x : Qx): quantificação universal: para todo x, satisfazendo (P x), (Qx) vale.

• (∃x : P x : Qx): quantificação existêncial: existe algum x, satisfazendo (P x), tal que (Qx) vale.

Notação 3. Como é usual em textos de teoria da prova, o símbolo ⊢ é usado para denotar uma relação de conseqüência lógica ou dedutibilidade. Assim • Γ ⊢ α denota que, da conjunção das premissas contidas em Γ,

1 Veja a página de David Gries para uma introdução a equational logic.

α pode ser provada.

• ⊢ α denota que α é um teorema da lógica.

Notação 4. As seguintes regras, essencialmente retiradas de [1] e usadas tanto por Curry ^{2} quanto por Church, poderão ser usadas para reduzir o número de parêntesis usados em expressões aritméticas e lógicas.

• operadores aritméticos são mais fortes do que operadores rela-

cionais. Assim

1 + 2 = 3

obviamente é uma abreviação de

(1 + 2) = 3

• dentre os operadores relacionais, negação é o mais forte, seguido de conjunção e disjunção e, por último, implicação e igualdade.

• ponto (.) e dois pontos (:) podem ser usados como marcadores para reduzir a número de parêntesis. Fim e início de expressão são marcadores com zero pontos. As regras básicas para seu uso neste texto são:

(1) um marcador com mais pontos tem mais força do que um marcador com menos pontos.

rev.xˆ ˆ ˆ ˆ ˆˆ y :=: revyˆ ˆ ˆ ˆ ˆˆ x

abrevia

(rev(xˆ ˆ ˆ ˆ ˆˆ y)) = (rev(yˆ ˆ ˆ ˆ ˆˆ x))

(2) um marcador à esquerda de um operador delimita uma expressão que se estende para a esquerda até um marcador de mais alta prioridade.

x + f.y

abrevia

x + f(y)

(3) um marcador à direita de um operador delimita uma expressão que se estende para a direita até um marcador de mais alta prioridade.

(4) a expressão delimitada por um marcador respeita os tipos da expressão envolvida.

rev.⊥ = ⊥

2Aliás, se você tem interesse sério em Ciência da Computação, cedo ou tarde deveria ler [1].

abrevia

rev(⊥) = ⊥

e não

rev(⊥ = ⊥)

que violaria o fato de rev mapeia seqüências para seqüências.

(5) um ponto amarrado a um operador relacional tem mais força do que um ponto ligado operador funcional.

rev.x .=. rev.y

abrevia

rev(x) = rev(y)

(6) um marcador mais à esquerda tem mais prioridade do que um marcador mais á direita.

p ⇒. q ⇒. r ⇒ s

abrevia

p ⇒ (q ⇒ (⇒ s)

IMPORTANTE: Estas notas não substituem o conhecimento que você adquiriu na disciplina de Noções de lógica.

Definição 1. A seguir são apresentados teoremas da lógica de primeira ordem que são usados em diversas provas ao longo deste documento. Note que:

• Equivalência lógica de duas proposições é representada pela igualdade das mesmas^{3} escrevendo

p = q

é usado em lugar de

p ≡ q

• Regras de inferência são freqüentemente introduzidas usando a notação:

\frac{Γ_{0} ⊢ α_{1}, Γ_{1} ⊢ α_{1}}{Λ ⊢ β}

que abrevia o raciocínio: se Γ_{0} é um conjunto de hipóteses apartir do qual se pode provar α_{0} e Γ_{1} é outro conjunto de hipóteses do qual se pode provar α_{1}, então do conjunto de hipóteses Λ é possível provar (deduzir) β.

3 Textos clássicos de lógica, por exemplo [3], preferem o uso de um símbolo distinto, no caso (≡) para representar equivalência lógica. Essa também é tendência seguida por [2]. É interessante notar, no entanto, que este último texto liga os sucessivos passos de uma prova, que são equivalências lógicas, usando igualdade.

Por isso, eu prefiro seguir a tradição da lógica de alta ordem e tratar equivalência como igualdade de proposições.

Para exemplo mais concreto, observe a seguinte a regra, apresentada como Introdução da Conjunção no sistema de Dedução Natural.

\frac{⊢ p, ⊢ q}{⊢ p ∧ q}

que diz que

– se p é um teorema da lógica e q é um teorema da lógica, então (p ∧ q) é um teorema da lógica;

– ou, lendo de baixo para cima, para provar que (p ∧ q) é verdadeiro (ou seja, ⊢ (p ∧ q)), prove que p é verdadeiro (ou seja, ⊢ p) e prove que q é verdadeiro (ou seja, ⊢ q).

2. Lógica via igualdade

Nesta seção, são introduzidos os axiomas da formalização da lógica clásica usada por Dijkstra, Scholten e outros a partir dos anos 1980 e que se caracteriza por uma apresentação de provas baseada em igualdade, implicação e transitividade das mesmas e de relações da aritmética. O sistema formal chamado de lógica E é introduzido e detalhado nos capítulos 4 e 5 de [2].

Na apresentação das regras e axiomas da lógica valem:

• p, q, r denotam fórmulas da lógica: termos de tipo (valor) booleano;

• a, b, c, x, y, z denotam termos arbitrários.

2.1. Axiomas e regras de inferência. Os axiomas estabelecem as propriedades fundamentais de igualdade e dos valores lógicos: true e false.

• \frac{⊢ p}{⊢ p[x := E]}⟨substituição⟩

• \frac{⊢ a = b}{⊢ E[x := a] = E[x := b]}⟨Leibniz⟩

• ⊢ x = y⟨reflexividade(=)⟩

• \frac{⊢ x = y}{⊢ y = x}⟨simetria(=)⟩

• \frac{⊢ x = y, ⊢ y = z}{⊢ x = z} transitividade(=)

• \frac{⊢ p, ⊢ p = q}{⊢ q} ⟨equanimidade⟩

• ⊢ (p = q) = r .=. p = (q = r)⟨associatividade(=)⟩ • ⊢ p = q = q = p⟨simetria(=)⟩

A simetria da igualdade de proposições permite, pelo axioma da associatividade, deduzir

⊢ ((p = q) = q) = p

e também

⊢ p = (q = (q = p))

• ⊢ true = q = q⟨identidade(=)⟩

• ⊢ false = ¬true⟨definição(false)⟩

• ⊢ ¬(p = q) = (¬p = q)⟨distributividade(¬, =)⟩

Exercício 1. Prove os seguiintes teoremas usando apenas os axiomas já apresentados.

(1) ⊢ true

(2) ⊢ ¬p = q .=. p = ¬q

(3) ⊢ ¬¬p = p

(4) ⊢ ¬p = p = false

Os axiomas a seguir definem as constantes lógica ∨ e ∧. • ⊢ (p ∨ q) ∨ r .=. p ∨ (q ∨ r)⟨associatividade(∨)⟩

• ⊢ (p ∨ q) = (q ∨ p)⟨simetria(∨)⟩

• ⊢ p ∨ (q = r) .=. (p ∨ q) = (p ∨ r)⟨distributividade(∨, =)⟩ • ⊢ p ∨ p = p⟨idempotente(∨)⟩

• ⊢ p ∨ ¬p⟨Excluded Middle⟩

• ⊢ p ∧ q = p = q = p ∨ q⟨Golden Rule⟩

Exercício 2. Prove os seguintes teoremas, usando apenas os axiomas já apresentados.

(1) ⊢ p ∨ true = true⟨Zero(∨)⟩

(2) ⊢ p ∨ false = p⟨identidade(∨)⟩

(3) ⊢ p ∨ (q ∨ r) = (p ∨ q) ∨ (p ∨ r)⟨lrdist(∨, ∨)⟩

(4) ⊢ p ∨ q = p ∨ ¬q = p

(5) ⊢ p ∧ ¬p = false

Exercício 3. Define e prove as seguintes para a conjunção: simetria, associatividade, idempotência, identidade, zero, distributividade de: ∧ sobre ∧, ∧ sobre ∨e ∨sobre ∧.

Exercício 4. Prove as seguintes leis, usando as regras já apresentadas. (1) ⊢ ¬(p ∧ q) = ¬p∨ ≠ q

(2) ⊢ p = q .=. (p ∧ q) ∨ (¬p ∧ q)

(3) ⊢ p = q ∧ (r = p) .=. (p = q) ∧ (r = q)

Os axiomas a seguir definem implicação(⇒).

• ⊢ p ⇒ q = p ∨ q = q⟨definição(⇒)⟩

• ⊢ (q ⇐ p) = (p ⇒ q)⟨Conseqüência⟩

• ⊢ p ⇒ q = ¬p ∨ q⟨lrdef(⇒)⟩

• ⊢ p ⇒ q = ¬q ⇒ p⟨Contrapositiva⟩

Exercício 5. Prove os seguintes teoremas sobre implicação, freqüentemente usados no processo de prova.

(1) ⊢ p ⇒ (q ⇒ r) .=. (p ⇒ q) ⇒ (p ⇒ r)

(2) ⊢ p ⇒ (q = r) .=. (p ⇒ q) = (p ⇒ r)

(3) ⊢ p ∧ q ⇒ r .p. ⇒ (q ⇒ r)

(4) ⊢ p ⇒ false .= ¬p

(5) ⊢ false ⇒ p .= true

Exercício 6. Define e prove sobre sobre reflexividade, transitividade, antissimetria, identidade e zero à direita da implicação.

Exercício 7. Os teoremas a seguir são muito usados no desenvolvimento de provas em geral. Prove-sos.

(1) ⊢ p ⇒ p ∨ q⟨Weakening⟩

(2) ⊢ p ∧ q ⇒ p⟨Weakening⟩

(3) ⊢ p ∧ q ⇒ p ∨ q⟨Weakening⟩

(4) ⊢ p ∨ (q ∧ r) ⇒ p ∨ q⟨Weakening⟩

(5) ⊢ p ∧ q ⇒ p ∧ (q ∨ r)⟨Weakening⟩

(6) ⊢ p ∧ (p ⇒ q) ⇒ q⟨Modus Ponens⟩

(7) ⊢ (p ⇒ r) ∧ (¬ ⇒ r) = r⟨Análise de caso⟩

(8) ⊢ (p ⇒ r) ∧ (q ⇒ r) = (p ∨ q ⇒ r)

(9) ⊢ (p ⇒ q) ∧ (q ⇒ p) = p = q

(10) ⊢ (p ⇒ q) ⇒ (p ∨ q ⇒ q ∨ r)⟨Monotonicidade(∧)⟩

(11) ⊢ (p ⇒ q) ⇒ (p ∧ r ⇒ q ∧ r)⟨Monotonicidade(∧)⟩

(12) ⊢ ¬(p ∨ q) = ¬p ∧ ¬q

3. Dedução Natural

Uma alternativa para sistemas de prova com um número elevado de axiomas como o que foi apresentado na seção anterior é o sistema de dedução natural, inventado por Gentzen [4]. Neste sistema, os axiomas válidos são introduzidos através de regras de inferência que estabelecem o significado das constantes lógicas.

Exercício 8. Use as regras de inferência do sistema de dedução natural, apresentadas em aula, e prove os teoremas da seção 2.

4. Conclusão?

Estas notas representam um rascunho inicial de um curso de uso de lógica para prova de propriedades de programas. Elas são necessariamente incompletas e precisam de muitas correções e adições em termos de:

• novos exemplos;

• novos exercícios;

• validações usando algum assistente de prova. Agradeço contribuições nesse sentido.

Referências

1. Haskell B. Curry, Foundations of mathematical logic, Dover Publications, Inc., 1977.

2. David Gries and Fred B.Schneider, A logical approach to discrete mathematics, Springer-Verlag, 1993.

3. Stephen Cole Kleene, Introduction to metamathematics, North-Holland Publishing CO., 1964.

4. M. Szabo (ed.), The collected papers of Gerhard Gentzen, North-Holland, Amsterdam, 1969.