Projecto de Lógica para Programação
Videoteca em Prolog
(2007-2008 – 2º semestre)
1. Introdução
A base de dados BDvip.pl contém informação sobre cinema - nomeadamente informação relativa a actores/realizadores, filmes e Óscares, retirada da IMDB e OSCAR.com1 -
codificada em factos em Prolog. Essa informação pode ser cruzada permitindo descobrir que actores contracenam num dado filme, para quantos Óscares foi nomeado um dado actor, etc. O projecto VIP (VIdeoteca em Prolog) tem como objectivo a implementação de um programa em Prolog que permite obter informação variada sobre cinema com base na BDvip.pl2.
2. A base de dados BDvip.pl
2.1 Informação sobre pessoas e suas actividades
A base de dados contém informação básica sobre pessoas com a seguinte estrutura: pessoa(id, nome, ano_nascimento, ano_morte).
em que:
− id: inteiro que identifica univocamente a pessoa (no conjunto das pessoas) − nome: string que representa o nome pelo qual é conhecida a pessoa
− ano_nascimento e ano_morte são, respectivamente, o ano de nascimento/morte da pessoa (0000 se as datas são desconhecidas).
Exemplo:
% A pessoa Alfred Hitchcock:
% é identificada pelo número 831998, nasceu em 1899 e morreu em 1980. pessoa(831998, ‘Alfred Hitchcock’, 1899, 1980).
Dado que várias actividades podem ser associadas a uma pessoa em cinema (actor, argumentista, produtor, etc.), existe a seguinte estrutura de dados:
actividade(id, nome). em que:
− id: inteiro que identifica univocamente uma actividade (no conjunto das actividades);
− nome: string que representa o nome da actividade. Exemplo:
% O número 5 representa a actividade de ‘realizador’ actividade(5, ‘realizador’).
2.2 Informação sobre filmes
A base de dados contém informação genérica sobre filmes, com a seguinte estrutura: filme(id, nome, ano_estreia, lugar_top_250).
em que:
− id: inteiro que identifica univocamente o filme (no conjunto dos filmes) − nome: string que representa o nome do filme
− ano_estreia: ano de lançamento do filme
− lugar_top_250: número que indica o lugar que o filme ocupa no top-250 da IMDB (0, se não está no top).
Exemplo:
% O filme Rear Window:
% é identificado pelo número 249003; % estreou em 1954;
% está no 14º lugar no top-250 da IMDB. filme(249003, ‘Rear Window’, 1954, 14).
2.3 Informação sobre as relações entre filmes, pessoas e actividades
Um realizador pode fazer vários filmes; um actor pode entrar em vários filmes; um filme pode ter vários realizadores; um filme pode ter vários actores; uma pessoa pode entrar num filme como actor, realizador, etc. Desde modo, existe na base dados a estrutura que se segue, que permite captar essas relações:
participa(p_id, f_id, a_id). em que:
− p_id: id de uma pessoa − f_id: id de um filme − a_id: id de uma actividade. Exemplo:
%A pessoa 831998 tem a actividade 5 no filme 249003 participa(831998, 249003, 5).
2.4 Informação sobre os Óscares
A base de dados contém informação sobre os Óscares, que é representada pela estrutura que se segue:
oscar(id, a_id, nome). em que:
− id: número que identifica univocamente o tipo do Óscar (no conjunto dos óscares)
− a_id: id da actividade associada
− nome: string que representa o nome do Óscar. Exemplo:
% O Óscar de Melhor Realizador: % é identificado pelo número 6; % está associado à actividade 5.
oscar(6, 5, ‘Oscar de Melhor Realizador’).
Os Óscares podem ser relacionados com as pessoas do seguinte modo: nomeada(p_id, f_id, a_id, ganhou?).
em que:
− p_id: id de uma pessoa − f_id: id de um filme
− a_id: id da actividade pela qual a pessoa foi nomeada para um Óscar
− ganhou?: booleano que indica se o Óscar foi ganho ou não (0 se não; 1 se sim). Exemplo:
% A pessoa 831998:
% foi nomeada no filme 249003; % pela sua actividade como 5; % mas não ganhou o Óscar.
nomeado(831998, 249003, 5, 0).
3. Funcionalidades a implementar
No projecto deverão ser implementadas um conjunto de funcionalidades. Segue-se uma breve descrição das funcionalidades a implementar, bem como a cabeça das cláusulas que deverão implementar essa funcionalidade:
(1) Quais os filmes em que participou uma dada pessoa como actor/realizador/...? filmes(P_id, A_id): devolve uma lista contendo os nomes dos filmes em que participou a pessoa P_id com a actividade A_id (0 se a lista for vazia);
filmes(P_id): devolve uma lista contendo os nomes dos filmes em que participou a pessoa P_id (0 se a lista for vazia). Se uma pessoa participou com actividades diferentes no mesmo filme, o nome do filme deve aparecer repetido tantas vezes quanto essas participações;
(3) Qual o elenco de um dado filme?
elenco(F_id): devolve uma lista contendo os nomes dos actores e actrizes participantes no filme F_id (0 se a lista for vazia);
(4) Quais as nomeações de uma pessoa com uma data actividade (independentemente de os ter ganho ou não)?
nomeacao(P_id, A_id): devolve uma lista de pares que têm no primeiro argumento o nome do filme para o qual a pessoa foi nomeada com a actividade A_id e no segundo o tipo de Óscar em causa;
(5) Para quantos Óscares foi nomeada uma dada pessoa (independentemente da actividade que desempenha e de os ter ganho ou não)?
nomeacoes(P_id): devolve o número de Óscares para os quais foi nomeada a pessoa P_id (independentemente de os ter ganho ou não);
(6) Qual o número de Óscares ganhos por um dado filme?
num_oscares_f(F_id): devolve o número de Óscares, efectivamente ganhos pelo filme F_id; (7) Qual a pessoa que entrou em mais filmes como actor/realizador/...?
participou_em_mais_filmes(A_id): devolve o par que tem no primeiro argumento o nome da pessoa que participou em mais filmes como A_id e no segundo o número de filmes em que participou. Em caso de empate, devolve um qualquer dos pares empatados;
(8) Quais os filmes em que contracenam um ou mais actores?
contracenam(Lista_P_ids): devolve uma lista contendo os Ids dos filmes em que participaram todas as pessoas cujas P_ids estão na lista não vazia Lista_P_ids (0 se não existe tal filme);
(9) Qual a pessoa mais bem cotada no top-250?
bem_cotado: devolve um par que tem no primeiro argumento o nome da pessoa mais bem cotada no top-250 e no segundo a sua cotação. Este cálculo é feito somando, para cada posição ocupada na tabela, (250 – posição ocupada), independentemente da actividade da pessoa no filme. Se uma pessoa não entrou em nenhum filme do top-250, tem -1. Em caso de empate, é devolvida a pessoa mais nova.
(10) Qual o par actor/realizador mais bem cotado no top-250?
bem_cotados: devolve o triplo contendo no primeiro argumento o nome do actor mais bem cotado no top-250, no segundo argumento o nome do realizador mais bem cotado no top-250 e no terceiro a soma das respectiva cotações. O cálculo das cotações é o
mesmo que o implementado na funcionalidade (9), mas desta vez, em caso de empate, é devolvido o triplo com o actor mais novo.
4. Detalhes da implementação
4.1.1 Ferramenta
Vai ser usado o swi-prolog (ferramenta com a qual vai ser avaliado o projecto). Informação sobre o swi-prolog pode ser consultada em http:/www.swi-prolog.org/, onde se podem também obter as ferramentas para as várias plataformas.
4.1.2 Regras a implementar e formato dos resultados
Os alunos terão de implementar no ficheiro vip.pl (e apenas neste ficheiro) um conjunto de regras cujas cabeças são as apresentadas na secção 3 e que implementam as funcionalidades aí descritas. Note que:
o O código a entregar deve estar ÚNICA e EXCLUSIVAMENTE no ficheiro vip.pl; o O ficheiro vip.pl não deve carregar a BDvip.pl.
Em relação ao formato de saída, no caso de o resultado ser uma lista, este deverá ter a seguinte forma: e1 ... en + em que:
o cada ei ocupa a PRIMEIRA posição da linha
o na linha imediatamente a seguir ao último ei, existe um (e um só) “+”
No caso em que o resultado é um par (a1, a2), um triplo (a1, a2, a3), ou uma lista de
pares [(a1, a2), ... (an, an+1)] o resultado deverá ter a forma:
a1 a2 ... an an+1 + em que:
o cada ai ocupa a PRIMEIRA posição da linha
o cada número ou nome de actor/actriz/realizador/filme ocupa uma linha o na última linha existe um (e um só) “+”.
4.1.3 Como testar o programa
Supondo que as cláusulas anteriormente discutidas estão definidas em vip.pl e que está igualmente definido o ficheiro teste.pl com o seguinte conteúdo:
start :- carregaDados, testes.
carregaDados :- ['BDvip.pl'], [‘vip.pl’]. testes :- ...
a seguinte linha de comando3:
swipl -s teste.pl -g start -t halt > resultados.txt
permitirá guardar os resultados do programa no ficheiro resultados.txt. Para poder testar o seu programa o ficheiro teste.pl está disponível, assim como o ficheiro resultados.txt que contém os resultados relativos a esses testes.
5. Relatório
O relatório deverá ter um máximo de 5 páginas (ver template em anexo) e um máximo de 10 000 caracteres (incluindo espaços). Este relatório deverá incluir:
o uma breve descrição da implementação de cada funcionalidade e a motivação para as decisões tomadas;
o uma breve descrição dos principais problemas encontrados ao longo da realização do projecto e uma explicação das respectivas soluções.
6. Informações importantes 6.1 Grupos
Serão aceites grupos de 2 e 3 alunos.
6.2 Avaliação
Cotação (sobre 20 valores)
Avaliação
IMPLEMENTAÇÃO 15 valores
- Avaliação Automática (12 valores); - Qualidade do código (3 valores).
Cotação (sobre 20 valores)
Avaliação
RELATÓRIO 5 valores
- Será tida em conta a qualidade do relatório em relação aos seguintes pontos: organização, clareza e qualidade da escrita.
3 A chamada ao Prolog varia nas diferentes plataformas (por exemplo, para windows deve usar-se plcon.exe, em linux deve usar-se pl e em Mac (ppc) deve usar-se /opt/local/bin/swipl).
Notas:
Caso se detectem cópias os alunos terão 0 no projecto e não poderão fazer LP este semestre. 6.3 Processo de entrega
Descrição Penalização
(sobre 20 valores) Formato de entrega - NUM-GRUPO.zip (ex: 71.zip) que
deverá conter:
o O ficheiro vip.pl;
o O relatório em formato .pdf. - Papel:
o O código de vip.pl; o O relatório de acordo com
a template dada.
O desrespeito por qualquer um destes formatos levará à não avaliação do projecto.
Data de entrega - NUM-GRUPO.zip
o Até às 15h de 28 de Maio de 2008 (quarta-feira) - Papel o Até às 15h de 28 de Maio de 2008 (quarta-feira) - 2 valores se entregue até 24 horas de atraso; - 4 valores se entregue até 48 horas de atraso; - Não serão aceites projectos a partir das 48 horas de atraso.
Modo de entrega - NUM-GRUPO.zip (e NÃO RAR!!!!!!) o Através do Fénix - Papel
o Repografia do DEI (Alameda) o Secretariado do DEI (Tagus)
das 10h-12h30 e 14h-16h
O não cumprimento do modo de entrega levará à não avaliação do projecto.