27
Linguagem Prolog INTELIGÊNCIA COMPUTACIONAL – 2015.1 ALUNO: ANTONIO RUFINO DE LIMA NETO

Linguagem Prolog - Antonio Rufino

Embed Size (px)

Citation preview

Page 1: Linguagem Prolog - Antonio Rufino

Linguagem PrologINTELIGÊNCIA COMPUTACIONAL – 2015.1

ALUNO: ANTONIO RUFINO DE LIMA NETO

Page 2: Linguagem Prolog - Antonio Rufino

O que é?

PROgrammation en LOGique;

Programação em Lógica Matemática;

Inteligência artificial e linguística computacional;

Criação:

1972

Alain Colmerauer e Robert Kowalski

Teorema da resolução com Cláusulas de Horn

H :- B1, …, Bn..

Page 3: Linguagem Prolog - Antonio Rufino

Elementos da Linguagem - Átomos

Definição: cadeias compostas pelos seguintes caracteres:

Letras Maiúsculas: A,..., Z

Letras Minúsculas: a,..., z

Dígitos: 0, 1,..., 9

Caracteres especiais: *, +, _, -, >, <, =, :, ~

Composição de Átomos:

Cadeias começando com letras minúsculas. Ex.: x_y, maria, curso_de_IA

Cadeias de caracteres especiais. Ex.: <---->, ::=

Cadeias de caracteres entre apóstrofos. Ex.: ‘Maria’, ‘casa branca’, ‘a’

Page 4: Linguagem Prolog - Antonio Rufino

Elementos da Linguagem - Átomos

Números: 1, 2.45, -20;

Variáveis: são cadeias de letras, dígitos e o caractere “_”;

Iguais a átomos, porém começados por letras maiúsculas;

Ex.: X, Mapa_da_mina, _nome;

Page 5: Linguagem Prolog - Antonio Rufino

Elementos da Linguagem - Fatos

Estabelecer um relacionamento existente entre objetos;

relação(objeto1, ..., objeton);

Identificadores de relacionamentos são denominados predicados;

Identificadores de objetos são denominados átomos;

Tanto predicados quanto átomos devem iniciar com letra

minúscula;

Page 6: Linguagem Prolog - Antonio Rufino

Elementos da Linguagem - Fatos

Estrutura de um fato

gosta(joao, maria).

Nome do predicado

Estrutura de uma regra

gosta(joao, X) :- gosta(X, vinho), gosta(X, futebol)

a -: b ; c ; d

Parâmetros

Conjunção

Disjunção

Page 7: Linguagem Prolog - Antonio Rufino

Elementos da Linguagem

Predicado “is”

Predicado usado em operações aritméticas;

Ex: ?- X is 2+3.

Resposta: X = 5.

Operadores aritméticos:

+ (adição), - (subtração), * (multiplicação), mod (resto), / (divisão real),

// (divisão inteira) e ^ (potenciação).

Page 8: Linguagem Prolog - Antonio Rufino

Elementos da Linguagem

Operadores relacionais

X = Y X e Y são iguais;

X \= Y X e Y são diferentes;

X < Y X é menor que Y;

X > Y X é maior que Y;

X =< Y X é menor ou igual a Y;

X >= Y X é maior ou igual a Y.

X =:= Y X e Y são iguais (p/ números);

X =\= Y X e Y são diferentes (p/ números).

Page 9: Linguagem Prolog - Antonio Rufino

Elementos da Linguagem

Predicado “write()”.

Predicado específico para imprimir na tela;

Exemplo: write(“olá”);

writef(Formato, Argumentos);

Opções de formatação:

%w - imprime o termo;

%d - imprime o termo ignorando seu tipo, por exemplo, \n é impresso

como uma string. • %s - imprime o termo como uma string; 7

%Nc - imprime o termo de modo centralizado numa quantidade N de

colunas;

Page 10: Linguagem Prolog - Antonio Rufino

Elementos da Linguagem

Mais Predicado writef(Formato, Argumentos);

