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

Exame de 1a Época - 2a Chamada

Data: 10 de Julho 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 construir um Sistema de Informação para uma Biblioteca, foram identificados as seguintes Entidades e Relações:
o Livro (descrito pelo ISBN, titulo, assunto e editora) que é escrito por um Autor (caracterizado por um nome, o país de onde é natural, e o estilo principal) e o Utente (descrito por um código, o nome, a classe (docente, aluno, externo), e o telefone) que requisita um livro numa data para leitura interna, ou domiciliária.

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, mostre como é que se podia:
b1)
escrever (imprimir no ecran) o título de todos os livros escritos por um autor;
b2)
construir uma lista com o ISBN de todos os livros requisitados para o domicílio por um utente;
b3)
escrever o título e o autor (nome) do livro mais requisitado até ao momento.

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

Questão 2

Pretende-se a implementação em Prolog de um codificador de mensagens (e de um descodificador de mensagens encriptadas), pela substituição simples de uma letra (ou dígito), de a-z (ou 0-9), por outra, também de a-z (ou 0-9). Uma das formas mais simples de substituição é deslocar o alfabeto de uma quantidade específica (chamemos-lhe um delta).
Por exemplo, se cada letra e cada dígito fôr deslocada de 3, então

a b c d e f g h i j k l m n o p q r s t u v w x y z 0123456789

ficaria

d e f g h i j k l m n o p q r s t u v w x y z a b c 3456789012

e a mensagem 'encontra-me ao anoitecer' ficaria 'hqfrqwud-ph dr dqrlwhfhu'.

Usando o algoritmo acima descrito e o predicado pré-definido name/2 (recorde-se que este predicado transforma uma frase (1\bo argumento) numa lista (2\bo argumento) com os códigos ASCII dos seus caracteres), implemente o predicado code( F,FCode,Delta ) que recebe a frase F e a devolve codificada em FCode usando um deslocamento Delta para rodar as letras e os dígitos.
Exemplo:

         ?- code('encontra-me ao anoitecer',C,3).
         C = 'hqfrqwud-ph dr dqrlwhfhu'

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

Questão 3

Considere as frases seguintes, que são estruturalmente (isto é, sintacticamente) idênticas:

e responda às questões:

a)
defina um analisador sintáctico, usando o formalismo DCG do Prolog, que reconheça essas frases e outras com a mesma estrutura.
b)
Modifique a sua gramática (DCG) de modo a aceitar também frases do tipo
c)
Acrescente à sua gramática (DCG) os argumentos e acções necessários de modo a validar a concordância, em género e em número, entre os determinantes e os nomes.
d)
Diga que questão (átomo lógico) deve colocar ao Interpretador de Prolog para fazer o reconhecimento da 1\ba frase acima com a DCG que desenvolveu (suponha que a DCG já foi consultada (carregada para a memória do Interpretador)).

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

Questão 4

Observe com cuidado a seguinte Base de Factos (BC)

         % profRisco(P)  :-  a profissao P 'e de alto-risco.
         profRisco(professor) .
         profRisco(fuzileiro) .
         profRisco(bombeiro) .
         % exerceProf(S,P)  :-  a pessoa S exerce a profissao P.
         exerceProf(ana,professor) .   exerceProf(rui,professor) .
         exerceProf(to,metalurgico) .  exerceProf(xico,bombeiro) .
         exerceProf(marta,bombeiro) .  exerceProf(hugo,fuzileiro) .
         % dorme(S,H)  :- a pessoa S dorme em media H horas por noite.
         dorme(tita,7) .                    dorme(pedro,5) .
         dorme(joao,4) .                    dorme(ze,5) .
         dorme(sofia,6) .                   dorme(mariana,8) .

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

a)
Defina o predicado exerceProfRisco(P) que é verdadeiro sempre que a pessoa P praticar uma actividade profissional considerada de alto-risco.
b)
Escreva as cláusulas que deveriam ser acrescentadas à BC para se poder validar que todos os factos exerceProf/2 (acima exemplificados) estavam aplicados consistentemente, isto é relacionavam uma pessoa (1\bo argumento) com uma profissão (2\bo argumento).
c)
Defina o predicado novaProfRisco(P,Pos) que acrescenta à BC uma nova profissão de alto-risco se e só se esse facto ainda não existir na base; o predicado a definir deve juntar o novo facto no início, ou no fim, conforme o 2\bo argumento (Pos) tenha o valor 'p' ou 'u', respectivamente.
d)
Usando a Árvore de Procura, indique qual seria a 1\ba e quais seriam as restantes respostas calculadas por um Interpretador de Prolog (IP) face à questão: razões diferentes
         exerceProf( QUEM,professor ) .
e)
Usando a Árvore de Procura, mostre que um IP responderia negativamente, "no", às questões abaixo, mas por razões diferentes
         dormeDemais(tita) .
         dormeDemais(joana) .

admitindo que existia na BC um predicado dormeDemais/1 assim definido

         dormeDemais(P) :-  dorme(P,H),  H > 9.

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

Questão 5

No livro 100 Jogos Lógicos da colecção O Prazer da Matemática da Gradiva, pode ser encontrado o jogo que se segue.

Um motorista exprime as suas impressões sobre automóveis da seguinte forma:

Admitirá ele a existência de uma viatura de tracção à frente que seja cara?

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

a)
Escreva cláusulas em Prolog que lhe permitam classificar viaturas de acordo com os seguintes parâmetros: tracção (à frente, ou a trás); potência (muita, média, pouca); classe (`ligeiro, ou pesado, ...).
b)
Recorrendo aos predicados que criou na alínea anterior, acrescente à BC mais cláusulas Prolog para traduzir as afirmações do motorista acima apresentadas, de tal modo que seja possível, posteriormente, fazer inferências sobre a estabilidade, preço, ou travões de uma viatura.
c)
Tomando em consideração a Base de Conhecimento criada nas alíneas anteriores, diga, justificando, se seria possível responder à questão formulada no jogo acima.

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

Questão 6

Escreva em Prolog cláusulas adequadas (podendo recorrer, se necessário a predicados pré-definidos) para definir:

a)
O predicado profundidade( E,L,N ) que, dado um elemento E e uma lista L que pode conter elementos que são novamente listas, determina a profundidade N da primeira ocorrência desse elemento na lista (supõe-se que o nível da lista mais externa é 1). Exemplo:
         ? profundidade(7,[3,[5,7],[4,[7,0]]],N).
         N = 2
b)
O predicado dobra( L,LL ), sendo L e LL listas, em que LL contém todos os elementos de L duplicados. Por exemplo:
         ?- dobra([1,2,3],[1,1,2,2,3,3])
         yes
c)
O predicado separa( L1,(Ln,Ll) ) que recebe como entrada uma lista L1 formada por números e letras, contendo eventualmente repetições, e devolve como saída um par em que o primeiro elemento Ln é a lista apenas dos números e o segundo elemento Ll é a lista apenas das letras. No resultado não podem aparecer repetições, podendo recorrer a predicados de Prolog pré-definidos. Exemplo:
         ?- separa([b,d,2,a,5,b],R).
         R = ([2,5],[d,a,b])
         ?- separa([4,d,5,4,q],R).
         R = ([5,4],[d,q])

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