introdução a prolog - professor.ufabc.edu.brprofessor.ufabc.edu.br/~e.francesquini/2019.q2... ·...
TRANSCRIPT
![Page 1: Introdução a Prolog - professor.ufabc.edu.brprofessor.ufabc.edu.br/~e.francesquini/2019.q2... · •Assim como Haskell, é declarativa. •Diferente de Haskell, é considerada uma](https://reader034.vdocuments.mx/reader034/viewer/2022042712/5f8b3069c33d022de41c0e48/html5/thumbnails/1.jpg)
Introdução a Prolog
![Page 2: Introdução a Prolog - professor.ufabc.edu.brprofessor.ufabc.edu.br/~e.francesquini/2019.q2... · •Assim como Haskell, é declarativa. •Diferente de Haskell, é considerada uma](https://reader034.vdocuments.mx/reader034/viewer/2022042712/5f8b3069c33d022de41c0e48/html5/thumbnails/2.jpg)
Sobre a linguagem
• Criada em 1972 por Alain Colmerauer e Robert Kowaslki.
• Assim como Haskell, é declarativa.
• Diferente de Haskell, é considerada uma linguagem lógica.
• Linguagem lógica: programas em Prolog especificam relações entre objetos.
• Essas relações ocorrem por meio de axiomas e regras.
• Assim como gcc ou cmake para C, possui diversas implementações, sendo SWI a mais polular.
![Page 3: Introdução a Prolog - professor.ufabc.edu.brprofessor.ufabc.edu.br/~e.francesquini/2019.q2... · •Assim como Haskell, é declarativa. •Diferente de Haskell, é considerada uma](https://reader034.vdocuments.mx/reader034/viewer/2022042712/5f8b3069c33d022de41c0e48/html5/thumbnails/3.jpg)
Instalação (sistema)
• sudo apt install swi-prolog
![Page 4: Introdução a Prolog - professor.ufabc.edu.brprofessor.ufabc.edu.br/~e.francesquini/2019.q2... · •Assim como Haskell, é declarativa. •Diferente de Haskell, é considerada uma](https://reader034.vdocuments.mx/reader034/viewer/2022042712/5f8b3069c33d022de41c0e48/html5/thumbnails/4.jpg)
Introdução
• Um programa Prolog é uma sequência de cláusulas Horn que definemo que é verdadeiro. Há no máximo uma cláusula verdadeira.
![Page 5: Introdução a Prolog - professor.ufabc.edu.brprofessor.ufabc.edu.br/~e.francesquini/2019.q2... · •Assim como Haskell, é declarativa. •Diferente de Haskell, é considerada uma](https://reader034.vdocuments.mx/reader034/viewer/2022042712/5f8b3069c33d022de41c0e48/html5/thumbnails/5.jpg)
Introdução
• Um programa Prolog é uma sequência de cláusulas Horn que definemo que é verdadeiro. Há no máximo uma cláusula verdadeira.
• Cláusulas de Horn têm o seguinte formato:• H ∨ ¬B1 ∨ ¬B2 … ∨ ¬Bn
![Page 6: Introdução a Prolog - professor.ufabc.edu.brprofessor.ufabc.edu.br/~e.francesquini/2019.q2... · •Assim como Haskell, é declarativa. •Diferente de Haskell, é considerada uma](https://reader034.vdocuments.mx/reader034/viewer/2022042712/5f8b3069c33d022de41c0e48/html5/thumbnails/6.jpg)
Introdução
• Um programa Prolog é uma sequência de cláusulas Horn que definemo que é verdadeiro. Há no máximo uma cláusula verdadeira.
• Cláusulas de Horn têm o seguinte formato:• H ∨ ¬B1 ∨ ¬B2 … ∨ ¬Bn
• Que é equivalente a• H ∨ ¬(B1 ∧ B2 … ∧ Bn)
![Page 7: Introdução a Prolog - professor.ufabc.edu.brprofessor.ufabc.edu.br/~e.francesquini/2019.q2... · •Assim como Haskell, é declarativa. •Diferente de Haskell, é considerada uma](https://reader034.vdocuments.mx/reader034/viewer/2022042712/5f8b3069c33d022de41c0e48/html5/thumbnails/7.jpg)
Introdução
• Um programa Prolog é uma sequência de cláusulas Horn que definemo que é verdadeiro. Há no máximo uma cláusula verdadeira.
• Cláusulas de Horn têm o seguinte formato:• H ∨ ¬B1 ∨ ¬B2 … ∨ ¬Bn
• Que é equivalente a• H ∨ ¬(B1 ∧ B2 … ∧ Bn)
• Que equivale a• (B1 ∧ B2 … ∧ Bn) → H
![Page 8: Introdução a Prolog - professor.ufabc.edu.brprofessor.ufabc.edu.br/~e.francesquini/2019.q2... · •Assim como Haskell, é declarativa. •Diferente de Haskell, é considerada uma](https://reader034.vdocuments.mx/reader034/viewer/2022042712/5f8b3069c33d022de41c0e48/html5/thumbnails/8.jpg)
Introdução
• Em programação lógica, significa que, para provar H, primeiros verifica B1, B2, … Bn.
![Page 9: Introdução a Prolog - professor.ufabc.edu.brprofessor.ufabc.edu.br/~e.francesquini/2019.q2... · •Assim como Haskell, é declarativa. •Diferente de Haskell, é considerada uma](https://reader034.vdocuments.mx/reader034/viewer/2022042712/5f8b3069c33d022de41c0e48/html5/thumbnails/9.jpg)
Estrutura de um programa
• Um programa Prolog possui uma série de predicados.
• Cada predicado tem um nome, e é seguido de zero ou maisargumentos (o Header da cláusula Horn).
• Cada argumento é um termo.
• Um predicado P com N argumentos é denotado por P/N.• Análogo à notação para assinatura de funções.
• Cada predicado é definido por fatos ou regras que formam seu corpo(Body da cláusula Horn).
• Se todas as cláusulas no Body forem verdadeiras, o predicado é verdadeiro.
![Page 10: Introdução a Prolog - professor.ufabc.edu.brprofessor.ufabc.edu.br/~e.francesquini/2019.q2... · •Assim como Haskell, é declarativa. •Diferente de Haskell, é considerada uma](https://reader034.vdocuments.mx/reader034/viewer/2022042712/5f8b3069c33d022de41c0e48/html5/thumbnails/10.jpg)
Tipos
Tipo Valores
boolean true, fail
integer Inteiros
real Números de ponto fluante
variable Variáveis (começam com uppercase)
atomSequência de caracteres (aspas ou sem aspas se começarem com lowercase)
• Dependendo da implementação do Prolog podem variar, mas costumam estar implementados:
![Page 11: Introdução a Prolog - professor.ufabc.edu.brprofessor.ufabc.edu.br/~e.francesquini/2019.q2... · •Assim como Haskell, é declarativa. •Diferente de Haskell, é considerada uma](https://reader034.vdocuments.mx/reader034/viewer/2022042712/5f8b3069c33d022de41c0e48/html5/thumbnails/11.jpg)
Fluxo
Base de dados(arquivo .pl)
Pergunta → → Resposta
![Page 12: Introdução a Prolog - professor.ufabc.edu.brprofessor.ufabc.edu.br/~e.francesquini/2019.q2... · •Assim como Haskell, é declarativa. •Diferente de Haskell, é considerada uma](https://reader034.vdocuments.mx/reader034/viewer/2022042712/5f8b3069c33d022de41c0e48/html5/thumbnails/12.jpg)
Estrutura de um programa: fatos
![Page 13: Introdução a Prolog - professor.ufabc.edu.brprofessor.ufabc.edu.br/~e.francesquini/2019.q2... · •Assim como Haskell, é declarativa. •Diferente de Haskell, é considerada uma](https://reader034.vdocuments.mx/reader034/viewer/2022042712/5f8b3069c33d022de41c0e48/html5/thumbnails/13.jpg)
Queries
• Fazemos perguntas e obtemos respostas.
![Page 14: Introdução a Prolog - professor.ufabc.edu.brprofessor.ufabc.edu.br/~e.francesquini/2019.q2... · •Assim como Haskell, é declarativa. •Diferente de Haskell, é considerada uma](https://reader034.vdocuments.mx/reader034/viewer/2022042712/5f8b3069c33d022de41c0e48/html5/thumbnails/14.jpg)
Queries
![Page 15: Introdução a Prolog - professor.ufabc.edu.brprofessor.ufabc.edu.br/~e.francesquini/2019.q2... · •Assim como Haskell, é declarativa. •Diferente de Haskell, é considerada uma](https://reader034.vdocuments.mx/reader034/viewer/2022042712/5f8b3069c33d022de41c0e48/html5/thumbnails/15.jpg)
Queries
![Page 16: Introdução a Prolog - professor.ufabc.edu.brprofessor.ufabc.edu.br/~e.francesquini/2019.q2... · •Assim como Haskell, é declarativa. •Diferente de Haskell, é considerada uma](https://reader034.vdocuments.mx/reader034/viewer/2022042712/5f8b3069c33d022de41c0e48/html5/thumbnails/16.jpg)
Estrutura de um programa: regras
• Possuem formato Head :- Body (cláusulas Horn)
![Page 17: Introdução a Prolog - professor.ufabc.edu.brprofessor.ufabc.edu.br/~e.francesquini/2019.q2... · •Assim como Haskell, é declarativa. •Diferente de Haskell, é considerada uma](https://reader034.vdocuments.mx/reader034/viewer/2022042712/5f8b3069c33d022de41c0e48/html5/thumbnails/17.jpg)
Estrutura de um programa: regras
• Não são funções, mas predicados, que apenas avaliam para verdadeiro ou falso.
• Predicados não retornam valores; apenas descrevem relações entre termos.
• Essas relações, que podem ser pensadas como o retorno, são armazenadas naspróprias variáveis passadas como argumento.
• Prolog procura as instâncias na base de dados para as quais o predicado é verdadeiro.
![Page 18: Introdução a Prolog - professor.ufabc.edu.brprofessor.ufabc.edu.br/~e.francesquini/2019.q2... · •Assim como Haskell, é declarativa. •Diferente de Haskell, é considerada uma](https://reader034.vdocuments.mx/reader034/viewer/2022042712/5f8b3069c33d022de41c0e48/html5/thumbnails/18.jpg)
Aplicando
![Page 19: Introdução a Prolog - professor.ufabc.edu.brprofessor.ufabc.edu.br/~e.francesquini/2019.q2... · •Assim como Haskell, é declarativa. •Diferente de Haskell, é considerada uma](https://reader034.vdocuments.mx/reader034/viewer/2022042712/5f8b3069c33d022de41c0e48/html5/thumbnails/19.jpg)
Help
• help(algumaCoisa) abre a "man page" do predicado algumaCoisa.
![Page 20: Introdução a Prolog - professor.ufabc.edu.brprofessor.ufabc.edu.br/~e.francesquini/2019.q2... · •Assim como Haskell, é declarativa. •Diferente de Haskell, é considerada uma](https://reader034.vdocuments.mx/reader034/viewer/2022042712/5f8b3069c33d022de41c0e48/html5/thumbnails/20.jpg)
Aritmética
• Em Prolog, tudo é simbólico, o que torna operaçõesmatemáticas um pouco diferentes em relação a outras linguagens.
• Variable is <expression>.• X is 11 + 5 * 6 / 3.
• X = 21
• X is 10 mod 4.• X = 2.
• 3 + 5 =:= 8.• true
Comando Operação
+ Adição
- Subtração
* Multiplicação
/ Divisão (real)
// Divisão (inteira)
mod Resto
** Potência
Comparação Notação
Menor X < Y.
Menor ou igual X =< Y.
Igual X =:= Y.
Diferente X =\= Y.
Maior ou igual X >= Y
Maior X > Y
![Page 21: Introdução a Prolog - professor.ufabc.edu.brprofessor.ufabc.edu.br/~e.francesquini/2019.q2... · •Assim como Haskell, é declarativa. •Diferente de Haskell, é considerada uma](https://reader034.vdocuments.mx/reader034/viewer/2022042712/5f8b3069c33d022de41c0e48/html5/thumbnails/21.jpg)
Aritmética
![Page 22: Introdução a Prolog - professor.ufabc.edu.brprofessor.ufabc.edu.br/~e.francesquini/2019.q2... · •Assim como Haskell, é declarativa. •Diferente de Haskell, é considerada uma](https://reader034.vdocuments.mx/reader034/viewer/2022042712/5f8b3069c33d022de41c0e48/html5/thumbnails/22.jpg)
Aritmética
![Page 23: Introdução a Prolog - professor.ufabc.edu.brprofessor.ufabc.edu.br/~e.francesquini/2019.q2... · •Assim como Haskell, é declarativa. •Diferente de Haskell, é considerada uma](https://reader034.vdocuments.mx/reader034/viewer/2022042712/5f8b3069c33d022de41c0e48/html5/thumbnails/23.jpg)
Aritmética
![Page 24: Introdução a Prolog - professor.ufabc.edu.brprofessor.ufabc.edu.br/~e.francesquini/2019.q2... · •Assim como Haskell, é declarativa. •Diferente de Haskell, é considerada uma](https://reader034.vdocuments.mx/reader034/viewer/2022042712/5f8b3069c33d022de41c0e48/html5/thumbnails/24.jpg)
Aritmética
![Page 25: Introdução a Prolog - professor.ufabc.edu.brprofessor.ufabc.edu.br/~e.francesquini/2019.q2... · •Assim como Haskell, é declarativa. •Diferente de Haskell, é considerada uma](https://reader034.vdocuments.mx/reader034/viewer/2022042712/5f8b3069c33d022de41c0e48/html5/thumbnails/25.jpg)
Exercício 1
• Implemente um predicado collatz que recebe dois argumentos, N e R. Se N for par, R recebe a metade de N. Se for ímpar, recebe 3N + 1.
![Page 26: Introdução a Prolog - professor.ufabc.edu.brprofessor.ufabc.edu.br/~e.francesquini/2019.q2... · •Assim como Haskell, é declarativa. •Diferente de Haskell, é considerada uma](https://reader034.vdocuments.mx/reader034/viewer/2022042712/5f8b3069c33d022de41c0e48/html5/thumbnails/26.jpg)
Exercício 1
• Implemente um predicado collatz que recebe dois argumentos, N e R. Se N for par, R recebe a metade de N. Se for ímpar, recebe 3N + 1.
![Page 27: Introdução a Prolog - professor.ufabc.edu.brprofessor.ufabc.edu.br/~e.francesquini/2019.q2... · •Assim como Haskell, é declarativa. •Diferente de Haskell, é considerada uma](https://reader034.vdocuments.mx/reader034/viewer/2022042712/5f8b3069c33d022de41c0e48/html5/thumbnails/27.jpg)
Listas
• Listas são definidas recursivamente, como em Haskell:• List --> [ ]
• List --> [Element|List]
• Sintaxe de uso semelhante a Haskell ou Python:• [elemento1, elemento2, elemento3]
• Não há restrição quanto a o que está na lista.
• Predicados costumam seguir o padrão de conter um caso para a listavazia e o caso genérico.
![Page 28: Introdução a Prolog - professor.ufabc.edu.brprofessor.ufabc.edu.br/~e.francesquini/2019.q2... · •Assim como Haskell, é declarativa. •Diferente de Haskell, é considerada uma](https://reader034.vdocuments.mx/reader034/viewer/2022042712/5f8b3069c33d022de41c0e48/html5/thumbnails/28.jpg)
Listas: exemplos
• [] é uma lista vazia.
• [a] é uma lista com um átomo a.
• [a, b] é uma lista com dois átomos.
• [a, [], parent(jim, peter)] é uma lista com um átomo, uma lista vazia e um termo composto.
![Page 29: Introdução a Prolog - professor.ufabc.edu.brprofessor.ufabc.edu.br/~e.francesquini/2019.q2... · •Assim como Haskell, é declarativa. •Diferente de Haskell, é considerada uma](https://reader034.vdocuments.mx/reader034/viewer/2022042712/5f8b3069c33d022de41c0e48/html5/thumbnails/29.jpg)
Listas: operações
![Page 30: Introdução a Prolog - professor.ufabc.edu.brprofessor.ufabc.edu.br/~e.francesquini/2019.q2... · •Assim como Haskell, é declarativa. •Diferente de Haskell, é considerada uma](https://reader034.vdocuments.mx/reader034/viewer/2022042712/5f8b3069c33d022de41c0e48/html5/thumbnails/30.jpg)
Listas
![Page 31: Introdução a Prolog - professor.ufabc.edu.brprofessor.ufabc.edu.br/~e.francesquini/2019.q2... · •Assim como Haskell, é declarativa. •Diferente de Haskell, é considerada uma](https://reader034.vdocuments.mx/reader034/viewer/2022042712/5f8b3069c33d022de41c0e48/html5/thumbnails/31.jpg)
Listas
![Page 32: Introdução a Prolog - professor.ufabc.edu.brprofessor.ufabc.edu.br/~e.francesquini/2019.q2... · •Assim como Haskell, é declarativa. •Diferente de Haskell, é considerada uma](https://reader034.vdocuments.mx/reader034/viewer/2022042712/5f8b3069c33d022de41c0e48/html5/thumbnails/32.jpg)
Listas
![Page 33: Introdução a Prolog - professor.ufabc.edu.brprofessor.ufabc.edu.br/~e.francesquini/2019.q2... · •Assim como Haskell, é declarativa. •Diferente de Haskell, é considerada uma](https://reader034.vdocuments.mx/reader034/viewer/2022042712/5f8b3069c33d022de41c0e48/html5/thumbnails/33.jpg)
Listas
• Como obter o último elemento da lista?
![Page 34: Introdução a Prolog - professor.ufabc.edu.brprofessor.ufabc.edu.br/~e.francesquini/2019.q2... · •Assim como Haskell, é declarativa. •Diferente de Haskell, é considerada uma](https://reader034.vdocuments.mx/reader034/viewer/2022042712/5f8b3069c33d022de41c0e48/html5/thumbnails/34.jpg)
Listas
• Como obter o último elemento da lista?
![Page 35: Introdução a Prolog - professor.ufabc.edu.brprofessor.ufabc.edu.br/~e.francesquini/2019.q2... · •Assim como Haskell, é declarativa. •Diferente de Haskell, é considerada uma](https://reader034.vdocuments.mx/reader034/viewer/2022042712/5f8b3069c33d022de41c0e48/html5/thumbnails/35.jpg)
Listas
• Prolog já oferece diversos predicados que implementam tarefas comuns quando se trabalha com listas.• member/2
• append/3
• delete/3
• reverse/2
• length/2
• E mais.
![Page 36: Introdução a Prolog - professor.ufabc.edu.brprofessor.ufabc.edu.br/~e.francesquini/2019.q2... · •Assim como Haskell, é declarativa. •Diferente de Haskell, é considerada uma](https://reader034.vdocuments.mx/reader034/viewer/2022042712/5f8b3069c33d022de41c0e48/html5/thumbnails/36.jpg)
Exercício 2
• Implemente um predicado comprimento/2. Ele recebe dois argumentos: uma lista e uma variável C. Ele armazena em C o comprimento da lista.
![Page 37: Introdução a Prolog - professor.ufabc.edu.brprofessor.ufabc.edu.br/~e.francesquini/2019.q2... · •Assim como Haskell, é declarativa. •Diferente de Haskell, é considerada uma](https://reader034.vdocuments.mx/reader034/viewer/2022042712/5f8b3069c33d022de41c0e48/html5/thumbnails/37.jpg)
Exercício 2
• Implemente um predicado comprimento/2. Ele recebe dois argumentos: uma lista e uma variável C. Ele armazena em C o comprimento da lista.
![Page 38: Introdução a Prolog - professor.ufabc.edu.brprofessor.ufabc.edu.br/~e.francesquini/2019.q2... · •Assim como Haskell, é declarativa. •Diferente de Haskell, é considerada uma](https://reader034.vdocuments.mx/reader034/viewer/2022042712/5f8b3069c33d022de41c0e48/html5/thumbnails/38.jpg)
Exercício 2
• Implemente um predicado comprimento/2. Ele recebe dois argumentos: uma lista e uma variável C. Ele armazena em C o comprimento da lista.
• Em Haskell, podemos usar o retorno da função. Em prolog, não temos funções.
![Page 39: Introdução a Prolog - professor.ufabc.edu.brprofessor.ufabc.edu.br/~e.francesquini/2019.q2... · •Assim como Haskell, é declarativa. •Diferente de Haskell, é considerada uma](https://reader034.vdocuments.mx/reader034/viewer/2022042712/5f8b3069c33d022de41c0e48/html5/thumbnails/39.jpg)
Exercício 2
• Implemente um predicado comprimento/2. Ele recebe dois argumentos: uma lista e uma variável C. Ele armazena em C o comprimento da lista.
• Em Haskell, podemos usar o retorno da função. Em prolog, não temos funções.
![Page 40: Introdução a Prolog - professor.ufabc.edu.brprofessor.ufabc.edu.br/~e.francesquini/2019.q2... · •Assim como Haskell, é declarativa. •Diferente de Haskell, é considerada uma](https://reader034.vdocuments.mx/reader034/viewer/2022042712/5f8b3069c33d022de41c0e48/html5/thumbnails/40.jpg)
Predicados não são funções
• Você não pode especificar um tipo de retorno para um predicado.
• O "retorno" é armazenado em um dos parâmetros.
• Não pode passar predicados para outros predicados e usá-los diretamente como funções em Haskell.
• Como implementar um map?
![Page 41: Introdução a Prolog - professor.ufabc.edu.brprofessor.ufabc.edu.br/~e.francesquini/2019.q2... · •Assim como Haskell, é declarativa. •Diferente de Haskell, é considerada uma](https://reader034.vdocuments.mx/reader034/viewer/2022042712/5f8b3069c33d022de41c0e48/html5/thumbnails/41.jpg)
Predicados não são funções
• Você não pode especificar um tipo de retorno para um predicado.
• O "retorno" é armazenado em um dos parâmetros.
• Não pode passar predicados para outros predicados e usá-los diretamente como funções em Haskell.
• Como implementar um map?
![Page 42: Introdução a Prolog - professor.ufabc.edu.brprofessor.ufabc.edu.br/~e.francesquini/2019.q2... · •Assim como Haskell, é declarativa. •Diferente de Haskell, é considerada uma](https://reader034.vdocuments.mx/reader034/viewer/2022042712/5f8b3069c33d022de41c0e48/html5/thumbnails/42.jpg)
Predicados não são funções
• Você não pode especificar um tipo de retorno para um predicado.
• O "retorno" é armazenado em um dos parâmetros.
• Não pode passar predicados para outros predicados e usá-los diretamente como funções em Haskell.
• Como implementar um map?
![Page 43: Introdução a Prolog - professor.ufabc.edu.brprofessor.ufabc.edu.br/~e.francesquini/2019.q2... · •Assim como Haskell, é declarativa. •Diferente de Haskell, é considerada uma](https://reader034.vdocuments.mx/reader034/viewer/2022042712/5f8b3069c33d022de41c0e48/html5/thumbnails/43.jpg)
Predicados não são funções
• Você não pode especificar um tipo de retorno para um predicado.
• O "retorno" é armazenado em um dos parâmetros.
• Não pode passar predicados para outros predicados e usá-los diretamente como funções em Haskell.
• Como implementar um map?
![Page 44: Introdução a Prolog - professor.ufabc.edu.brprofessor.ufabc.edu.br/~e.francesquini/2019.q2... · •Assim como Haskell, é declarativa. •Diferente de Haskell, é considerada uma](https://reader034.vdocuments.mx/reader034/viewer/2022042712/5f8b3069c33d022de41c0e48/html5/thumbnails/44.jpg)
Misturando listas e aritmética
• Mesma ideia vale para gerar uma lista de anos bissextos.
• Predicado não retorna uma lista de inteiros.
• Essa lista é armazenada em um parâmetro.
![Page 45: Introdução a Prolog - professor.ufabc.edu.brprofessor.ufabc.edu.br/~e.francesquini/2019.q2... · •Assim como Haskell, é declarativa. •Diferente de Haskell, é considerada uma](https://reader034.vdocuments.mx/reader034/viewer/2022042712/5f8b3069c33d022de41c0e48/html5/thumbnails/45.jpg)
Misturando listas e aritmética
• Mesma ideia vale para gerar uma lista de anos bissextos.
• Predicado não retorna uma lista de inteiros.
• Essa lista é armazenada em um parâmetro.
![Page 46: Introdução a Prolog - professor.ufabc.edu.brprofessor.ufabc.edu.br/~e.francesquini/2019.q2... · •Assim como Haskell, é declarativa. •Diferente de Haskell, é considerada uma](https://reader034.vdocuments.mx/reader034/viewer/2022042712/5f8b3069c33d022de41c0e48/html5/thumbnails/46.jpg)
Misturando listas e aritmética
• Armazenar retornos em argumentos pode deixar o código mais verboso.
• Por exemplo, na distância de Manhattan:
![Page 47: Introdução a Prolog - professor.ufabc.edu.brprofessor.ufabc.edu.br/~e.francesquini/2019.q2... · •Assim como Haskell, é declarativa. •Diferente de Haskell, é considerada uma](https://reader034.vdocuments.mx/reader034/viewer/2022042712/5f8b3069c33d022de41c0e48/html5/thumbnails/47.jpg)
Misturando listas e aritmética: exemplo
• Como implementar um predicado log_table que recebe uma lista de inteiros e devolve uma lista de lista de números, em que cada sublista contém, na primeira posição, o elemento original, e na segunda, o seu log?
• O predicado log/2 já existe.
• Exemplo:
![Page 48: Introdução a Prolog - professor.ufabc.edu.brprofessor.ufabc.edu.br/~e.francesquini/2019.q2... · •Assim como Haskell, é declarativa. •Diferente de Haskell, é considerada uma](https://reader034.vdocuments.mx/reader034/viewer/2022042712/5f8b3069c33d022de41c0e48/html5/thumbnails/48.jpg)
Misturando listas e aritmética: exemplo
![Page 49: Introdução a Prolog - professor.ufabc.edu.brprofessor.ufabc.edu.br/~e.francesquini/2019.q2... · •Assim como Haskell, é declarativa. •Diferente de Haskell, é considerada uma](https://reader034.vdocuments.mx/reader034/viewer/2022042712/5f8b3069c33d022de41c0e48/html5/thumbnails/49.jpg)
Compilando Prolog
• Até agora escrevemos em um arquivo .pl e carregamos para o interpretador.
• É possível também compilar o código e gerar um executável.
• Defina um predicado main:
• Compile com• swipl --goal=main -o nomeExecutavel -c aula.pl
![Page 50: Introdução a Prolog - professor.ufabc.edu.brprofessor.ufabc.edu.br/~e.francesquini/2019.q2... · •Assim como Haskell, é declarativa. •Diferente de Haskell, é considerada uma](https://reader034.vdocuments.mx/reader034/viewer/2022042712/5f8b3069c33d022de41c0e48/html5/thumbnails/50.jpg)
Testes unitários
• Testes são escritos entre as diretivas begin_tests/1 e end_tests/1.
• Arquivo de teste tem extensão .plt.
• Deve ter o mesmo nome do arquivo .pl.
![Page 51: Introdução a Prolog - professor.ufabc.edu.brprofessor.ufabc.edu.br/~e.francesquini/2019.q2... · •Assim como Haskell, é declarativa. •Diferente de Haskell, é considerada uma](https://reader034.vdocuments.mx/reader034/viewer/2022042712/5f8b3069c33d022de41c0e48/html5/thumbnails/51.jpg)
Testes unitários
• Testes são escritos entre as diretivas begin_tests/1 e end_tests/1.
• Arquivo de teste tem extensão .plt.
• Deve ter o mesmo nome do arquivo .pl.
![Page 52: Introdução a Prolog - professor.ufabc.edu.brprofessor.ufabc.edu.br/~e.francesquini/2019.q2... · •Assim como Haskell, é declarativa. •Diferente de Haskell, é considerada uma](https://reader034.vdocuments.mx/reader034/viewer/2022042712/5f8b3069c33d022de41c0e48/html5/thumbnails/52.jpg)
Testes unitários
• Testes são escritos entre as diretivas begin_tests/1 e end_tests/1.
• Arquivo de teste tem extensão .plt.
• Deve ter o mesmo nome do arquivo .pl.
![Page 53: Introdução a Prolog - professor.ufabc.edu.brprofessor.ufabc.edu.br/~e.francesquini/2019.q2... · •Assim como Haskell, é declarativa. •Diferente de Haskell, é considerada uma](https://reader034.vdocuments.mx/reader034/viewer/2022042712/5f8b3069c33d022de41c0e48/html5/thumbnails/53.jpg)
Functor em Prolog
![Page 54: Introdução a Prolog - professor.ufabc.edu.brprofessor.ufabc.edu.br/~e.francesquini/2019.q2... · •Assim como Haskell, é declarativa. •Diferente de Haskell, é considerada uma](https://reader034.vdocuments.mx/reader034/viewer/2022042712/5f8b3069c33d022de41c0e48/html5/thumbnails/54.jpg)
Functor em Prolog
• Não tem relação com functor de Haskell.
![Page 55: Introdução a Prolog - professor.ufabc.edu.brprofessor.ufabc.edu.br/~e.francesquini/2019.q2... · •Assim como Haskell, é declarativa. •Diferente de Haskell, é considerada uma](https://reader034.vdocuments.mx/reader034/viewer/2022042712/5f8b3069c33d022de41c0e48/html5/thumbnails/55.jpg)
Functor em Prolog
• Não tem relação com functor de Haskell.
• Se refere ao átomo de uma estrutura e sua aridade.
• Existe inclusive um predicado functor que informa o nome e a aridade de outro predicado.
![Page 56: Introdução a Prolog - professor.ufabc.edu.brprofessor.ufabc.edu.br/~e.francesquini/2019.q2... · •Assim como Haskell, é declarativa. •Diferente de Haskell, é considerada uma](https://reader034.vdocuments.mx/reader034/viewer/2022042712/5f8b3069c33d022de41c0e48/html5/thumbnails/56.jpg)
Functor em Prolog
• Não tem relação com functor de Haskell.
• Se refere ao átomo de uma estrutura e sua aridade.
• Existe inclusive um predicado functor que informa o nome e a aridade de outro predicado.
![Page 57: Introdução a Prolog - professor.ufabc.edu.brprofessor.ufabc.edu.br/~e.francesquini/2019.q2... · •Assim como Haskell, é declarativa. •Diferente de Haskell, é considerada uma](https://reader034.vdocuments.mx/reader034/viewer/2022042712/5f8b3069c33d022de41c0e48/html5/thumbnails/57.jpg)
Mais
• https://www.sciencedirect.com/science/article/pii/0010448583901288
• https://www.jstor.org/stable/2268661?seq=1#page_scan_tab_contents
• https://www.swi-prolog.org
• https://www.lix.polytechnique.fr/~liberti/public/computing/prog/prolog/prolog-tutorial.html
• https://rextester.com/
• https://www.metalevel.at/prolog/concepts