%Nl - imprime o termo alinhado à esquerda numa quantidade N de colunas;

%Nr - imprime o termo alinhado à direita numa quantidade N de colunas; Para gerar alguns caracteres deve se usar seqüencias de escape, estas são:

\n - cria uma nova linha;

\l - criar um separador de linha, o resultado é igual ao produzido por \n;

\r - retorna ao início da linha;

\t - tabulação; •

\% - imprime o símbolo %;

\nnn - onde n é um número decimal, produz o caractere ASCII com o código informado.

Page 11: Linguagem Prolog - Antonio Rufino

Programa em Prolog

Uma árvore genealógica.

pai(adão,cain).

pai(adão,abel).

pai(adão,seth).

pai(seth,enos).

Consultas:

?- pai(adão,cain).

Resposta: true

?- pai(adão,enos).

Reposta: false

Page 12: Linguagem Prolog - Antonio Rufino

Programa em Prolog

Consulta com variável:

?- pai(X,abel).

Resposta: X = adão.

Obs: lembrando que variável com inicial maiúscula;

Consulta com várias variáveis:

?- pai(adão,X).

Resposta: X = cain ; X = abel ; X = seth ;

Page 13: Linguagem Prolog - Antonio Rufino

Programa em Prolog

Nova Regra:

avô(X,Y) :- pai(X,Z), pai(Z,Y).

Obs: O ":-" significa "se“;

Consulta:

?- avô(X,enos).

Resposta: X = adão;

Outra regra:

irmão(X,Y) :- pai(Z,X), pai(Z,Y), X\=Y.

Respostas: irmão(cain,abel). irmão(cain,seth). irmão(abel,cain).

irmão(abel,seth). irmão(seth,cain). irmão(seth,abel).

Page 14: Linguagem Prolog - Antonio Rufino

Programa em Prolog - Aritmético

Programa Exemplo:

país(Nome, Área, População)

país(brasil, 9, 130).

país(china, 12, 1800).

país(eua, 9, 230).

país(índia, 3, 450).

Densidade demográfica:

país(brasil,A,P), D is P/A.

A = 9

P = 130

D = 14.4444

Page 15: Linguagem Prolog - Antonio Rufino

Programa em Prolog - Aritmético

"Qual a diferença entre a população da China e da Índia?“

?- país(china,_,X), país(índia,_,Y), Z is X-Y.

X = 1800

Y = 450

Z = 1350

Comparação:

A área do Brasil é igual à área dos Estados Unidos?

?- país(brasil,X,_), país(eua,Y,_), X =:= Y.

X = 9

Y = 9

Yes

Page 16: Linguagem Prolog - Antonio Rufino

Programa em Prolog – If-Else

if(Condition,Then,Else) :- Condition, !, Then.

if(_,_,Else) :- Else.

Operador !: A execução do predicado ! (corte) poda todos os ramos ainda não explorados;

Caso a Condition seja verdadeira, o if nem verifica o Else, vai direto para o Then.

Ex. 1: ?- if(8 mod 2 =:= 0, write(par), write(ímpar)).

Usando a primeira cláusula do Programa, temos:

Condition = 8 mod 2 =:= 0

Then = write(par)

Else = write(ímpar);

Page 17: Linguagem Prolog - Antonio Rufino

Programa em Prolog – If-Else (cont)

e a consulta é reduzida a três objetivos:

?- 8 mod 2 =:= 0, !, write(par).

Como a condição expressa pelo primeiro objetivo é verdadeira,

mais uma redução é feita pelo sistema e obtemos

?- !, write(par).

Agora o corte é executado, fazendo com que a segunda cláusula

do programa seja descartada, e a consulta torna-se

?- write(par).

Finalmente, executando-se write, a palavra par é exibida no vídeo

e o processo termina.

Page 18: Linguagem Prolog - Antonio Rufino

Programa em Prolog – If-Else (cont)

Ex. 2: ?- if(5 mod 2 =:= 0, write(par), write(ímpar)).

