Minicurso Prolog

65
Universidade Federal de Alagoas Campus Arapiraca Disciplina: Paradigmas de Linguagem de Programação Jackson Rodrigues Costa Karlos Albertto Ricardo Netto Luis Adelmo Barbosa Leite Vanessa Rodrigues Prolog

Transcript of Minicurso Prolog

Page 1: Minicurso Prolog

Universidade Federal de AlagoasCampus Arapiraca

Disciplina: Paradigmas de Linguagem de Programação

Jackson Rodrigues CostaKarlos Albertto Ricardo Netto

Luis Adelmo Barbosa LeiteVanessa Rodrigues

Prolog

Page 2: Minicurso Prolog

História 1879 – Proposta por Frege a partir dos

Cálculos de predicados.

1972 – Primeira implementação a linguagem Prolog realizada por Alain Colmerauer.

1974 – Formalização semântica da programação com clausulas de Horn.

1977 – Prolog de Edimburgo.

2

Page 3: Minicurso Prolog

Programação Lógica Um programa em lógica é então a representação

de determinado problema ou situação expressa através de um conjunto finito de um tipo especial de sentenças lógicas denominadas cláusulas.

Algoritmo pode ser dividido em : Lógica Controle

3

Page 4: Minicurso Prolog

Programação Lógica

4

O programador precisa apenas definir a os componentes lógicos de um algoritmo, deixando o controle da execução para ser exercido pelo sistema de programação em lógica utilizado.

Especificações são programas; Capacidade dedutiva; Não-determinismo; Reversibilidade das relações; Tríplice interpretação dos programas em lógica;

● semântica declarativa● semântica operacional● semântica procedimental

Recursão.

Page 5: Minicurso Prolog

Aplicações

Sistema baseados em conhecimento; Sistemas de bases de dados; Sistemas especialistas; Processamento de linguagem natural; Educação; Arquiteturas não-convencionais.

5

Page 6: Minicurso Prolog

Porque estudar prolog

Fácil aprendizado; Implementa com precisão todos os

modelos surgidos nos últimos anos; Defini precisamente Sistemas reflexivos; Libera o programador dos problemas

associados ao controle de rotinas.

6

Page 7: Minicurso Prolog

Prolog É uma linguagem orientada ao processamento simbólico; Representa uma implementação da lógica como linguagem

de programação; Apresenta uma semântica declarativa inerente à lógica; Permite a definição de programas reversíveis; Permite a obtenção de respostas alternativas; Suporta código recursivo e iterativo ; Permite associar o processo de especificação ao processo de

codificação de programas; Representa programas e dados através do mesmo

formalismo; Incorpora facilidades computacionais extra lógicas e

metalógicas.

7

Page 8: Minicurso Prolog

instalação

● Sudo apt-get install swi-prolog

Page 9: Minicurso Prolog

Fatos O fato é formada por um predicado, seus

argumentos (objetos) e finalizamos a instrução com um ponto(.)

Exemplo:

progenitor(joão, josé).

9

Page 10: Minicurso Prolog

Exemplo prático

10

Page 11: Minicurso Prolog

Regras ● As regras declaram coisas que podem ser

ou não verdadeiras, dependendo da satisfação das condições dadas.

Exemplo:Para todo X e YX é mãe de Y se

X é progenitor de Y eX é feminino.

11

Page 12: Minicurso Prolog

Exemplo prático

12

irmã(X, Y) :-progenitor(Z, X),progenitor(Z,Y),

feminino(X),diferente(X, Y).

Page 13: Minicurso Prolog

Construções recursivas Recursividade – é um princípio que nos

permite obter a solução de um problema a partir da solução de uma instância menor dele mesmo.

Exemplo:Para todo X e Z

X é antepassado de Z seX é progenitor de Z.

13

Page 14: Minicurso Prolog

Exemplo prático

14

Page 15: Minicurso Prolog

Consultas Consulta - É sempre uma sequência

composta por um ou mais objetivos. Para obter a resposta, o sistema Prolog tenta satisfazer todos os objetivos que compõem a consulta, interpretando-os como uma conjunção.

Exemplo:

?- progenitor(josé, íris).

15

Page 16: Minicurso Prolog

Sintaxe e Semântica

