
\documentclass[a4paper]{article}
\usepackage[portuges]{babel}
\usepackage{a4wide}
\usepackage[latin1]{inputenc}
\usepackage{epsf}

\parindent=0pt
\parskip=2pt

\def\site{\emph{site}}
\def\swi{\textsf{SWI-Prolog}}
\def\sgml{\textsf{SGML}}
\def\html{\textsf{HTML}}
\def\dtd{\textsf{DTD}}
\def\w3{\textsf{WWW}}
\def\nets{\textsf{Netscape}}

\newtheorem{questao}{Quest\~{a}o}
\newcommand{\com}[1]{%
  \texttt{#1} }


\begin{document}

\title{Paradigmas da Programação I\\ LECom (2º ano)}
\author{Trabalho Prático nº 2}
\date{Ano lectivo 2004/2005}

\maketitle

%--------------------------------------------------------------------------
\section{Objectivos e Organização}
Este trabalho prático tem como principais {\bf objectivos}:
\begin{itemize}
\item
aumentar a experiência de uso de uma linguagem (declarativa)
lógica  para modelar estratégias de decisão e de planeamento de acções;
\item
praticar o uso de \emph{listas} e da \emph{recursividade};
\item
aumentar a experiência de
programação na linguagem lógica \textsf{Prolog} para resolução
geral de problemas, encontrando a resposta a questões formuladas
(num determinado universo de discurso) ao construir a árvore de
prova que verifica se a interrogação colocada faz parte, ou se
se pode inferir, da teoria (programa) apresentada;
\item
aperfeiçoar o uso do ambiente de programação lógica \swi.
\end{itemize}
Além disso é intenção desta folha de trabalho, estimular nos alunos o gosto pelos jogos
tradicionais e sua programação e prepará-los para concursos de programação.

Para o efeito, esta folha contém 2 grupos com um total de 7 enunciados,
devendo resolver dois, um de cada grupo.

O trabalho--a realizar até ao final do mês de Dezembro--ou seja, o
programa desenvolvido, deve ser submetido automaticamente por cada
grupo mal esteja concluído, usando para isso o sistema de
submissão electrónica disponibilizado na página da disciplina. Para
efeito de avaliação, será depois (em data a combinar, mas fora da
aula) apresentado ao docente a funcionar (acompanhado do
respectivo
relatório de desenvolvimento) e defendido pelo grupo (3 alunos).

O \textbf{relatório} a elaborar deve ser claro
e, além do respectivo enunciado, da descrição do problema,
e das escolhas/decisões que determinaram a sua implementação final,
deverá conter exemplos de utilização e o código do programa.
Como é de tradição, o relatório  será escrito em \LaTeX.

%--------------------------------------------------------------------------
\section{Grupo 1 de Enunciados}

\subsection{Torres de Hanoi}
Desenvolva um programa em \textsf{Prolog} que implemente o famoso
jogo das \textsf{Torres de Hanoi} em que se pretende mover os
\texttt{n} disco empilhados na Torre A (por ordem decrescente do
seu diâmetro) para a Torre C, usando a Torre B como auxiliar. De
cada vez só pode mover 1 disco de uma torre para a outra, mas jamais pode colocar
um disco sobre outro de menor diâmetro.\\
O programa deve ser invocado através do predicado \texttt{torresHanoi/1},
em que o argumento único é o número de disco com que se pretende jogar.
O programa escreverá cada movimento a efectuar indicado a torre origem e a torre destino.

%--------------------------------------------------------------------------
\subsection{8 Rainhas}
Desenvolva um programa em \textsf{Prolog} que implemente o famoso
quebra-cabeças das \textsf{8 Rainhas} cujo objectivo é colocar 8 rainhas num tabuleiro
de xadrez \texttt{8x8} de tal modo que nenhuma fique em xeque\footnote{No xadrez uma Rainha
põe em xeque todas as casa da mesma linha, coluna ou diagonais.}.\\
O programa deve ser invocado através do predicado \texttt{oitoRainhas/0}.
Ao terminar, o programa indica em que posição (Linha, Coluna) se deveria colocar cada Rainha,
ou então sinalizar que não existe solução.\\
\underline{Sugestão}: altere o predicado inicial de modo a receber como parâmetro a dimensão
do tabuleiro (e consequentemente o número de Rainhas a colocar).

%--------------------------------------------------------------------------
\subsection{Saltos de Cavalo}
Desenvolva um programa em \textsf{Prolog} que implemente o famoso
quebra-cabeças das \textsf{Saltos de Cavalo} cujo objectivo é atravessar um tabuleiro
de xadrez \texttt{NxN} a partir de uma casa dada, com saltos de cavalo\footnote{No xadrez um Cavalo
salta de casa onde para as 8 na sua vizinhança que se atinge deslocando uma em linha/coluna e uma
para baixo/cima.} de tal modo que todas sejam visitadas 1 e 1 só vez.\\
O programa deve ser invocado através do predicado \texttt{saltosCavalo/3}, em que o primeiro
argumento é a dimensão do tabuleiro e os dois seguintes a coordenada da casa de partida.\\
Ao terminar, o programa indicará o percurso feito pelo Cavalo no tabuleiro,
registando o número do salto em que pousa em cada casa.

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

\section{Grupo 2 de Enunciados}

\subsection{Jogo da Forca}
Neste trabalho, pretende-se que crie desenvolva em \textsf{Prolog} um programa para jogar
com o Utilizador uma versão mono-palavra do conhecido \textsf{Jogo da Forca}, em que o computador escolhe
uma palavra-mistério e o jogador tem \texttt{n} tentativas para a adivinhar, propondo uma letra de cada
vez.\\
O programa deve ser invocado através do predicado \texttt{jogoForca/1},
em que o argumento único é o número de tentativas permitidas.
Ao começar, o computador mostra a palavra-mistério com uma marca qualquer na posição de cada
caracter.
Em cada jogada o computador lê uma letra e volta a mostrar a palavra-mistério com as marcas substituídas
pelo caracter introduzido em todas as posições em que ele ocorra na palavra.\\
O jogo termina quando o utilizador acertar em todos os caracteres, ou quando atingir o máximo de jogadas
sem sucesso.\\
\underline{Sugestão}: use o predicado \texttt{random/1} com argumento \texttt{p} para escolher à sorte uma
das \texttt{p} palavras-mistério que tem na sua base de conhecimento.

%--------------------------------------------------------------------------
\subsection{Master Mind}
O desafio que se coloca desta vez é desenvolver um programa \textsf{Prolog} para jogar o jogo
\textsf{Master Mind} com o utilizador, em que o computador detém a combinação de cores a adivinhar
(4 entre 6 cores possíveis, sem repetições).
O jogador terá de acertar na combinação em, no máximo, \texttt{n} jogadas.\\
O programa deve ser invocado através do predicado \texttt{masterMind/1},
em que o argumento único é o número de tentativas permitidas.
Em cada jogada o computador lê uma combinação de 4 cores proposta pelo jogador e responde indicando
o número de cores certas na posição certa (marcas pretas) e
o número de cores certas na posição errada (marcas brancas).\\
O jogo termina quando o utilizador acertar na combinação (fizer 4 marcas pretas), ou quando atingir o máximo de jogadas
sem sucesso.\\
\underline{Sugestão}: use o predicado \texttt{random/1} com argumento \texttt{c} para escolher à sorte uma
das \texttt{c} combinações que tem na sua base de conhecimento.

%--------------------------------------------------------------------------
\subsection{Batalha Naval}
Neste caso o que lhe é pedido é para recriar o tradicional jogo da \textsf{Batalha Naval} em \textsf{Prolog}.
O computador deve carregar para a sua base de conhecimento uma configuração inicial do jogo,
em que estarão colocados num tabuleiro de xadrez \texttt{10x10} os seguintes navios:
4 submarinos; 3 navios de 2 canos; 2 navios de 2 canos; 1 navio de 4 canos.\\
O programa deve ser invocado através do predicado \texttt{batalhaNaval/0},
em que o argumento único é o número de tentativas permitidas.
Em cada jogada o computador lê 3 tiros (cada tiro é o par de coordenadas da casa que se pretende atingir, na
forma de Linha e Coluna) e indica o resultado, isto é se foi tudo na água ou se algum navio foi atingido.\\
O jogo termina quando o utilizador afundar toda a frota, ou quando indicar que não quer continuar a jogar.

%--------------------------------------------------------------------------
\subsection{Minesweeper}
Neste caso o programa que deve desenvolver em \textsf{Prolog} arranca, tal como no caso anterior com
uma configuração inicial do jogo, em que estarão colocados num tabuleiro de xadrez \texttt{NxN} várias
bombas (ao todo \texttt{M}).\\
O programa deve ser invocado através do predicado \texttt{minesweeper/2},
em que os argumentos são a dimensão do tabuleiro (\texttt{N}) e o número \texttt{M} de bombas enterradas
no campo armadilhado.
Em cada jogada o computador lê 1 par de coordenadas da casa a inspeccionar, na
forma de Linha e Coluna, e indica o resultado, isto é mostra todas as casas em torno dessa que estão livres
parando na fronteira, isto é, nas casas que estejam encostadas a uma bomba.
Para cada quadrícula da fronteira, indica o número de bombas adjacentes.\\
O jogo termina quando o utilizador fizer explodir o campo, acertando num bomba,
ou quando descobrir todas as quadrículas sem tocar em nenhuma bomba.

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

\end{document}
