conferencia 6 estruturas, pregados para o trabalho com ... · como se representam as listas no...

41
Conferencia 6 Estruturas, pregados para o trabalho com estruturas, seletores MSc. Angel Alberto Vazquez Sánchez

Upload: dinhbao

Post on 01-Dec-2018

213 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Conferencia 6 Estruturas, pregados para o trabalho com ... · Como se representam as listas no Prolog? ... Se queremos fazer um predicado que dados dois parâmetros ... possui carnê

Conferencia 6Estruturas, pregados para o trabalho com

estruturas, seletores

MSc. Angel Alberto Vazquez Sánchez

Page 2: Conferencia 6 Estruturas, pregados para o trabalho com ... · Como se representam as listas no Prolog? ... Se queremos fazer um predicado que dados dois parâmetros ... possui carnê

2/41

Objetivo

● Caracterizar as estruturas como elemento importante da programação no Prolog.

Page 3: Conferencia 6 Estruturas, pregados para o trabalho com ... · Como se representam as listas no Prolog? ... Se queremos fazer um predicado que dados dois parâmetros ... possui carnê

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.

Page 4: Conferencia 6 Estruturas, pregados para o trabalho com ... · Como se representam as listas no Prolog? ... Se queremos fazer um predicado que dados dois parâmetros ... possui carnê

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?

Page 5: Conferencia 6 Estruturas, pregados para o trabalho com ... · Como se representam as listas no Prolog? ... Se queremos fazer um predicado que dados dois parâmetros ... possui carnê

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?

Page 6: Conferencia 6 Estruturas, pregados para o trabalho com ... · Como se representam as listas no Prolog? ... Se queremos fazer um predicado que dados dois parâmetros ... possui carnê

6/41

Introdução

● Como representamos uma família usando a programação orientada a objetos?

Page 7: Conferencia 6 Estruturas, pregados para o trabalho com ... · Como se representam as listas no Prolog? ... Se queremos fazer um predicado que dados dois parâmetros ... possui carnê

7/41

Introdução

● Quais são os tipos de dados no Prolog?

Page 8: Conferencia 6 Estruturas, pregados para o trabalho com ... · Como se representam as listas no Prolog? ... Se queremos fazer um predicado que dados dois parâmetros ... possui carnê

8/41

Introdução

No atómicas

Listas Estructuras

Tipos de dados / Não variáveis / Não atômicas

Page 9: Conferencia 6 Estruturas, pregados para o trabalho com ... · Como se representam as listas no Prolog? ... Se queremos fazer um predicado que dados dois parâmetros ... possui carnê

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)

]

).

Page 10: Conferencia 6 Estruturas, pregados para o trabalho com ... · Como se representam as listas no Prolog? ... Se queremos fazer um predicado que dados dois parâmetros ... possui carnê

10/41

Introdução

Page 11: Conferencia 6 Estruturas, pregados para o trabalho com ... · Como se representam as listas no Prolog? ... Se queremos fazer um predicado que dados dois parâmetros ... possui carnê

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.

Page 12: Conferencia 6 Estruturas, pregados para o trabalho com ... · Como se representam as listas no Prolog? ... Se queremos fazer um predicado que dados dois parâmetros ... possui carnê

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

Page 13: Conferencia 6 Estruturas, pregados para o trabalho com ... · Como se representam as listas no Prolog? ... Se queremos fazer um predicado que dados dois parâmetros ... possui carnê

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

Page 14: Conferencia 6 Estruturas, pregados para o trabalho com ... · Como se representam as listas no Prolog? ... Se queremos fazer um predicado que dados dois parâmetros ... possui carnê

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

Page 15: Conferencia 6 Estruturas, pregados para o trabalho com ... · Como se representam as listas no Prolog? ... Se queremos fazer um predicado que dados dois parâmetros ... possui carnê

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.

Page 16: Conferencia 6 Estruturas, pregados para o trabalho com ... · Como se representam as listas no Prolog? ... Se queremos fazer um predicado que dados dois parâmetros ... possui carnê

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

Page 17: Conferencia 6 Estruturas, pregados para o trabalho com ... · Como se representam as listas no Prolog? ... Se queremos fazer um predicado que dados dois parâmetros ... possui carnê

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

Page 18: Conferencia 6 Estruturas, pregados para o trabalho com ... · Como se representam as listas no Prolog? ... Se queremos fazer um predicado que dados dois parâmetros ... possui carnê

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.

Page 19: Conferencia 6 Estruturas, pregados para o trabalho com ... · Como se representam as listas no Prolog? ... Se queremos fazer um predicado que dados dois parâmetros ... possui carnê

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.

