Minicurso Prolog

Preview:

Citation preview

Universidade Federal de AlagoasCampus Arapiraca

Disciplina: Paradigmas de Linguagem de Programação

Jackson Rodrigues CostaKarlos Albertto Ricardo Netto

Luis Adelmo Barbosa LeiteVanessa Rodrigues

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

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

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.

Aplicações

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

5

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

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

instalação

● Sudo apt-get install swi-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

Exemplo prático

10

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

Exemplo prático

12

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

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

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

Exemplo prático

14

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

Sintaxe e Semântica

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

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’

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 ?

Variáveis

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

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

Estruturas

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

Estruturas de Árvores

(a + b) * (c - 5)

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

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).

Tipos de Operadores

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

2*a + b*c

Prolog entende:

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

Aritmética

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).

Tabela de prioridade

Listas

29

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

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

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

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

33

Representação de Listas

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

34

Representação de Listas

Corpo

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

35

Representação de Listas

CabeçaCorpo

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

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

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

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

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

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

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

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

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

Tomamos o primeiro programa;

antepassado(X, Z) :-

progenitor(X, Z).

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

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

Isso vai dar falha!

45

Backtracking

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

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

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

Negação por Falha

Como podemos dizer isso em Prolog?

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

49

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

Estruturas de Dadose

Entrada e Saída

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;

Recuperação de Informações

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(_, _, [_, _, _| _]).

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.

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).

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;

Abstração de Dados – Autômatos

Consultas

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

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;

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;

Entrada e Saída

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

Entrada e Saída

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;

Perguntas?