Page 17: Minicurso Prolog

Objetos

Especifica formas diferentes para cada tipo de objeto

Nenhuma informação adicional como o seu tipo de dados é necessária.

Maiúsculas

Minúsculas

Page 18: Minicurso Prolog

Tipos de ÁtomosLetras ou dígitos, caractere especial, letras minúsculas

Ex: socrates, nil, x47, x_y.

Cadeia de caractere especiais

Ex: <--------->, ::=, =/=

Caracteres quaisquer desde que entre apóstrofos

Ex: ‘D.Pedro I’, ’21 de dezembro de 2012’

Page 19: Minicurso Prolog

Exemplos

gosta(maria, chocolate).

gosta(maria, vinho).

gosta(pedro, vinho).

gosta(pedro, maria).

Perguntas:

Pedro gosta de maria e maria gostade pedro ?

Quem gosta de chocolate ?

Page 20: Minicurso Prolog

Variáveis

Cadeia de letras, dígitos, e do caractere especial (_)

Ex: X, Resultado, Lista_de_Alunos, _ , etc.

Page 21: Minicurso Prolog

Estruturas

São formadas por um funtor seguidos de componentes separadas por virgulas e colocadas entre parênteses.

Page 22: Minicurso Prolog

Estruturas de Árvores

(a + b) * (c - 5)

*(+(a,b), -(c,5))

Page 23: Minicurso Prolog

Unificação

Unificam se:

Se forem idênticos

As variáveis de ambos os termos podem ser instanciadas com objetos de maneira que, após a substituição das variáveis por esses objetos, os termos se tornam idênticos.

data(D, M, 2012).

data(X, março, A).

?-data(D,M,2012) = data(X, março, A).

Page 24: Minicurso Prolog

Tipos de Operadores

Page 25: Minicurso Prolog

Operadores e AritméticaNa matemática costuma-se escrever na forma infixa.

2*a + b*c

Prolog entende:

+(*(2,a),(b,c))

Page 26: Minicurso Prolog

Aritmética

Page 27: Minicurso Prolog

Definir operadoresO programador pode definir os operadores

Pedro tem informações.

tem(pedro, informações)

josé ama maria.

ama(josé, maria)

:- op(600, xfx, tem).

Page 28: Minicurso Prolog

Tabela de prioridade

Page 29: Minicurso Prolog

Listas

29

Page 30: Minicurso Prolog

Representação de Listas

Lista são estruturas simples de dados;

[Brasil, Uruguai, Argentina, Paraguai]

Isso é apenas a aparência externa da lista;

Objetos são arvores em Prolog;

Então como representar listas como objetos em Prolog?

30

Page 31: Minicurso Prolog

Representação de Listas

Dois casos devem ser observados:

Listas vazias;

Listas não-vazias;

Representação do primeiro caso: []

No segundo caso:

A lista é constituída por cabeça e corpo;

31

Page 32: Minicurso Prolog

Cabeça pode ser qualquer objeto;

Obrigatoriamente, o corpo é um lista;

Os dois são unidos em uma estrutura;

Representando listas, temos:

•(Cabeça, Corpo)

Representando o exemplo anterior, podemos fazer:

•(Brasil, •(Uruguai, •(Argentina, •(Paraguai, [])))).

32

Representação de Listas

Page 33: Minicurso Prolog

•(Brasil, •(Uruguai, •(Argentina, •(Paraguai, [])))).

33

Representação de Listas

Page 34: Minicurso Prolog

•(Brasil, •(Uruguai, •(Argentina, •(Paraguai, [])))).

34

Representação de Listas

Corpo

Page 35: Minicurso Prolog

•(Brasil, •(Uruguai, •(Argentina, •(Paraguai, [])))).

35

Representação de Listas

CabeçaCorpo

Page 36: Minicurso Prolog

O ultimo corpo da lista tem seu corpo vazio ([]);

O uso de “•” pode trazer confusão;

Em Prolog a notação é mais simples para as listas;

Em Prolog, [H|T] representam um lista onde:

H é a cabeça;

T é o corpo.

36

Representação de Listas

Page 37: Minicurso Prolog

Exemplo de consulta com lista:

idades([[andre, 25], [jose, 30]]).

No programa consulte assim:

