Exercícios práticos de
Linguagens de Programação II - 2005/2006

Página actualizada às . Comentários para pedro.coutinho@dsi.uminho.pt 

Semanas 2º Semestre

20 Fevereiro 27 Fevereiro 6 Março 13 Março 20 Março 27 Março
3 Abril 10 Abril 17 Abril 24 Abril 1 Maio 8 Maio
15 Maio 22 Maio 29 Maio      


2º Semestre


Semana de 20 Fevereiro

Sumário

Horário especial de início do segundo semestre da LIG: não há aulas excepto apresentação da disciplina 5ª feira (EE 0.10, 10 às 13h).


Semana de 27 Fevereiro

Sumário

Ajustes de turnos, apresentação do laboratório. Resolução de exercício sobre interfaces gráficas em Java (Swing): construção de um tabuleiro de jogo de cartas. Exploração de janelas, painéis e gestores de apresentação (layout managers)


Semana de 6 Março

Sumário

Continuação da resolução do exercício sobre interfaces gráficas em Java da semana passada: o modelo de eventos Swing.


Semana de 13 Março

Sumário

Continuação da resolução de exercícios sobre interfaces gráficas em Java (Swing): exploração de novos componentes e gestores de apresentação.


Semana 20 Março

Sumário

Conclusão da resolução de exercícios sobre interfaces gráficas em Java e apresentação dos resultados. Apresentação do enunciado do trabalho prático.


Semana 27 Março

Sumário

Introdução ao ambiente de programação em PROLOG - o SWI. Comandos básicos do SWI. Resolução de exercícios. Tracing de predicados.

Exercícios do capítulo 1 do livro de PROLOG

Tendo em conta a existência de uma base de conhecimento com factos do tipo progenitor(pai, filho) do género dos apresentados nas aulas teóricas e no capítulo 1 do livro, escreva regras que descrevam as situações abaixo apresentadas. Teste convenientemente as novas regras através de questões (com e sem opção de trace).

Exercício 1.3 a) [resolução]

Predicado feliz, sendo que uma pessoa é considerada feliz no caso de ter pelo menos um filho.

Exercício 1.3 b) (adaptado) [resolução]

Predicado temcasalfilhos, verdade sempre que uma pessoa tem um filho e uma filha.

Exercício 1.5 (adaptado) [resolução]

Predicado tia, indicando se uma pessoa é tia de outra.


Semana 3 Abril

Sumário

Resolução de exercícios introdutórios à Programação em Lógica em PROLOG. Tracing de predicados (continuação).

Exercícios do capítulo 2 do livro de PROLOG

Exercício 2.4 [resolução]

Considere a existência dos predicado linha (seg do capítulo 2), definido à base do predicado ponto (point do capítulo 2).
Utilizando o predicado linha, escreva um termo que represente qualquer linha vertical na coordenada x=5.

Exercício 2.5 [resolução]

Assuma que um rectângulo é representado pelo termo rectangulo(P1, P2, P3, P4) em que os pontos P representam os vértices do rectângulo. Defina a relação

    regular(R)

que é verdade se R for um rectângulo em que cada dos seus lados ou é vertical ou horizontal.

Exercício 2.8 [resolução]

Reescreva a seguinte regra sem usar a notação do ponto e vírgula (ou):

traduzir(Numero, Palavra) :-
            Numero = 1, Palavra = um;
            Numero = 2, Palavra = dois;
            Numero = 3, Palavra = tres.

Exercício 2.9

Considere o seguinte programa em PROLOG (adaptado da fig. 10 do livro)

% inicio do programa

grande(urso).         % clausula 1
grande(elefante).    % clausula 2
pequeno(gato).      % clausula 3
castanho(urso).      % clausula 4
preto(gato).           % clausula 5
cinzento(elefante).  % clausula 6

escuro(Z) :- preto(Z).       % clausula 7
escuro(Z) :- castanho(Z).  % clausula 8

% fim do programa

Simule a execução das seguintes questões:

? - escuro(X), grande(X).

e

? - grande(X), escuro(X).

Para encontrar as respostas, qual das questões é mais trabalhosa (em termos procedimentais)?.


Semana 10 Abril

Férias de Páscoa.


Semana 17 Abril

Sumário

Resolução de exercícios com aritmética, comparação e listas em PROLOG.

Exercícios do capítulo 3 do livro de PROLOG

Exercício 3.17 [resolução]

Definir o predicado  maxList(List,Max), tal que Max seja o maior valor da lista de números List.

Exercício 3.18 [resolução]

Definir o predicado  sumList(List,Sum), tal que Sum seja a soma dos elementos contidos na lista List.

Exercício 3.2 [resolução]

Defina o predicado mylast(Item, List) em que Item é o último elemento da lista List. Escreva-o de duas formas:

a) utilizando o predicado append(L1,L2,L3) para concatenar duas listas

b) sem utilização do predicado append.

Exercício 3.4 [resolução]

Defina o predicado myreverse(List, ReversedList) que inverte a ordem dos elementos de uma lista. Por exemplo, a questão

?- myreverse([a,b,c,d],[d,c,b,a]).

deverá ter sucesso.


Semana 24 Abril

Sumário

Uso de termos estruturados.

Exercícios do capítulo 4 do livro de PROLOG

Exercício 4.1 [resolução]

Considere o exemplo de termos estruturados sobre relações familiares (ver p. 98 livro e aula teórica semana 10 Abril), nomeadamente nas relações familia/3, pessoa/4, criança/1, etc. Escreva questões (golos) que lhe permitam encontrar a seguinte informação na base de dados familiar:

a) Os apelidos das famílias sem filhos.

