\documentclass[12pt]{amsart}
\usepackage{listings}
\usepackage[portuges]{babel}
\lstloadlanguages{Pascal,Haskell}
\lstset{frame=tb}
\input{defalgo}
\input{defport}
\input{deflogic}
\input{defseqs}

\def\pivot{piv\^o}
\def\varderiv{vari\aa vel derivada}

\title{Corre\c c\~ao de programas \\ Draft 1}
\author{Raul H.C.Lopes}
\begin{document}
\maketitle

\section{Introdu\cao}
Estas notas introduzem um problema importante da arte de programa\cao\ de 
computadores: corre\cao\ de programas no paradigma imperativo. O conjunto de 
exemplos usados aborda em geral o tratamento de \sqn s: pesquisa, soma, 
particionamento. Os problemas de particionamento motivar\ao\ a pr\oo xima \sqn\ de notas que trata de ordena\cao\ de \sqn s.

Refer\^encias fundamentais sobre esses problemas s\ao:
\begin{itemize}
	\item corre\cao\ de programas: \cite{dijkstra:discipline}, o marco 
	    inicial na \'area, \cite{dijkstra:fdpp}, cole\cao\ artigos abordando            algoritmos e provas interessantesm \cite{gries:science-prog}, 
	    texto claro e f\'acil de ler.
	\item ordena\cao: \cite{dek:taocp:iii}, a b\ii blia. 
\end{itemize}

Cada uma das pr\'oximas se\coes\ propor\'a um problema, cuja solu\cao\ ser\aa\ 
delineada. A cada solu\cao\ apresentada, nota\cao\ da linguagem de comandos 
guardados ser\'a introduzida  e exerc\ii cios ser\ao\ propostos.

\begin{notation}
	O s\ii mbolo $\dfn$ \ee\ usado para introduzir \emph{nomes} como 
	abrevia\coes\ de f\oo rmulas, ou seja, introduzir 
	\emph{nomes/s\ii mbolos} via defini\cao l\oo gica. Por exemplo,
	\[ P \dfn \lele 0km \land S = \bndsum{i}{\lelt 0ik}{v.i}\]
	introduz o s\ii mbolo $P$ como nome para a f\oo rmula
         \[\lele 0km \land S = \bndsum{i}{\lelt 0ik}{v.i}\]
\end{notation}

