Intodução à Programação Lógica
MAC, Mat, EM (3o ano)

Exame de Época de Recurso

Data: 12 de Setembro de 1997
Hora: 10:00

 
 
Dispõe de 3:00 horas para realizar este exame
 
Leia as questões com toda a atenção
e Responda com calma e clareza em folha convencional

Questão 1

Para gerir uma Central de Reservas de Automóveis e de Hóteis portugueses foram identificadas as seguintes Entidades e Relações:
a Viatura (especificada pela marca, modelo, matrícula, cilindrada e número de lugares), o Hotel (descrito pelo nome, classificação (em número de estrelas), localização, telefone), o Cliente (caracterizado por um nome, bilhete de identidade, profissão, telefone), e a Reserva que é feita por um Cliente para uma Viatura, ou para um Hotel, e que é descrita por: um código de reserva; número de pessoas; data de aluguer (dia, mes); número de dias da ocupação; e, caso se trate de um Hotel, regista-se ainda o número de quartos e respectivo tipo (duplo, simples, ou suite).

Antes de se criar a Base de Dados Relacional, que servirá de suporte ao sistema informático final, está-se a pensar fazer um protótipo do sistema num ambiente de programação declarativo, lógico.

Responda, então, às alíneas seguintes:

a)
Escolha os predicados (indique o seu nome e todos os seus argumentos) que deve usar em Prolog para modelar as entidades e as relações entre elas (para concretizar a sua resposta, mostre como exemplo 1, ou 2, factos concretos para cada um desses predicados).
b)
De acordo com o modelo que escolheu acima, desenvolva predicados para:
b1)
escrever (imprimir no écran) o nome de todos os Clientes que fizeram pelo menos uma Reserva para um dado Hotel, ou Viatura;
b2)
construir uma lista com a localização de todos os Hotéis reservados para o mês de ágosto';
b3)
acrescentar à base de conhecimento (BC) factos conta(Mes,N) que indiquem, para cada mês do ano, o número de reservas que se registaram para determinado Hotel.
c)
assumindo que L é a lista de locais produzida na linha b2), escreva um predicado filtra(L,L1) que constrói a lista L1 eliminando de L todos os repetidos;
d)
defina a relação shift(L1,L2) tal que L2 seja a lista L1 (resultante da alínea anterior) ``deslocada rotacionalmente'' de um elemento para a esquerda. Por exemplo,
       ?- shift( [aveiro, coimbra, braga, porto], L2).
       L2 = [coimbra, braga, porto, aveiro]
e)
assumindo que os factos conta/2, referidos na alínea b3), foram correctamente acrescentados à BC, escreva uma nova operação para determinar o mês em que houve mais reservas do Hotel em causa
f)
suponha agora que em vez de ter na BC os 12 factos conta/2 referidos em b3), tinha um só facto contas/1 com a lista dos 12 pares:
       contas( [(jan,100),(fev,50),...,(dez,450)] ).

desenvolva um predicado soma/0 que escreva no écran o total das reservas feitas ao longo do ano.

%-------------------------

Questão 2

No regresso duma longa viagem por Portugal, Timóteo passou pela Central de Reservas (modelada no problema anterior) e fez, dos Hotéis que frequentou, as seguintes observações1:

A dita Central de Reservas pretende, obviamente, incorporar na BC do seu sistema de prototipagem em Prolog estas informações preciosas. Responda então às alineas seguintes:

