Post on 01-Dec-2018
Conferencia 6Estruturas, pregados para o trabalho com
estruturas, seletores
MSc. Angel Alberto Vazquez Sánchez
2/41
Objetivo
● Caracterizar as estruturas como elemento importante da programação no Prolog.
3/41
Bibliografía
● Ivan Bratko, PROLOG Programming for Artificial Intelligence. Capítulo 4.
● Varios, El lenguaje de programación Prolog, Universidad Jaume I de Castellón, 2001.
● Llorens y Castel, Prácticas de Lógica Prolog, Universidad de Alicante, 1996. Capítulo 4.
4/41
Ponto de partida
● O que é um fato?● O que é um predicado ou regra?● O que é uma pergunta?● Quais são os mecanismos do Prolog para resolver
problemas?● No que consiste a unificação?
5/41
Ponto de partida
● No que consiste o backtracking automático?● O que são as árvores de resolução SLD?● Como se representam as listas no Prolog?● O que é o corte e para que serve?
6/41
Introdução
● Como representamos uma família usando a programação orientada a objetos?
7/41
Introdução
● Quais são os tipos de dados no Prolog?
8/41
Introdução
No atómicas
Listas Estructuras
Tipos de dados / Não variáveis / Não atômicas
9/41
Introdução
family(
person( tom, fox, date(7,may, 1950), works(bbc, 15200) ),
person( ann, fox, date(9,may,l951), unemployed),
[
person( pat, fox, date(S,rnay,1973), unemployed),
person( jim, fox, date(5,may,1973), unemployed)
]
).
10/41
Introdução
11/41
Estrutura
Sintaticamente a estrutura é um tipo de dado com notação de predicado, ou seja, escrevem-se da mesma forma em que se escrevem os fatos, entretanto são dados e NÃO pregados
No nome das estruturas lhe chama functor, e deve começar com minúscula.
12/41
Exemplos de estruturas
Estrutura Nome Argumentos
-(N,1) - N e 1
+(3,4) + 3 e 4
person(juan,23,masc) person Juan, 23, masc
data(20,9,1998) data 20,9,1998
13/41
Sintaxe
● O mesmo functor ou nome se pode ter com distinta quantidade de parâmetros e com tipos de dados distintos (Ex. pessoa)
● Para utilizar uma estrutura no Prolog só é necessário nomeá-la, ou seja, não se precisa declará-la antes
14/41
Sintaxe
● Pode-se utilizar uma estrutura ainda quando não estiverem definidos (instanciados) todos seus dados
pessoa(Nombre,Fecha,fem)● Prolog implementa pregados para conhecer os
componentes de uma estrutura como são =.. , functor e arg
15/41
Predicado predefinido: FUNCTOR
functor(Estrutura, Nome, Aridad)
Estrutura é uma estrutura com nomeie Nome e aridad (números de argumentos) Aridad.
Pode-se utilizar de duas maneiras:● tendo Estrutura instanciada, e portanto faz corresponder a
Nomeie com o nome de dita estrutura e Aridad com um inteiro que indica o número de argumentos.
● quando Nomear e Aridad estão instanciados, por isso Estrutura fica instanciada a uma estrutura com o nome e o número de argumentos jogo de dados.
16/41
Predicado predefinido: FUNCTOR
?-functor(logica,F,N).
F = logica, N = 0
?-functor(3+2,F,N).
F = +, N = 2
?-functor([a,b,c],F,N).
F = . , N = 2
?-functor(E,libro,2).
E = libro(_,_)
?-functor(3+2+1,+,3).
no
?- functor(3+2+1,+,2).
yes
17/41
Predicado predefinido: FUNCTOR
?- functor(fecha(20,9,98),F,A).
F = fecha , % Functor ou nome da estrutura
A = 3
?- functor(E,p,5).
E = p(_2252,_2254,_2256,_2258,_2260)
% Criou um estrutura com o nome e a quantidade de argumentos dados
18/41
Predicado predefinido: FUNCTOR
?- functor(E,p,N).
! ----------------------------------------
! Error 22 : Instantiation Error
! Goal : functor(_4140,p,_4144)
Aborted
% A quantidade de argumentos deve estar definida
● Para usar o predicado functor(E,P,N) deve estar instanciado ao menos N ou E.
19/41
Predicado predefinido: FUNCTOR
Como pode ver-se, o predicado functor permite trabalhar
em qualquer dos dois sentidos. Por exemplo, pode-se usar
para construir uma estrutura com igual nome que outra
mas com um argumento menos.
20/41
Predicado predefinido: ARG
arg( Posição, Estrutura, Argumento)
O argumento da estrutura Estrutura que ocupa a posição
Posição é Argumento. Deve-se utilizar com, pelo menos, os
dois primeiros argumentos instanciados, e serve para
acessar a um determinado argumento de uma estrutura.
21/41
Predicado predefinido: ARG
?-arg(1,1+2+3,Arg).
Arg = 1+2
?-arg(1,[a,b,c],Arg).
Arg = a
?-arg(2,p(x,f(y)),Arg).
Arg = f(y)
?- arg(1,asignatura(logica,lunes),logica).
yes
22/41
Predicado predefinido: ARG
?- arg(1,p(a,b,c),V).
V = a % Toma o valor do 1er argumento
?- arg(3,p(a,b,c),V).
V = c
?- arg(3,p(X1,X2,X3),kk).
X1 = _ ,
X2 = _ ,
X3 = kk % dá-lhe valor ao 3er argumento
23/41
Predicado predefinido: ARG
?- arg(1,a+b,V).
V = a
?- L=[a,b,c], arg(1,L,A1), arg(2,L,A2).
L = [a,b,c]
A1 = a
A2 = [b,c] % Recordar que a lista é estrutura .
?- L=[a,b,c], arg(3,L,A3).
no % A estrutura . só tem 2 argumentos
24/41
Predicado Predefinido: UNIV “=..”
Estrutura =.. Lista
O predicado univ(=..) permite-nos acessar a argumentos de estruturas das que não conhecemos de antemão o número de componentes.
Se Estrutura estiver instanciada, Lista será uma lista cujo primeira componente (cabeça) é o functor da estrutura e o resto (cauda) os distintos argumentos de dita estrutura. Se Lista estiver instanciada, criará uma estrutura cujo functor será a cabeça da lista, e cujos argumentos serão os distintos elementos da lista.
25/41
Predicado Predefinido: UNIV “=..”
?-p(x,f(y),z) =.. L.
L = [p,x,f(y),z]
?-E =.. [+,2,3].
E = 2+3
?-Clausula =.. [asignatura,logica,lunes,11].
Clausula = asignatura(logica,lunes,11)
26/41
Predicado Predefinido: UNIV “=..”
?- p(a,b,c,d)=..L.
L = [p,a,b,c,d]
?- E=..[ana,perez].
E = ana(perez)
?- [a,b,c]=..L.
L = [.,a,[b,c]] % La estructura . y sus dos argumentos
27/41
Predicado Predefinido: UNIV “=..”
?- a+b=..L.
L = [+,a,b]
?- E=p(a,b,c), E=..[N|L], E1=..[N,d|L].
E = p(a,b,c) ,
N = p ,
L = [a,b,c] ,
E1 = p(d,a,b,c)
28/41
Trabalho con estruturas
Se queremos fazer um predicado que dados dois parâmetros (Nome e Primeiro sobrenome), crie uma estrutura que se chame nome se poderia fazer da seguinte forma:
crea_nombre(Nome, Sobrenome, Estrutura):-
Estrutura = nome(Nome, Sobrenome).
29/41
Trabalho con estruturas
Quanto a estilo, é muito mais elegante no Prolog definir o predicado crea_nombre da maneira seguinte:
crea_nombre(Nome, Sobrenome,
nome(Nome, Sobrenome)).
Isto cumpre exatamente a mesma função e é muito mais descritivo
30/41
Trabajo con estructuras
31/41
Dados família
Prolog nos permite recuperar informação desejada dessas
base de dados e podemos fazer referência a determinados
objetos sem ter que especificar todos seus componentes ou
podemos simplesmente indicar a estrutura dos objetos que
nos interessam e deixar alguns dos componentes da
estrutura não especificados ou parcialmente especificados.
32/41
Exemplo de acesso a dados família
a) Referir-se a tudo da família fox.
family(person(_fox,_,_),_,_).
b) Alguma família com exatamente 3 filhos.
family(_,_,[_,_,_]).
c) Informação da mulher através da instanciação de uma variável para o nome e outra para o sobrenome.
family(_,person(Nome, Apelido,_,_),_).
33/41
Exemplo de acesso a dados famíliaa) Existe alguma família onde o pai se nomeie Tom?
?- family(person(tom,_,_,_),_,_).
yes
b) Quais são os filhos da família fox ?
?- family(person(_,fox,_,_),_,L).
L=[person(pat,fox,fecha(5,may,1973),desempleado),
person(jim,fox,fecha(5,may,1973),desempleado)]
c) O nome do primeiro filho da família fox.
?- family(person(_,fox,_,_), _, [person(N,_,_,_)|_])).
N= pat
34/41
Conclusões parciais
Existem muitas maneiras de representar a mesma informação
utilizando os fatos combinados com estruturas.
Pode haver mais de uma solução para um problema dado, o
importante é que se acreditam os mecanismos para recuperar a
informação segundo a forma usada para representá-la.
35/41
Selectores
Suponha que vai se usar uma estrutura pessoa(Nome, Idade,
Sexo) para representar os dados de uma pessoa.
Se se necessitar um predicado que permita saber se uma
pessoa dada é apta para as FAR validando que é masculino
e menor de 50 anos poderia ficar assim:
aptoFAR(P):- P=persona(_,E,S), E<50,
S=masculino.
36/41
Selectores
Outro predicado seria o seguinte que valida que alguém
possui carnê de identidade (>16 anos):
tiene_ci(P):- arg(2,P,E), E>16.
?-P=persona(pepe,24,masculino), aptoFAR(P), tiene_ci(P).
yes
37/41
Selectores
Entretanto, se trocássemos a estrutura para incluir também a província o que passaria:
?- P=persona(pepe,24,masculino,ch),aptoFAR(P),
tiene_ci(P).
no
Pois, no Apto_FAR não unifica:
persona(pepe,24,masculino,ch)=persona(_,E,S)
Solução: …terei que trocar todas as linhas de código onde se usa a estrutura pessoa.
38/41
Seletores
O que acontece é que os detalhe de implementação se
mesclam com a lógica geral do programa.
Este problema é muito similar ao que trata de resolver o
mecanismo de encapsulamiento em programação orientada
a objetos usando os métodos set, get e as propriedades
(property).
39/41
Seletores
No contexto do Prolog, a idéia seria definir um predicado para acessar a cada campo da estrutura, como os seguintes:
nomeie_pessoa(pessoa(N,_,_,N)). idade_pessoa(pessoa(_,E,_,E)). sexo_pessoa(pessoa(_,_,S,S)).
40/41
Selectores
Voltando para exemplo anterior, os dois pregados devem ficar agora da seguinte maneira:
aptoFAR(P):- edad_persona(P,E),sexo_persona(P,S), E<50,
S=masculino.
tiene_ci(P):- edad_persona(P,E), E>16.
conseguiu-se evitar o uso de detalhes físicos
41/41
Conclusões