Capítulo 3 Lógica de Primeira Ordem

Documentos relacionados
Capítulo 3 Lógica de Primeira Ordem

Lógica Proposicional. LEIC - Tagus Park 2 o Semestre, Ano Lectivo 2007/08. c Inês Lynce c Luísa Coheur

Capítulo 3 Lógica de Primeira Ordem

Capítulo 3 Lógica de Primeira Ordem

Lógica Proposicional. LEIC - Tagus Park 2 o Semestre, Ano Lectivo 2007/08. c Inês Lynce c Luísa Coheur

Conceitos Básicos. LEIC 2 o Semestre, Ano Lectivo 2012/13. c Inês Lynce

Conceitos Básicos. LEIC - Tagus Park 2 o Semestre, Ano Lectivo 2007/08. c Inês Lynce c Luísa Coheur

Lógica Proposicional. LEIC - Tagus Park 2 o Semestre, Ano Lectivo 2007/08. c Inês Lynce c Luísa Coheur

A linguagem Prolog. Sintaxe, terminologia e semântica informal: Os objectos de dados em Prolog são chamados termos.

UNIDADE ACADÊMICA: Faculdade de

Mecanismos de Controle

Lógica Computacional

Lógica Computacional (CC2003)

BUSCA DE SOLUÇÕES EM PROLOG

Conferência Árvores de resolução SLD

Sintaxe e Semântica de Programas Prolog

Programação Lógica. Controle (Bactracking, Cut, Fail) Paulo Henrique Ribeiro Gabriel

SCC Capítulo 3 Prova Automática de Teoremas

SCC Capítulo 5 Representação de Conhecimento através do Prolog

Prolog: Programação em

Fernando Silva DCC-FCUP. Estruturas de Dados

Eugénio Oliveira Outros docentes da cadeira:

UNIVERSIDADE TÉCNICA DE LISBOA INSTITUTO SUPERIOR TÉCNICO. Exercícios para as aulas práticas de Lógica para Programação

Retrocesso e corte. Paradigma de Programação Lógico. Marco A L Barbosa

Inteligência Artificial. Prolog. Aula 2 Introdução (cont.)

Comparação com Divisão e Conquista

O termo Programação Dinâmica é um bocado infeliz.

Sherlock Holmes The Dancing Men

Lógica para Computação

USANDO UM MÉTODO INDUTIVO PARA RESOLVER PROBLEMAS. Bruno Maffeo Departamento de Informática PUC-Rio

Introdução à Ciência da Computação II. Recursão. Prof. Ricardo J. G. B. Campello

Aplicações de Lógica. Lógica como Linguagem de Programação. Mario Benevides UFRJ

Ederson Luiz da Silva Ciência da Computação. Algoritmos e Programação

Conferência Tratamento de listas no PROLOG

Compiladores - Especificando Sintaxe

Inteligência Artificial

Universidade de Aveiro

UNIVERSIDADE TÉCNICA DE LISBOA INSTITUTO SUPERIOR TÉCNICO. Exercícios para as aulas práticas de Lógica para Programação

Mecanismos de Controle

Grafos Direcionados. > Grafos Direcionados Representações Computacionais 1/36

Lógica de Hoare. Abordagem que usaremos: aplicar o método de Hoare sobre uma linguagem de programação imperativa simplificada.

Estruturas de Dados. Revisão de Funções e Recursão. Agradecimentos

2. Diga qual é a diferença entre tipos de informação elementares e tipos de informação estruturados.

Inteligência Artificial Apontamentos para as aulas Luís Miguel Botelho

Unificação PROGRAMAÇÃO EM LÓGICA. Unificação. Unificação. Unificação. Unificação. Linguagem Prolog Parte III

UNIVERSIDADE LUSÍADA DE LISBOA. Programa da Unidade Curricular PROGRAMAÇÃO Ano Lectivo 2013/2014

Fundamentos de Programação

a) Defina em Prolog iguais/1, um predicado que recebe um estado do jogo e que verifica que todas as pilhas têm o mesmo número de peças.

PROGRAMAÇÃO DE COMPUTADORES I BCC Aula Prática 15

Objetos Estruturados Listas Recursão Exercícios. Inteligência Artificial

Recursividade. Objetivos do módulo. O que é recursividade

Paradigmas. Fortran, Algol, Algol-68, Pascal, C, Cobol, PL/I

Aula prática 5. Funções Recursivas

1 5 = = = = = = = = 5

Exercícios: Árvores. Universidade Federal de Uberlândia - UFU Faculdade de Computação - FACOM Lista de exercícios de estrutura de dados em linguagem C

Análise Sintática I. Eduardo Ferreira dos Santos. Abril, Ciência da Computação Centro Universitário de Brasília UniCEUB 1 / 42

Aula 13 - Somas de Séries

Prof. A. G. Silva. 24 de agosto de Prof. A. G. Silva Programação em Lógica 24 de agosto de / 1

ao paradigma imperativo

UNIVERSIDADE LUSÍADA DE LISBOA. Programa da Unidade Curricular COMPLEMENTOS DE PROGRAMAÇÃO Ano Lectivo 2016/2017