a)
Recorrendo apenas aos predicados de aridade 2 (cujo 1\bo argumento será sempre o Hotel em causa) comida, empregados, abertura, custo, vista, piscina, muro, proibido escreva cláusulas Prolog que traduzam as opiniões acima expressas pelo Timóteo.
b)
Tomando em consideração o conjunto de cláusulas que criou na alínea anterior:
b1)
diga como formulava ao Interpretador de Prolog (IP) a seguinte questão: ``quais são os Hotéis que servem boa comida tendo os muros cobertos com madressilva''.
b2)
diga se o Interpretador de Prolog (IP) consegue concluir pela veracidade da seguinte afirmação: `òs proprietários de cães podem alojar-se com os ditos em Hotéis com muros recobertos a madressilva''.

%-------------------------

Questão 3

Ainda à volta do sistema de prototipagem em Prolog da Central de Reservas, desenhou-se a gramática abaixo (apresentada na notação lógica DCG) para definir uma linguagem que permita descrever viaturas.

         viaturas  -->  marca, modelo, matriculas.
         marca     -->  [pal(M)].
         modelo    -->  [pal(M)], cilindrada, lugares.
         cilindrada-->  numero.
         lugares   -->  numero.
         numero    -->  [num(N)].
         matriculas-->  matricula, outras.
         outras    -->  [','], matriculas.
         outras    -->  [].
         matricula -->  [mat(X)].

Responda, então, às alíneas seguintes:

a)
Diga qual a resposta de um Interpretador de Prolog (IP), à questões:
a1)
       ?- viaturas( [pal(ferrari),pal(f40),num(300),num(8),mat(45-66-AX),mat(66-68-EI)], [] ).
a2)
       ?- viaturas( [pal('Mercedes'),pal(c220D),num(2155),num(5)], [] ).
b)
Modifique a gramática supra de modo a: permitir que cada frase contenha a descrição de viaturas de marcas e/ou modelos diferentes; e que não seja obrigatório escrever o número de lugares.
c)
Acrescente à DCG supra as acções semânticas e os argumentos que achar necessários de modo a:
c1)
validar a cilindrada que terá de ser um número superior, ou igual, a 1000 e validar o número de lugares que deverá estar no intervalo [2,10[;
c2)
validar a marca do automóvel que terá de ser uma de entre as marcas existentes numa lista que se supõe existir na BC na forma do predicado marcas([peugeot, fiat, ferrari, mercedes, ...]).

%-------------------------

Questão 4

Para fazer a Gestão de cada Hotel ligado à Central de Reservas de que vimos falando, construiu-se a seguinte base de factos (BF):

         % cargo(C)  :-  o nome C define um cargo profissional em hotelaria.
         cargo(director).
         cargo(recepcionista).
         cargo(grumete).
         cargo(governanta).
         cargo(barman).
         % exerceCargo(P,C,H)  :- a pessoa P exerce o cargo C no hotel H.
         exerceCargo(pedro,grumete,ibis).
         exerceCargo(delfim,director,penta).
         exerceCargo(mario,barman,alfa).
         exerceCargo(zezinha,governanta,afonso5).
         exerceCargo(analia,recepcionista,ibis).
         exerceCargo(luis,recepcionista,penta).
         % manda(C,S)  :- a pessoa que exerce o cargo C 'e
                          o chefe directo da pessoa que exerce o cargo S.
         manda(director,recepcionista).
         manda(director,governanta).
         manda(recepcionista,grumete).
         manda(governanta,barman).
         % dormeMuito(P)  :- a pessoa P dorme muitas horas.
         dormeMuito(antonio).
         dormeMuito(sandra).
         % deita(P,H)  :- a pessoa P deita-se as H horas.
         deita(antonio,0).
         deita(ana,03).
         deita(sandra,22).
         % hospedada(P,H)  :- a pessoa P esta hospedada no hotel H.
         hospedada(antonio,penta).
         hospedada(ana,ibis).
         hospedada(sandra,afonso5).

e o seguinte programa Prolog:

         % chamaBarman(P) :-  a pessoa P chama por um barman.
         chamaBarman(P) :-  dormeMuito(P).
         chamaBarman(P) :-  deitaTarde(P).
         chamaBarman(P) :-  mandadoPor(barman,P).

         % mandadoPor(S,C) :-  a pessoa S recebe ordens (directas ou nao) de C.
         mandadoPor(S,C) :-  manda(C,S), !.
         mandadoPor(S,C) :-  manda(C1,S), mandadoPor(C1,C).

         deitaTarde(P)   :-  deita(P,H), H>0, H<12.

Responda, então, às alíneas seguintes:

a)
Usando a Árvore de Prova, diga qual a resposta de um Interpretador de Prolog (IP), à questão
         mandadoPor(grumete,director).
b)
Usando a Árvore de Procura, mostre qual seria a 1\ba e as restantes respostas de um Interpretador de Prolog (IP), à questão
         exerceCargo(Quem,OQue,ibis).
c)
Usando a Árvore de Procura, diga se um Interpretador de Prolog (IP), teria de fazer retrocesso (backtracking) para responder afirmativamente à questão
         chamaBarman(ana).
d)
Usando o predicado manda/2 acima, escreva um novo predicado manda1(Nome1,Nome2) que permita saber que a pessoa Nome1 manda directamente na pessoa Nome2, atendendo ao cargo que exercem e ao local de trabalho (o hotel terá de ser o mesmo).
e)
Escreva as cláusulas que deveriam ser acrescentadas à BC para se poder validar que todos os factos exerceCargo/3 (acima exemplificados) estavam aplicados consistentemente, i.é, relacionavam uma pessoa com um cargo num determinado .
f)
Escreva um predicado barmen(P,LN) que constrúa a lista de nomes, LN, de todos os Barman que podem ser chamados pela pessoa P (essa pessoa terá de estar hospedada num hotel e estar em condições de chamar um barman).

%-------------------------


Footnotes:

1 Problema inspirado no Jogo 49 da livro 100 Jogos Lógicos da colecção O Prazer da Matemática da Gradiva.