Novamente a primeira cláusula é selecionada e obtemos

?- 8 mod 2 =:= 0, !, write(par).

Nesse caso, porém, como a condição expressa pelo primeiro

objetivo é falsa, o corte não chega a ser executado e a segunda

cláusula do programa é, então, selecionada pelo retrocesso.

write(ímpar).

A palavra ímpar é exibida no vídeo e o processo termina.

Page 19: Linguagem Prolog - Antonio Rufino

Programa em Prolog – Listas

Listas são um dos tipos de dados mais úteis existentes na linguagem

Prolog, diz-se que uma lista é uma seqüência ordenada de uma quantidade qualquer de elementos. Os elementos de uma lista

podem ser de qualquer tipo, tais como, números ou átomos.

Listas não vazias:

cabeça - corresponde ao primeiro elemento da lista;

cauda - corresponde aos elementos restantes da lista.

Ex: [pam, liz, pat, ann, tom, bob, jim];

Lista vazia:

[]

Page 20: Linguagem Prolog - Antonio Rufino

Programa em Prolog – Listas (cont)

É possível separar as partes de uma lista utilizando uma barra

vertical, assim, pode-se escrever Lista = [cabeça | cauda]. Com isso, é possível determinar as seguintes listas:

[a | b, c] = [a, b, c]

Exemplo: member(x,y).

?− member ( a , [ a , b , c ] ) .

True;

?− member ( a , [ [ a , b ] , c ] ) .

False;

?− member ( [ a , b ] , [ [ a , b ] , c ] ) .

True;

Page 21: Linguagem Prolog - Antonio Rufino

Programa em Prolog – Listas (cont)

Contatenação:

Pode se usar o append(L1,L2,L3).

Este predicado concatena a lista L1 e L2 exibindo o resultado em L3.

Exemplo de predicado:

conc ( [ ] , L , L ) .

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

conc([a,b], [], [a,b]) = true

conc([a,b], [c,d], [a,b,c,d]) = true

?− conc ( [ a , b ] , [ c ] , L ) .

L = [ a , b , c ] ;

Page 22: Linguagem Prolog - Antonio Rufino

Programa em Prolog – Listas (cont)

Decompor a lista:

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 = [ ] ;

Page 23: Linguagem Prolog - Antonio Rufino

Programa em Prolog – Exemplos

Descrição: O exemplo clássico para determinar que se todo

homem é mortal e se Sócrates é um homem, então Sócrates é mortal. Essas a�rmações podem ser representadas através das

fórmulas:

∀x(homem(x) → mortal(x))

homem(socrates)

a partir destas pode-se concluir:

mortal(socrates)

Page 24: Linguagem Prolog - Antonio Rufino

Programa em Prolog – Exemplos

Código em Prolog:

m o r t al (X) :− % Todos os homens são m o r t a i s

homem(X) ,

w r i t e f ( `%w%w%w ' , [ ` Sim , ' , X, ` é m o r t al ' ] ) .

homem( s o c r a t e s ) . % S ó c r a t e s é um homem.

Consulta:

m o r t al ( s o c r a t e s ) .

Sim, socrates é mortal

Yes

Page 25: Linguagem Prolog - Antonio Rufino

Programa em Prolog – Exemplos

Fatorial:

fatorial(0,1) .

fatorial(N,F) :−

N > 0,

N1 is N−1,

fatorial(N1,F1),

F is N ∗ F1.

Consultas:

fatorial(3,W) .

W = 6;

Page 26: Linguagem Prolog - Antonio Rufino

Obrigado!

Duvidas?

Page 27: Linguagem Prolog - Antonio Rufino

Bibliografia

http://www.ime.usp.br/~slago/slago-prolog.pdf

https://pt.wikipedia.org/wiki/Prolog

http://gersonc.anahy.org/graduacao/paradigmas/prologsan.pdf

http://www.dsc.ufcg.edu.br/~logica/PROLOG/apostila-prolog.pdf