Linguagem Prolog - Antonio Rufino
-
Upload
antonio-rufino -
Category
Software
-
view
671 -
download
1
Transcript of Linguagem Prolog - Antonio Rufino
Linguagem PrologINTELIGÊNCIA COMPUTACIONAL – 2015.1
ALUNO: ANTONIO RUFINO DE LIMA NETO
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..
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’
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;
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;
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
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).
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).
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;
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.
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
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 ;
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).
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
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
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);
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.
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.
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:
[]
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;
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 ] ;
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 = [ ] ;
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)
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
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;
Obrigado!
Duvidas?
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