Técnicas de análise de algoritmos

UNIVERSIDADE LUSÍADA DE LISBOA. Programa da Unidade Curricular COMPLEMENTOS DE PROGRAMAÇÃO Ano Lectivo 2010/2011

Métodos de Verificação

Fundamentos da Programação

UNIVERSIDADE LUSÍADA DE LISBOA. Programa da Unidade Curricular INTRODUÇÃO À PROGRAMAÇÃO Ano Lectivo 2017/2018

Exercícios para Fundamentos da Programação Utilizando Múltiplos Paradigmas

UNIVERSIDADE LUSÍADA DE LISBOA. Programa da Unidade Curricular COMPLEMENTOS DE MATEMÁTICA Ano Lectivo 2018/2019

Trabalho Prático 1. Valor: 1,0 pontos (10% da nota total) Data de Entrega: 02/05/2010

2. Linguagem de Programação Prolog

Fundamentos. Paradigma de Programação Lógico. Marco A L Barbosa

UNIVERSIDADE LUSÍADA DE LISBOA. Programa da Unidade Curricular COMPLEMENTOS DE PROGRAMAÇÃO Ano Lectivo 2009/2010

UNIVERSIDADE LUSÍADA DE LISBOA. Programa da Unidade Curricular INTRODUÇÃO AOS ALGORITMOS E ESTRUTURAS DE DADOS Ano Lectivo 2016/2017

Programação II RECURSÃO

Complexidade de Algoritmos. Edson Prestes

Compiladores - Gramáticas

Programação I Aula 16 Mais exemplos de recursão Pedro Vasconcelos DCC/FCUP

Inteligência Artificial

Elisabete Raposo Freire Departamento de Matemática Universidade dos Açores 21 Abril 2012

INE5403 FUNDAMENTOS DE MATEMÁTICA DISCRETA

Compiladores - Gramáticas

Programas em L1 pertencem ao conjunto de árvores de sintaxe abstrata definido pela gramática abstrata abaixo:

Lógica Computacional Aula 1

Fundamentos de Inteligência Artificial [5COP099]

étodos uméricos SISTEMAS DE EQUAÇÕES LINEARES (Continuação) Prof. Erivelton Geraldo Nepomuceno PROGRAMA DE PÓS-GRADUAÇÃO EM ENGENHARIA ELÉTRICA

semana 03/05/2014 a 09/05/2014 semana 10/05/2014 a 16/05/2014 semana 17/05/2014 a 23/05/ e 25/05/2014

Universidade de São Paulo

Lista de Figuras Figura 1 1: Figura 1 2: Figura 1 3: Figura 1 4: Figura 1 5: Figura 1 6: Figura 1 7: Figura 2 1: Figura 2 2: Figura 2 3: Figura 2 4:

Probabilidade. Objetivos de Aprendizagem. UFMG-ICEx-EST. Cap. 2 - Probabilidade Espaços Amostrais e Eventos. 2.1.

Programação. Folha Prática 5. Lab. 5. Departamento de Informática Universidade da Beira Interior Portugal. Copyright 2010 All rights reserved.

Instruções de repetição

SOCIEDADE CAMPINEIRA DE EDUCAÇÃO E INSTRUÇÃO PONTIFÍCIA UNIVERSIDADE CATÓLICA DE CAMPINAS Média de Qualidade de cada Aspecto por ano/semestre

Técnicas de Paralelização

DOSSIER DA DISCIPLINA

Lógica para Computação

ÍNDICE. PREFÁCIO xv. 3 PROCESSOS GERADOS POR PROCEDIMENTOS Recursão Linear Cálculo de potências Cálculo de factoriais 91

Aula de hoje Aula passada

UNIVERSIDADE LUSÍADA DE LISBOA. Programa da Unidade Curricular PROGRAMAÇÃO Ano Lectivo 2012/2013

Lógica para Computação Primeiro Semestre, Aula 10: Resolução. Prof. Ricardo Dutra da Silva

Computação e Programação

Transcrição:

Capítulo 3 Lógica de Primeira Ordem Lógica para Programação LEIC - Tagus Park 1 o Semestre, Ano Lectivo 2007/08 c Inês Lynce and Luísa Coheur

Bibliografia Baseados nos slides de Andrew Rice, Universidade de Cambridge, 2007. Martins J.P., Prolog, Capítulo 5. Ben-Ari M., Mathematical Logic for Computer Science, Springer-Verlag, 2003, Capítulo 8. Alguns exercícios de listas foram tirados das folhas de PLF do Prof. Nuno Mamede

Programa de festas Semântica do Prolog Listas em Prolog Aspectos não puros do Prolog Atribuição Corte O Falhanço Forçado A negação Definição de novas operações

Semântica do Prolog Programa em Prolog sequência de cláusulas (e não conjunto!!!!) refutação SLD com: função de selecção que escolhe o primeiro literal numa cláusula objectivo; regra de procura que escolhe a primeira cláusula na sequência de cláusulas que constitui o programa.

Semântica do Prolog Aspectos a considerar semântica declarativa: o que estamos a calcular semântica procedimental: como calcular