\begin{notation}
	As seguintes regras, essencialmente retiradas de 
	\cite{curry:foundations} e usadas tanto por Curry
	\footnote{Ali\aa s, 
	se voc\^e tem interesse s\ee rio em \textbf{Ci\^encia
	da Computa\cao}, cedo ou tarde deveria ler
	\cite{curry:foundations}.}
	quanto por Church, 
	poder\ao\ ser usadas para reduzir o n\uu mero 
	de par\^entesis usados em express\oes\ aritm\ee ticas e l\oo gicas.
	\begin{itemize}
		\item operadores aritm\ee ticos s\ao\ mais fortes do que 
			operadores relacionais. Assim
			\[1 + 2 = 3 \]
			obviamente \ee\ uma abrevia\cao\ de 
			\[ (1+2) = 3 \]
		\item dentre os operadores relacionais, nega\cao\ \ee\ o mais
			forte, seguido de conjun\cao\ e disjun\cao\ e, por 
			\uu ltimo, implica\cao\ e igualdade.
		\item ponto (\textbf{.}) e dois pontos (\textbf{:})  podem
			ser usados como \emph{marcadores} para reduzir a n\uu mero de 
			par\^entesis. Fim e in\ii cio de express\ao\ s\ao\ 
			marcadores com zero pontos.
			As regras b\aa sicas para seu uso neste
			texto s\ao:
			\begin{enumerate}
				\item um marcador com mais pontos tem mais 
					for\ca\ do que um marcador com menos 
					pontos.
				      \[ rev.\xcat xy \ll:=\lr: rev\xcat yx\]
				      abrevia
				      \[ (rev(\xcat xy)) = (rev(\xcat yx))\]
				\item um marcador \`a esquerda de um operador
					delimita uma express\ao\ que se estende
					para a esquerda at\ee\ um marcador de
					mais alta prioridade.
					\[ x+f.y\]
					abrevia
					\[x+f(y)\]
					
				\item um marcador \`a direita de um operador
					delimita uma express\ao\ que se estende
					para a direita at\ee\ um marcador de
					mais alta prioridade.
			        \item a express\ao\ delimitada por um marcador
					respeita os tipos da express\ao\ 
					envolvida.
				      \[ rev.\xnil = \xnil \]
				      abrevia 
				      \[ rev(\xnil) = \xnil \]
				      e n\ao\
				      \[ rev(\xnil=\xnil)\]
				      que violaria o fato de $rev$ mapeia
				      \sqn s para \sqn s.
				\item um ponto amarrado a um operador relacional
					tem mais for\ca\ do que um ponto ligado
					operador funcional.
					\[rev.x\ll.=\lr.rev.y\]
					abrevia
					\[rev(x) = rev(y)\]
				\item um marcador mais \`a esquerda tem mais 
					prioridade do que um marcador mais
					\'a direita.
				\[ p \limp\lr. q\limp\lr. r\limp s\]
				abrevia
				\[ p\limp(q\limp(\limp s)\]
			\end{enumerate}
	\end{itemize}
\end{notation}

As provas listadas nestas notas e em outras presentadas ao longo do curso
apresentam provas baseadas no formalismo da l\oo gica equacional, usada
tamb\ee m em \cite{gs:discretemaths}. Algumas dessas regras s\ao\ apresentadas
abaixo. Voc\^e pode usar os sistemas de prova, como Dedu\cao\ Natural ou
Sequent Calculus, ou sistema de Hilbert. O importante \ee\  que use um sistema
de forma coerente e apresente refer\^encia para as fontes de suas regras 
para que n\ao\ restem d\uu vidas sobre quaisquer passos de suas provas.

IMPORTANTE: Estas notas n\ao\ substituem o conhecimento que voc\^e adquiriu na
disciplina de \textbf{No\coes\ de l\oo gica}.

\begin{definition}
	A seguir s\ao\ apresentados teoremas da l\oo gica de primeira ordem
	que s\ao\ usados em diversas provas ao longo deste documento. Note
	que:
	\begin{itemize}
	\item Equival\^encia l\oo gica de duas proposi\coes\ \ee\ representada
		pela igualdade da mesma, ou seja,
		\[ p = q\]
		\ee\ usado em lugar de
		\[ p \equiv q\]
	\item O s\ii mbolo $\follows$ define uma rela\cao\ de con\sqn.
		\[ p, q \follows r \]
	abrevia: `` assumindo que $p$ e $q$ s\ao\ verdades, ent\ao\ \ee\ 
	poss\ii vel provar $r$. 
	\item Regras de infer\^encia s\ao\ freq\"uentemente introduzidas
		usando a nota\cao:
		\[\infrtwop{\Gamma_0}{\alpha_1}{\Gamma_1}{\alpha_1}{\Lambda}{\beta}\]
		que abrevia o racioc\ii nio: se $\Gamma_0$ \ee\ um conjunto
		de hip\oo teses apartir do qual se pode provar $\alpha_0$ e
		$\Gamma_1$ \ee\ outro conjunto de hip\oo teses do qual se
		pode provar $\alpha_1$, ent\ao\ do conjunto de hip\oo teses
		$\Lambda$ \ee\ poss\ii vel provar (deduzir) $\beta$. 
		
		Para exemplo mais concreto, observe a seguinte a regra, 
		apresentada como \emph{Introdu\cao\ da Conjun\cao} no sistema
		de Dedu\cao\ Natural.
		\[\infrtwop{}{p}{}{q}{}{p\land q}\]
		que diz que
\begin{itemize}
	\item se $p$ \ee\ um teorema da l\oo gica e $q$ \ee\ um teorema
		da l\oo gica, ent\ao\ $(p\land q)$ \ee\ um teorema da l\'ogica;
	\item ou, lendo de baixo para cima, para provar que $(p\land q)$ \ee\
		verdadeiro (ou seja, $\follows (p\land q)$), prove
		que $p$ \ee\ verdadeiro (ou seja, $\follows p$) e prove
		que $q$ \ee\ verdadeiro (ou seja, $\follows q$).

	\end{itemize}
	\end{itemize}

	A lista a seguir apresenta alguns dos teoremas da l\'ogica cl\aa ssica
	usados. Ela \ee\ obviamente incompleta: por exemplo, n\ao\ est\ao\
	listados comutatividade de \land\ e \lor, associatividade, etc.
	\begin{itemize}
		\item $\lrintro\lor:\ \follows p\limp(p\lor q)$
		\item $\lrelim\lor:\ 
	                \follows (p\limp r)\land(q\limp r)\ll.\limp\lr. 
			                (p\lor q)\limp r$
		\item $\lrelim\land:\ \follows p\land q\limp p$
		\item $\lrmp:\follows\ p\land(p\limp q)\limp q$
		\item $\lrif:\ \follows(q\lif p) = (p\limp q)$
		\item $\lrleibniz:\ (e=f)\follows E[z:e]=E[z:=f]$
		\item $\lrdemorgan\land:\ 
			\follows \neg(p\land q) = \neg p\lor\neg q$
		\item $\lrdemorgan\lor:\ 
			\follows \neg(p\lor q) = \neg p\land\neg q$
		\item $\lrdemorgan\cand:\ 
			\follows \neg(p\cand q) = \neg p\cor\neg q$
		\item $\lrdemorgan\cor:\ 
			\follows \neg(p\cor q) = \neg p\cand\neg q$
		\item $\lrdist\land\lor:\ 
			\follows r\land(p\lor q) = (r\land p)\lor(r\land q)$
	\end{itemize}
	T\ee cninas usuais de prova s\ao\ codificadas pelas regras:

	\begin{gather*}
		\lrdeduct:\ \infronep{P}{Q}{ }{P\limp Q}\\
		\lrbycase:\ \infrtwop{}{E[z:=\ltrue]}{}{E[z:=\lfalse]}{}{E[z:=P]}\\
		\lrbycontra:\ \infronep{}{\neg P\limp\lfalse}{}{P}\\
		\lrcontrapos:\ \infronep{}{\neg Q\limp \neg P}{}{P\limp Q}\\
		\lrmutualimp:\ \infrtwop{}{P\limp Q}{}{Q\limp P}{}{P = Q}\\
		\lrintro\land:\ \infrtwop{}{P}{}{Q}{}{P\land Q}
	\end{gather*}

\end{definition}
\input{seqsearch}

\input{seqops}

\input{seqperms}

Estas notas foram completamente alteradas desde a \uu ltima vers\ao, mas ainda
necessitam muitas corre\coes\ e adi\coes\ em termos de:
\begin{itemize}
	\item novos exemplos;
	\item novos exerc\ii cios;
	\item explana\cao\ da sem\^antica da linguagem usada;
	\item substitui\cao\ total dos exemplos em Haskell por equivalentes em
		l\oo gica;
	\item valida\coes\ usando algum assistente de prova.
\end{itemize}

Agrade\co\ contribui\coes\ nesse sentido.

\bibliographystyle{amsplain}
\bibliography{abbrev,general,program,simulation,co,algorithms,compgeo,formal,maths}


\end{document}