idades([[_,A], [_,B]]).

idades([[A,_], [B,_]]).

Outras formas de consulta:

idades([[andre,_], [jose,_]]).

37

Operações sobre Listas

Page 38: Minicurso Prolog

Operações sobre Listas

Representação mais genérica:

[H|T], onde H vem de Head e T de Tail;

Exemplos:

primeiro([P|_], P).

ultimo([U], U).

ultimo([_|R], U) :- ultimo(R, U).

Agora consulte assim:

primeiro([a,b,c,d], P).

ultimo(([9,8,7],X).

38

Page 39: Minicurso Prolog

Exemplo de concatenação de listas:

conc([], L, L).

conc([X | L1], L2, [X | L3]) :-

conc(L1, L2, L3).

Utilização do programa:

conc([a, b, c], [1, 2, 3], L).

conc([a, [b, c], d], [a, [], b], L).

conc(L1, L2, [a, b, c]).

conc(_, [X, g, Y | _], [a, b, c, d, e, f, g, h]).

Operações sobre Listas

Page 40: Minicurso Prolog

Remoção de elementos de uma Lista:

remover(X, [X | C], C).

remover(X, [Y | C], [Y | D]) :-

remover(X, C, D).

Utilização do programa:

remover(a, [a, b, a, a], L).

remover(a, L, [b, c, d]).

40

Operações sobre Listas

Page 41: Minicurso Prolog

Inversão de listas:

inverter([], []).

inverter([X | Y], Z) :-

inverter(Y, Y1),

conc(Y1, [X], Z).

Utilização do programa:

inverter([a, b, c], [c, b, a]).

inverter([a, b, c], X).

41

Operações sobre Listas

Page 42: Minicurso Prolog

Length:

length([a,b], X).

length([a,b], 3).

Member:

member(2, [1,2,3]).

member(2, [1,2,3,2]).

Sort:

sort([4,1,9], X).

sort([2,1,1,2],[1,2]).

sort([2,1,1,2],[2,1,1,2]).

42

Predicados Úteis com Listas

Page 43: Minicurso Prolog

Append:

append([1,2], [3,4], X).

append(A, [3,4], [1,2,3,4]).

Nextto:

nextto(3, 4, [1,2,3,4]).

nextto(4, 3, [1,2,3,4]).

nextto(3, 4, [1,2,3,0,4]).

43

Predicados Úteis com Listas

Page 44: Minicurso Prolog

BacktrackingObserve o seguinte código:

antepassado(X, Z) :-

progenitor(X, Z).

antepassado(X, Z) :-

progenitor(X, Y),

antepassado(Y, Z).

O que acontece nesse código?

Tomando os exemplos anteriores de arvore genealógica, podemos perguntar, “João é antepassado de Íris?”.

Dois caminhos existentes;

44

Page 45: Minicurso Prolog

Tomamos o primeiro programa;

antepassado(X, Z) :-

progenitor(X, Z).

?-antepassado(João, Íris).

?-progenitor(João,Íris).

Isso vai dar falha!

45

Backtracking

Page 46: Minicurso Prolog

Então após a falha o Prolog retorna ao programa original e busca por soluções alternativas;

Mesmo caminho;

Ao voltar todo caminho é desfeito;

Exemplo:

gosta(joão, jazz).

gosta(joão, renata).

gosta(joão, lasanha).

gosta(renata, joão).

gosta(renata, lasanha).

Analisando:

?-gosta(joão, X), gosta(renata, X).

46

Backtracking

Page 47: Minicurso Prolog

Comando CutAs vezes, o Backtracking pode ser ineficiente;

o “cut” aborta o processo de Backtracking;

Benefícios:

Programa roda mais rápido;

Ocupa menos memória;

Em alguns casos, evita laços-infinitos.

Principais aplicações:

Eliminar soluções alternativas da árvore de pesquisa quando uma já é suficiente;

Encerrar a pesquisa quando a continuação levar ao infinito;

Na implementação da negação como regra de falha.

47

Page 48: Minicurso Prolog

Exemplo:

mamifero(X) :- gato(X).

mamifero(X) :- cachorro(X).

mamifero(X) :- rato(X).

gato(tom).

rato(jerry).

cachorro(spike).

gosta(ana,X) :- gato(X),!.

gosta(ana,X) :- mamifero(X).

48

Comando Cut

Page 49: Minicurso Prolog

Negação por Falha

Como podemos dizer isso em Prolog?

“Maria gosta de todos os animais, menos de cobras”.

49

Page 50: Minicurso Prolog

Negação por FalhaComo podemos dizer isso em Prolog?

“Maria gosta de todos os animais, menos de cobras”.

gosta(maria, X) :-

cobra(X), !, fail.

gosta(maria, X) :-

animal(X).

O cut evita o backtracking e o fail irá ocasionar na falha da cláusula.

Também podemos usar para definir a relação diferente(X, Y):

diferente(X, Y) :- X=Y, !, fail; true.

Se Objetivo é bem-sucedido então not(Objetivo) falha, senão not(Objetivo) é bem-sucedido.

not(P) :- P, !, fail; true.

50

Page 51: Minicurso Prolog

Estruturas de Dadose

Entrada e Saída

Page 52: Minicurso Prolog

Estruturas de Dados

● Base de Dados pode ser naturalmente representada em prolog com um conjunto de fatos;

● Para recuperação de informação estruturada em base de dados

– Mecanismos de consultas;

– Mecanismos de unificação;

Page 53: Minicurso Prolog

Recuperação de Informações

Page 54: Minicurso Prolog

Recuperação de Informações

● Recuperar todas as famílias “oliveira”

– ?-família(pessoa(_, oliveira, _, _), _, _).● Famílias cuja mãe não trabalhar

– ?-família(_, pessoa(_, _, _, nt), _).● Famílias que não tem filhos

– ?-família(_, _, []).● Famílias com 3 filhos ou mais

– ?-família(_, _, [_, _, _| _]).

Page 55: Minicurso Prolog

Recuperação de Informações● Nome e Sobrenome de todas as pessoas

– ?-existe(pessoa(Nome, Sobrenome, _, _)).● Saber quem nasceu em 93

– ?-filho(X), nasceu(X, data(_,_,93)).● Pessoas nascidas antes de 76

– ?-existe(pessoa(_, _, data(_,_,A), nt), A < 76.

Page 56: Minicurso Prolog

Recuperação de Informações

● As pessoas com salário maior 1000

– ?- existe(Pessoa),

nasceu(Pessoa, data(_,_,A)),

A > 65,

salário(Pessoa, Salário),

Salário > 5000.● Saber as famílias e suas rendas

– ?-família(Pai, Mãe, Filhos),

total([Pai, Mãe | Filhos], RFam).

Page 57: Minicurso Prolog

Abstração de Dados● Técnica de programação que facilita a

representação de estruturas de dados complexas;

● Contribui para a legibilidade do programa;

● Construções matemáticas abstratas, como autômatos, podem ser traduzidas diretamente para especificações executáveis;

Page 58: Minicurso Prolog

Abstração de Dados – Autômatos

Page 59: Minicurso Prolog

Consultas

● ?-aceita(s1, [a, a, a, b]).● ?-aceita(S, [a, b]).● ?-aceita(s1, [X, Y, Z]).

Page 60: Minicurso Prolog

Abstração de Dados

● Problema pode ser abordado de várias maneiras;

– Variando sua representação;

– Inclusão de tratamento de redundância pode ocasionar economia de computação;

● Muitas vezes, o passo chave para resolução de um problema é a generalização;

Page 61: Minicurso Prolog

Entrada e Saída

● Entradas e Saídas são executadas por meio de predicados pré-definidos;

● Predicados para leitura e escrita de termos são:

– read(Termo), write(Termo).

● Predicados para formatação de texto:– tab(N), nl;

Page 62: Minicurso Prolog

Entrada e Saída

● ?-escreveLista2([[a, b, c], [d, e, f], [g, h, i]]).

Page 63: Minicurso Prolog

Entrada e Saída

Page 64: Minicurso Prolog

Entrada e Saída

● Também pode-se trabalhar com entrada e saída de arquivos;

● Pode gardar consultas nestes arquivos e executá-las lendo o arquivo;

● Predicados:– see(A);

– tell(A);

– seen;

– told;

Page 65: Minicurso Prolog

Perguntas?