b) Todas as crianças empregadas.

c) Os apelidos das famílias com mãe empregada e pai desempregado.

d) Todas as crianças cujos pais diferem em idade pelo menos 15 anos.


Semana 1 Maio

Sumário

Estudo e exploração da ferramenta Interprolog.

Demonstração e exercício Interprolog

Considere os seguintes exemplos de utilização do Interprolog:

Exemplo 1

Hello User, que concatena a string "Hello," com a do nome do utilizador do sistema e apresenta-a na consola. A contatenação é feita utilizando SWI-Prolog

Código fonte: TesteInterProlog.java (ver comentários e alterar código para a situação em concreto. Por exemplo, a localização do SWI-Prolog na máquina onde o programa é executado)

Utilizando os comandos abaixo apresentados, compile e execute o programa.

Comando compilação: javac -classpath interprolog.jar TesteInterProlog.java

Comando execução: java -cp .;interprolog.jar TesteInterProlog

Exemplo 2

Exemplo que apresenta a lista de cartas de um determinado jogador. A informação sobre o jogador está descrita no seguinte ficheiro Prolog - jogadoresv2.pl

Código fonte: TesteInterPrologListas2.java (ver comentários e alterar código para a situação em concreto. Por exemplo, a localização do SWI-Prolog na máquina onde o programa é executado)

Utilizando os comandos abaixo apresentados, compile e execute o programa.

Comando compilação: javac -classpath interprolog.jar TesteInterPrologListas2.java

Comando execução: java -cp .;interprolog.jar TesteInterPrologListas2

Exercício [resolução]

Tendo em conta os exemplos apresentados, desenvolva uma aplicação que solicite o número de jogador e apresente o seu nome bem como a lista de cartas. A informação sobre os jogadores está armazenada no seguinte ficheiro jogadores.pl


Semana 8 Maio

Sumário

Controlo de retrocesso. Negação como falhanço. Input / Output em Prolog

Exercícios do capítulo 5 e 6 do livro de PROLOG

Exercício 5.1 [resolução]

Considere o seguinte programa:

    p(1).
    p(2):-!.
    p(3).

Escreva as respostas às seguintes questões (depois teste-as no SWI e confronte com a resposta dada):

a) ?- p(X).

b) ?- p(X), p(Y).

c) ?- p(X), !, p(Y).

Exercício 5.3 [resolução]

Defina o predicado

    separa(Numeros, Positivos, Negativos)

que separa uma lista de números em duas listas: uma com os números positivos (incluindo o zero) e outra com os números negativos. Por exemplo:

    separa([3, -1, 0, 5, -2], [3, 0, 5], [-1, -2])

Pense em duas versões: com e sem utilização de cut.

Exercício 6.2 (adaptado) [resolução]

Seja f um ficheiro de termos. Defina o predicado

    procuraTodosTermos(Term)

que apresenta no terminal e acrescenta à base de conhecimento todos os termos em f que unificam com Term. Certifique-se que Term não é instanciado durante o processo de procura (o que poderia impedir a sua unificação com termos posteriores que existam no ficheiro).


Semana 15 Maio

Sumário

Tolerância de Ponto: Enterro da Gata 2006


Semana 22 Maio

Sumário

Alterações à base de conhecimento. Resolução de exercícios utilizando predicados para obtenção de múltiplas soluções: bagof, setof e findall.

Exercícios do capítulo 7 do livro de PROLOG

Exercício 7.6 (adaptado) [resolução]

Considere o predicado maketable (cf. p.180 do livro) que acrescenta à base de conhecimento uma tabela de multiplicações  (product):

    maketable:-
        L = [0, 1, 2, 3, 4, 5 , 6, 7, 8, 9],
        member(X, L),
        member(Y, L),
        Z is X*Y,
        assert(product(X, Y, Z)),
        fail.

a) Escreva em Prolog a questão que remove toda a tabela de multiplicações (product) da base de conhecimento.

b) Escreva em Prolog a questão que apenas remove as multiplicações cujo resultado é zero.

c) Escreva em Prolog a questão que apenas remove as multiplicações cujo resultado é superior ou igual a dez.

Exercício Múltiplas Soluções [resolução]

Considere o seguinte conjunto de factos que registam a participação de pessoas em vários eventos:

% formato: evento(nome pessoa, nome evento, tipo evento, local evento, data(dia,mês,ano))

evento('Rui','O Último Destino 3',cinema,'Guimarães',data(29,4,2006)).
evento('Rui','O Último Destino 3',cinema,'Braga',data(30,4,2006)).
evento('Rui','Art Déco - Colecção Berardo',exposicao, 'Museu Serralves',data(26,5,2006)).
evento('Ana','Art Déco - Colecção Berardo',exposicao,'Museu Serralves',data(23,5,2006)).
evento('Ana','Missão Impossível 3',cinema,'Porto', data(30,5,2006)).
evento('Carlos','O Último Destino 3',cinema,'Braga',data(21,5,2006)).
evento('Carlos','Missão Impossível 3',cinema,'Braga',data(30,5,2006)).
evento('Carlos','Turandot',opera,'Coliseu Lisboa', data(1,5,2006)).

Utilizando os predicados para obtenção de múltiplas soluções, escreva as questões Prolog que permitam responder ao que é solicitado nas seguintes alíneas

a) Quem foi ao cinema?

b) Quantos bilhetes de cinema foram vendidos em Maio?

c)  Apresente uma lista ordenada de elementos do tipo NomePessoa/[lista dos nomes dos eventos que participou]


Semana 29 Maio

Sumário

Apresentação e defesa oral dos trabalhos práticos.


C¾°Ý‘¨