Prolog Objetos Estruturados Estruturados
Inteligência Artificial
Objetos Estruturados Listas Recursão Exercícios
Exercícios
Relembrando a introdução: Exer Exercí cíci cios os
pgs pgs 22 e 23 – Livro Livro Pala Palazz zzoo
introducaoProgramacaoProlog_ introducaoProgramacaoProlog_Palazzo.pdf Palazzo.pdf
1.
Escreva um programa Prolog para representar:
João nasceu em Pelotas e Jean nasceu em Paris. Pelotas fica no Rio Grande do Sul. Paris fica na França. Só é gaúcho quem nasceu no Rio Grande do Sul.
Exercícios 1.
Resposta:
nasceu(joão,pelotas). nasceu(jean,paris). local(paris,franca). local(pelotas,rio_grande_do_sul). gaucho(X):nasceu(X,Cidade), local(Cidade, rio_grande_do_sul).
Exercícios 2.
Escreva um programa Prolog para representar:
Os corpos celeste dignos de nota são as estrelas, os planetas e os cometas. Vênus é um corpo celeste, mas não é uma estrela. Os cometas possuem cauda quando estão perto do sol. Vênus está perto do sol, mas não possui cauda.
Exercícios 2.
Resposta:
%Programa que deve ser criado: tipo/2 – %tipo(Instancia_Corpo_Celeste, X). % +
: uma instância de um corpo % celeste
corpo_celeste(estrela).
% - : o tipo do corpo celeste
corpo_celeste(planeta). corpo_celeste(cometa). corpo_celeste(asteroide).
tipo(venus,X):corpo_celeste(X), X \= estrela,
digno_de_nota(Corpo_Celeste):corpo_celeste(Corpo_Celeste), (Corpo_Celeste == estrela ; Corpo_Celeste == planeta; Corpo_Celeste == cometa).
esta_perto_sol(venus), not(possui_cauda(venus,X)),!. possui_cauda(X,Y):esta_perto_sol(X), Y == cometa. esta_perto_sol(venus).
Exercícios 3.
Assuma que arcos em um grafo dirigido representam custos e sejam descritos como arco(R,S,T), significando que há um arco de custo T entre R e S. Defina custo(U,V,L) – existe um caminho de custo L entre U e V B E 2 3
2
5
A
2
D
4
4 C
5
F
Exercícios 3.
Resposta:
arco(a,b,3). arco(b,d,2). arco(a,d,5). arco(a,c,4). arco(c,d,4). arco(c,f,5). arco(d,e,2). arco(e,f,2). mais(X,Y,Z):Z is X + Y. custo(X,Y,T):arco(X,Y,T),!. custo(X,Y,T):arco(X,Z,T1),!, custo(Z,Y,T2), mais(T1,T2,T).
Variáveis Cadeias de letras, dígitos e caracter _, sempre começando com maiúscula ou _ Exemplos:
X Mapa_da_mina _nome
Objetos Estruturados Objetos de dados com vários componentes, podendo ser, cada um deles, por sua vez, uma estrutura Todas os objetos estruturados em Prolog são árvores Átomo: árvore somente com raiz
Objetos Estruturados
Exemplo: Data
– estrutura com três componentes: dia, mês e ano termo
data data(7,julho,1953)
7
julho
1953 termo
Objetos Estruturados data(7,julho,1953)
Pode ser visto com um fato Como objeto estruturado, data(7,julho,1953) é apresentado como um argumento em uma relação
deixa de ser uma relação e passa a ser um funtor
data
Objetos Estruturados
Um funtor é definido por: Nome
– sintaxe é a mesma dos átomos Aridade – corresponde ao número de argumentos data/2
Listas Uma das estruturas mais simples em Prolog Seqüência ordenada de elementos Pode ter qualquer comprimento Ordenada: ordem dos elementos na seqüência é importante Todos os objetos em Prolog são árvores
Listas
não fogem à regra
Listas Funtor de lista: . Argumentos: Cabeça e Cauda
.(Cabeça,Cauda)
Cauda, por sua vez é uma lista Vazia
OU Tem sua Cabeça e Cauda
Listas
Lista
Cabeça
Cauda
[gosto,de,vinho] [[3],5,[2,7]] [X,Y|Z] [[c,gato]]
gosto [3] X [c,gato]
[de,vinho] [5,[2,7]] [Y|Z] []
Colchetes: melhoria notacional Listas representadas por árvores Como fica a representação das listas ao lado?
Listas Operação envolvendo termos: unificação Dados dois termos, eles se unificam se:
São
idênticos OU As variáveis em ambos os termos podem ser instanciadas em objetos, de maneira que após a substituição das variáveis por esses objetos, os termos se tornam idênticos
Listas Unificação de [X|Y] – X,Y variáveis com [a1, a2, a3, ..., an]
Substituição: {X/a1,Y/[a2,a3,...,an]} se n>1 {X/a1,Y/[]} se n=1
Listas
Busca Recursiva: Qual
a base da busca por um elemento em uma lista? E como faço a recursão?
Listas
Base:
pertence(X,[X|_]).
Recursão:
pertence(X,[_|Y]):pertence(X,Y).
Controle de Retrocesso Backtracking Prolog: retrocesso automático Poderoso recurso de programação – o programador não precisa explicitar o retrocesso Às vezes, é necessário prevenir
Uso
do ! (corte )
Controle de Retrocesso Backtracking
Objetivos do uso do !: Tornar
o programa mais rápido Fazer com que o programa ocupe menos espaço na memória
Controle de Retrocesso Backtracking
Exemplo de uso: f(x)
= 0 se x < 3 f(x) = 2 se x ≥ 3 ou x < 6 f(x) = 4 se x ≥ 6
Implementar em Prolog
Controle de Retrocesso Backtracking
Resposta:
f(X,0):-X < 3. f(X,2):-3 =< X, X > 6. f(X,4):-6 =< X.
Interrogar Prolog:
?-f(1,Y),2
% versão 1
Controle de Retrocesso Backtracking
se removido, não altera resultado
Usando corte verde:
f(X,0):-X < 3,!. f(X,2):-3 =< X, X > 6,!. f(X,4):-6 =< X.
Interrogar Prolog:
?-f(1,Y),2
% versão 2
Controle de Retrocesso Backtracking
Usando corte vermelho:
f(X,0):-X < 3,!. f(X,2):-X > 6,!. f(X,4):-6 =< X.
se removido, altera resultado
Interrogar Prolog:
?-f(1,Y),2
% versão 3
Controle de Retrocesso Backtracking
pertence –
não-determinístico – encontra todas as ocorrências de um elemento
pertence(X,[X|_]). pertence(X,[_|Y]):pertence(X,Y).
Controle de Retrocesso Backtracking
pertence_deterministico
somente uma vez o elemento
Como fica?
– encontra
Controle de Retrocesso Backtracking
pertence_deterministico/2:
pertence_deterministico(Elem,[Elem|_]):-!. pertence_deterministico(Elem,[_|Cauda]):pertence_deterministico (Elem,Cauda).
Exercícios
Quais das próximas operações de unificação serão bem sucedidas e quais irão falhar? Para as que forem bem sucedidas, quais são as instanciações de variáveis resultantes?
ponto(A, B) = ponto(1, 2). ponto(A, B) = ponto(X, Y, Z). mais(2, 2) = 4. +(2, D) = +(E, 2). t(p(-1,0), P2, P3) = t(P1, p(1, 0), p(0, Y)).
Exercícios Supondo que um retângulo seja representado pelo termo: retângulo(SupEsq, InfDir)
onde SupEsq representa o ponto superior esquerdo e InfDir o ponto inferior direito de um retângulo em uma tela de vídeo (1280 x 1024). Defina a relação quadrado(R, ...)
que é verdadeira se R é um quadrado.
Exercícios
Resposta:
%quadrado(retangulo(PontoSuperiorEsquerdo, % PontoInferiorDireito)). quadrado(retangulo(ponto(X1,Y1),ponto(X2,Y2))):Comp1 is X2 - X1, Comp2 is Y2 - Y1, Comp1 == Comp2.
Exercícios
Considere o seguinte programa: f(1, um). f(s(1), dois). f(s(s(1))), três). f(s(s(s(X))), N) :- f(X, N).
Como iria o sistema Prolog responder as seguintes questões? Quando várias respostas são possíveis, dê pelo menos duas: ?-f(s(1), A). ?-f(s(s(1)), dois). ?-f(s(s(s(s(s(s(1)))))), C). ?-f(D, três).
Exercícios
Implementar as outras relações da nota didática – processamentos de listas