Vinicius Ponte Machado

Slides:



Advertisements
Apresentações semelhantes
Concepção da linguagem, ou seja, porque e como ela é como é?
Advertisements

Capítulo 9 A semântica da Lógica de Predicados
Evolução dos SGBD’s (2ª Parte).
Universidade Federal de Campina Grande – UFCG Centro de Engenharia Elétrica e Informática – CEEI Departamento de Sistemas e Computação – DSC Máquina de.
Elsa Carvalho 49 Universidade da Madeira Departamento de Matemática e Engenharias Programação em Lógica e Funcional (2000/01) (Actualizado em 2005/06)
Elsa Carvalho 163 Universidade da Madeira Departamento de Matemática Programação em Lógica e Funcional (2000/01) (Actualizado em 2004/05) Teoria dos Modelos.
Nice Maria Americano da Costa
Software Básico Silvio Fernandes Universidade Federal Rural do Semi-Árido Departamento de Ciências Exatas e Naturais Ciência da Computação Aula.
Software Básico Silvio Fernandes
Sinais e Sistemas – Capítulo 3
EQUAÇÕES QUÍMICAS.
1. GRANDEZAS VARIÁVEL: função das grandezas das quais depende.
autômatos finitos com transições e
SISTEMAS LINEARES I Prof. Marlon.
SISTEMAS LINEARES II Prof. Marlon.
04(c) 2007 Gustavo Motta1 Introdução ao -calculus Prof. Gustavo Motta Departamento de Informática/UFPB.
5. Processamento de Listas
2. A Linguagem Prolog.
Introdução à Modelagem Conceitual 3. Prolog
SIMULAÇÃO EM COMPUTADOR: O PENSAMENTO COMO PROCESSAMENTO DE INFORMÇÕES
DEDUÇÃO NO CÁLCULO PROPOSICIONAL
A Lógica das Sentenças Abertas Profa. Ana Florencia Aula 9
INF 1771 – Inteligência Artificial
INF 1771 – Inteligência Artificial
LISTAS Uma lista é uma estrutura de dados muito comum na programação não numérica (com particular destaque na computação simbólica onde representa quase.
Inteligência Artificial: A Linguagem Prolog (parte 2)
Vinicius Ponte Machado
Sintaxe e Semântica do PROLOG.
Aula Prática - Prolog Sistemas Inteligentes /~if684
LISTAS Uma lista é uma estrutura de dados muito comum na programação não numérica (com particular destaque na computação simbólica onde representa quase.
MATEMÁTICA Prof. Carlos Alexandre.
Informática Teórica Engenharia da Computação
Informática Teórica Engenharia da Computação
Aula Prática - Prolog Sistemas Inteligentes /~if684
Aula 13 Derivação Implícita, derivadas das funções trigonométricas inversas e derivadas de funções logarítmicas.
Informática Teórica Engenharia da Computação
Introdução a Lógica Prof. Luiz Carlos Gabi.
Informática Teórica Engenharia da Computação
Linguagens lógicas 2013 – Luiz Mauricio Nascimento Silva
GEOMETRIA AXIOMÁTICA, SEGMENTOS DE RETA
Sistemas Especialistas
FUNÇÃO INVERSA Conteúdo: Profª Maria Cristina Kessler
©Prof. Lineu MialaretAula 9 - 1/28Matemática Discreta 1 Instituto Federal de Educação, Ciência e Tecnologia de São Paulo - IFSP Campus de Caraguatatuba.
André Luiz da Costa Carvalho
Sistemas Especialistas Podem ser definidos como programas de computador desenvolvidos para representar o conhecimento humano num dado domínio específico.
Funções Caderno de Exercícios 2ª aula Nome
Laboratório de Programação
Métodos Formais.
Elsa Carvalho 18 Universidade da Madeira Departamento de Matemática Programação em Lógica e Funcional (2000/01) (Actualizado em 2004/05) Estruturas de.
94 Elsa Carvalho Universidade da Madeira Departamento de Matemática e Engenharias Programação em Lógica e Funcional (2000/01) (Actualizado em 2005/06)
INE Fundamentos de Matemática Discreta para a Computação
Programação Lógica com Prolog
Prof. André Luis Roland Tancredo Engenheiro da Computação e Pesquisador em Desenvolvimento Tecnológico para Semicondutores pelo CNPq Especialista em Microeletrônica.
CES-10 INTRODUÇÃO À COMPUTAÇÃO
Inteligência Artificial: A Linguagem Prolog (Parte 1)
Algoritmos.
Cálculo Lâmbda (l – Calculus)
MÁQUINAS DE TURING Acadêmicos: Karen Juliani Tosta Tomaz RA – 47566
Modelo Entidade-Relacionamento
Projeto de Banco de Dados
Módulo II Capítulo 1: Orientação a Objetos
PROGRAMAÇÃO LÓGICA Vinicius Ponte Machado Aula 13 – Predicados de Controle UNIVERSIDADE FEDERAL DO PIAUÍ – UFPI Departamento de Informática & Estatística.
SISTEMAS DE INFORMAÇÃO Inteligência Artificial 2011/01 UNIPAC - FACAE Faculdade de Ciências Administrativas e Exatas Araguari - MG.
Estática Estática Histórico
Álgebra Booleana e Circuitos Lógicos Em 1854, George Boole introduziu o formalismo que até hoje se usa para o tratamento sistemático da lógica, que é.
Aula 4 Bioestatística Probabilidade para variáveis aleatórias.
Comportamento Assintótico
CMCC Centro de Matemática, Computação e Cognição 2016 DISCIPLINA Práticas de Ensino de Matemática no Ensino Fundamental TÍTULO DO SEMINÁRIO ÁLGEBRA: UMA.
Inteligência Artificial Objetos em Prolog  Esta aula introduz objetos de dados simples e estruturados  Os tópicos abordados são:  Unificação como operação.
5. Processamento de Listas
Transcrição da apresentação:

Vinicius Ponte Machado UNIVERSIDADE FEDERAL DO PIAUÍ – UFPI Departamento de Informática & Estatística Curso de Ciência da Computação PROGRAMAÇÃO LÓGICA Vinicius Ponte Machado Aula 8 – Operadores e Aritmética

Recursividade Definir relação de progenitor progenitor(maria, josé). progenitor(joão, josé). progenitor(joão, ana). progenitor(josé, júlia). progenitor(josé, íris). progenitor(íris, jorge).  Iremos adicionar agora ao programa a relação antepassado, que será definida a partir da relação progenitor. A definição necessita ser expressa por meio de duas regras:  a primeira das quais definirá os antepassados diretos (imediatos) e a segunda os antepassados indiretos.

Recursividade

Recursividade A primeira: antepassado(X, Z) :- progenitor(X, Z). A segunda regra é mais complicada, porque a cadeia de progenitores poderia se estender indefinidamente. Uma primeira tentativa seria escrever uma cláusula para cada posição possível na cadeia. Isso conduziria a um conjunto de cláusulas do tipo:  antepassado(X, Z) :- progenitor(X, Y), progenitor(Y, Z). progenitor(X, Y1), progenitor(Y1, Y2), progenitor(Y2, Z). progenitor(Y2, Y3), progenitor(Y3, Z). ...

Recursividade somente funcionaria até um determinado limite, isto é, somente forneceria antepassados até uma certa profundidade na árvore genealógica de uma família.  A idéia básica é definir a relação em termos de si própria, empregando um estilo de programação em lógica denominado recursivo:  antepassado(X, Z) :- progenitor(X, Y), antepassado(Y, Z).  Tais definições são denominadas recursivas e do ponto de vista da lógica são perfeitamente corretas e inteligíveis, o que deve ficar claro, pela observação da figura.

Recursividade O sistema Prolog deve muito do seu potencial de expressividade à capacidade intrínseca que possui de utilizar facilmente definições recursivas. O uso de recursão é, em realidade, uma das principais características herdadas da lógica pela linguagem Prolog.

Processamento de Listas Uma importante classe de estruturas de dados em Prolog é composta de expressões simbólicas, também denominadas "S-Expressões". Permitem a representação de listas de tamanho indefinido como tipos de árvores onde os ramos Também denominados sub-árvores, são reunidos entre parênteses e outros delimitadores para formar sequências de objetos.  Listas são estruturas simples de dados, largamente empregadas em computação não-numérica. Uma lista é uma seqüência de qualquer número de itens, como: brasil, uruguai, argentina, paraguai. Uma lista deste tipo pode ser escrita em Prolog como:   [brasil, uruguai, argentina, paraguai]

Listas Essa, entretanto, é apenas a aparência externa das listas. Todos os objetos estruturados em Prolog são na realidade árvores e as listas seguem a regra.  Representar listas como objetos Prolog, dois casos devem ser considerados: a lista vazia e a lista não-vazia. No primeiro caso, a lista é representada simplesmente como um átomo, []. No segundo, a lista deve ser pensada como constituída de dois componentes: uma "cabeça" e um "corpo". Por exemplo, na lista dada, a cabeça é "brasil" e o corpo é a lista [uruguai, argentina, paraguai]

Listas Em geral, a cabeça pode ser qualquer objeto Prolog - como uma árvore ou uma variável. O corpo, entretanto, deve ser obrigatoriamente uma lista. A cabeça e o corpo são combinados em uma estrutura por meio de um functor especial. A escolha desse functor depende da implementação considerada da linguagem Prolog. Aqui será assumido o ponto "·" que é o símbolo funcional adotado com maior freqüência na representação de listas nas diversas implementações Prolog  ·(Cabeça, Corpo)

Listas O exemplo de lista dado é então representado pelo termo Prolog: ·(brasil, ·(uruguai, ·(argentina, ·(paraguai, [])))).

Listas O programador pode empregar qualquer notação, entretanto, a que utiliza colchetes é normalmente preferida. Segundo tal notação, um termo da forma [H|T] é tratado como uma lista de cabeça H e corpo T. Listas do tipo [H|T] são estruturas muito comuns em programação não-numérica. Deve-se recordar que o corpo de uma lista é sempre outra lista, mesmo que seja vazia.  Os seguintes exemplos devem servir para demonstrar tais idéias: [X | Y] ou [X | [Y | Z]] unificam com [a, b, c, d] [X, Y, Z] não unifica com [a, b, c, d] [a, b, c] == [a | [b | [c]]] == [a | [b, c]] == [a, b | [c]] == [a, b, c | []]

Listas As consultas abaixo também são elucidativas: ?-[X | Y] = [a, b, c]. X=a Y=[b, c] ?-[X, Y, Z] = [a, b, c, d]. não ?-[X [Y | Z]] = [a, b, c, d]. X=a Y=b Z=[c, d]

Construções de Listas A primeira necessidade para a manipulação de listas é ser capaz de construí-las a partir de seus elementos básicos: uma cabeça e um corpo. Tal relação pode ser escrita em um único fato:  cons(X, Y, [X | Y]).  Por exemplo: ?-cons(a, b, Z). Z=[a | b]

Construções de Listas Durante a unificação a variável X é instanciada com a, Y com b e Z com [X|Y], que por sua vez é instanciada com [a|b], devido aos valores de X e Y. Se X for um elemento e Y uma lista, então [X|Y] é uma nova lista com X como primeiro elemento. Por exemplo:  ?-cons(a, [b, c], Z). Z=[a, b, c] ?-cons(a, [], Z). Z=[a]

Listas A generalidade da unificação permite a definição de um resultado implícito:  ?-cons(a, X, [a, b, c]). X=[b, c] Neste último exemplo as propriedades de simetria dos argumentos, lembram um solucionador de equações: um X é encontrado tal que [a|X] = [a, b, c]. Entretanto, se o primeiro argumento for uma lista com, digamos, três elementos e o segundo uma lista com dois, o resultado não será uma lista com cinco elementos: ?-cons([a, b, c], [d, e], Z). Z=[[a, b, c], d, e] de modo que o predicado cons/3 não resolve o problema de concatenar duas listas em uma terceira. Mais adiante será estudado o predicado conc/3 que realiza tal função.

Ocorrência de um elemento em uma lista Vamos implementar um tipo de relação de ocorrência que estabelece se determinado objeto é membro de uma lista, como em: membro(X, L)  onde X é um objeto e L uma lista. O objetivo membro(X, L) é verdadeiro se X ocorre em L.  O programa que define a relação membro/2 baseia-se na seguinte afirmação:  X é membro de L se (1) X é a cabeça de L, ou (2) X é membro do corpo de L.

Ocorrência de um elemento em uma lista Pode ser representada em Prolog por meio de duas cláusulas.  A primeira, um fato, estabelece a primeira condição: X é membro de L, se X é a cabeça de L. A segunda, uma regra que será empregada quando X não é cabeça de L, é uma chamada recursiva que diz que X ainda pode ser membro de L, desde que seja membro do corpo de L. membro(X, [X | C]). membro(X, [Y | C]) :- membro(X, C).

Concatenação de Listas Para a concatenação de duas listas quaisquer, resultando em uma terceira, se definirá a relação: conc(L1, L3, L3)  onde L1 e L2 são duas listas e L3 é a concatenação resultante. Por exemplo: conc([a, b], [c, d], [a, b, c, d])

Concatenação de Listas Novamente, dois casos devem ser considerados para a definição de conc/3, dependendo do primeiro argumento L1: Se o primeiro argumento é uma lista vazia, então o segundo e o terceiro argumentos devem ser a mesma lista. Chamando tal lista de L, essa situação pode ser representada pelo seguinte fato Prolog: conc([], L, L). Se o primeiro argumento de conc/3 for uma lista não-vazia, então é porque ela possui uma cabeça e um corpo e pode ser denotada por [X|L1]. A concatenação de [X|L1] com uma segunda lista L2, produzirá uma terceira lista com a mesma cabeça X da primeira e um corpo L3 que é a concatenação do corpo da primeira lista, L1, com toda a segunda, L2. Isso pode ser visto na figura 5.2, e se representa em Prolog por meio da regra: conc([X | L1], L2, [X | L3]) :- conc(L1, L2, L3).

Concatenação de Listas O programa completo para a concatenação de listas, descrevendo o predicado conc/3 é apresentado a seguir: conc([], L, L). conc([X | L1], L2, [X | L3]) :- conc(L1, L2, L3). Exemplos simples de utilização de tal programa são: ?-conc([a, b, c], [1, 2, 3], L). L=[a, b, c, 1, 2, 3] ?-conc([a, [b, c], d], [a, [], b], L). L=[a, [b, c], d, a, [], b] ?-conc([a, b], [c | R], L). L=[a, b, c | R]

Concatenação de Listas O programa conc/3, apesar de muito simples, é também muito flexível e pode ser usado em inúmeras aplicações. Por exemplo, ele pode ser usado no sentido inverso ao que foi originalmente projetado para decompor uma lista em duas partes:   ?- conc(L1, L2, [a, b, c]). L1=[] L2=[a, b, c]; L1=[a] L2=[b, c]; L1=[a, b] l2=[c]; L1=[a, b, c] L2=[]; Não

Concatenação de Listas Podemos também usar o programa para procurar por um determinado padrão em uma lista. Por exemplo, podemos encontrar os meses antes e depois de um determinado mes: ?-M=[jan,fev,mar,abr,mai,jun,jul,ago,set,out,nov,dez], conc(Antes, [mai | Depois], M). Antes=[jan,fev,mar,abr] Depois=[jun,jul,ago,set,out,nov, dez]   É possível ainda apagar de uma lista todos os elementos que se seguem a um determinado padrão. No exemplo abaixo, retira-se da lista dos dias da semana a sexta-feira e todos os dias que a seguem. ?-conc(Trab, [sex | _], [seg,ter,qua,qui,sex,sab,dom]). Trab=[seg,ter,qua,qui]