Alfio Martini www.inf.pucrs.br/alfio Clube de Lógica em Ciência da Computação Faculdade de Informática - PUCRS 2 de setembro de 2013
Sumário Objetivos Gerais 1 Objetivos Gerais 2 3 Funções Primitivas Recursivas sobre 4
Sumário Objetivos Gerais 1 Objetivos Gerais 2 3 Funções Primitivas Recursivas sobre 4
Objetivos Apresentar os princípios gerais que envolvem construções indutivas de tipos de dados: Princípio geral destas definições (Construtores) Definições de funções totais por recursão primitiva Esquema de indução para prova de propriedades
Sumário 1 Objetivos Gerais 2 3 Funções Primitivas Recursivas sobre 4
:Idéia Geral Uma definição indutiva de um conjunto S consiste sempre dos seguintes passos: Base Listar alguns elementos específicos (constantes) de S. Pelo menos um elemento deve ser listado. Indução Definir uma ou mais regras para a construção de novos elementos de S a partir dos elementos já existentes. Fecho Declarar que S consiste exatamente dos elementos produzidos pelos passos da base e indução.
Construtores de Dados Os construtores de um conjunto indutivo S são todos elementos listados no passo da base juntamente com todas as regras apresentadas no passo da indução.
Indutiva dos Naturais Os elementos do conjunto indutivo Nat são todos os valores gerados pelas seguintes regras: zero Nat NatZero x Nat suc x Nat NatSuc Nat é isomórfico à N, onde N = {0, 1, 2,...} suc : Nat Nat e zero : Nat (operadores)
Uma outra definição de Nat [NatZero] zero Nat. [NatSuc] Se x Nat, então suc x Nat. [Fecho] Nada mais está em Nat.
Linguagem Nat Termos zero suc zero suc (suc zero) suc (suc (suc zero)). suc k zero (k N).
Uma Gramática para Nat N : Nat ::= zero suc N (N Nat)
Naturais: Princípio de Indução Princípio de Indução Cada elemento em Nat tem a seguinte forma: zero Suc k, k Nat
Regra de Indução para Nat Conjunto Indutivo Nat x 0 : Nat, P(x 0 ). P zero. P(suc x 0 ) n : Nat.P n (x 0 arbitrária) IndNat
Indutiva de ListEmpty nil List(A) h A T List(A) ListCons h T List(A)
Linguagem List(A) Termos List(A) List(N) List(Nat) nil nil nil x nil 5 nil (suc zero) nil a b nil 2 0 nil zero (suc 3 zero)nil...
Uma Gramática para List(A) L : List(A) ::= nil h L (h A, L List(A))
: Princípio de Indução Princípio de Indução Cada elemento em List(A) tem a seguinte forma: nil h T, h A, T List(A)
Regra de Indução para List(A) Conjunto Indutivo List(A) e 0 : A, l 0 : List(A), P l 0. P nil. P (e 0 l 0 ) l : List(A). P l (e 0, l 0 arbitrárias) IndList
Indutiva da Lógica Proposicional Exercício...
Sumário Objetivos Gerais Funções Primitivas Recursivas sobre 1 Objetivos Gerais 2 3 Funções Primitivas Recursivas sobre 4
Funções Primitivas Recursivas sobre Funções Primitivas Recursivas: Visão Geral Idéia Geral Dada uma definição de um conjunto indutivo S, f : S... S S é definida por recursão da seguinte forma: Escolher um dos argumentos (posições) de entrada de S e, neste argumento: definir f para cada elemento do conjunto base (constantes) definir f para cada um dos construtores restantes (regras de construção)
Funções Computáveis (FC) Funções Primitivas Recursivas sobre Funções Recursivas (FR) A classe de FC é a classe de FR (Church) Classe FR primitivas é uma subclasse das FR FR Primitivas são todas funções TOTAIS
FR Primitivas Objetivos Gerais Funções Primitivas Recursivas sobre Construção Funções Básicas (zero, sucessor e projeções) Regra da Composição (Substituição) Regra da
Classe de Funções Primitivas Recursivas Funções Primitivas Recursivas sobre Funções Básicas A classe de funções primitivas recursivas sobre os números naturais N é definida pelas seguintes regras: Função Constante: a função constante zero z(x) = 0 é primitiva recursiva. Função Sucessor: a função sucessor Suc(x) = x + 1 é primitiva recursiva. Função de Projeção: para todo n 1 e 1 i n, a função n-ária de projeção Pi n que retorna o i-ésimo argumento, é primitiva recursiva. P n i (x 1,..., x n) = x i
Classe de Funções Primitivas Recursivas Funções Primitivas Recursivas sobre Regra de Composição f (x 1,..., x k ) y 1 = g 1(z 1,..., z m). y k = g k (z 1,..., z m) h(z 1,..., z m) = f (y 1,..., y k ) = f (g 1(z 1,..., z m),..., g k (z 1,..., z m)) h = Cn[f, g 1,..., g k ]
Classe de Funções Primitivas Recursivas Funções Primitivas Recursivas sobre h(x, 0) = f (x) h(x, Suc(y)) = g(x, y, h(x, y)) h = Pr[f, g]
Classe de Funções Primitivas Recursivas Funções Primitivas Recursivas sobre (Adição) x + 0 = x x + Suc(y) = Suc(x + y) sum(x, 0) = x sum(x, 0) = P 1 1 (x) sum(x, Suc(y)) = Suc(sum(x, y)) sum(x, Suc(y)) = Suc(P 3 3 (x, y, sum(x, y))) = Cn[Suc, P 3 3 ](x, y, sum(x, y)) sum Pr[P 1 1, Cn[Suc, P 3 3 ]]
Uma bijeção entre Nat e N Funções Primitivas Recursivas sobre Nat2nat : Nat N, onde Nat2nat zero = 0 Nat2nat (suc x) = Suc (Nat2nat x) (Nat2nat01) (Nat2nat02) 0 N Suc : N N tal que Suc x x + 1
Adição em Nat Objetivos Gerais Funções Primitivas Recursivas sobre add : Nat Nat Nat, onde add x 0 = x add x (suc y) = suc (add x y) (add01) (add02)
Concatenação em Funções Primitivas Recursivas sobre cat : List(A) List(A) List(A), onde cat nil l = l cat (h T ) l = h (cat T l) (cat01) (cat02)
Comprimento de Funções Primitivas Recursivas sobre length : List(A) N, onde length nil = 0 length (h T ) = (length T ) + 1 (len01) (len02)
Teoremas sobre add Objetivos Gerais Funções Primitivas Recursivas sobre x : Nat. y : Nat. z : Nat.add x (add y z) = add (add x y) z x : Nat. y : Nat.add x y = add y x x : Nat.add(Z, x) = x x : Nat. y : Nat.add x (suc y) = add (suc x) y) x : Nat. y : Nat.add (suc x) y) = suc (add x y) Th-add-01 Th-add-02 Th-add-03 Th-add-04 Th-add-05
(A) Funções Primitivas Recursivas sobre l 1 : List(A). l 2 : List(A). l 3 : List(A). cat l 1 (cat l 2 l 3 ) = cat (cat l 1 l 2 ) l 3 l 1 : List(A). l 2 : List(A).len (cat l 1 l 2 ) = add (len l 1 ) (len l 2 ) l : List(A).cat l nil = l l : List(A).rev (rev l) = l l 1 : List(A). l 2 : List(A). rev (cat l 1 l 2 ) = cat (rev l 2 ) (rev l 1 )) Th-cat-01 Th-cat-02 Th-cat-03 Th-rev-01 Th-rev-02
Sumário Objetivos Gerais 1 Objetivos Gerais 2 3 Funções Primitivas Recursivas sobre 4
Objetivos Gerais Tipos Indutivos são definidos por Construtores Tipos Indutivos podem ser equipados com Funções Funções são definidas por Tipos Indutivos + Funções = (Abstract) Datatypes Provas por Indução e definições de Funções são feitas sobre os Construtores do Tipo.