\documentclass[pdflatex,12pt]{amsart}
%\documentclass[12pt]{amsart}
\usepackage{amsmath}
\usepackage[portuges]{babel}
\usepackage[latin1]{inputenc}
\usepackage{enumerate}


\input{defport}
\input{deflogic}
\def\stdin{\emph{stdin}}
\def\stdout{\emph{stdout}}
\def\lpo{\emph{l\'ogica de primeira ordem}}
\def\LPO{\textbf{LPO}}
\def\clx{cl\aa usula}
\title{Trabalho 0: \\ Ambiente para programa\c c\~ao em L\'ogica\\
       Draft 0}

\author{Raul H.C. Lopes}

\def\SC{\emph{Senhor do Castelo}}
\begin{document}

\maketitle
\section{Introdu\cao} 
O objetivo fundamental deste trabalho consiste em exercitar simultaneamente:
\begin{itemize}
	\item Sua capacidade de formula\cao\ de programas recursivos,
		implementando um programa de porte razo\aa vel em Haskell;
	\item seu conhecimento de l\oo gica, implementando uma m\aa quina de 
		infer\^encia;
	\item sua capacidade de formula\cao\ de solu\coes\ para probelmas usando 
		l\oo gica, implementando algoritmos na sua m\aa quina de
		infer\^encia.
\end{itemize}

\section{Seu provador e o mundo}
Seu provador entender\aa\ teorias apresentadas usando \LPO\
e provar\'a teoremas por contradi\cao. Uma teoria ser\aa\ sempre uma conjun\cao\
de disjun\coes\ de literais. Um literal representar\aa\ uma verdade at\^omica
ou a nega\cao\ de uma verdade at\^omica. Um \'atomo ser\'a sempre um 
predicado n-\'ario aplicado a $n$ termos. Seu provador entender\'a teorias
e teoremas expressos como disjun\coes\ de \clx s.
Por exemplo:

$$  -man(x)\, |\, mortal(x)$$

representar\'a o axioma:

$$\forall x: man(x) \limp mortal(x)$$

Note na cl\'ausula:
\begin{itemize}
  \item o quantificador universal fica impl\ii cito;
  \item na verdade, todas as vari\'aveis s\ao\ universalmente quantificadas;
  \item o uso da mesma conven\cao\ do Otter: nomes iniciados com $u,v,x,y,w,z$ 
	  s\ao\ nomes de vari\aa veis;
\end{itemize}

Como no Otter, use:
\begin{itemize}
  \item $|$ para representar a disjun\cao;
  \item $-$ para representar a nega\cao;
\end{itemize}

Dado que a nota\cao\ ser\aa\ toda clausal, seu provador n\ao\ precisar\'a usar
nenhuma constante l\'ogica, al\'em das duas acimas.


\subsection{A linguagem do seu provador}

Em resumo, a linguagem do seu provador consistir\'a de um subconjunto da
linguagem do Otter: todas as constru\coes\ admiss\ii veis na l\oo gica do
seu provador ser\ao\ admiss\ii veis no Otter.

\subsection{Input/output do seu provador}
A entrada e sa\ii da do seu provador ser\ao\ compat\ii veis com entrada/sa\ii da
do Otter.

 Seu provador ler\aa\ do \stdin\ o arquivo com o conjunto de cl\aa usulas e
 produzir\aa\ em \stdout\ a prova resultante.
 
\subsection{A l\'ogica do seu provador}
Seu provador implementar\aa\ no m\ii nimo as seguintes regras de infer\^encia
e estrat\ee gias de busca,
que est\ao\ presentes no Otter:

\begin{itemize}
  \item resolu\cao\ bin\aa ria e fatora\cao\ para gerar novas cl\'ausulas;
  \item elimina\cao de cl\'ausulas subjugadas para reduzir
a explos\ao\ combinat\'oria do espa\cc o de pesquisa;
  \item conjunto de suporte;
 \item busca em largura e profundidade;
 \item uso de literais de respostas, \textbf{\$ANS} literais no Otter, para
	 extra\cao\ de respostas.
\end{itemize}

Todas essas regras est\ao\ apresentadas nas notas de aulas, em  refer\^encias
dispon\ii veis na biblioteca, como \cite{manna:dfcp} ou \cite{chang-lee}, e no
manual do Otter.

\section{A execu\cao\ trabalho}

\subsection{As etapas de constru\cao}
Decomponha seu trabalho de acordo com as etapas abaixo.

\subsubsection{Os tipos de dados}
Defina as classes indutivas e os tipos de dados que as representar\ao\
na linguagem de implementa\cao.

\subsubsection{Lendo um axioma}
Defina e implemente  procedimento para converter um string representando um 
axioma (ou uma conjectura) para a representa\cao\ interna do seu sistema.

\subsubsection{Lendo o arquivo de entrada}
Defina e implemente procedimento para converter um conjunto de strings 
representando uma teoria para 
a representa\cao\ interna da mesma no seu sistema.



\subsubsection{Apresentando output}
Defina e implemente procedimentos que permitam converter qualquer 
representa\cao\ interna de f\'ormula para um string em acordo com
a linguagem externa do provador.

\subsubsection{As regras de infer\^encia}
Defina claramente as regras que pretende ter em seu provador 
e implemente-as.

\subsubsection{Estrat\'egias}
Defina e implemente estrat\'egias para melhorar o desempenho do seu provador,
como:
\begin{itemize}
\item elimina\cao\ de tautologias;
\item elimina\cao\ de cl\aa usulas subjugadas;
\item prefer\^encia por uso de \clx s unit\'arias nos passos
de resolu\cao.
\end{itemize}


\subsection{Linguagem de programa\cao}
Implemente em Haskell.
 
\subsection{O que entregar}
Voc\^e dever\aa\ entregar \emph{tarball} contendo:
\begin{itemize}
  \item A implementa\cao\ do provador;
  \item Documenta\cao\ em \LaTeX;
  \item Makefile 
\end{itemize}

Estando no diret\'orio de trabalho, compacte seus arquivos com o comando:

\begin{verbatim}
  tar -zhcf tp0.tar.gz *
\end{verbatim}

Teste seu \emph{tarball}, executando  a seguinte \sqn\ de comandos em
um diret\'orio tempor\'ario \textbf{vazio}:
\begin{verbatim}
  tar -zxf tp0.tar.gz
  make all
  ./prove < in > out 
\end{verbatim}

Na \sqn\ acima, \textbf{prove} \ee\ o nome do provador e essa \uu ltima
linha aciona prova para teoria em arquivo de nome \textbf{in} e despeja
resultado em arquivo de nome \textbf{out}.

IMPORTANTE: qualquer fuga dessa especifica\cao\ implica em dana\cao\ eterna
na terra do \SC.
T\ao\ importante quanto: trabalhos submetidos ap\'os \textbf{dead}line
ser\ao\ anulados. Mesmo que o atraso seja de $12$ segundos e por culpa
da menstrua\cao\ at\ii pica da av\oo\ do Bush.


\subsection{Makefile}

Seu \emph{Makefile} conter\'a dois \emph{targets}:
\begin{itemize}
  \ibf{all}: que ativar\'a a compila\cao\ de todos os programas bem como
a gera\cao\ de documenta\cao\ em \textbf{PDF} a partir dos fontes em \LaTeX.
\ibf{doc}: que converter\aa\ um artigo do formato \LaTeX\ para \textbf{PDF}.
\end{itemize}



\subsection{A avalia\cao}
A nota ser\aa\ atribu\ii da de acordo com a  tabela \ref{pontos}. Note que
um item com pontua\cao\ $* 0.8$ indica que a nota final do trabalho
ser\aa\ multiplicada por $0.8$.

\begin{table}
\begin{tabular}{|l|l|}\hline
  Provador & at\ee\ $ 8.0$\\
  Artigo & at\ee\  $2.0$ \\
  Trabalho individual & $* 1.3$ \\
  Trabalho em grupo de 2 & $* 0.9$ \\
  Trabalho em grupo de 3 & $* 0.5$ \\
  Trabalho em grupos de 4 ou mais & $ * 0.000001$\\\hline 
\end{tabular}
\vspace*{0.1cm}
\caption{Pontua\cao\ do trabalho}\label{pontos}
\end{table}



Pl\aa gios anulam o trabalho atual e s\ao\ remetidos imediatamente \`a 
dire\cao\ do CT, que define puni\cao\ que pode resultar em expuls\ao\
da universidade.
  
\section{As datas}

Cada grupo dever\aa\ entregar primeiro um plano de trabalho assinado propondo
data de entrega final do trabalho que n\ao\ poder\aa\ ir al\ee m do dia
10 de setembro. Note que voc\^e ainda realizar\aa\ mais uma prova e
opcionalmente um trabalho. Deixar este trabalho se alongar demais prejudicar\aa\
seu desempenho nas outras avalia\coes.

Data de entrega do plano de trabalho: 05 de setembro de 2004.

O plano de trabalho dever\aa\ especificar claramente:
\begin{itemize}
	\item o que ser\aa\ implementado;
	\item as etapas de implementa\cao;
	\item a data da entrega.
\end{itemize}

Ao fazer seu plano de trabalho, inspire-se em tudo o que voc\^e deveria estar 
apredendo em Engenharia de Software.
\bibliography{abbrev,analysis,formal,general,algorithms,program}

\bibliographystyle{amsplain}


\end{document}

