Em Prolog, estruturas (também chamadas de functors) são a forma de criar objetos de dados complexos que agrupam múltiplos componentes sob um mesmo nome. Elas são equivalentes a registros em outras linguagens, permitindo modelar dados estruturados de forma natural e declarativa.
1. O que é uma Estrutura?
Uma estrutura em Prolog é um objeto composto que agrupa vários componentes (argumentos) sob um functor (um nome que identifica o tipo da estrutura). A sintaxe é:
|
1 |
functor(componente1, componente2, componente3, ...) |
Os componentes podem ser de qualquer tipo: átomos, números, variáveis ou até mesmo outras estruturas.
Exemplos de Estruturas
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
% Uma data: dia, mês, ano data(6, agosto, 2003) % Um ponto no plano cartesiano ponto(3, 5) % Uma pessoa com nome, idade e cidade pessoa(joao, 30, 'São Paulo') % Uma linha com dois pontos linha(ponto(7,9), ponto(13,2)) |
2. Estruturas como Dados vs. Fatos como Relacionamentos
É importante entender a diferença entre estruturas e fatos:
-
Estrutura: Um objeto de dados. Ex:
ponto(3,5)é um dado que representa um ponto no plano. -
Fato: Um relacionamento entre objetos. Ex:
distancia(ponto(0,0), ponto(3,4), 5).é um fato que relaciona dois pontos e sua distância.
Estruturas podem aparecer como argumentos dentro de fatos e regras.
3. Programa 5.6: Acontecimentos Históricos
Vamos criar uma base de dados de acontecimentos históricos usando estruturas para representar datas:
|
1 2 3 4 5 6 7 8 9 10 |
% hist(Data, Acontecimento) % Data é uma estrutura: data(Dia, Mes, Ano) hist(data(7, setembro, 1822), 'Independência do Brasil'). hist(data(13, maio, 1888), 'Abolição da Escravatura'). hist(data(15, novembro, 1889), 'Proclamação da República'). hist(data(25, dezembro, 1991), 'Fim da União Soviética'). hist(data(11, setembro, 2001), 'Atentados de 11 de setembro'). |
Consultando Acontecimentos Históricos
1. Qual é o acontecimento de uma data específica?
|
1 2 |
?- hist(data(7, setembro, 1822), F). F = 'Independência do Brasil'. |
2. Em que data ocorreu a Proclamação da República?
|
1 2 |
?- hist(D, 'Proclamação da República'). D = data(15, novembro, 1889). |
3. Quais acontecimentos ocorreram no mês de setembro?
|
1 2 3 4 |
?- hist(data(_, setembro, _), F). F = 'Independência do Brasil' ; F = 'Atentados de 11 de setembro' ; false. |
4. Quais acontecimentos ocorreram no século XIX (anos 1800-1899)?
|
1 2 3 4 5 |
?- hist(data(_, _, Ano), F), Ano >= 1800, Ano < 1900. Ano = 1822, F = 'Independência do Brasil' ; Ano = 1888, F = 'Abolição da Escravatura' ; Ano = 1889, F = 'Proclamação da República' ; false. |
5. Extrair partes da data:
|
1 2 |
?- hist(data(Dia, Mes, Ano), 'Independência do Brasil'). Dia = 7, Mes = setembro, Ano = 1822. |
4. O Conceito de Functor
O functor é a “tag” ou “rótulo” que identifica o tipo da estrutura. Ele consiste no nome do functor e na sua aridade (número de argumentos).
|
1 2 3 4 |
data/3 % Functor "data" com 3 argumentos ponto/2 % Functor "ponto" com 2 argumentos pessoa/3 % Functor "pessoa" com 3 argumentos linha/2 % Functor "linha" com 2 argumentos |
Dois functors com o mesmo nome mas aridades diferentes são considerados diferentes.
Por exemplo, data/3 (dia, mês, ano) e data/2 (mês, ano) são functors distintos.
5. Estruturas Aninhadas
Uma das grandes vantagens das estruturas é que elas podem ser aninhadas, permitindo modelar dados complexos de forma hierárquica.
|
1 2 3 4 5 6 7 8 9 10 11 |
% Linha definida por dois pontos linha(ponto(7,9), ponto(13,2)). % Endereço com rua, número, cidade e estado endereco('Rua das Flores', 100, 'São Paulo', 'SP'). % Pessoa com nome, idade, endereço e telefone pessoa(joao, 30, endereco('Rua A', 10, 'RJ', 'RJ'), telefone(11, 987654321)). |
Consultas com Estruturas Aninhadas
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
% Extrair coordenadas de uma linha ?- linha(ponto(X1,Y1), ponto(X2,Y2)). X1 = 7, Y1 = 9, X2 = 13, Y2 = 2. % Encontrar pessoas de um determinado estado ?- pessoa(Nome, _, endereco(_, _, _, Estado), _). Nome = joao, Estado = 'SP'. % Extrair o telefone de uma pessoa ?- pessoa(joao, _, _, telefone(DDD, Numero)). DDD = 11, Numero = 987654321. |
6. Exercícios Propostos
Pratique a criação e uso de estruturas com estes desafios:
-
Livro: Crie uma estrutura
livro/4com título, autor, ano e ISBN. Adicione alguns fatoslivro(...)e faça consultas para:- Encontrar todos os livros de um autor específico.
- Encontrar livros publicados antes de 1950.
- Extrair o ISBN de um livro pelo título.
-
Funcionário: Crie uma estrutura
funcionario/4com nome, cargo, salário e departamento. Adicione fatos e consulte:- Funcionários com salário acima de 5000.
- Funcionários de um determinado departamento.
- Encontrar o salário de um funcionário pelo nome.
-
Endereço aninhado: Crie uma estrutura
pessoa/3com nome, idade eendereco/4(rua, número, cidade, estado). Adicione fatos e consulte:- Pessoas que moram em um determinado estado.
- Pessoas que moram em uma determinada cidade.
- Pessoas com idade acima de 18 anos.
-
Pedido: Crie estruturas para representar um sistema de pedidos:
produto(Nome, Preco)item(Produto, Quantidade)pedido(Numero, Cliente, ListaDeItens, Total)
7. Conclusão
As estruturas (functors) são uma ferramenta essencial em Prolog para:
- Modelar dados complexos: Agrupe informações relacionadas em um único objeto.
- Criar hierarquias: Aninhe estruturas para representar dados com múltiplos níveis.
- Facilitar consultas: Use padrões de unificação para extrair componentes específicos.
- Organizar o código: Dê nomes significativos aos seus dados usando functors.
Diferente de listas (que são sequências), estruturas têm componentes fixos e nomeados (pelo functor), o que as torna ideais para representar entidades do mundo real com atributos conhecidos.
Pratique com os exercícios e explore como estruturas podem tornar seus programas Prolog mais legíveis, organizados e expressivos!