Semântica declarativa ant(x, Z) :- ant(x, Y), ad(y, Z). se ant(x, Y) e ad(y, Z) se verificam para uma dada substituição para as variáveis X, Y e Z, então ant(x, Z) tb é verdade para essa substituição das variáveos X e Z.

Semântica procedimental ant(x, Z) :- ant(x, Y), ad(y, Z). para provar ant(x, Z) há que provar primeiro ant(x, Y) e depois, com as substituições adequadas, provar ad(y, Z).

Semântica procedimental do Prolog Para provar um objectivo, percorrem-se as cláusulas do programa pela ordem em que aparecem e tenta-se utilizar cada uma por essa ordem...... unificando o objectivo com a cabeça da cláusula:

Semântica procedimental do Prolog se a unificação falha próxima, ou falhanço se não existem mais cláusulas; se a unificação tem sucesso, aplica-se a substituição resultante da unificação aos literais no corpo da cláusula e resolve-se cada um dos objectivos do corpo da cláusula, da esquerda para a direita (sucesso se todos os objectivos tiveram sucesso, insucesso se um dele falha);

Semântica procedimental do Prolog se falha um dos objectivos, retrocede-se para o objectivo mais recente para o qual ainda pode haver uma solução.

Importância da ordem das cláusulas Prolog segue estratégia de procura em profundidade com retrocesso Pode nunca encontrar solução (mesmo que ela exista) caso siga por um caminho infinito Função de selecção escolhe o primeiro literal do objectivo Regra de procura escolhe a primeira cláusula determinada

Importância da ordem das cláusulas: árvore SLD p(a). p(b). p(c). q(c). : p(x),q(x). : p(x),q(x). : q(a). : q(b). : q(c).

Importância da ordem das cláusulas: exemplo

Vamos lá aos exemplos

E vamos lá voltar às nossas amigas listas

Soma dos elementos de uma lista soma([],0). soma([cabeca Cauda],N) :- soma(cauda,m), N is M+Cabeca.

Remoção de um elemento de uma lista remove(cabeca,[cabeca Cauda],Cauda). remove(x,[cabeca Cauda1],[Cabeca Cauda2]) :- remove(x,cauda1,cauda2).?- remove(el,[1,2,3],res).

?- remove(el,[1,2,3],res).: árvore SLD remove(el,[1,2,3],res). El=1, Res = [2,3]

?- remove(el,[1,2,3],res).: árvore SLD remove(el,[1,2,3],res) El=2, Res = [1,3] remove(el,[2,3],cauda2) El=2, Cauda2 = [3]

?- remove(el,[1,2,3],res).: árvore SLD remove(el,[1,2,3],res) El=3, Res = [1,2] remove(el,[2,3],cauda2) El=3, Cauda2 = [2] remove(el,[3],cauda22) El=3, Cauda22 = []

?- remove(el,[1,2,3],res).: árvore SLD remove(el,[1,2,3],res) No remove(el,[2,3],cauda2) remove(el,[3],cauda22) remove(el,[],cauda23

?- remove(el,[1,2,3],res).: árvore SLD

Comprimento de uma lista (O(N)) Requisitos de memória: O(N) para lista de comprimento N comp1([],0). comp1([ Cauda],N) :- comp1(cauda,m), N is M+1.?- comp1([1,2],x). comp1([1 [2]],X) :- comp1([2],m), X is M+1. comp1([2 []],M) :- comp1([],m1), M is M1+1. comp1([],0). M1 = 0 M is M1+1 M = 1 X is M+1 X = 2 comp1([1,2],2)

Comprimento de uma lista (O(1)) Requisitos de memória: O(1) comp2(lista,res) :- comp2(lista,0,res). comp2([],acum,acum). comp2([ Cauda],Acum,Res) :- Acum1 is Acum+1, comp2(cauda,acum1,res).?- comp2([1,2],x). comp2([1,2],x) :- comp2([1,2],0,x). comp2([1 [2]],0,X) :- Acum1 is 0+1, comp2([2],acum1,x). comp2([2 []],1,X) :- Acum1 is 1+1, comp2([],acum1,x). comp2([],2,2). X=2 comp2([1,2],2)

Comprimento de uma lista: execução

Factorial (versão recursiva) factorial(0, 1). factorial(x, Y) :- X > 0, X1 is X-1, factorial(x1, Z), Y is X * Z.

Factorial (versão recursiva em scheme) (define (factorial n) (if (= n 0) 1 (* n (factorial (- n 1)))))

Permutação de listas perm([],[]). perm(lst,[cabeca Cauda]) :- remove(cabeca,lst,res),perm(res,cauda).

Permutação de listas: exemplo

E vamos lá fazer uns exercícios... Adiciona um elemento ao fim de uma lista Selecciona o n-ésimo elemento de uma lista

Adiciona um elemento ao fim da lista adicionafim(x, [],[X]). adicionafim(x, [Y L], [Y L1]) :- adicionafim(x, L, L1).

Selecciona o n-ésimo elemento de uma lista nth(1, [X L], X). nth(n, [X L], R) :- N > 1, N1 is N-1, nth(n1, L, R).