Page 20: Conferencia 6 Estruturas, pregados para o trabalho com ... · Como se representam as listas no Prolog? ... Se queremos fazer um predicado que dados dois parâmetros ... possui carnê

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.

Page 21: Conferencia 6 Estruturas, pregados para o trabalho com ... · Como se representam as listas no Prolog? ... Se queremos fazer um predicado que dados dois parâmetros ... possui carnê

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

Page 22: Conferencia 6 Estruturas, pregados para o trabalho com ... · Como se representam as listas no Prolog? ... Se queremos fazer um predicado que dados dois parâmetros ... possui carnê

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

Page 23: Conferencia 6 Estruturas, pregados para o trabalho com ... · Como se representam as listas no Prolog? ... Se queremos fazer um predicado que dados dois parâmetros ... possui carnê

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

Page 24: Conferencia 6 Estruturas, pregados para o trabalho com ... · Como se representam as listas no Prolog? ... Se queremos fazer um predicado que dados dois parâmetros ... possui carnê

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.

Page 25: Conferencia 6 Estruturas, pregados para o trabalho com ... · Como se representam as listas no Prolog? ... Se queremos fazer um predicado que dados dois parâmetros ... possui carnê

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)

Page 26: Conferencia 6 Estruturas, pregados para o trabalho com ... · Como se representam as listas no Prolog? ... Se queremos fazer um predicado que dados dois parâmetros ... possui carnê

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

Page 27: Conferencia 6 Estruturas, pregados para o trabalho com ... · Como se representam as listas no Prolog? ... Se queremos fazer um predicado que dados dois parâmetros ... possui carnê

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)

Page 28: Conferencia 6 Estruturas, pregados para o trabalho com ... · Como se representam as listas no Prolog? ... Se queremos fazer um predicado que dados dois parâmetros ... possui carnê

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

Page 29: Conferencia 6 Estruturas, pregados para o trabalho com ... · Como se representam as listas no Prolog? ... Se queremos fazer um predicado que dados dois parâmetros ... possui carnê

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

Page 30: Conferencia 6 Estruturas, pregados para o trabalho com ... · Como se representam as listas no Prolog? ... Se queremos fazer um predicado que dados dois parâmetros ... possui carnê

30/41

Trabajo con estructuras

Page 31: Conferencia 6 Estruturas, pregados para o trabalho com ... · Como se representam as listas no Prolog? ... Se queremos fazer um predicado que dados dois parâmetros ... possui carnê

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.

Page 32: Conferencia 6 Estruturas, pregados para o trabalho com ... · Como se representam as listas no Prolog? ... Se queremos fazer um predicado que dados dois parâmetros ... possui carnê

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

Page 33: Conferencia 6 Estruturas, pregados para o trabalho com ... · Como se representam as listas no Prolog? ... Se queremos fazer um predicado que dados dois parâmetros ... possui carnê

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

Page 34: Conferencia 6 Estruturas, pregados para o trabalho com ... · Como se representam as listas no Prolog? ... Se queremos fazer um predicado que dados dois parâmetros ... possui carnê

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.

Page 35: Conferencia 6 Estruturas, pregados para o trabalho com ... · Como se representam as listas no Prolog? ... Se queremos fazer um predicado que dados dois parâmetros ... possui carnê

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.

Page 36: Conferencia 6 Estruturas, pregados para o trabalho com ... · Como se representam as listas no Prolog? ... Se queremos fazer um predicado que dados dois parâmetros ... possui carnê

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

Page 37: Conferencia 6 Estruturas, pregados para o trabalho com ... · Como se representam as listas no Prolog? ... Se queremos fazer um predicado que dados dois parâmetros ... possui carnê

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.

Page 38: Conferencia 6 Estruturas, pregados para o trabalho com ... · Como se representam as listas no Prolog? ... Se queremos fazer um predicado que dados dois parâmetros ... possui carnê

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

Page 39: Conferencia 6 Estruturas, pregados para o trabalho com ... · Como se representam as listas no Prolog? ... Se queremos fazer um predicado que dados dois parâmetros ... possui carnê

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

Page 40: Conferencia 6 Estruturas, pregados para o trabalho com ... · Como se representam as listas no Prolog? ... Se queremos fazer um predicado que dados dois parâmetros ... possui carnê

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

Page 41: Conferencia 6 Estruturas, pregados para o trabalho com ... · Como se representam as listas no Prolog? ... Se queremos fazer um predicado que dados dois parâmetros ... possui carnê

41/41

Conclusões