Lógica e Computação
A Lógica proporciona um enquadramento formal para descrever e analizar com rigor um determinado assunto.
O objetivo principal deste texto é apresentar a Lógica como uma ferramenta para a descrição e análise de sistemas informáticos.
Sintaxe e Semântica
Por formal entende-se o tipo de regras, por exemplo, da aritmética ou da sintaxe de programas. Uma expressão aritmética como tem uma estrutura que segue um conjunto de definições sintáticas, que determinam o que pode ser escrito.
- Por exemplo é uma expressão incorreta porque não respeita as definições habituais das expressões aritméticas (porém segue a reversed polish notation).
Por outro lado, o valor resulta de definições semânticas. Por exemplo
- A igualdade diz que as expressões e têm o mesmo valor.
- As expressões e são diferentes, porque começam por símbolos diferentes, e .
- Mas ambas definem o mesmo valor.
- Outras igualdades deste tipo, como ou permitem deduzir, por fim, que .
- As definições sintáticas especificam o que pode ser escrito, ie as expressões corretas.
- As definições semânticas definem o valor das expressões corretas.
Dedução
Também interessa a noção de dedução: quais são as conclusões de hipóteses dadas?
Em termos práticos:
- Quais são as consequências de certas ações?
- Se qual o valor de ?
- Quais são os meios necessários para um dado objetivo?
- Qual o valor de quando ?
Este interesse vai além da aritmética. Em geral, como é que a estrutura e o valor permitem chegar a conclusões a partir de hipóteses dadas?.
Uma dedução ou prova é uma sequência de passos que começa com hipóteses e termina numa conclusão. Cada um desses passos deve depender apenas das hipóteses e dos passos anteriores, pela aplicação de regras rigorosas.
Hipóteses, passos e conclusão são proposições (ou fórmulas) e as regras definem como certas proposições (ou fórmulas) são conclusão de outras.
A distinção entre estrutura e valor leva a dois tipos de consequência:
- A consequência sintática diz que há uma prova da conclusão a partir das hipóteses .
- A consequência semântica diz que a conclusão é verdadeira sempre que as hipóteses são verdadeiras.
No primeiro caso, a consequência sintática, não participam os valores verdade/falso. Só é considerada a estrutura da proposições.
Para a consequência semântica interessam os valores verdade/falso e, também, a estrutura. Por exemplo, usando para verdade e para falso, na tabela
os valores booleanos na coluna dependem dos valores / de e de e também da estrutura de ; a coluna é diferente porque, embora dependa exatamente dos mesmos valores, tem uma estrutura diferente.
Informática
No caso da informática a descrição e a análise rigorosa de um sistema (ou programa) é fundamental.
Dado o seguinte programa:
#![allow(unused)] fn main() { fn answer(x: i32) -> i32 { 2 * x } let y = answer(21); println!("The answer is {y}."); }
Os termos usados, como fc
, println!
ou os parêntesis {
, }
não são arbitrários; têm de ser exatamente aqueles e não outros. Além disso, a ordem por que são escritos também segue regras precisas. Por exemplo, o fragmento
#![allow(unused)] fn main() { answer() {fn} 2 * x i32 i32; }
é incorreto.
Além das regras de escrita para programas corretos, também é necessário rigor na execução de um programa. O programa acima deve produzir o texto 42
na consola.
Estes dois aspetos dos programas, a escrita (sintaxe) e a execução (semântica), têm de ser definidas rigorosamente num sistema formal.
A lógica é esse sistema, capaz de definir formalmente tanto a sintaxe como a semântica dos programas.
Além de correto, um programa deve ter um comportamento bem definido. Consideremos a seguinte função:
#![allow(unused)] fn main() { fn sum(x: i32) -> i32 { // x >= 0 let mut y = 0; let mut z = 0; while z !== x { z = z + 1; y = y + z; } // y = 0 + 1 + ... + x y } }
Como garantir que o valor devolvido por sum(x)
é quando ?
Uma resposta formal a este problema também permite considerar as seguintes questões:
- Como definir um programa correto?
- Como descrever o comportamento de um programa?
- Como provar que um programa funciona de acordo com as especificações?
- Como desenvolver componentes adicionais?
- Como analizar e tratar situações críticas, de erro, entradas incorretas, etc?
- Como coordenar equipas de dezenas, centenas ou milhares de engenheiros informáticos, com experiências e formações variadas?
Estas questões não podem ser respondidas ad hoc. Precisam de respostas obtidas com rigor e objetividade.
Um sistema informático crítico não pode ter uma estrutura ambígua ou subjetiva; tem de ser descrito objetivamente de forma a que diferentes equipas o possam analizar, utilizar, desenvolver, corrigir, manter, expandir, substituir, etc
Por exemplo, a documentação de uma linguagem, como a rust
, de uma biblioteca, como a Distributed
, a especificação de um formato, como o yaml
, formalizam o que se pode escrever e o respetivo comportamento.
Esquema de Programa
Para concretizar o objetivo deste curso o programa segue os seguintes assuntos:
- A lógica proposicional é relativamente simples e flexível para descrever alguns domínios simples. No entanto tem limitações que limitam o seu uso em casos reais.
- A lógica de primeira ordem é significativamente mais expressiva e resolve muitas das limitações da lógica proposicional. Essa expressividade vem à custa de alguma complexidade e limites computacionais.
- A verificação de programas ilustra uma aplicação da lógica à informática:
- Dada a especificação formal do comportamento de um programa, como deduzir com rigor que o programa funciona como pretendido?
Lógica Proposicional
Na Lógica Proposicional são definidos os conceitos base para a descrição e análise de teorias formais.
O domínio é descrito por proposições, que são formadas por átomos ligados por conectivos e têm valores verdade/falso.
-
Objetivos: Descrever proposições, saber como chegar a conclusões a partir de hipóteses dadas e relacionar a estrutura com o valor de uma proposição.
-
Plano: Definir uma linguagem adequada para proposições. Descrever regras de dedução e definir o cálculo do valor das proposições.
-
Avaliar: Quais são limites computacionais e expressivos?
-
Utilizar: Que problemas podem ser descritos e resolvidos?
Sintaxe da Lógica Proposicional
A sintaxe é o início da formalização da dedução.
Sobre a definição das proposições:
- Intuitivamente uma "proposição" é uma frase que podemos dizer que é "verdadeira" ou "falsa".
- Formalmente uma "proposição" é uma estrutura que resulta de "conectivos" aplicados a "átomos".
- Casos atómicos: proposições indivisíveis ("está a chover.").
- Casos estruturados:
- negação "não está a chover"
- conjunção "está a chover e a fazer sol"
- disjunção "está a chover ou a fazer sol"
- implicação "se está a fazer sol então não está a chover"
Nesta parte não interessa ainda o valor (verdade/falso) duma proposição, mas na sua sintaxe.
Proposições
Uma proposição descreve um facto.
Definição (Proposição)
Seja um conjunto de símbolos.
Uma proposição é uma expressão que resulta exclusivamente de um dos seguintes casos:
- Um átomo (ou proposição atómica ou letra proposicional) é um elemento de .
- A negação de uma proposição. Se é uma proposição então é uma proposição.
- A conjunção, a disjunção, ou a implicação de duas proposições. Se e forem proposições então também são proposições.
Regras de Precedência
Usam-se regras de precedência para simplificar proposições.
Por exemplo, a proposição pode ser simplificada como
Regras de Precedência
- Os parêntesis têm precedência sobre os conectivos.
- A negação tem precedência sobre os outros conectivos.
- A conjunção e a disjunção têm precedência sobre a implicação.
- A conjunção tem precedência sobre a disjunção.
Formalmente, a expressão não é uma proposição. Mas as regras de precedência definem sem ambiguidade a proposição .
Árvore de Sintaxe
Uma proposição pode ser representada graficamente.
Por exemplo define a árvore
%%{init: {'theme':'neutral'}}%% graph TD impl(()) --> nota(()) nota --> a(()) impl --> or(()) or --> b(()) or --> andcd(()) andcd --> c(()) andcd --> d(())
enquanto que define
%%{init: {'theme':'neutral'}}%% graph TD or(()) --> impl(()) impl --> nota(()) impl --> b(()) nota --> a(()) or --> andcd(()) andcd --> c(()) andcd --> d(())
Exemplos de Proposições
- representa "está a chover".
- representa "o número cinco é par".
- representa "Coimbra fica em Portugal".
- : "não está a chover".
- : "o número cinco é ímpar".
- : "Coimbra não fica em Portugal".
- : "é falso que não está a chover".
- : "está a chover e o número cinco é par".
- : "está a chover e não está a chover".
- : "está a chover e está a chover".
- : "Se está a chover então o número cinco não é par e Coimbra fica em Portugal".
- A escrita natural é ambígua: "Coimbra fica em Portugal" depende, ou não, de "Está a chover"? isto é, aquela frase significa ou ?
- : "está a chover ou cinco é par".
- : "ou está a chover ou não está a chover".
- : "está a chover ou está a chover".
- : "ou está a chover ou cinco não é par e Coimbra fica em Portugal".
- : "se está a chover então cinco é par".
- : "se está a chover então não está a chover".
- : "se está a chover então está a chover".
- : "Coimbra não fica em Portugal porque cinco é par".
- : "penso, logo existo".
Observações
- Erros sintáticos:
- Não são proposições: perguntas "O café está frio?" e imperativos "Corre!".
- Coloquialismos, ie frases comuns que correspondem a proposições:
- "a exceto se b", "a a não ser que b":
- "chove exceto se faz sol", "chove a não ser que faça sol"
- Um caso é alternativo ao outro; Acontece um sempre que não acontece o outro.
- "b porque a", "quando a também b", "b sempre que a": .
- "quando faz sol também passeio",
- "passeio sempre que faz sol",
- "passeio porque faz sol"
- Se fizer sol então passeio. Porém, também posso passear sem que faça sol.
- "a exceto se b", "a a não ser que b":
Conectivos Derivados
Os símbolos designam-se conectivos pois conectam (ligam) proposições mais simples.
A definição de proposição exclui certos conectivos comuns, como e . De facto, é possível dispensar quase todos os conectivos e começar apenas com, por exemplo e definir os restantes conectivos à custa destes.
Como numa linguagem de programação, onde instruções e operações simples definem outras mais complexas.
No entanto, para facilitar a escrita é comum usarem-se outros conectivos.
Definição (Conectivos Derivados)
Sejam duas proposições.
Nome | Abreviatura | Forma Expandida |
---|---|---|
se e só se (sse) | ||
ou exclusivo (xor) | ||
nand | ||
nor | ||
contradição | ||
tautologia |
Embora sintaticamente estes novos conectivos sejam representados por símbolos "novos", o que esta tabela define é a "forma equivalente" que fica "abreviada" de acordo com esta tabela.
Isto é não é uma proposição mas uma "abreviatura" da "forma expandida" que, por sua vez, é uma abreviatura de e esta expressão já é uma proposição.
Dedução Natural Proposicional
Uma descoberta contra-intuitiva (dos filósofos Gregos).
Algumas deduções resultam apenas da forma (sintaxe, estrutura) das proposições envolvidas; o assunto tratado é irrelevante.
Por exemplo as duas deduções
- "Se está frio então levo o cachecol. Está frio. Portanto, levo o cachecol." e
- "Se o orçamento chumbar então o governo cai. O orçamento chumbou. Portanto, o governo cai."
são sobre assuntos muito diferentes mas partilham a mesma forma (estrutura):
Pretente-se definir e usar regras formais para deduzir consequências, , dadas certas hipóteses, , independentemente do assunto que está a ser tratado.
O que significa ?
- A hipótese, , é um conjunto de proposições: expressões construídas a partir de átomos ligados por conectivos.
- A conclusão, , é uma proposição.
- As regras dizem respeito aos conectivos e são de dois tipos: introdução ou eliminação.
- Uma prova de com hipóteses resulta de aplicar as regras linha-a-linha de forma que:
- Cada linha ou é uma hipótese de ou uma proposição que depende das linhas anteriores por aplicação de uma regra.
- Na última linha está a proposição .
- A notação significa "existe uma prova de com hipóteses em " ou que " é consequência (formal) das hipóteses ".
As proposições são definidas com conectivos e as regras estão organizadas por esses conectivos.
Existem regras para , , , etc
Além disso, há regras de introdução, em que a conclusão é formada por um certo conectivo, e regras de eliminação em que o conectivo está numa das hipóteses.
Conjunção
Eliminação da Conjunção
Eliminação da conjunção (esquerda) ()
ou
Esta regra chama-se "eliminação da conjunção à esquerda", representa-se por e diz que se é uma das hipóteses, pode concluir-se .
- É uma regra de eliminação da conjunção porque a conjunção ocorre nas hipóteses.
- "Esquerda" significa que na conclusão ocorre a proposição esquerda, o .
Esta, e qualquer outra regra, é apresentada de duas formas equivalentes:
- horizontal "" usa o símbolo de consequência (formal); à esquerda estão as hipóteses e à direita a conclusão.
- vertical "" parece uma fração; em cima estão as hipóteses e por baixo a conclusão.
Eliminação da conjunção (direita) ()
ou
Esta regra é semelhante à anterior, com a diferença que a consequência é o lado direito da hipótese.
Provas em Tabela
Como aplicar as regras para fazer uma prova?
Uma prova em tabela tem o seguinte aspeto
Linha | Proposição | Regra | Hipóteses |
---|---|---|---|
1 | |||
2 | 1 |
e o resultado é
isto é, é consequência da hipótese .
Outra forma de dizer o mesmo:
Existe uma prova de a partir da hipótese .
A construção de uma prova é organizada numa tabela:
- As linhas são escritas de cima para baixo.
- Cada linha tem um número, na coluna "Linha", definido sequencialmente: 1, 2, 3, etc.
- Na coluna "Proposição" está uma proposição que pode ser um de dois casos:
- É uma hipótese e assinala-se um na coluna "Regra" ou
- Resulta das linhas anteriores por aplicação de uma regra. Nesse caso:
- Na coluna "Regra" escreve-se o nome da regra. Por exemplo, .
- Na coluna "Hipóteses" escrevem-se os números da linhas onde estão as hipóteses da regra aplicada. Por exemplo, 1.
- Na última linha está a conclusão da prova, que depende da hipóteses colocadas na prova.
Introdução da Conjunção
Introdução da Conjunção ()
ou
Esta regra chama-se "introdução da conjunção", representa-se por e diz que se as hipóteses forem e então pode concluir-se .
- É uma regra de introdução da conjunção porque a conjunção ocorre na conclusão.
- Neste caso a conclusão depende de duas hipóteses.
Exemplos
Linha | Proposição | Regra | Hipóteses |
---|---|---|---|
1 | |||
2 | |||
3 | 1, 2 |
- As hipóteses estão indicadas nas linhas 1 e 2.
- Na linha 3 é aplicada a regra com hipoteses na linhas 1 e 2.
Desta tabela pode escrever-se
Isto é é consequência das hipóteses .
Exemplo. Idempotência da conjunção, .
Primeiro
Linha | Proposição | Regra | Hipóteses |
---|---|---|---|
1 | |||
2 | 1, 1 |
mostra que .
Depois
Linha | Proposição | Regra | Hipóteses |
---|---|---|---|
1 | |||
2 | 1 |
mostra que .
Combinando as duas conclusões,
Exemplo. Comutatividade da conjunção, .
Linha | Proposição | Regra | Hipóteses |
---|---|---|---|
1 | |||
2 | 1 | ||
3 | 1 | ||
4 | 3, 2 |
Exemplo. Eliminação e introdução da conjunção.
Linha | Proposição | Regra | Hipóteses |
---|---|---|---|
1 | |||
2 | |||
3 | 2 | ||
4 | 3, 1 |
Dupla Negação
As regras que dizem respeito à negação "simples", como são um pouco mais sofisticadas, e ficam para mais tarde. Já as regras para a "dupla negação", como são bastante simples.
Intuitivamente, a "dupla negação", é como o "simétrico do simétrico", .
Introdução da dupla negação ()
ou
Eliminação da dupla negação ()
ou
Implicação
Eliminação da Implicação
Eliminação da Implicação ou Modus Ponens ()
ou
Modus Ponens é uma expressão latina e designa uma das primeiras, e mais importantes, regras de inferência.
Sobre o Modus Ponens:
- "está frio."
- "se está frio então levo cachecol."
- portanto "levo cachecol".
Em tabela:
Linha | Proposição | Regra | Hipóteses |
---|---|---|---|
1 | |||
2 | |||
3 | 1, 2 |
Exemplo. Cadeia de Implicações I
Linha | Proposição | Regra | Hipóteses |
---|---|---|---|
1 | |||
2 | |||
3 | |||
4 | 1, 2 | ||
5 | 4, 3 |
Introdução da Implicação
Nesta regra aparece um tipo novo de hipótese, uma sub-prova com hipóteses locais, representada por na forma horizontal e por na forma vertical.
Introdução da Implicação ()
ou
As hipóteses locais duma sub-prova são descartadas com a aplicação da regra.
Exemplo. Cadeia de Implicações II
Linha | Proposição | Regra | Hipóteses |
---|---|---|---|
1 | |||
2 | |||
3 | (6) | ||
4 | 3, 1 | ||
5 | 4, 2 | ||
6 | 3 - 5 |
Este exemplo ilustra o processo de descarte das hipóteses locais de uma sub-prova:
- Na linha 3 é introduzida a hipótese .
- As linhas 4 e 5 dependem dessa hipótese.
- Na linha 6 é a aplicada a regra , em que
- A sub-prova da hipótese desta regra ocorre nas linhas 3 - 5 da prova.
- E escreve-se 3 - 5 na coluna "Hipóteses".
- A aplicação desta regra descarta toda a sub-prova.
- E escreve-se (6) na coluna "Hipóteses" da linha 3, onde inicia a sub-prova.
- A sub-prova da hipótese desta regra ocorre nas linhas 3 - 5 da prova.
Exemplo. Cadeia de Implicações III
Linha | Proposição | Regra | Hipóteses |
---|---|---|---|
1 | |||
2 | (7) | ||
3 | (6) | ||
4 | 3, 1 | ||
5 | 4, 2 | ||
6 | 3 - 5 | ||
7 | 2 - 6 |
Este exemplo continua o anterior: Na linha 7 ocorre uma nova aplicação da regra .
- Esta aplicação usa as linhas 2 - 6 como sub-prova.
- A hipótese da linha 2 é descartada, sendo indicado que esse descarte é feito na linha 7.
Disjunção
As regras da disjunção são menos diretas do que as anteriores:
- Existem dois casos para a introdução: esquerdo e direito. Tal como as regras de eliminação da conjunção.
- A regra da eliminação descarta duas sub-provas.
Introdução da Disjunção
Introdução da disjunção (esquerda) ()
ou
Introdução da disjunção (direita) ()
ou
Nestas regras a conclusão inclui um predicado que não ocorre nas hipóteses — na regra esquerda e na direita:
- Este predicado pode ser um qualquer, o que dá uma grande liberdade para a construção da prova.
- Porém, se esse predicado não for bem escolhido em nada contribui para a conclusão a que se pretende escolher.
Eliminação da Disjunção
Esta regra é, talvez, a mais complexa da Dedução Natural Proposicional:
- As hipóteses são:
- Uma disjunção, ;
- A sub-prova , que é descartada com a aplicação da regra;
- A sub-prova , que também é descartada com a aplicação da regra;
- Uma sub-prova tem como hipótese um dos "casos" de , o predicado .
- A outra sub-prova tem como hipótese o outro "caso" de , o predicado .
- Em cada uma das sub-provas a conclusão, :
- É comum às sub-provas;
- Não ocorre na disjunção ;
- Portanto, pode ser escolhido sem restrições mas com o fim da prova em mente.
Eliminação da Disjunção ()
ou
(Semi-)Propriedade Distributiva
Prova
Linha | Proposição | Regra | Hipóteses |
---|---|---|---|
1 | |||
... | ... | ||
? | ? |
Linha | Proposição | Regra | Hipóteses |
---|---|---|---|
1 | |||
2 | 1 | ||
... | ... | ||
? | ? |
Linha | Proposição | Regra | Hipóteses |
---|---|---|---|
1 | |||
2 | 1 | ||
1º caso da linha 2 | |||
3 | |||
... | ... | ||
? | ? |
Linha | Proposição | Regra | Hipóteses |
---|---|---|---|
1 | |||
2 | 1 | ||
1º caso da linha 2 | |||
3 | |||
4 | 3 | ||
... | ... | ||
? | ? |
Linha | Proposição | Regra | Hipóteses |
---|---|---|---|
1 | |||
2 | 1 | ||
1º caso da linha 2 | |||
3 | |||
4 | 3 | ||
2º caso da linha 2 | |||
5 | |||
... | ... | ||
? | ? |
Linha | Proposição | Regra | Hipóteses |
---|---|---|---|
1 | |||
2 | 1 | ||
1º caso da linha 2 | |||
3 | |||
4 | 3 | ||
2º caso da linha 2 | |||
5 | |||
6 | 1 | ||
... | ... | ||
? | ? |
Linha | Proposição | Regra | Hipóteses |
---|---|---|---|
1 | |||
2 | 1 | ||
1º caso da linha 2 | |||
3 | |||
4 | 3 | ||
2º caso da linha 2 | |||
5 | |||
6 | 1 | ||
1º caso da linha 6 | |||
7 | |||
8 | 7 | ||
... | ... | ||
? | ? |
Linha | Proposição | Regra | Hipóteses |
---|---|---|---|
1 | |||
2 | 1 | ||
1º caso da linha 2 | |||
3 | |||
4 | 3 | ||
2º caso da linha 2 | |||
5 | |||
6 | 1 | ||
1º caso da linha 6 | |||
7 | |||
8 | 7 | ||
2º caso da linha 6 | |||
9 | |||
10 | 5, 9 | ||
... | ... | ||
? | ? |
Linha | Proposição | Regra | Hipóteses |
---|---|---|---|
1 | |||
2 | 1 | ||
1º caso da linha 2 | |||
3 | |||
4 | 3 | ||
2º caso da linha 2 | |||
5 | |||
6 | 1 | ||
1º caso da linha 6 | |||
7 | |||
8 | 7 | ||
2º caso da linha 6 | |||
9 | |||
10 | 5, 9 | ||
11 | 10 | ||
... | ... | ||
? | ? |
Linha | Proposição | Regra | Hipóteses |
---|---|---|---|
1 | |||
2 | 1 | ||
1º caso da linha 2 | |||
3 | |||
4 | 3 | ||
2º caso da linha 2 | |||
5 | |||
6 | 1 | ||
1º caso da linha 6 | |||
7 | (12) descarte | ||
8 | 7 | ||
2º caso da linha 6 | |||
9 | (12) descarte | ||
10 | 5, 9 | ||
11 | 10 | ||
12 | 6, 7 - 8, 9 - 11 | ||
... | ... | ||
? | ? |
Linha | Proposição | Regra | Hipóteses |
---|---|---|---|
1 | |||
2 | 1 | ||
1º caso da linha 2 | |||
3 | (13) descarte | ||
4 | 3 | ||
2º caso da linha 2 | |||
5 | (13) descarte | ||
6 | 1 | ||
1º caso da linha 6 | |||
7 | (12) | ||
8 | 7 | ||
2º caso da linha 6 | |||
9 | (12) | ||
10 | 5, 9 | ||
11 | 10 | ||
12 | 6, 7 - 8, 9 - 11 | ||
13 | 2, 3 - 4, 5 - 12 |
Linha | Proposição | Regra | Hipóteses |
---|---|---|---|
1 | |||
2 | 1 | ||
1º caso da linha 2 | |||
3 | (13) | ||
4 | 3 | ||
2º caso da linha 2 | |||
5 | (13) | ||
6 | 1 | ||
1º caso da linha 6 | |||
7 | (12) | ||
8 | 7 | ||
2º caso da linha 6 | |||
9 | (12) | ||
10 | 5, 9 | ||
11 | 10 | ||
12 | 6, 7 - 8, 9 - 11 | ||
13 | 2, 3 - 4, 5 - 12 |
As sub-provas foram indentadas para facilitar a leitura. Esta indentação é opcional e nem sempre será aplicada.
A regra é aplicada duas vezes:
- Na linha 12:
- A disjunção, , está na linha 6;
- Uma sub-prova, de , com hipótese , em 7 - 8;
- A outra sub-prova, também de , mas com hipótese , em 9 - 11;
- Na linha 13:
- A disjunção, , está na linha 2;
- Uma sub-prova, de , com hipótese , em 5 - 6;
- A outra sub-prova, também de , mas com hipótese , em 5 - 12;
Pode parecer estranho porque é que aparece cinco vezes como conclusão, nas linhas 4, 8, 11, 12 e 13.
Nas últimas três foram descartadas hipóteses temporárias, para sub-provas. Até ao descarte essas hipóteses estão "ativas" e teriam de aparecer na lista de hipóteses "final":
- Na linha 11 as hipóteses ativas são:
- Linha 1: .
- Linha 3: .
- Linha 5: .
- Linha 7: .
- Linha 9: .
- Na linha 12, quando é aplicada a regra , são descratadas as hipóteses 7 e 9 e permanecem ativas:
- Linha 1: .
- Linha 3: .
- Linha 5: .
- Na linha 13, depois de aplicada a regra, são descartadas as hipóteses 3 e 5 e permanece ativa a linha 1.
Negação e Contradição
A contradição () está relacionada com a negação () pois é definida como .
A contratição, , é o primeiro conectivo derivado dos quatro iniciais, e .
Informalmente, pode ser lido como "falso".
Introdução da Negação
Introdução da Negação ()
ou
Esta regra pode ser lida da seguinte forma:
Se a hipótese leva a uma contradição, , é porque essa hipótese é "falsa". Portanto, a sua negação, , tem de ser "verdadeira".
- Esta regra tem como hipótese apenas uma sub-prova, que é descartada juntamente com a respetiva hipótese, na aplicação.
- Na conclusão da sub-prova o predicado não ocorre (necessariamente) na hipótese .
Contradição
Definição (Contradição, )
-
Qualquer proposição da forma é uma contradição.
-
Usa-se o símbolo para representar contradições.
Não é evidente (por enquanto) que esta definição de seja legítima!
- Porque é que não depende de ?
- O de é o mesmo de ?
Com esta definição a regra pode ser re-escrita da seguinte forma:
Introdução da Negação () (versão alternativa)
ou
Numa prova pode ser usada qualquer uma das versões da regra .
Introdução da Contradição
Este novo conectivo tem as respetivas regras de dedução.
Introdução da Contradição ()
ou
Esta regra tem duas hipóteses contraditórias e e a conclusão é .
Eliminação da Contradição
Eliminação da Contradição ()
ou
Pode ser escolhida qualquer proposição na conclusão esta regra.
Efeito da Contradição
A regra pode ser lida como "de uma contradição é sempre possível concluir qualquer proposição".
Em termos práticos a lógica e a dedução natural são utilizadas para descrever e analizar um certo problema. Por exemplo, um programa, uma empresa, etc.
Supondo que a Dona Entrelinha é gestora (CEO!) de uma padaria e vai aplicar a lógica e a dedução natural para descrever e analisar o fluxo de trabalho. Começou com um conjunto de regras para o dia-a-dia da padaria:
Certo dia houve falta de farinha, pelo que a Dona Entrelinha acrescentou às regras e antecipou que, nesse dia, não teria lucro: porque
Linha | Proposição | Regra | Hipóteses |
---|---|---|---|
1 | não há ingredientes | ||
2 | admitindo que faz pão (5) descarte | ||
3 | 2, | ||
4 | 2, 6 | ||
5 | 1 - 3 | ||
6 | (regra derivada!) | ||
Caso 1 de 6 | |||
7 | (15) descarte | ||
8 | 7, 5 | ||
9 | 8, | ||
Caso 2 de 6 | |||
10 | (15) descarte | ||
11 | 10, | ||
12 | 6, 7-9, 10-11 |
Tentado manter o lucro, a Dona Entrelinha foi a uma padaria rival e comprou pão. Mas, com o stress da situação, esqueceu-se de retirar das hipóteses as proposições sobre os ingredientes. Ficou então com hipóteses
Ora, neste caso
Linha | Proposição | Regra | Hipóteses |
---|---|---|---|
1 | |||
2 | (5) | ||
3 | 1, | ||
4 | 3, 2 | ||
5 | 4 |
Na linha 5 podemos escrever qualquer proposição, i.e. qualquer proposição é consequência de !
Esta situação não é desejável porque qualquer teoria (conjunto de hipóteses) "útil" deve distinguir "verdade" de "falso"; os "factos" dos "enganos".
Uma teoria que permita contradições não é "útil" porque qualquer proposição é consequência dessa teoria.
E, se qualquer proposição é consequência, também a sua negação o é; se para qualquer proposição , então também .
Programação Lógica
As hipóteses iniciais da Dona Entrelinha podem ser descritas pelo seguinte programa ASP
:
ingredientes :- pao.
clientes :- lucro.
pao :- lucro.
-lucro :- clientes, -pao.
-lucro :- -clientes.
clientes ; -clientes.
Como é normal em programação lógica:
- Em vez de escreve-se usando a sintaxe
b :- a
, que se lê "b
sea
". Adicionalmente, - A negação é representada por
-a
. - A conjunção por
a, b
. - A disjunção por
a; b
.
Pode-se perguntar em que circunstâncias este programa é satisfeito. O resultado é
Solving...
Answer: 1
-clientes -lucro
Answer: 2
clientes
SATISFIABLE
Isto é, há duas formas (answer sets) destas regras serem cumpridas:
- Ou não há clientes nem lucro (
Answer: 1
). - Ou há clientes, mas não a garantia de lucro (
Answer: 2
) .
Recursos
- A linguagem
ASP
(Answer set programming) na wikipedia. - O sistema Potassco inclui o programa
clingo
que pode ser instalado ou correr no browser.
Introdução de Teses
Esta regra permite usar provas anteriores como regras: se previamente foi provado que e na prova actual ocorrem todas as hipóteses de então é uma conclusão.
Introdução de Teses ()
ou
A sub-prova é descartada na aplicação desta regra.
Regras Derivadas
Certas regras facilitam e reduzem significativamente o número de passos numa prova.
- É necessário demonstrar que as regras novas resultam das anteriores.
- Também algumas regras anteriores são redundantes: umas resultam das restantes.
Modus Tollens ()
ou
Demonstração.
Linha | Proposição | Regra | Hipóteses |
---|---|---|---|
1 | |||
2 | |||
3 | (6) | ||
4 | 3, 1 | ||
5 | 4, 2 | ||
6 | 3 - 5 |
Redução ao Absurdo ()
ou
Demonstração.
Linha | Proposição | Regra | Hipóteses |
---|---|---|---|
1 | |||
2 | (4) | ||
3 | 1, 2 | ||
4 | 2-3 | ||
5 | 4 |
Terceiro Excluído ()
ou
Demonstração.
Linha | Proposição | Regra | Hipóteses |
---|---|---|---|
1 | (8) | ||
2 | (5) | ||
3 | 2 | ||
4 | 1, 3 | ||
5 | 2-4 | ||
6 | 5 | ||
7 | 1, 6 | ||
8 | 1-7 | ||
9 | 8 |
Exemplo. Regras Derivadas
A regra como resultado de .
Demonstração.
Linha | Proposição | Regra | Hipóteses |
---|---|---|---|
1 | |||
2 | (4) | ||
3 | 1, 2 | ||
4 | 2 - 3 |
Isto é ou
Tabela de Regras
Resumo das regras da Dedução Natural Proposicional.
Consequência Sintática Proposicional
Uma regra, , especifica como certas hipóteses, , produzem uma determinada conclusão, :
Encadeando várias regras obtém-se uma prova, apresentada numa tabela:
Linha | Proposição | Regra | Hipóteses |
---|---|---|---|
1 | |||
n |
em que cada linha depende das anteriores não descartadas, por aplicação de uma regra.
Por fim, a relação entre as hipóteses não descartadas, , e a conclusão na última linha, , é representada por e diz-se que é consequência sintática de .
Definição (Teorema)
Uma proposição é um teorema se , isto é, se pode ser demonstrada sem hipóteses.
Pode parecer estranho como fazer uma prova sem hipóteses. Mas já vimos como podemos "descartar" hipóteses usando implicações, pela regra .
A continuação do exemplo da cadeia de implicações serve para ilustrar este ponto.
Exemplo. Cadeia de Implicações IV
Linha | Proposição | Regra | Hipóteses |
---|---|---|---|
1 | (8) | ||
2 | (7) | ||
3 | (6) | ||
4 | 3, 1 | ||
5 | 4, 2 | ||
6 | 3 - 5 | ||
7 | 2 - 6 | ||
8 | 1 - 7 |
Este exemplo mostra uma prova em que todas as hipóteses foram descartadas. Formalmente seria para indicar que o conjunto de hipóteses é vazio, , mas pode ser abreviado para
De acordo com a definição de teorema, é um teorema porque tem uma prova sem hipóteses "ativas".
Semântica Proposicional
Como definir valores booleanos de proposições?
As regras da dedução natural usam apenas a sintaxe das proposições, e permitem determinar se uma conclusão é consequência de certas hipóteses . Nesse caso escreve-se .
não é booleana no sentido em que não depende dos valores das hipóteses nem da conclusão .
Os valores booleanos das proposições baseiam-se em valorações.
São funções que associam os valores booleanos aos átomos e daí, respeitando a estrutura dos conectivos, a todas as proposições.
O que significa ?
- A hipótese, , é um conjunto de proposições.
- A conclusão, , também é uma proposição.
- As valorações define os valores booleanos de todas as proposições.
- A notação significa que "se todas as hipóteses são verdadeiras então também é verdadeira."
Valoração
Definição (Valoração)
Uma valoração é qualquer função que associa um valor booleano, ou , a cada proposição, de forma que:
- Para cada átomo o valor é definido explicitamente.
- Para cada conectivo , resulta da tabela
Exemplo. Valorações
Sejam duas proposições atómicas.
Se então
Se então
O valor booleano de uma proposição depende apenas dos valores booleanos dos átomos que ocorrem nessa proposição.
A definição de .
Previamente foi definido como uma "representação" de . Então foi questionado se o que representa será o mesmo que representa, por exemplo, .
- Na tabela de todas as linhas são , tal como serão em ou em ou ...
- ...ou em qualquer outra proposição que resulte de substituir em , como por exemplo.
Isto é, é "sempre ". Analogamente, é "sempre ".
Número de Valorações
Dados dois átomos, e , quantas valorações diferentes existem para ?
- Como só pode ter dois valores, e também, as valorações possíveis para são:
ou em tabela
Em geral, para átomos existem valorações diferentes.
Modelos de Proposições
Definições (Modelo e Refutação) ()
Modelos
- Seja uma proposição. Um modelo de é uma valoração tal que . Nesse caso escreve-se .
- Se for um conjunto de proposições, um modelo de é um modelo de todos os seus elementos: se e só se para cada .
Refutações
- Uma refutação de é uma valoração tal que . Nesse caso escreve-se .
- Se for um conjunto de proposições, uma refutação de é uma refutação de algum dos seus elementos: se e só se para algum .
Por exemplo, se for então é modelo de
- (trivialmente)
- porque (ver a tabela na definição de valoração)
- porque, pela tabela, Como e estamos no segundo caso, .
Resumindo, se (isto é, se ) então
ou seja
Cálculo de valores usando uma árvore
Qualquer proposição pode ser representada graficamente por uma árvore de sintaxe e essa representação pode ser útil no cálculo de valores booleanos.
Por exemplo, para verificar que sabendo que :
%%{init: {'theme':'neutral'}}%% flowchart TD impl([]) --> negp([]) negp --> p([]) impl --> pp([]) p -.-> || negp pp -.-> || impl negp -.-> || impl
Cálculo de valores usando uma tabela
Sabendo que :
Tipos de Proposições
Uma proposição pode ter zero, um ou vários modelos ou refutações.
Definição (Tipos de Proposições)
Uma proposição é:
- Compatível ou Satisfazível se tem algum modelo: existe tal que .
- Válida ou Tautologia se qualquer valoração é modelo: para qualquer , .
- Contingente se tem um modelo e uma refutação: existem tais que e .
- Contradição ou Incompatível se não tem modelos: para qualquer , .
Exemplo. Tipos de Proposições
- Compatíveis:
- Válidas:
- Contingentes:
- Contradições:
Consequência Semântica Proposicional
Certas hipóteses, , são verdadeiras, apenas com algumas valorações, . Nesse caso, que outras proposições, , também resultam verdadeiras?
Objetivo: Determinar se a proposição é verdadeira quando são verdadeiras as hipóteses .
Mais concretamente, pretende-se relacionar os valores booleanos das hipóteses com os da conclusão.
Definição (Consequência Semântica, )
Sejam um conjunto de proposições e uma proposição.
Diz-se que é consequência semântica de e escreve-se se qualquer modelo de também é modelo de :
Observações:
- significa que existe um modelo de que é uma refutação de .
- Para que é necessário que, para cada valoração ,
Exemplos
-
- Qualquer modelo de também é modelo de :
- Se então .
- Qualquer modelo de também é modelo de :
-
- Qualquer modelo de também é modelo de e de , de acordo com a tabela dos conectivos.
-
- Um modelo de , de acordo com a tabela dos conectivos, também é modelo de .
-
- Um modelo de , de acordo com a tablea dos conectivos, tem de ser modelo de e modelo de .
- Portanto também é modelo de .
-
- Com a valoração temos mas .
- porque as hipóteses não têm qualquer modelo.
- Este caso pode parecer um pouco confuso. A pergunta que a colocar é: "Existe algum modelo de que não seja de ?" — e a resposta é "Não"!
- :
- Se então .
- Mas então, de acordo com as regras das valorações, também independentemente de .
-
- Para qualquer valoração , ou ou (exercício: porquê?).
- Portanto .
Equivalência Semântica
Definição (Proposições Equivalentes, )
Duas proposições são equivalentes se e . Nesse caso escreve-se .
Exemplo.
Para provar que por uma tabela:
Nesta tabela:
- Cada linha corresponde a uma das quatro valorações de .
- As colunas e (isto é, e ) mostram como essas valorações variam.
- As colunas e (isto é, e ) são iguais.
- Isto prova que qualquer modelo (isto é, em qualquer linha) se uma coluna é verdadeira, também a outra coluna o é.
- Também se conclui que :
- Porque é verdadeira nas linhas 4 e 5 e, nessas linhas, também é verdadeira.
- Porém :
- Na linha 1 é verdadeira mas é falsa.
Sobre a Equivalência Semântica
- O símbolo não é um conectivo lógico, ao contrário de .
- Isto é, se forem proposições não é uma proposição enquanto que são.
- Analogamente não é um número mas , , e são.
Leis de De Morgan e outras equivalências
Consequência Semântica, Sintática e Implicação
É possível re-escrever de formas que podem ser mais úteis em certas circunstâncias. Exatamente as mesmas formas são também aplicáveis a .
Teorema (Consequência Semântica, Sintática e Implicação)
Sejam um conjunto de proposições, e uma proposição.
Então:
- se e só se se e só se .
- se e só se se e só se .
Este teorema mostra:
- Como na consequência semântica , as hipóteses podem ser "reduzidas" a uma única proposição e como "retirar" todas as hipóteses, escrevendo a implicação .
- Exatamente as mesmas transformações são aplicáveis à consequência sintática.
Completude e Validade
Qual a relação entre "dedução" e "verdade"? Entre e ?
Teorema (Completude e Validade da Lógica Proposicional)
Seja um conjunto de proposições e uma proposição.
Então se e só se .
Este teorema afirma que a Lógica Proposicional é:
- Completa: Se então
- Todas as proposições válidas são teoremas.
- Segura: Se então
- Todos os teoremas são válidos.
Na Lógica Proposicional todas as verdades podem ser deduzidas e todos os teoremas são verdadeiros.
Gödel e Turing
Além da Lógica Proposicional, os "Teoremas da completude e validade" têm uma importância enorme na Matemática e na Computação.
Na Matemática
Kurt Gödel mostrou, em 1931, que qualquer teoria que inclua a aritmética não pode ser simultâneamente completa e segura.
Isto significa que em muitas disciplinas da Matemática, por exemplo na Álgebra Linear ou na Análise Matemática, das duas uma:
- Ou essa disciplina não é segura, isto é alguns teoremas são falsos.
- Ou é incompleta, isto é algumas proposições verdadeiras não têm demonstração.
Esta conclusão destruiu o Programa de Hilbert, que tinha por objetivo formalizar toda a matemática num conjunto completo de axiomas e provar que esse conjunto é seguro.
No entanto não se predeu muito do trabalho feito no sentido da formalização. Nem sempre é necessário incluir toda a aritmética e muitas vezes é, de facto, possível provar que certas teorias formais são seguras e completas, como a Lógica Proposicional.
Na Computação
Além da Matemática, também na Computação (isto é, "A Teoria da Informática") as questões sobre completude e validade são importantes. A mais importante é conhecida por "Halting Problem" ou "Problema da Paragem":
Existe um programa capaz de determinar se um dado programa termina?
Isto é, será possível escrever um programa que tem como entrada outro programa e, após um número finito de passos, determina se o programa dado termina ou não termina?
Esta questão foi posta, e respondida, por Alan Turing, um dos fundadores da Computação: Não. Nenhum programa pode resolver este problema.
A relação entre o Problema da Paragem e o Teorema de Gödel não é evidente mas é profunda: A abordagem de Turing ao Problema da Paragem segue a abordagem de Gödel à questão da completude e validade.
Computação
Lógica Proposicional, Computação e Informática
- Como podem contribuir a Computação e a Informática para a Lógica Proposicional?
- Desenvolvendo e implementando algoritmos para (ajudar a) descobrir se uma proposição é um teorema, válida ou compatível
- Como pode a Lógica Proposicional contribuir para a Computação e para a Informática?
- Definindo linguagens para descrever computações, estados, erros, etc.
- Especificando métodos para detetar e lidar com essas situações.
Formas Normais
Objectivos
- Simplificar a linguagem lógica, descartando a necessidade do conectivo .
- Normalizar a estrutura das proposições.
- Usufruir computacionalmente da normalização e simplificação.
Definição (Literal, FND, FNC)
- Uma literal é uma proposição atómica ou a negação de uma proposição atómica.
- Qualquer proposição é equivalente a uma proposição na forma normal disjuntiva (FND): em que cada é uma literal.
- Qualquer proposição é equivalente a uma proposição na forma normal conjuntiva (FNC): em que cada é uma literal.
As formas normais usam apenas os conectivos e (e este último apenas nas literais). Além disso os conectivos e estão agrupados de forma "regular".
Estas duas propriedades são importantes porque simplificam substancialmente a representação e processamento algorítmico de proposições.
Cálculo da Forma Normal Disjuntiva
A designação "disjuntiva" indica que esta forma é uma disjunção () de conjunções de literais.
Um processo para se obter a FND de uma proposição é o seguinte:
- Fazer a tabela da proposição , atendendo às colunas com os átomos e com a proposição.
- Em cada linha onde a proposição é , construir uma conjunção ():
- Para cada átomo que é nessa linha, "contribuir" para a conjunção com ;
- Para cada átomo que é nessa linha, "contribuir" para a conjunção com .
- Fazer a disjunção () de todas as conjunções.
Exemplo: FND de .
portanto
Intuitivamente, primeiro determina-se em que linhas a proposição é ?:
- No conjunto de linhas .
Depois descreve-se a união dessas linhas (). E cada linha é unicamente identificada pela parte conjuntiva ():
- só é na linha ;
- só é na linha .
A FND de descreve a união das linhas em que é .
Cálculo da Forma Normal Conjuntiva
A designação "conjuntiva" indica que esta forma é uma conjunção () de disjunções de literais.
Um processo para se obter a FNC de uma proposição é o seguinte:
- Fazer a tabela da proposição , atendendo às colunas com os átomos e com a proposição.
- Em cada linha onde a proposição é , construir uma disjunção ():
- Para cada átomo que é nessa linha, "contribuir" para a disjunção com ;
- Para cada átomo que é nessa linha, "contribuir" para a disjunção com .
- Fazer a conjunção () de todas as disjunções.
Exemplo: FNC de .
portanto
Intuitivamente, primeiro determina-se em que linhas a proposição é ?:
- No conjunto de linhas .
Depois descreve-se a interseção dos complementos de cada uma dessas linhas (). O complemento de cada linha é unicamente identificado pela parte disjuntiva ():
- só é na linha , ie é nas linhas e ;
- só é na linha , ie é nas linhas e .
A FNC de descreve a interseção de linhas em que é .
Completude Funcional
Uma das aplicações práticas das formas normais consiste na descrição de qualquer função booleana.
Isto é, dada uma função booleana (os argumentos e o valor são ) qualquer:
Por exemplo
Esta descrição da função na forma de uma proposição é importante porque assim pode-se aplicar a Dedução Natural Proposicional para estudar a função.
Mas também pode acontecer estar disponível apenas uma "tabela" dessa função. Por exemplo
Neste caso, em que não é dada uma proposição para descrever a função, também não pode ser utilizada a Dedução Natural Proposicional.
Importa então de resolver o seguinte problema: "Dada uma função na forma de uma tabela, é possível encontrar uma proposição que descreva essa função? Se sim, como obter tal proposição?"
Teorema (Completude funcional) Qualquer função booleana pode ser representada por uma proposição usando apenas os conectivos , e .
Demonstração.
Basta aplicar a cálculo da FNC ou da FND à tabela da função. ◻
Exemplo. Encontrar uma proposição que descreveva uma dada função booleana.
Portanto
Fica como exercício mostar que e são equivalentes. Isso pode ser feito de duas formas distintas:
- Com duas provas DNP: .
- Com uma tabela: .
O Teorema de Completude e Validade garante que qualquer uma destas duas formas é suficiente.
Exercício: Encontre uma proposição para representar a função booleana dada na tabela seguinte.
Problemas e Algoritmos
Que problemas podem ser resolvidos algoritmicamente?
- Muitos problemas numéricos, por exemplo.
- Ordenação, Criptografia, Programação Linear, etc
E sobre problemas na lógica?
Problemas e Instâncias
É necessário começar por definir (semi-formalmente) o que é um problema e uma instância e a diferença entre resolver e decidir
Definição (Problema, Instância, Resolver, Decidir)
Um problema é um conjunto de pares (instância, resposta).
- Resolver consiste em calcular a resposta que corresponde a uma instância.
- Decidir consiste em verificar se um candidato é, ou não, a resposta de uma instância.
Exemplo. Problema da soma
O problema da soma consiste no conjunto de pares em que . Algumas dos pares deste problema são
A resolução da soma tem como "entrada" uma instância e consiste em calcular um de forma que . Por exemplo, dada a instância a resolução é .
A decisão da soma tem como "entradas" uma instância e um candidado e consiste em verificar se , isto é, se é uma resposta da instância . Por exemplo, dada a instância e o candidato a decisão é . Já se o candidato for a decisão é .
Problemas Computacionais da Lógica Proposicional
Definição (SAT)
O problema da satisfação (SAT) consiste no conjunto de pares em que é uma proposição e um valor booleano tal que
Isto é, Dada uma proposição, determinar se essa proposição tem um modelo.
Nos Tipos de Proposições, uma proposição que tenha algum modelo é compatível ou satisfazível.
Definição (Validade)
O problema da validade consiste no conjunto de pares em que é uma proposição e um valor booleano tal que
Isto é, Dada uma proposição, determinar se essa proposição é válida.
Nos Tipos de Proposições, para uma proposição válida (ou tautologia) todas as valorações são modelos.
Definição (Provabilidade)
O problema da provabilidade consiste no conjunto de pares em que é uma proposição e um valor booleano tal que
Isto é, Dada uma proposição, determinar se essa proposição é um teorema.
Um teorema é uma proposição que tem uma prova (sem hipóteses).
O Problema da Satisfação (SAT)
Existe uma valoração tal que ?
É fácil fazer um algoritmo para resolver a este problema. Por exemplo, em Rust:
#![allow(unused)] fn main() { fn sat(p: Proposition) -> bool { let vs = valorations(p); // gerar todas as valorações de p for vi in vs { // para cada valoração vi... if vi(p) { // testar se vi é modelo de p return true; // nesse caso, devolver "true" } } return false; // se não foi encontrado um modelo, devolver "false" } }
O problema é que vs
tem elementos se tiver átomos. Se for satisfazível o algoritmo termina antes de testar todas as valorações. Mas, se não for satisfazível então este algoritmo vão ser testadas todas as valorações obtidas.
Este algoritmo não é eficiente porque consome demasiado tempo (a fazer as verificações no pior caso) e espaço (a memória para guardar todas as valorações).
Supondo que um computador que faz de verificações vi(p)
por segundo:
- Se tiver átomos existem valorações, e demora segundos, isto é milhões de milénios a verificar , no pior caso.
- Em comparação, o universo tem uma idade estimada de 13787 milhões de milénios; seriam necessárias milhões de vidas do universo para resolver este problema para uma única proposição.
- Mesmo melhorando milhões de vezes a velocidade dos computadores este algoritmo não é utilizável na prática — e átomos é um exemplo muito modesto.
Embora seja tecnicamente possível converter a função valorations
num iterador, resolvendo o problema do espaço, ainda assim continua a fazer as verificações — o problema do tempo persiste!.
Existe um algoritmo eficiente para resolver SAT? Ninguém sabe!
Quem resolver SAT eficientemente tem Fama, Fortuna & Glória Instantâneas, Universais & Eternas &tc.
O Interesse do Problema da Satisfação
Uma única proposição pode descrever um sistema complexo:
- Um automóvel.
- Um foguetão.
- Uma central nuclear.
- A economia de um país.
- O clima de um planeta.
- Um ser vivo.
- A ecologia de uma região.
- O funcionamento de um programa.
- ...
Um modelo descreve as condições para atingir um objetivo e/ou as consequências de uma ação.
Resolver SAT eficientemente (por exemplo, em tempo polinomial) iria permitir uma revolução em todos os setores da atividade humana: política, gestão, engenharia, etc.
Os Problemas do Problema da Satisfação
-
Embora sejam conhecidos algoritmos que resolvem rapidamente problemas SAT com dezenas de milhar de variáveis, a complexidade computacional é desconhecida no caso geral.
-
SAT é -completo. Isto significa que pode ser decidido em tempo polinomial e ser usado para resolver vários problemas de otimização, desenho de circuitos, inteligência artificial, etc.
-
A linguagem da lógica proposicional não descrimina objetos de um domínio nem como estes se relacionam — portanto SAT sofre também desta limitação.
Os Outros Problemas
- A validade é equivalente à provabilidade, porque se e só se (o teorema da validade e completude).
- A satisfação é equivalente à validade, porque se não existe tal que ( é uma contradição) então para qualquer , ( é válida).
Problemas Equivalentes. Intuitivamente dois problemas A e B são equivalentes se um algoritmo para resolver A pode ser eficientemente adaptado para resolver B e vice-versa.
Resolução
One Ring to bring them all and in the darkness bind them
A Resolução é uma regra que substitui todas as outras e funciona associada à forma normal disjuntiva.
Resolução ()
ou
Exercício. Derive a regra da resolução das regras anteriores. Isto é, mostre que
A regra da resolução é mais útil na sua forma generalizada.
Resolução generalizada ()
No limite, quando obtemos .
Algoritmo de Resolução
Com as proposições escritas na FNC, a regra da resolução pode substituir todas as outras.
Para se verificar se com a regra da resolução:
- Convertem-se todas as proposições de e para a forma normal conjuntiva.
- Verifica-se se por aplicações sucessivas da resolução.
(Mais tarde, na secção "Exemplos" o algoritmo da resolução é aplicado a alguns problemas.)
O algoritmo de resolução, juntamente com a unificação, é a base da linguagem lógica Prolog.
Exemplos
O Labirinto do Minotauro
- O labirinto consiste numa rede de salas ligadas por corredores.
- Algures no labirinto está o Minotauro, , que devora quem entrar nessa sala.
- O Minotauro pode ser morto por Teseu, , que tem uma única seta e perceciona apenas a sala em que se encontra.
- Algumas salas têm um poço, , onde todos, exceto o minotauro, caem quando entram.
- Numa única sala está Ariadne, , que Teseu procura.
- Nas salas adjacentes ao Minotauro fede, .
- Nas salas adjacentes aos poços sente-se uma brisa, .
N.B. "adjacente" exclui as diagonais.
Formalização
Dadas as seguintes proposições atómicas:
- o Minotauro está na sala .
- fede na sala .
- está um poço na sala .
- há brisa na sala .
- Teseu está na sala .
- Ariadne está na sala .
A base de conhecimento inicial de Teseu, admitindo que "deteta" tudo na sala em que está:
Exercícios
Use os predicados atómicos e:
-
Deduza por Teseu. Também pode deduzir ?
-
Descreva, numa proposição, a sala do exemplo anterior.
Suponha que o labirinto tem apenas salas e formalize:
- Existe apenas um minotauro no labirinto.
- Existe apenas um poço no labirinto.
- Existem dois poços no labirinto.
- O minotauro está na mesma sala que Ariadne.
- O minotauro está numa sala diferente de Ariadne.
- Teseu está na mesma linha que o minotauro.
- Ariadne está na mesma coluna que Teseu.
- Teseu está numa sala adjacente a Ariadne.
Porque não consegue formalizar "Cada sala tem quanto muito um poço"? E se for possível existirem dois poços na mesma sala?
Exemplo de Dedução
Quando Teseu passa da sala , onde não há um poço, para a sala , deteta uma brisa. Conclui então que há um poço na sala , ainda não visitada.
- Transcrever a regra das brisas, , para a FNC:
- Listar as proposições relevantes, incluindo:
- O poço não está em : .
- Sente-se uma brisa em : .
- A negação da tese: .
- Aplicar a resolução:
Conclusão
Computação e Complexidade
- Qual o efeito do número de proposições no algoritmo da resolução?
- Qual o efeito do número de átomos em SAT?
- isto é, resolver vs. decidir.
- Resolver: Calcular tal que .
- Decidir: Verificar se .
Expressividade
- No Labirinto do Minotauro, como descrever um labirinto com salas?
- Em geral, quantas regras de dedução são necessárias?
Objetos e Relações (antevisão)
- .
- .
Exercícios de Lógica Proposicional
Estes exercícios foram copiados e/ou inspirados nas seguintes obras:
- Lógica e Aritmética de Augusto Franco de Oliveira.
- forallχ de P. D. Magnus.
- Logic in Computer Science de Michael Huth e Mark Ryan.
- Artificial Intelligence, A Modern Approach de Stuart Russell e Peter Norvig.
- Mathematics for Computer Science: Course Textbook de Eric Lehman, F Thomson Leighton e Albert R Meyer.
Sistemas Formais
Exercício 1 O que se passa aqui?
- Identifique rigorosamente e explique os erros nesta prova errada.
- Em que condições é válida a igualdade ?
- Prove (corretamente) que se então .
Exercício 2 O sistema dedutivo (que aparece no livro Gödel, Escher and Bach) é um sistema formal com apenas três símbolos (, , ) um axioma() e quatro regras:
- .
- .
- .
- .
onde e representam expressões arbitrárias.
Uma prova é uma sequência finitas de expressões em que cada é ou um axioma ou resulta de alguma expressão anterior por aplicação de uma das regras.
A última expressão de uma prova chama-se teorema.
Mostre que:
- A expressão é um teorema.
- O número de de um teorema nunca é múltiplo de três.
- A expressão , para qualquer , é um teorema.
- Se é um teorema, então é um teorema.
- Se então é teorema.
- A expressão é um teorema para qualquer que não seja múltiplo de três.
- Uma expressão é teorema de se e só se é da forma em que é uma expressão formada só por e e onde o número de não é múltiplo de três.
Formalização de Linguagem Natural
Exercício 3 Quais das seguintes frases são proposições no sentido lógico?
- Portugal é mais pequeno que Espanha.
- O Porto fica ao sul de Coimbra.
- O Porto fica ao sul de Coimbra?
- O Porto e Coimbra.
- O Porto ou Coimbra, mas Lisboa não.
- Chove no Porto ou em Coimbra, mas em Lisboa não.
- O número atómico do hélio é 2.
- O número atómico do hélio é .
- Aquece o café!
- Brrr! Que frio está este café!
- Café frio é repugnante.
- Demora o tempo que precisares.
- Esta é a última alínea.
- Esta é a última alínea.
Exercício 4 Use a simbolização dada para traduzir as frases abaixo para a lógica proposicional.
- : O Sr. Aas foi assassinado.
- : O culpado é o mordomo.
- : O culpado é o cozinheiro.
- : A duquesa mente.
- : O Sr. Hoek foi assassinado.
- : A arma do crime é uma frigideira.
- Ou o Sr. Aas ou o Sr. Hoek foi assassinado.
- Se o Sr. Aas foi assassinado, o culpado é o cozinheiro.
- Se o Sr. Hoek foi assassinado, o culpado não é o cozinheiro.
- Ou o culpado é o mordomo ou a duquesa mente.
- O culpado é o cozinheiro só se a duquesa mente.
- Se a arma do crime for uma frigideira, então o crime deve ter sido cometido pelo cozinheiro.
- Se a arma do crime não for uma frigideira então o culpado é o cozinheiro ou o mordomo.
- O Sr. Aas foi assassinado se e só se o Sr. Hoek não foi assassinado.
- A duquesa está a mentir, a não ser que o o Sr. Hoek tenha sido assassinado.
- Se o Sr. Aas foi assassinado, a arma do crime foi uma frigideira.
- Como o culpado é o cozinheiro, o mordomo está inocente.
- Claro que a duquesa está a mentir!
Fórmulas Proposicionais
Exercício 5 Tendo em conta as convenções de escrita, desenhe árvores das seguintes proposições.
Dedução Natural
Exercício 6 Faça as seguintes deduções:
Consequência Semântica
Exercício 7 Três indivíduos, , e , suspeitos de um crime, prestam os seguintes depoimentos:
- : é culpado, mas é inocente.
- : Se é culpado, então é culpado.
- : Eu estou inocente, mas um dos outros dois é culpado.
- Os três depoimentos são compatíveis (isto é, podem ser todos simultaneamente válidos)?
- Algum dos depoimentos é consequência dos outros dois?
- Construa provas correspondentes à alínea anterior.
- Supondo que os três suspeitos são inocentes, quem mentiu?
- Supondo que todos dizem a verdade, quem é inocente e quem é culpado?
- Supondo que os inocentes dizem a verdade e os culpados mentem, quem é inocente e quem é culpado?
Exercício 8 Para cada uma das proposições seguintes, indique se é uma tautologia, contradição, contingente ou compatível. Justifique a sua resposta com uma tabela de verdade completa ou parcial, conforme necessário.
Exercício 9 Para cada um dos pares seguintes, indique se as proposições são equivalentes. Justifique a sua resposta com uma tabela de verdade completa ou parcial, conforme necessário.
Exercício 10 Determine quais dos seguintes conjuntos de proposições são consistentes. Justifique a sua resposta com uma tabela de verdade completa ou parcial, conforme necessário.
Exercício 11 Determine quais das seguintes consequências estão corretas. Justifique a sua resposta com uma tabela de verdade completa ou parcial, conforme necessário.
Exercício 12 Responda a cada uma das questões seguintes, justificando a sua resposta.
- Suponha que e são (semanticamente) equivalentes (). O que pode dizer sobre ?
- Suponha que é contingente. O que pode dizer sobre ?
- Suponha que é inconsistente. O que pode dizer sobre ?
- Suponha que é uma contradição. O que pode dizer sobre ?
- Suponha que é uma tautologia. O que pode dizer sobre ?
- Suponha que e são equivalentes. O que pode dizer sobre ?
- Suponha que e não são equivalentes. O que pode dizer sobre ?
Exercício 13 Quantas operações booleanas com dois argumentos existem? Quais são (construa as respetivas tabelas)? Em geral, quantas operações booleanas com argumentos existem?
Exercício 14 A linguagem da lógica proposicional usa os conectivos primitivos e e define e como abreviaturas de certas expressões que usam apenas os conectivos primitivos.
Já foi visto que pelo que pode perder o estatuto de conectivo primitivo e ser definido como uma abreviatura de . Como também então os conectivos e são suficientes como conectivos primitivos, dispensando e .
A tabela abaixo define alguns conectivos menos comuns. Verifique se algum é suficiente para definir todos os conectivos binários como abreviaturas.
Exercício 15 Verifique que as seguintes conclusões estão erradas, mostrando uma valoração em que as hipóteses são verdadeiras mas a conclusão é falsa.
Exercício 16 Para cada uma das seguintes conclusões erradas, encontre uma interpretação em linguagem natural dos símbolos onde as premissas são verdadeiras mas as conclusões falsas.
Exercício 17 Construa fórmulas para as funções e na FNC e na FND com base na seguinte tabela:
Aplicações
Exercício 18.
Suponha que Teseu percorreu o seguinte caminho até à situação na figura e recolheu as perceções "nada" em , uma brisa em e fedor (mau cheiro) em . A anotação "" significa posição segura (ie Teseu sabe que não tem nem o Minotauro nem um poço). Agora Teseu interroga-se sobre as posições adjacentes e .
- Construa todos os mundos possíveis para as posições adjacentes, isto é todas as valorações sobre o conteúdo conjunto das posições e compatíveis com as regras do Labirinto do Minotauro (deve encontrar 32).
- Assinale os casos consistentes com as perceções de Teseu.
- Assinale os casos em que são verdadeiras e .
- Conclua que o Minotauro está em , está um poço em e que é segura.
Se representar por (Base de Conhecimento) as proposições que descrevem as perceções e os mundos possíveis, mostrou que e portanto descobriu que o Minotauro está em , um poço em e que a posição é segura.
Exercício 19
O Minesweeper é um jogo bem conhecido. O mundo é uma grelha retangular com casas e minas espalhadas ao acaso. Cada casa pode ser sondada e o resultado é morte se estiver uma mina nessa casa ou, se não estiver uma mina na casa sondada, o número de minas nas casas adjacentes (incluindo as diagonais).
- Represente por o facto "está uma mina na posição ". Escreva "estão exatamente duas minas adjacentes a " usando uma proposição com os conectivos e átomos .
- Generalize a alínea anterior para construir uma proposição na FNC que afirme que (das ) casas adjacentes têm minas.
Lógica de Primeira Ordem
A Lógica de Primeira Ordem (LPO) mantém a Lógica Proposicional e desenvolve-a de forma a ser possível identificar objetos individuais e como se relacionam.
O domínio é povoado por objetos e descrito pelas suas relações.
- Objetivo: Ultrapassar os limites expressivos da lógica proposicional.
- Plano: Aumentar a sintaxe com objetos, funções, relações, variáveis e quantificadores.
- Adaptar: As regras da dedução natural e as valorações têm de ser revistas.
- Utilizar: A nova linguagem permite expandir e sofisticar a descrição e tratamento de problemas.
Domínio
Um domínio é uma área de conhecimento, um sistema informático, um jogo ou puzzle, um sistema físico, etc.
Um certo domínio é caraterizado por:
- Objetos por exemplo, números, listas ou pessoas.
- Relações específicas entre os objetos desse domínio. Por exemplo "maior", "vazia" ou "descendente".
- Regras específicas para as relações. Por exemplo, "a soma de dois números positivos é maior que esses números", "juntar duas listas vazias produz uma lista vazia" ou "cada pessoa tem dois ascendentes".
A Lógica de Primeira Ordem proporciona uma base formal para descrever rigorosamente muitos domínios importantes.
Porque é que a Lógica Proposicional não é suficiente?
No Labirinto do Minotauro foram assinalados alguns limites da Lógica Proposicional. Por exemplo, não é possível usar a LP para afirmar "cada sala tem quanto muito um poço" nem fazer uma descrição geral de um labirinto com salas.
A solução para ultrapassar esta limitação da Lógica Proposicional consiste em fazer proposições mais "ricas", que permitam identificar "objetos" individuais, como as salas do labirinto, e as diferentes formas como esses objetos se "relacionam", como ou .
Sintaxe da Lógica de Primeira Ordem
A sintaxe da Lógica de Primeira Ordem mantém os conectivos da Lógica Proposicional e adiciona termos para designar objetos e fórmulas para representar relações entre esses objetos.
A sintaxe e as regras da Dedução Natural Proposicional continuam válidas.
- São acrescentados termos: constantes, funções e variáveis.
- As fórmulas acrescentam relações e quantificadores às proposições.
Por enquanto definem-se todos estes conceitos novos. Mais tarde são tratadas as regras de dedução e da semântica para a Lógica de Primeira Ordem.
Termos e Fórmulas
- Os termos são definidos por constantes, funções e por variáveis; Identificam objetos.
- As fórmulas são definidas por relações, conectivos e expressões com quantificadores. Tal como as proposições da Lógica Proposicional, descrevem factos.
Termos
Definição (Termo)
Sejam conjuntos de símbolos (para as variáveis, as constantes e as funções, respetivamente). São termos:
- Átomos. Qualquer constante de e qualquer variável de .
- Funções. Se e forem termos então é um termo.
Um termo em que não ocorrem variáveis diz-se fechado. Caso contrário diz-se aberto.
Em geral, a aridade faz parte da especificação de cada símbolo funcional (e a seguir de cada ). Quando necessário indica-se a aridade com um indice — é binária, é -ária, etc.
Exemplos. Termos
- Átomos: , , , , .
- Funções: , , , , .
Não são termos:
- é uma expressão infinita.
- é uma proposição (verdade/falso).
- é uma proposição.
- é um símbolo funcional mas a expressão não está completa.
Fórmulas
Definição (Fórmula)
Sejam como na definição de termos e um conjunto de símbolos de relações. São fórmulas:
- Igualdade. Se forem termos, é uma fórmula.
- Conectivos. Se forem fórmulas, são fórmulas.
- Relações. Se forem termos e então é uma fórmula.
- Quantificadores. Se for uma variável e uma fórmula, e são fórmulas.
Exemplos. Fórmulas
- Igualdade. , , .
- Conectivos. .
- Relações. .
- Quantificadores. .
Não são fórmulas:
- , , , porque são termos.
- , , são símbolos relacionais mas as expressões estão incompletas.
- é um erro de sintaxe. Se quisermos dizer "Dois é um número par maior que quarto" devemos escrever .
- é uma expressão infinita.
Sobre a Igualdade
- Um uso da igualdade é nas formação de fórmulas, por exemplo, .
- Outro uso é quando comparamos as expressões "" e "" que são, obviamente, diferentes.
- Quando for necessário distinguir o primeiro caso do segundo, usa-se a notação (dois "") para indicar a igualdade de expressões.
Escrita natural e Escrita formal
A escrita natural de termos e fórmulas comuns é diferente, mas equivalente, à sua escrita formal.
Nesta tabela estão várias expressões apresentadas na escrita natural usadas no dia-a-dia e a respetiva notação formal que segue as definições de termo e de fórmula.
Tratamento das Variáveis
As variáveis são uma das novidades da Lógica de Primeira Ordem em relação à Lógica Proposicional. Embora intuitivamente comuns, nos termos formais há uma série de cuidados necessários com as variáveis.
Ocorrências Ligadas e Ocorrências Livres
- A definição de fórmula (de primeira ordem) não é simples.
- Envolve relações, conectivos, e termos que, por sua vez são baseados em constantes, variáveis e funções.
- As variáveis têm um papel especial e delicado.
Intuitivamente, o papel da variável na fórmula é simples de entender. Assim como em . Mas em casos mais complexos, como , há influências entre e .
Essas influências podem ter consequências indesejadas pelo que é necessário descrever e lidar com essas influências.
Definição (Ocorrência Ligada e Ocorrência Livre)
Numa fórmula ou qualquer ocorrência de em diz-se ligada. As ocorrências não ligadas dizem-se livres.
Exemplo. Ocorrências Ligadas e Ocorrências Livres
Nesta lista de fórmulas as ocorrências livres estão assinaladas desta forma "" e as ligadas desta "".
Nota. Uma variável pode ocorrer livre e ligada numa fórmula — a classificação "livre/ligada" diz respeito a cada ocorrência de cada variável.
Há uma analogia entre as fórmulas com ocorrências ligadas e os somatórios.
Intuitivamente, uma ocorrência ligada pode ser sintaticamente trocada por outra:
Tal como em expressões mais comuns, envolvendo somatórios:
Condições e Parâmetros
- Uma ocorrência livre condiciona a variável. Na fórmula a variável ocorre livre e essa ocorrência condiciona os valores que pode ter.
- Considerando a fórmula, a ocorrência da variável livre parametriza a fórmula. Para ser verdadeira é necessário que seja um número par.
Definição (Condição, Parâmetro)
Quando a variável ocorre livre na fórmula diz-se que é uma condição em ou que é um parâmetro de e escreve-se
Nota. A expressão "" não é uma fórmula; "" é que é.
- A escrita "" indica que está condicionada por ou seja, é parametrizada por .
- Quando não ocorre livre em então não condiciona .
- Mas, por exemplo, a fórmula condiciona ; tem de ser positivo.
Exemplo. Condições e Parâmetros
- .
- .
- .
- .
- .
Substituição
Uma variável pode ser intuitivamente interpretada como uma "marca" a ser substituida por um valor.
Na fórmula a variável representa um valor arbitrário ou desconhecido. Por exemplo, se " tiver o valor ", então a fórmula passa a que, na aritmética, é "verdade".
Interessa formalizar esta "transformação" de em , substituindo a variável pelo termo .
Definição (Substituição)
Sejam uma fórmula, uma variável e um termo.
A substituição em de por , escrita , é a fórmula que se obtém substituindo em todas as ocorrências livres de por .
Se não ocorre livre em então . Isto é, a substituição "não teve efeito". Aqui é usada a "igualdade de expressões", , para mostrar que e são sintaticamente a mesma fórmula; os mesmos símbolos, a mesma estrutura, nas mesmas posições.
Exemplos. Substituição
- :
- é .
- é — porque não é livre.
- :
- é — Cuidado!
- é .
- :
- é .
- é .
Efeitos Indesejados das Substituições
Na aritmética, a fórmula é verdadeira: dado um número qualquer, existe outro número maior. Se fazendo, por exemplo, mostra que existe um número maior que esse .
Isto sugere que na fórmula pode-se substituir a variável por outro termo qualquer. E em geral, é verdade.
- Substituindo obtém-se que é verdade: basta escolher .
Sem cuidado na substituição podem resultar efeitos inesperados ou indesejados.
- Substituirmos obtém-se , que é uma fórmula falsa: nenhum número é menor que ele próprio!
Interessa distinguir as substituições "inócuas" das que provocam estes efeitos inesperados ou até indesejados.
Definição (Variável Afetada, Termo Livre)
Sejam uma fórmula e uma variável em .
- Variável Afetada. A variável é afetada por em , ou afeta em , se, em , há uma ocorrência livre de numa sub-fórmula de da forma ou .
- Termo Livre. O termo é livre para em se nenhuma variável de afeta em .
Isto é:
- A variável não afeta em se
- Em nenhuma sub-fórmula de da forma ou a variável ocorre livre.
- O termo não é livre para em se tem uma variável que afeta . Isto é, se:
- A variável ocorre em e
- Numa sub-fórmula ou de há uma ocorrência livre de .
Critérios Simples para Termos Livres/Não Livres
Estas definições envolvem uma fórmula e duas variáveis e são um pouco confusas.
Sejam uma fórmula e uma variável em . Um termo é livre para se:
- Não ocorrem variáveis em — isto é, se é fechado.
- Não existem variáveis comuns entre e .
- Nenhuma variável de está quantificada em .
- Onde as variáveis de estão quantificada em , não ocorre .
Um termo não é livre para em
Exemplos. Termo livre/não livre
Seja a fórmula — é livre, ligada e afeta .
- O termo é livre para porque e não têm variáveis comuns.
- Nenhuma variável do termo está quantificada em . Portanto é livre para em .
- não é livre para porque afeta ; é a fórmula .
- Pela mesma razão, o termo não é livre para em ; Substituindo em produz a fórmula .
Nota. Com e obtêm-se condições em e mas não com nem com .
Dedução Natural de Primeira Ordem
As fórmulas da LPO estendem as proposições.
Há quatro tipos de fórmulas: igualdades, conectivos, relações e quantificadores.
- As regras dos conectivos são as da lógica proposicional.
- As regras das relações são específicas de cada domínio.
- As regras da igualdade e dos quantificadores são independentes do domínio.
Dado que as conectivos têm as regras da lógica proposicional e as regras para as relações dependem de cada domínio, restam as regras de dedução da igualdade e dos quantificadores
Continua-se a usar:
- As regras da DNP.
- O símbolo .
- As provas em tabela.
Vão-se acrescentar:
- Regras para a igualdade e para os quantificadores.
Quantificador Universal
Intuitivamente é uma conjunção:
Analogamente, é uma soma:
Portanto, as regras para o quantificador universal estão relacionadas com as regras da conjunção: e .
Eliminação do Quantificador Universal
Eliminação do Quantificador Universal ()
ou desde de que seja livre para em .
Notas sobre a regra
- A regra generaliza as duas regras e .
- O termo tem de ser livre para em .
Exemplo. Eliminação do Quantificador Universal
Para qualquer termo fechado , .
Linha | Fórmula | Regra | Hipóteses |
---|---|---|---|
1 | |||
2 | |||
3 | e fechado | ||
4 | 2, 3 |
- Como é fechado não ocorrem variáveis em logo este é livre para em .
- A regra permite na linha 3.
Analogia
Se "Todos os alentejanos são portugueses" e "O João é alentejano" então "O João é português".
Exemplo. Eliminação do Quantificador Universal
Se não ocorre em então .
Linha | Fórmula | Regra | Hipóteses |
---|---|---|---|
1 | |||
2 | e fechado |
- A regra permite escolher qualquer termo fechado, onde não ocorrem variáveis.
- Na linha 2, é porque não ocorre em
Introdução do Quantificador Universal
Introdução do Quantificador Universal ()
ou desde que a variável não ocorra fora da sub-prova nem em hipóteses ativas.
A sub-prova e a variável são descartadas com a aplicação da regra.
Exemplo. Introdução do Quantificador Universal
Se não ocorre em então .
Linha | Fórmula | Regra | Hipóteses |
---|---|---|---|
1 | (2) nova | ||
2 | 1 - 1 |
O truque está em escolher uma variável "nova", . Portanto essa variável não ocorre em . Além disso, também
Analogias
- Se então também .
- Como não ocorre em , substituir por em resulta em .
Exemplo. Aplicação incorreta de
Linha | Fórmula | Regra | Hipóteses |
---|---|---|---|
1 | |||
2 | 1 | ||
3 | 2 - 2 | ||
4 | 3 - 3 |
Nesta falsa demonstração o erro está na linha 3 porque ocorre fora da sub-prova 2 - 2.
Analogia: Ilustração intuitiva de
Linha | Fórmula | Regra | Hipóteses |
---|---|---|---|
1 | |||
2 | Para qualquer | ||
3 | Definição de |
Quantificador Existencial
Intuitivamente é uma disjunção:
Portanto, as regras para o quantificador existencial estão relacionadas com as regras da disjunção: e .
Eliminação do Quantificador Existencial
Eliminação do Quantificador Existencial ()
ou desde que não ocorra fora da sub-prova. Em particular, não pode ocorrer em .
A sub-prova e a variável são descartadas com a aplicação da regra.
Exemplo. Aplicação incorreta de
Mais à frente é desenvolvido um exemplo de aplicação correta desta regra. O caso seguinte é uma aplicação incorreta.
Linha | Fórmula | Regra | Hipóteses |
---|---|---|---|
1 | |||
2 | |||
3 | 1, 2 - 2 | ||
4 | 2 - 3 |
O erro está na linha 3 porque ocorre fora da sub-prova .
Introdução do Quantificador Existencial
Introdução do Quantificador Existencial ()
ou desde que seja livre para em e não ocorra em .
Excecionalmente nesta regra, de para podem ser substituídas apenas algumas ocorrências de por , não obrigatoriamente todas.
Exemplo. Substituição parcial
Nem todas as ocorrências do termo são substituidas por em
Exemplo. Ilustração intuitiva da regra
Linha | Fórmula | Justificação |
---|---|---|
1 | ||
2 | Seja um dos acima. | |
3 | Definição de |
Exemplo. Aplicação intuitiva das regras e
Linha | Fórmula | Justificação | Linha | Fórmula | Justificação | |
---|---|---|---|---|---|---|
1 | Hipótese | 1 | Hipótese | |||
2 | Seja como acima | 2 | Para qualquer . | |||
3 | Definição de | 3 | Definição de |
Exemplo. Introdução de
Para qualquer termo fechado ,
Linha | Fórmula | Regra | Hipóteses |
---|---|---|---|
1 | |||
2 | |||
3 | 1 | ||
4 | 2, 3 | ||
5 | fechado |
Na linha 4 a variável não ocorre em porque esta resulta de e não ocorre em . Portanto a ocorrência de na linha 5 está correta.
Igualdade
Introdução da Igualdade
Introdução da Igualdade ()
ou onde é um termo fechado (sem variáveis).
Eliminação da Igualdade
Eliminação da Igualdade ()
ou desde que sejam livres para em .
Exemplo Informal: Eliminação da Igualdade
Linha | Fórmula | Justificação |
---|---|---|
1 | ||
2 | satisfaz . Isto é, | |
3 | Aritmética () | |
4 |
Regras Derivadas
Leis de De Morgan
Regras Gerais
Se não ocorre em :
Exemplos de Derivações
Provas com Quantificadores
Exemplo 1
Demonstrar que se não ocorre em então
Uma prova possível é:
Linha | Fórmula | Regra | Hipóteses |
---|---|---|---|
1 | |||
? |
Linha | Fórmula | Regra | Hipóteses | Observação |
---|---|---|---|---|
1 | ||||
2 | 1 | variável nova portanto livre para em ; . | ||
? |
Linha | Fórmula | Regra | Hipóteses |
---|---|---|---|
1 | |||
2 | 1 | ||
3 | 2 | ||
? |
Linha | Fórmula | Regra | Hipóteses | Observação |
---|---|---|---|---|
1 | ||||
2 | 1 (4) | Descarte de . | ||
3 | 2 | |||
4 | 2 - 3 | |||
? |
Linha | Fórmula | Regra | Hipóteses | Observação |
---|---|---|---|---|
1 | ||||
2 | 1 (4) | |||
3 | 2 | |||
4 | 2 - 3 | |||
5 | 1 | nova portanto livre para em ; . | ||
? |
Linha | Fórmula | Regra | Hipóteses |
---|---|---|---|
1 | |||
2 | 1 (4) | ||
3 | 2 | ||
4 | 2 - 3 | ||
5 | 1 | ||
6 | 5 | ||
? |
Linha | Fórmula | Regra | Hipóteses |
---|---|---|---|
1 | |||
2 | 1 (4) | ||
3 | 2 | ||
4 | 2 - 3 | ||
5 | 1 | ||
6 | 5 | ||
7 | 6, 4 |
Exemplo 2
Demonstrar que se não ocorre em então
Uma prova possível é:
Linha | Fórmula | Regra | Hipóteses | Observação |
---|---|---|---|---|
1 | ||||
2 | 1 | |||
3 | 1 | |||
4 | 3 | nova; . | ||
5 | 2, 4 | |||
6 | 2 - 5 | ; não ocorre aqui. |
Provas com Quantificadores
Exemplo 3
Demonstrar que se não ocorre em então
Linha | Fórmula | Regra | Hipóteses | Observação |
---|---|---|---|---|
1 | ||||
Caso 1 de 1. | ||||
2 | (10) | |||
3 | 2 | nova. | ||
4 | 3 | livre para em ; . | ||
Caso 2 de 1. | ||||
5 | (10) | |||
Caso genérico de 5. | ||||
6 | (9) | nova logo livre para em ; . | ||
7 | 6 | |||
8 | 7 | ; não ocorre aqui. | ||
9 | 5, 6 - 8 | não ocorre aqui. | ||
10 | 1, 2-4, 5-9 |
Exemplo 4
Demonstrar que se não ocorre em então
Linha | Fórmula | Regra | Hipóteses | Observação |
---|---|---|---|---|
1 | ||||
2 | 1 | nova; ; descarte : (9) | ||
3 | (8) | Caso 1 de 2. | ||
4 | 3 | não ocorre aqui. | ||
5 | (8) | Caso 2 de 2. | ||
livre para em ; | ||||
6 | 5 | ; não ocorre aqui. | ||
7 | 6 | |||
8 | 2, 3 - 4, 5 - 7 | |||
9 | 1, 2 - 8 |
Provas com Igualdade
Exemplo 5
Se é um termo fechado, .
Linha | Fórmula | Regra | Hipóteses | Observação |
---|---|---|---|---|
1 | é fechado | |||
2 | 1 | parcial. |
- Na linha 1, o termo é fechado, isto é, não tem variáveis. Além disso: seja a fórmula . O termo é livre para em e não ocorre em . Estas são as condições para a regra .
- A linha 2 resulta de substituir parcialmente por , de em .
Além disso, nesta prova não surgem hipóteses. A primeira linha resulta da regra , que não tem hipóteses.
Exemplo 6
Demonstrar que (simetria).
Linha | Fórmula | Regra | Hipóteses | Observação |
---|---|---|---|---|
1 | novas; (:4 :5 :6) | |||
Seja a fórmula . | ||||
2 | ||||
3 | 2, 1 | |||
4 | não descartadas. | |||
5 | 4 | não ocorre em 4; descartada. | ||
6 | 5 | não ocorre em 5; descartada. |
Vejamos, na linha 3, a aplicação da regra (usando em vez de ) desde que sejam livres para em
A fórmula usada nesta prova é . Porquê?
- A substituição , na linha 3, tem de ser para ficar na linha 4.
- Portanto, escolhe-se fazendo a substituição "inversa" na fórmula "alvo":
- Agora é que resulta da regra na linha 2.
Portanto, fazendo a fórmula :
- A hipótese na linha 1 é a hipótese da regra .
- Na linha 2 fica que é , a segunda hipótese da regra .
- Na linha 3 fica que é , a conclusão da regra com hipóteses em 1 e 2.
Consequência Sintática de Primeira Ordem
A consequência sintática de primeira ordem é uma simples extensão da consequência sintática proposicional, com as regras de introdução e eliminação dos quantificadores e da igualdade.
De resto,
- Uma prova é uma sequência de fórmulas em que cada fórmula ou é uma hipótese ou resulta das anteriores por aplicação de uma regra.
- A expressão significa que existe uma prova da conclusão com hipóteses em .
Porém, o facto da linguagem da lógica de primeira ordem ser substancialmente mais rica do que da lógica proposicional obriga a cuidados especiais com as variáveis: se foram descartadas ou se estão livres para substituições.
Semântica de Primeira Ordem
Como definir valores booleanos das fórmulas da lógica de primeira ordem?
Vai-se generalizar as valorações dos átomos proposicionais aos novos elementos da lógica de primeira ordem: termos, funções, relações e fórmulas.
Para a lógica de primeira ordem, além dos conectivos é necessário considerar o que significa (isto é interpretar):
- Cada termo: constantes, variáveis e funções.
- Cada fórmula: a igualdade, as relações, os quantificadores.
Aos átomos da lógica proposicional correspondem, na lógica de primeira ordem, as relações e a igualdade.
Portanto, a consequência semântica de primeira ordem, assenta:
- Na interpretação dos termos.
- Na interpretação das relações, incluindo a igualdade.
- Nos quantificadores.
Interpretação
As interpretações são para a LPO o análogo das valorações da LP: definem o valor das fórmulas. Porém, enquanto que na LP "bastava" valorar proposições, na LPO é preciso interpretar fórmulas e termos.
A interpretação dos termos não pode ficar limitada a simples valores booleanos: os termos aritméticos representam muito mais do que dois valores.
A solução para este problema consiste em interpretar os termos como representações de elementos de um certo universo.
Com este passo resolvido, também as relações formais passam a ser interpretadas em relação a esse universo. Por exemplo a fórmula pode ser interpretada no universo dos números naturais e, nesse universo, tem um certo valor booleano.
Interpretação de Símbolos
Definição (Interpretação - parte 1)
Sejam como nas definições de termo e de fórmula.
Seja um conjunto não vazio, o universo. Uma interpretação (de ) em define:
- Constantes. Para cada , um elemento
- Variáveis. Para cada , um elemento
- Funções. Para cada , uma função
- Igualdade. A relação de igualdade em , , é o conjunto
- Relações. Para cada , um subconjunto
Relações e Conjuntos
O que significa dizer " é o conjunto " e o que é que isto tem a ver com a igualdade?
Voltando ao exemplo da aritmética.
Primeiro. A relação "" nos números naturais . O que significa ""?
Significa que e têm, em conjunto, uma "caraterística" em comum com outros pares de números, como e ou e mas que outros pares de números, como e ou e , não têm essa "caraterística".
Ou seja inclui certos pares de números, como , e exclui outros pares, como .
Outra forma de dizer isto: A relação é o conjunto:
Em geral, para saber se basta ver se . Isto é:
Uma relação binária é o mesmo que um conjunto de pares ordenados.
Segundo. Que conjunto de pares ordenados define a relação de igualdade?
Isto é, qual é o conjunto tal que: e a resposta é
Em geral, para um conjunto qualquer,
A relação de igualdade no conjunto é o conjunto de pares ordenados.
Terceiro. Como caso particular, para um domínio a relação de igualdade é definida por
Explicitação ()
Vai ser frequentemente necessário indicar explicitamente (ou fixar) a interpretação de uma certa variável-
Definição (Explicitação, )
A explicitação da variável em para a interpretação , representa-se por e denota a seguinte interpretação , obtida a partir de : isto é
Interpretação de Termos
Definição (Interpretação - parte 2)
Dado uma interpretação de no universo , a interpretação do termo , escrita , é:
-
Constante ou Variável. Se então já está definida na parte 1.
-
Função. Se em que e são termos então
Isto é, para interpretar um termo como "" nos números naturais é preciso:
- Interpretar os sub-termos "" e "". Obtém-se, por exemplo, e .
- Interpretar o símbolo functional "". Obtém-se, por exemplo, a função .
Portanto a fórmula é interpretada como a expressão aritmética (em escrita formal) que, usando as regras comuns, resulta em .
Exemplos
Domínio "Senhor dos Anéis"
-
O universo é .
-
As constantes .
-
A relação é o conjunto dos Elfos. Por exemplo, significa que é uma Elfo.
-
A relação indica quando duas personagens estiveram do mesmo lado numa batalha. Por exemplo, .
Neste universo não se pode definir a função para a proveniência duma personagem. Por exemplo, seria desejável escrever . Esta limitação pode ser ultrapassada estendendo o universo com objetos adequados.
Por exemplo,
Domínio "Labirinto do Minotauro"
-
O universo é .
-
As constantes .
-
A relação é o conjunto das salas onde está o(um) Minotauro. Por exemplo, significa que o(um) Minotauro está na sala .
-
A relação indica quando duas salas são adjacentes. Por exemplo, .
Neste universo não se pode definir a função para se obter a coluna duma sala. Por exemplo, seria desejável escrever . Esta limitação pode ser ultrapassada se estendermos o universo com objetos adequados.
Por exemplo,
Interpretações do "SdA" e do "LdM"
Sejam e duas interpretações: e para, respetivamente, os domínios "Senhor dos Anéis" e "Labirinto do Minotauro".
- A mesma constante, tem interpretações diferentes, conforme o universo:
- .
- O que significa ?
- No SdA: "Sauron é um Elfo" (não é!).
- No LdM, "(Um? O?) Minotauro está na sala 12" (pode estar... depende do estado do labirinto).
A Lógica de Primeira Ordem permite descrever domínios muito diferentes, não só de fantasia.
- Não basta descrever, é necessário aplicar o sistema formal para estudar o domínio que, muitas vezes é intangível por ser fantasia, distante como Marte, prejudicial como uma zona radioactiva, caro, perigoso, abstrato, etc.
- Além das conclusões, via Dedução Natural, também importa a consequência semântica: usar interpretações para atribuir valores booleanos a fórmulas.
Consequência Semântica de Primeira Ordem
- Intuitivamente a interpretação (por ) de uma fórmula como corresponde a afirmar que para cada elemento do universo .
- Há um problema técnico em exprimir rigorosamente o que acontece às variáveis. Não se pode escrever porque, não é um símbolo lógico (mas um elemento do universo da interpretação) portanto não pode ocorrer numa fórmula.
- É necessário um tratamento especial para as variáveis, usando a explicitação das interpretações.
Consequência Semântica
Definição (Modelo, )
Dada uma interpretação de no universo , diz-se que a fórmula é verdade em , que satisfaz ou que é modelo de , e escreve-se , de acordo com o tipo de :
- Igualdade. se .
- Relação. se .
- Universal. se para cada , .
- Existencial. se existe tal que .
Seja um conjunto de fórmulas. Então diz-se que é modelo de e escreve-se se para cada . Nesse caso também se diz que é consistente.
Definição (Tipos de Fórmulas)
Seja um conjunto (possivelmente infinito) de fórmulas e uma fórmula. Diz-se que:
- Consequência. A fórmula é consequência de e escreve-se , se cada modelo de também é modelo de , isto é, se então .
- Compatível, Satisfazível. A fórmula é compatível ou satisfazível se tem um modelo (existe tal que ).
- Válida, Tautologia. A fórmula é válida ou uma tautologia se qualquer interpretação é modelo ( para qualquer ). Nesse caso escreve-se .
Nota. Abuso da notação
O símbolo é usado com vários significados distintos:
- : Uma interpretação e uma proposição.
- : Uma interpretação e um conjunto de proposições.
- : Um conjunto de proposições e uma proposição.
- : Uma proposição.
Verificação de Modelos
Os Amigos de Gandalf
Como verificar se uma interpretação é modelo de uma fórmula com quantificadores universais?
Sejam
- Constantes: ,
- Relações: ,
Dada a seguinte interpretação daqueles símbolos em :
Será que satisfaz "Nenhum dos amigos dos amigos de Gandalf é amigo dele"?
Para verificar se listam-se os todos possíveis valores de :
O que a primeira linha mostra é que, fazendo e então a fórmula é falsa:
Como uma das explicitações de não é verdade em então
Computação
Problemas Computacionais da Lógica de Primeira Ordem
Em relação à lógica proposicional, aqui apenas se substitui "proposição" por "fórmula" e "valoração" por "interpretação".
Definição (SAT)
O problema da satisfação (SAT) consiste no conjunto de pares em que é uma fórmula e um valor booleano tal que
Isto é, Determinar se uma fórmula dada tem algum modelo.
Nos tipos de fórmulas, uma fórmula que tenha algum modelo é compatível ou satisfazível.
Definição (Validade)
O problema da validade consiste no conjunto de pares em que é uma fórmula e um valor booleano tal que
Isto é, Determinar se uma fórmula dada é válida.
Nos tipos de fórmulas, para uma fórmula válida (tautologia) todas as interpretações são modelos.
Definição (Provabilidade)
O problema da provabilidade consiste no conjunto de pares em que é uma fórmula e um valor booleano tal que
Isto é, Determinar se uma fórmula dada tem uma prova.
Um teorema é uma fórmula que tem uma prova (sem hipóteses).
(In)Decidibilidade
Na lógica de primeira ordem o problema SAT é indecidível.
- Na lógica proposicional, existe um algoritmo (não eficiente) que decide se uma proposição é, ou não, satisfazível.
- Na lógica de primeira ordem nenhum algoritmo decide, em geral, se uma fórmula é, ou não, satisfazível.
- Ao contrário do problema SAT proposicional, em que não se sabe se existe um algoritmo eficiente, sobre o SAT de primeira ordem sabe-se que não existe um algorimo, eficiente ou não.
Demonstrar estas afirmações está fora do âmbito desta disciplina.
- Conhecem-se algoritmos para SAT em classes grandes de fórmulas, mas nenhum tem toda a generalidade.
- Este assunto é referido na página do Post Correspondence Problem na wikipedia.
Verificação por Modelos
- A maior expressividade da Lógica de Primeira Ordem em relação à Lógica Proposicional sacrifica a decidibilidade de SAT.
- Ainda assim, As Amigos de Gandalf mostram que com a verificação de modelos é possível resolver problemas práticos de modelação.
Exemplos
- As Árvores Genealógicas ilustram uma aplicação simples da formalização e dedução de primeira ordem.
- Os Números, Conjuntos e Listas formalizam domínios de aplicações reais.
Árvores Genealógicas
Linguagem das Árvores Genealógicas
Este domínio inclui factos como "Zeus é o pai de Atenas" e regras como "A avó de uma dada pessoa é a mãe de um progenitor dessa pessoa".
- Os termos deste domínio são as pessoas ou os deuses do Olimpo (Para desenjoar de famílias reais).
- Duas relações unárias determinam o sexo:
- As relações familiares são representadas por relações binárias (palavras terminadas em "" são versões neutras):
- Como cada pessoa tem exatamente um pai e uma mãe biológicos usam-se funções:
Veja também:
- O sistema xy para determinar o sexo.
- Substantivos sobrecomuns.
Regras das Árvores Genealógicas
A mãe de uma pessoa é a progenitor feminina.
O marido de uma pessoa é o cônjuge masculino.
Masculino e Feminina são conjuntos complementares.
Progenitor e descendente são relações inversas.
Axiomas, Definições e Teoremas
Os axiomas são as regras "iniciais", que proporcionam o funcionamento básico de um domínio.
- Os axiomas também exprimem factos básicos: Leto é a mãe de Apolo.
- As regras das árvores genealógicas (e mais algumas nos exercícios) formam os axiomas deste domínio.
As definições são axiomas da forma
onde uma relação ( neste caso) tem uma forma equivalente () onde apenas ocorrem expressões "já" definidas.
No domínio das árvores genealógicas as regras assentam apenas nas relações
Algumas afirmações sobre um domínio são teoremas, isto é são deduzidas, via dedução natural, a partir dos axiomas. Por exemplo (exercício):
Números, Conjuntos e Listas
Linguagem dos Números Naturais
Os números naturais são a base da aritmética e de todo o desenvolvimento numérico da matemática, informática, etc.
- Constantes: (Zero).
- Funções: (Sucessor).
- lê-se "o sucessor de ".
- Relações: (Número Natural).
- lê-se " é um número natural".
- Regras (Axiomas de Peano):
- Zero é um número (natural).
- O sucessor de um número é um número.
- Zero não é um sucessor.
- Números diferentes têm sucessores diferentes.
- O Princípio de Indução é de segunda ordem; não pode ser enunciado na lógica de primeira ordem e, portanto, não será usado aqui.
Escrita de números e as operações aritméticas comuns
As definições iniciais são suficientes para toda a aritmética. Normalmente escrevemos expressões como que não fazem parte dessas definições.
Números naturais
Embora só tenha sido definido um número natural, o , os restantes resultam de aplicações sucessivas função : Usa-se "" para indicar que é, por definição, . Também se escreve "" em vez de "":
Em geral também se escreve "" em vez de "".
Operações
As operações comuns da aritmética, soma, produto, subtração e divisão, são definidas a partir de . Por exemplo:
Definição (Soma)
A soma é a função binária definida recursivamente da seguinte forma:
- Base:
- Passo:
Como é comum, escreve-se em vez .
Exemplo.
Fórmula | Observação |
---|---|
escrita informal | |
escrita formal | |
Passo | |
Passo | |
Base | |
escrita informal | |
escrita informal |
Definição (Subtração)
A subtração é a função binária definida a partir da da seguinte forma: Como é comum, escreve-se "" em vez "".
Linguagem dos Conjuntos
"Conjunto" é o conceito matemático mais fundamental. Com conjuntos definem-se relações, funções, e outros objetos como, por exemplo, os números naturais.
- Termos: São de dois tipos, elementos e conjuntos.
- Constantes: lê-se "conjunto vazio".
- Relações:
- Conjunto: ; "" lê-se " é um conjunto".
- Pertence: também se escreve e lê-se " pertence a " ou " é elemento de ".
- Subconjunto: também se escreve e lê-se " está contido em " ou " é sub-conjunto de " ou " contém ".
- Funções:
- Interseção: também se escreve e lê-se "a interseção de com ".
- União: também se escreve e lê-se "a união de com ".
- Inclusão: também se escreve e lê-se "a inclusão de a ".
- Regras:
- Os únicos conjuntos são o vazio e os que resultam de acrescentar um elemento a outro conjunto.
- O vazio não tem elementos.
- Acrescentar um elemento que já está no conjunto não tem efeito.
- Os (únicos) elementos que estão num conjunto (são elementos que) foram incluídos.
O conjunto vazio, , desempenha um papel semelhante ao zero nos números naturais — é a partir de que se formam todos os restantes conjuntos. E, continuando esta analogia, a operação de inclusão é semelhante a sucessor. Por exemplo: Todos estes conjuntos são diferentes:
- O conjunto tem zero elementos.
- O conjunto tem um elemento, o conjunto .
- O conjunto também tem um elemento, . Portanto, como , também porque os respetivos elementos são diferentes.
- Sucessivamente, , etc.
Linguagem das Listas
As listas são uma das estruturas de dados mais utilizadas na informática.
As listas são semelhantes aos conjuntos porque têm elementos. A diferença é que uma lista pode ter elementos repetidos e a ordem conta. Por exemplo:
- Termos: São de dois tipos, elementos e listas.
- Constantes: lê-se lista vazia ou nil.
- Relações:
- Lista: ; "" lê-se " é uma lista".
- Pertence: ; "" lê-se " está em ".
- Funções:
- Construção: ; "" lê-se "construção de com ".
- Acrescentar: ; "" lê-se " acrescentada a ".
- Primeiro: ; "" lê-se "o primeiro de ".
- Restantes: ; "" lê-se "os restantes de ".
- Regras: (versão informal)
- é a lista sem elementos.
- é lista.
- está na lista .
- é a lista que resulta de acrescentar o elemento à frente de . Isto é, se e só se e .
- é a lista que resulta de acrescentar a lista ao fim da lista .
- o primeiro elemento da lista .
- a lista sem o primeiro elemento.
Notação:
- .
- .
- .
Tal como o zero nos números naturais e o conjunto vazio nos conjuntos, também a lista vazia é o termo mais simples, a partir do qual resultam todos os outros. A operação nas listas é análoga a nos números e à inclusão nos conjuntos.
Conclusão
A Lógica de Primeira Ordem é muito mais expressiva do que a Lógica Proposicional.
O uso de termos e relações permite uma escrita mais compacta (os exemplos do LdM) e geral (ainda no LdM)
SAT é insolúvel para a LPO.
Não existe um algoritmo geral para decidir quando uma fórmula tem um modelo.
Há limites aos domínios e relações que a LPO que pode descrever.
- A existência de caminho entre dois vértices de um grafo orientado (Reachability problem na wikipedia) não pode ser expressa por uma fórmula da LPO.
- O Princípio de Indução na Linguagem dos Números Naturais.
Porém, é realizável especificar e verificar modelos de muitas linguagens de primeira ordem.
Aplicações da LPO incluem:
- Estruturas de dados (conjuntos, listas, etc)
- Especificação de Tarefas.
- Representação de Conhecimento.
- Verificação de Programas.
Exercícios de Lógica de Primeira Ordem
Estes exercícios foram copiados e/ou inspirados nas seguintes obras:
- Lógica e Aritmética de Augusto Franco de Oliveira.
- forallχ de P. D. Magnus.
- Logic in Computer Science de Michael Huth e Mark Ryan.
- Artificial Intelligence, A Modern Approach de Stuart Russell e Peter Norvig.
- Mathematics for Computer Science: Course Textbook de Eric Lehman, F Thomson Leighton e Albert R Meyer.
Formalização de Linguagem Natural
Exercício 1 No domínio dos animais, formalize:
- O Aníbal, o Bói e a Certa vivem no Jardim Zoológico.
- Bói é um réptil, mas não é um crocodilo.
- Se Certa gosta do Bói então Bói é um macaco.
- Se Bói e Certa são crocodilos, Aníbal gosta de ambos.
- Alguns répteis vivem no jardim zoológico.
- Todo o crocodilo é um réptil.
- Qualquer animal que viva num jardim zoológico é um macaco ou um crocodilo.
- Alguns répteis não são crocodilos.
- Certa gosta de um réptil.
- Bói gosta de todos os macacos que moram no jardim zoológico.
- Todos os animais de que Aníbal gosta também gostam dele.
- Se algum animal for um réptil, é o Aníbal.
- Se algum animal for um crocodilo, também é um réptil.
- Qualquer animal de que Certa gosta, também Aníbal gosta.
- Há um animal que gosta do Bói mas, infelizmente, o Bói não corresponde.
Exercício 2
Use os símbolos acima para formalizar:
- Bond é um espião, mas nenhum vegetariano é espião.
- Ninguém sabe a combinação do cofre, a não ser que Nell a saiba.
- Nenhum espião sabe a combinação do cofre.
- Nem Bond nem Nell são vegetarianos.
- Nell confia num vegetariano.
- Quem confia em Bond confia num vegetariano.
- Quem confia em Bond confia em alguém que confia num vegetariano.
- Só Nell sabe a combinação do cofre.
- Nell confia em Bond, mas em mais ninguém.
- A pessoa que sabe a combinação do cofre é vegetariano.
- A pessoa que sabe a combinação do cofre não é espião.
Exercício 3 Defina linguagens adequadas, formalize e demonstre:
- Os únicos candidatos são o João e o Alberto. O João e o Alberto são idiotas. Portanto, qualquer candidato é idiota.
- Todo o barbeiro faz a barba das pessoas que não se barbeiam a si próprias. Nenhum barbeiro faz a barba das pessoas que se barbeiam a si próprias. Portanto, não existem barbeiros.
Fórmulas Proposicionais
Exercício 4 Tendo em conta as convenções de escrita, desenhe árvores de análise sintática das seguintes fórmulas:
Exercício 5 Ocorrências Livres e Ligadas
-
Identifique as ocorrências livres e ligadas da variável nas seguintes fórmulas:
-
Indique se as seguintes afirmações são verdadeiras ou falsas:
- Na fórmula , todas as ocorrências de são ligadas.
- Na fórmula , a primeira ocorrência de é livre e a segunda é ligada.
- Na fórmula , a variável não tem ocorrências ligadas.
- Na fórmula , a variável tem uma ocorrência livre.
- Na fórmula , a variável tem uma ocorrência livre.
-
Reescreva as seguintes fórmulas, renomeando as variáveis ligadas para evitar conflitos de nomes:
-
Construa fórmulas da lógica de primeira ordem que satisfaçam as seguintes condições:
- Uma fórmula com duas variáveis livres e uma variável ligada.
- Uma fórmula com uma variável livre e duas variáveis ligadas.
- Uma fórmula com todas as variáveis ligadas.
- Uma fórmula com todas as variáveis livres.
-
Considere a seguinte fórmula:
- Identifique as ocorrências livres e ligadas de e .
- Reescreva a fórmula, renomeando as variáveis ligadas para evitar conflitos de nomes.
- Construa um modelo que satisfaça a fórmula.
-
Identifique os termos livres e não livres na fórmula .
-
Quais dos seguintes termos são livres e quais são não livres na fórmula ?
-
Dada a fórmula , determine se as seguintes afirmações são verdadeiras ou falsas:
- O termo é livre para .
- O termo é não livre para .
- O termo é livre para .
- O termo é não livre para .
-
Construa uma fórmula da lógica de primeira ordem com as seguintes características:
- Contém pelo menos um termo livre e um termo não livre.
- Utiliza as funções e e os predicados e .
Dedução Natural
Exercício 6 Faça as seguintes provas, usando acumulativamente as regras e condições indicadas:
Sejam símbolos relacionais, funcional e termos adequados.
Eliminação Universal:
Introdução Universal: .
Introdução Existencial: .
Eliminação Existencial: .
N.B. abrevia e também abrevia ._
Seja uma fórmula sem variáveis livres e onde não ocorre .
Introdução da Igualdade: .
- Se em não ocorrem variáveis,
Eliminação da Igualdade: .
- .
Consequência Semântica
Exercício 7 Senhor dos Anéis
Use a interpretação acima para determinar das fórmulas seguintes quais são verdadeiras e quais são falsas.
Exercício 8 Alien
Use a interpretação acima para determinar das fórmulas seguintes quais são verdadeiras e quais são falsas.
Exercício 9 Mostre que as seguintes relações estão erradas, construindo interpretações onde as hipóteses são verdadeiras a conclusão falsa:
Aplicações
Exercício 10 Linguagem das Árvores Genealógicas
- Partindo apenas das relações e , defina as restantes relações e funções
- Consulte a árvore genealógica dos deuses gregos nesta página da wikipédia e deduza quem são de , de , e de num sistema lógico adequado (por exemplo, prolog).
Exercício 11 Linguagem dos Conjuntos
Formalize:
- Um conjunto é subconjunto de outro se e só se todos os elementos do primeiro conjunto são elementos do segundo conjunto.
- Dois conjuntos são iguais se e só se cada um é subconjunto do outro.
- Um elemento está na interseção de dois conjuntos se e só se é elemento de ambos os conjuntos.
- Um elemento está na união de dois conjuntos se e só se é elemento de algum dos conjuntos.
Exercício 12 Linguagem das Listas
- Formalize as regras das listas.
Formalize, classifique (compatível, contingente, válida, contradição) justificando formalmente, dê exemplos e contra-exemplos das seguintes afirmações e afirmações:
- e .
- se e só se ou .
- Duas listas são iguais se têm os mesmos elementos nas mesmas posições.
- Defina a função de acordo com as seguintes regras:
- Defina a função comprimento de uma lista, acrescentando a linguagem dos números naturais.
- Mostre que duas listas iguais têm o mesmo comprimento.
- Mostre se existem listas diferentes com o mesmo comprimento (e se no domínio existir só um elemento?).
- Mostre se duas listas que têm os mesmos elementos também têm o mesmo comprimento.
Introdução
Motivação: Verificar o processamento de dados em programas sequenciais.
Método: Baseada em provas; são construídas demonstrações de que o programa verifica as propriedades indicadas.
Automatismo: Semi-automático; alguns passos dessas provas podem ser mecanizados mas outros dependem de supervisão humana — o que frequentemente proporciona boas heurísticas para ajudar o programador.
Âmbito: Certas propriedades formais de um programa; não é feita uma especificação completa do seu comportamento.
Domínio: Os programas sequenciais transformacionais correm num único processador (sequencial, não concorrente); recebem uma entrada e terminam produzindo uma saída (transformacional).
Desenvolvimento: Aplica-se antes do desenvolvimento para formalizar o funcionamento de segmentos críticos de um sistema e durante a implementação a pequenos fragmentos de código que executam uma tarefa identificável (logo especificável);
Racional:
- Melhor documentação. A estrutura lógica de uma especificação formal organiza uma implementação que a verifica.
- Menos tempo de desenvolvimento. As especificações formais reduzem significativamente o tempo gasto na depuração e nos testes. Também contribuem para reduzir erros de planeamento e clarificar os papéis e contributos estruturais das várias componentes de um sistema.
- Refatorização mais simples. Componentes propriamente especificadas e verificadas são mais facilmente reutilizadas e re-implementadas.
- Certificações em auditorias. A prova que um programa está conforme a sua especificação é uma das garantias solicitadas durante a certificação de sistemas críticos.
Especificação de Programas
O processo de verificação formal de um programa começa por uma definição formal da sintaxe dos programas, continua com a respetivas semântica, isto é, as computação e a especificação dos "comportamentos": condições sobre as entradas e os respetivos resultados.
As condições das entradas e resultados são fórmulas de uma lógica de primeira ordem adequada e a verificação é uma prova com regras adequadas à sintaxe do programa.
Programas Sequenciais Transformacionais
O primeiro passo consiste em definir uma linguagem de programação adequada que, essencialmente, é um sub-conjunto das linguagens imperativas comuns (C
, Python
, Rust
).
A formalização de uma linguagem (de programação ou outro uso) é assunto de outra disciplina, não tratado aqui. Resumindo, uma linguagem de programação pode ser definida usando uma gramática independente do contexto.
Definição (Expressão, Instrução, Programa)
Dada a gramática onde representa os números inteiros e as variáveis.
Então:
- Expressão numérica: Uma expressão numérica resulta da variável . As expressões numéricas usam números, variáveis e as funções aritméticas ; São termos na LPO.
- Expressão booleana: Uma expressão booleana resulta da variável . As expressões booleanas podem ser construídas com os conectivos lógicos e com as relações numéricas ; São fórmulas sem quantificadores na LPO.
- Instrução: Uma instrução resulta da variável . Há três tipos de instruções:
- Cópia . O lado esquerdo, , é uma variável e o lado direito, , uma expressão numérica.
- Condição . A guarda é uma expressão booleana e são (sub-)programas, o ramo positivo e o ramo negativo respetivamente.
- Repetição ou Ciclo . A guarda é uma expressão booleana e o corpo um (sub-)programa.
- Programa: Um programa resulta da variável .
- O caso é o programa vazio, sem instruções.
- O caso é uma sequência em que a a seguir à instrução estão as instruções de . Nesta sequência não estão incluídas as instruções dos corpos das repetições nem dos ramos das condições.
Isto é, um programa é uma sequência de instruções, possivelmente vazia. Há três tipos de instruções: cópia, condição e repetição. As expressões numéricas e booleanas são parte dessas instruções.
Esta definição apenas cobre a sintaxe de um programa. Para definir a computação de um programa é necessário um estado que descreva a instrução atual e os valores das variáveis e como os diferentes tipos de instruções comandam a evolução do estado.
Definição (Estado, Valoração, Computação)
Seja um programa com instruções e variáveis .
Estado: Um estado, ou configuração, de é um par em que:
- é o índice da instrução ativa, um número natural positivo.
- é um vetor de números tal que o valor da variável é .
Valoração: Um estado de um programa define o valor das expressões desse programa da seguinte forma:
- Valor numérico: Seja uma expressão numérica. Então é o valor de em e resulta de:
- Substituir as variáveis de pelos respetivos valores em .
- Usar as regras usuais da aritmética para as operações.
- Valor booleano: Seja uma expressão booleana. Então é o valor de em e resulta de:
- Calcular os valores numéricos em .
- Usar as regras usuais das desigualdades e dos conectivos booleanos em .
- Se for diz-se que satisfaz e escreve-se ou simplesmente .
Computação: Uma computação do programa a partir do estado é uma sequência de estados em que resulta de em função da instrução activa de .
- Estado inicial: Em geral é dado. Caso contrário, assume-se que , a instrução ativa é a primeira instrução de e todas as variáveis têm valor .
- Estado seguinte: Seja um estado com instrução ativa (índice) e valores . O estado seguinte, , depende do tipo da instrução ativa:
- Se não existe instrução ativa () o programa termina e é o estado final.
- Cópia
- em que em todas as posições exceto ;
- Condição
- Se seja o estado que resulta da computação de (o ramo positivo) a partir do estado e os valores em . Então .
- Caso contrário, se , seja o estado que resulta da computação de (o ramo negativo) a partir do estado e os valores em . Então .
- Repetição
- (continuação) Se , então .
- Caso contrário, se então seja o estado que resulta da computação de (o corpo) a partir do estado e os valores em :
- (ciclo) Se então .
- (continuação) Caso contrário, se , então .
As definições acima formalizam objetivamente a computação que um programa executa dada uma entrada (o estado inicial) para produzir o respetivo resultado (o estado final).
Exemplo. Computação
Copy
.
Considere-se o programa Copy
:
#![allow(unused)] fn main() { y = 1; if x > y { while y < x { y = y + 1; } } else { while x < y { x = x + 1; } } }
Exercícios:
- Quantas instruções tem este programa? De que tipos?
- Quantos sub-programas?
A computação deste programa no estado inicial (assumindo e ) está ilustrada na seguinte tabela:
Passo | Valores | Instrução () | Instrução (prog) | Observação |
---|---|---|---|---|
1 | 1 | y = 1; | ||
2 | 2 | if x > y { P } else { N } | ||
sub N | ||||
3 | 2 - 1 | while x < y { C } | ||
sub C | ||||
4 | 2 - 1 - 1 | x = x + 1; | ||
2 - 1 - 2 | C termina | |||
5 | 2 - 1 | while x < y { C } | ||
2 - 2 | N termina | |||
3 | Copy termina |
Exercícios:
- Faça a computação para o estado inicial .
- Será que definir o valor de no estado inicial tem algum efeito no estado final?
- Será que este programa garante que o estado final seja qual for o estado inicial?
- Em que casos o valor de não é afetado pelo programa? E o valor de ?
Problema da Paragem
Pode acontecer que uma computação não termine. Por exemplo o programa
#![allow(unused)] fn main() { while true {} }
não termina em qualquer estado inicial. Neste caso a computação é uma sequência infinita de estados e o estado final não está definido.
O Problema da Paragem, apresentado informalmente na secção Gödel e Turing da Consequência Semântica Proposicional, consiste em determinar se existe algum programa que verifique se qualquer programa termina ou não.
Agora, com uma definição formal de "programa", este problema pode ser apresentado com mais rigor.
A ideia é representar cada programa e estado inicial por um número, digamos , e correr no estado inicial .
Essa computação de deve terminar e, no estado final, fica se e só se o programa com estado inicial termina.
O que Turing mostrou é que não existem programas como : nenhum programa resolve o problema da paragem.
Programas Totais e Parciais
Definição (Programa Total, Parcial)
Seja um programa e um estado.
- Se termina (ou converge) no estado como acima escreve-se
- Caso contrário, diverge no estado e escreve-se
Além disso,
- é total se termina qualquer que seja o estado inicial como acima: . Nesse caso escreve-se
- é parcial se não termina com alguns estados iniciais como acima: . Nesse caso escreve-se
Por exemplo o programa
#![allow(unused)] fn main() { while x != y { x = x + 1 } }
termina quando mas não termina se . Portanto é um programa parcial.
Com a definição de programa total e parcial, o problema da paragem pode ser enunciado da seguinte forma:
Problema da Paragem. Existe um programa que classifica corretamente cada programa como total ou parcial?
Nesta formulação estamos a assumir que a entrada dos programas é dada na forma de um número que "codifica" juntamente o programa e o estado inicial.
O problema que se está a tratar aqui é mais "simples": É possível provar que um programa tem um determinado comportamento? Isto é, se a entrada verificar determinadas condições iniciais existe uma prova que o resultado do programa satisfaz as condições finais?
Exemplo. Satisfação de estados iniciais e finais.
Considere-se o seguinte programa e condições sobre os valores das variáveis antes do programa correr e quando termina.
#![allow(unused)] fn main() { y = 0; z = 0; while z != x { z = z + 1; y = y + z; } }
Seja o estado inicial e o estado final.
se, no início | então, quando termina |
---|---|
A ideia é caraterizar o "comportamento" de um programa pelos estados iniciais e finais.
Triplos de Hoare
Pretende-se relacionar uma condição inicial dada e uma condição final obtida por efeito da computação do programa.
Definição (Triplo de Hoare, )
Seja um programa, e fórmulas. Um triplo de Hoare é a expressão e significa que se o programa corre num estado inicial que satisfaz , , então, quando termina o estado final, , satisfaz , .
- A fórmula é a pré-condição do triplo.
- A fórmula é a pós-condição do triplo.
- O programa é o programa do triplo.
As fórmulas e são fórmulas LPO no universo dos números inteiros, com as interpretações usuais dos símbolos .
Além disso:
- Cada variável de é representada da mesma forma em e : é representada por , por , etc.
- As variáveis ligadas de e não ocorrem em .
Notação. A representação usual dos triplos de Hoare é . Aqui usa-se a forma para evitar confusão com a sintaxe dos programas, que usa {}
para delimitar sub-programas, e com a substituição em fórmulas FOL, que usa para substituir as ocorrências da variável pelo termo na fórmula .
Especificação por Triplos de Hoare
Supondo que se pretende que um programa tenha o seguinte comportamento: quando é um número positivo, o programa define como um número cujo quadrado é menor do que :
Isto é, se o programa correr num estado tal que quando termina, no estado que resulta, , tem-se .
Um programa que produza "lixo" quando está de acordo com a especificação, desde que funcione como indicado quando .
Variáveis lógicas e do programa
Há uma associação entre as variáveis lógicas das condições e as variáveis que ocorrem nos programas. Esta associação é necessária mas requer algum cuidado.
Seja Fac1
o seguinte programa
y = 1;
z = 0;
while z != x {
z = z + 1;
y = y * z;
}
O triplo
especifica que, se então Fac1
deve calcular o fatorial de e guardar o resultado em . Neste caso a variável lógica está associada a e a .
Mais adiante vai-se provar que este programa efetivamente calcula o fatorial de .
Agora, seja Fac2
o programa
y = 1;
while x != 0 {
y = y * x;
x = x - 1;
}
Para Fac2
o triplo não funciona porque é transformado pelo programa.
Este problema pode ser resolvido usando uma "variável lógica auxiliar":
- é uma variável lógica universalmente quantificada e que não ocorre em
Fac2
: Para qualquer , . - Como não ocorre em
Fac2
este triplo especifica o comportamento que se pretende: no fim é o fatorial de .
Regras da Verificação de Programas
As regras da verificação de programas estão organizadas (essencialmente) pelos tipos de instruções.
Ciclos e Programas Parciais
Num triplo de Hoare, , a verificação da pós-condição pressupõe que termina quando .
Entre os tipos de instruções, apenas os ciclos podem contribuir para programas que não terminam; Um programa apenas com instruções "cópia" ou "condição" sem ciclos termina sempre.
Como o problema da paragem é indecidível, isto é, não há um algoritmo para classificar um programa como total ou parcial, as regras de verificação que envolvem ciclos (onde está o "problema" da paragem) devem contemplar ambos os casos.
De facto, existe uma regra para ciclos totais e outra regra para ciclos parciais.
O tratamento dos ciclos totais está fora do âmbito desta disciplina e vai-se usar apenas a regra do caso parcial nos ciclos.
A razão desta escolha está na complexidade adicional de tratar o caso total. Os ciclos, como estão apresentados, permitem programas parciais e, claro, também programas totais.
Uma forma de garantir que um ciclo termina consiste em usar ciclos limitados. Por exemplo, a sintaxe do C
permite
for (int i = 0; i < 10; i++) {
// instruções que não afetam i
}
Claro, isto é um caso particular de ciclos ilimitados:
#![allow(unused)] fn main() { i = 0; while i < 10 { // instruções que não afetam i i = i + 1; } }
Regras para a Verificação de Programas Parciais
Implicação
Definição ()
Nesta regra:
- são fórmulas FOL+Aritmética.
- significa que existe uma prova de com hipóteses na lógica FOL+Aritmética.
P
é um programa.
Esta é uma regra de "conveniência", que permite restringir a pré-condição e generalizar a pós-condição.
Sequência
Sequência ()
Nesta regra:
- são fórmulas FOL+Aritmética.
P
eQ
são programas.
Intuitivamente:
- Se antes de e depois,
- e se antes de e depois;
- Estão, quando antes de também depois:
Cópia
Cópia ()
Nesta regra:
- é uma fórmula FOL+Aritmética.
- é um termo aritmético.
- resulta de substituir, em , algumas ocorrências da variável por .
Exemplo. Provas em Tabela
Mostrar que
Temos de usar a regra
Para esta regra ser corretamente aplicada é necessário identificar o termo e a fórmula .
Uma prova em tabela é:
Linha | Instrução | Fórmula | Regra | Hipóteses | Observação |
---|---|---|---|---|---|
1 | prec | pré-condição | |||
2 | aritm | 1 | aritmética na linha anterior | ||
3 | x = y + 1 | ||||
4 | copy | 2, 3 | é a fórmula "" |
- Na primeira linha está a pré-condição do triplo (prec) e na última linha está a pós-condição do triplo.
- A segunda linha resulta da primeira por aplicação das regras da aritmética (aritm).
- Na terceira linha está (apenas) a instrução do triplo.
- Finalmente, a última linha resulta de aplicar a regra .
Mas ficam algumas dúvidas:
- Qual a justificação para a linha 2? É necessária?
- Donde vêm a fórmula e o termo ? O que se passa com a substituição ?
Como identificar a fórmula e o termo usados na regra .
- De acordo com a regra, deve ser a pós-condição de uma instrução da forma
x = E
. - O que pretendemos com esta regra é obter a fórmula . Portanto, deve ser .
- Falta o . A instrução "real" é
x = y + 1
. Portanto, deve ser . - Isso significa que na prova deve estar a fórmula , que resulta de .
- Por isso é usado o teorema da aritmética e a regra .
- Em casos diretos, como este, pode usar-se a "pseudo-regra" para simplificar a prova.
Mais rigorosamente, o que aquela tabela apresenta é a seguinte prova formal:
Este exemplo ilustra a seguinte eurística para as provas de verificação:
As linhas de uma prova lêem-se "de cima para baixo" mas escrevem-se "de fora para dentro"
O que isto significa é que as seguintes regras ajudam a fazer uma prova:
- Começar por escrever as hipóteses ou pré-condições dadas e a conclusão ou pós-condição pretendida.
- "Descer" a partir das linhas superiores enquanto as conclusões são diretas.
- "Subir" das linhas inferiores enquanto a hipóteses necessárias são diretas.
Exemplos da regra .
Condicional
Condicional ()
Nesta regra:
- e são fórmulas FOL + Aritmética.
P
eQ
são programas, respetivamente os ramos positivo e negativo da instrução condicional.
Exemplo.
Seja Max
o programa
#![allow(unused)] fn main() { if x > y { z = x } else { z = y } }
Recapitulando a definição de da aritmética:
L. | Instrução | Fórmula | Regra | Hipóteses | Observação |
---|---|---|---|---|---|
1 | prec | ||||
2 | if x > y { | ||||
? | |||||
? | z = x | ||||
? | |||||
? | } else { | ||||
? | |||||
? | z = y | ||||
? | |||||
? | } | ||||
? | cond | 2, ? - ?, ? - ? |
L. | Instrução | Fórmula | Regra | Hipóteses | Observação |
---|---|---|---|---|---|
1 | prec | ||||
2 | if x > y { | ||||
? | |||||
? | z = x | ||||
? | copy | têm de ser iguais | |||
? | } else { | ||||
? | |||||
? | z = y | ||||
? | copy | têm de ser iguais | |||
? | } | ||||
? | cond | 2, ? - ?, ? - ? | têm de ser iguais |
L. | Instrução | Fórmula | Regra | Hipóteses | Observação |
---|---|---|---|---|---|
1 | prec | ||||
2 | if x > y { | ||||
3 | posb | guarda | |||
? | z = x | ||||
? | copy | ||||
? | } else { | ||||
8 | negb | negação da guarda | |||
? | z = y | ||||
? | copy | ||||
? | } | ||||
? | cond | 2, ? - ?, ? - ? |
L. | Instrução | Fórmula | Regra | Hipóteses | Observação |
---|---|---|---|---|---|
1 | prec | ||||
2 | if x > y { | ||||
3 | posb | ||||
4 | ? | ||||
5 | z = x | ||||
6 | copy | ||||
7 | } else { | ||||
8 | negb | negação da guarda | |||
? | z = y | ||||
? | copy | ||||
? | } | ||||
? | cond | 2, ? - ?, ? - ? |
L. | Instrução | Fórmula | Regra | Hipóteses | Observação |
---|---|---|---|---|---|
1 | prec | ||||
2 | if x > y { | ||||
3 | posb | ||||
4 | impl | ||||
5 | z = x | ||||
6 | copy | ||||
7 | } else { | ||||
8 | negb | ||||
9 | impl | ||||
10 | z = y | ||||
11 | copy | ||||
12 | } | ||||
13 | cond | 2, ? - ?, ? - ? |
L. | Instrução | Fórmula | Regra | Hipóteses | Observação |
---|---|---|---|---|---|
1 | prec | ||||
2 | if x > y { | ||||
3 | posb | ||||
4 | z = x | ||||
5 | copy | ||||
6 | impl | ||||
7 | } else { | ||||
8 | negb | ||||
9 | z = y | ||||
10 | copy | ||||
11 | impl | ||||
12 | } | ||||
13 | cond | 2, 3 - 6, 8 - 11 |
Ciclo Parcial e Invariante
Definição (, Invariante)
Uma invariante do ciclo é qualquer fórmula tal que
Isto é,
A fórmula é um invariante do ciclo se para qualquer estado tal que , quando é executado no estado e termina, no estado final, , ainda .
Por outras palavras, um invariante de um ciclo é uma condição que é válida antes e depois da computação do corpo do ciclo. Pode acontecer que durante essa computação a condição deixe de ser válida desde que, no fim, volte a sê-lo.
Exemplo. Verificação de um programa para calcular .
Mostre que em que Fac1
é o programa
#![allow(unused)] fn main() { y = 1; z = 0; while z != x { z = z + 1; y = y * z; } }
Para este exemplo é preciso recapitular a seguinte propriedade da aritmética:
L. | Instrução | Fórmula | Regra | Hipóteses | Observação |
---|---|---|---|---|---|
1 | prec | ||||
2 | y = 1; | ||||
? | copy | ||||
? | z = 0; | ||||
? | copy | ||||
? | |||||
? | while z != x { | ||||
? | step | ||||
? | z = z + 1; | ||||
? | copy | ||||
? | y = y * z; | ||||
? | copy | ||||
? | |||||
? | } | ||||
? | loop | ?, ? - ? | |||
? |
L. | Instrução | Fórmula | Regra | Hipóteses | Observação |
---|---|---|---|---|---|
1 | prec | ||||
2 | impl | ||||
3 | y = 1; | ||||
4 | copy | ||||
5 | impl | ||||
6 | z = 0; | ||||
7 | copy | ||||
8 | impl | ||||
9 | while z != x { | ||||
11 | step | ||||
? | z = z + 1; | ||||
? | copy | ||||
? | y = y * z; | ||||
? | copy | ||||
? | ? | ||||
? | } | ||||
? | loop | ?, ? - ? | |||
? | impl |
L. | Instrução | Fórmula | Regra | Hipóteses | Observação |
---|---|---|---|---|---|
1 | prec | ||||
2 | impl | ||||
3 | y = 1; | ||||
4 | copy | ||||
5 | impl | ||||
6 | z = 0; | ||||
7 | copy | ||||
8 | impl | ||||
9 | while z != x { | ||||
11 | step | ||||
12 | impl | ||||
13 | z = z + 1; | ||||
14 | copy | ||||
15 | y = y * z; | ||||
16 | copy | ||||
17 | impl | ||||
18 | } | ||||
19 | loop | 9, 11-17 | |||
20 | impl |
Exercícios de Verificação de Programas
Estes exercícios foram copiados e/ou inspirados nas seguintes obras:
- Lógica e Aritmética de Augusto Franco de Oliveira.
- forallχ de P. D. Magnus.
- Logic in Computer Science de Michael Huth e Mark Ryan.
- Artificial Intelligence, A Modern Approach de Stuart Russell e Peter Norvig.
- Mathematics for Computer Science: Course Textbook de Eric Lehman, F Thomson Leighton e Albert R Meyer.
Instruções Extra
Exercício 1 Em que circunstâncias a instrução if G {A} else {B}
não termina?
Exercício 2 Uma instrução comum que não está presente na nossa linguagem de programação é o for
, que pode ser usado para somar termos de uma sucessão como no exemplo seguinte:
#![allow(unused)] fn main() { s = 0; for i = 0; i <= max; i = i + 1 { s = s + 2 * i; } }
Depois de executar a cópia
s = 0
inicial, a instruçãofor
executa primeiroi = 0
, depois o corpos = s + 2 * i
seguido do incrementoi = i + 1
repetidamente até quei <= max
fique falso.
Explique como a instrução for
pode ser definida na linguagem inicial.
Estado
Exercício 3 Para cada estado tal que e , determine, justificando, quais da seguintes relações são válidas:
- .
- .
- .
- .
- .
- .
Provas
Exercício 4 Use as regras adequadas para provar:
- .
- .
- onde
P3
é
#![allow(unused)] fn main() { a = 1; y = x; y = y - a; }
Exercício 5 Escreva programas tais que os triplos seguintes sejam válidos e, de seguida, faça as respetivas demonstrações.
- .
- .
Verificação de Programas
Exercício 6 Prove a validade de
onde é o menor de e e P
é o programa
#![allow(unused)] fn main() { if x > y { z = y; } else { z = x; } }
Exercício 7 Prove a validade de
onde é o menor de e e P
é o programa
#![allow(unused)] fn main() { if x <= y { z = x; } else { z = y; } }
Exercício 8 Para cada uma das especificações seguintes escreva um programa adequado e prove que está correto:
- .
- .
Exercício 9 A função caraterística da relação é
Por exemplo, e .
Prove a validade de
onde Xpos
é o programa
#![allow(unused)] fn main() { if x > 0 { y = 1; } else { y = 0; } }
e
Exercício 10 Prove a validade de
onde Copy1
é o programa
#![allow(unused)] fn main() { a = x; y = 0; while a != 0 { y = y + 1; a = a - 1; } }
Exercício 11 Prove a validade de
onde Multi1
é o programa
#![allow(unused)] fn main() { a = 0; z = 0; while a != y { z = z + x; a = a + 1; } }
Exercício 12 Prove a validade de
onde Multi2
é o programa
#![allow(unused)] fn main() { z = 0; while y != 0 { z = z + x; y = y - 1; } }
Exercício 13 Prove a validade de
onde Copy2
é o programa
#![allow(unused)] fn main() { y = 0; while y != x { y = y + 1; } }
Exercício 14 É suposto o programa Div
calcular o dividendo dos inteiros e ; isto é, o único inteiro tal que existe um inteiro (o resto) tal que e .
Por exemplo, se e então porque , com .
Prove que
sendo Div
o programa
#![allow(unused)] fn main() { r = x; d = 0; while r >= y { r = r - y; d = d + 1; } }
Exercício 15 Prove a validade de
onde é o menor de e e Minup
é o programa
#![allow(unused)] fn main() { z = 0; while z < y and z < x { z = z + 1; } }
Exercício 16 Modifique o exercício anterior de forma a calcular o máximo de . Use a seguinte igualdade aritmética:
Exercício 17 Complete o programa seguinte, e demonstre a sua validade, de forma a calcular o máximo de .
#![allow(unused)] fn main() { ? ? x; while ? ? y { z = z + 1; } }
Exercício 18 Prove a validade de
onde Downfac
é o programa
#![allow(unused)] fn main() { a = x; y = 1; while a > 0 { y = y * a; a = a - 1; } }
Exercício 19 Prove a validade de
onde Somat1
é o programa
#![allow(unused)] fn main() { i = 0; y = 0; while i <= x { i = i + 1; y = y + i; } }
sabendo que
Exercício 20 Prove a validade de
onde Somat2
é o programa
#![allow(unused)] fn main() { y = 0; while x > 0 { y = y + x; x = x - 1; } }
usando as igualdades aritméticas do exercício anterior.