\documentclass[12pt, a4paper]{article}
 
\newcounter{conta}
\newcounter{conta2}

\hyphenation{geo-gra-fia es-pe-cia-li-za-das e-xem-plo pro-je-to
com-ple-xi-da-de de-sa-pa-re-ce a-bor-da-gem co-mo}

\begin{document}

\vspace*{4cm}
\begin{flushleft} \LARGE\bf
Cap\'{\i}tulo 2: Sintaxe e Significado de Programas Prolog
\end{flushleft}

\vspace*{.5cm}
\begin{itemize} \LARGE
 \item Objetos de dados
 \item Casamento
 \item Significado declarativo de programas Prolog
 \item Significado procedural
 \item Exemplo: macaco e bananas
 \item Ordem das cl\'ausulas e metas
 \item A rela\c c\~ao entre Prolog e l\'ogica
\end{itemize}
\vfill
\ 

\pagebreak
\noindent{\Huge\bf Objetos de dados}

\vspace*{9cm}
\noindent{\LARGE\bf \'Atomos e n\'umeros}

\vspace*{3mm}
\begin{itemize} \Large
 \item \'Atomos:
       \begin{itemize}
        \item Come\c cando com letra min\'uscula: \verb|ana|, \verb|x12|,
              \verb|x_12|.
        \item S\'o caracteres especiais: \verb|<--->|, \verb|==>|, \verb|...|.
        \item Entre ap\'ostrofos: \verb|'Ana'|, \verb|'Deus'|, \verb|'Brasil'|.
       \end{itemize}
 \item N\'umeros:
       \begin{itemize}
        \item Inteiros: \verb|0|, \verb|123|, \verb|-33|.
        \item Reais: \verb|3.14|, \verb|-0.0021|, \verb|100.0|.
       \end{itemize}
\end{itemize}

\vfill
\hfill Cap\'{\i}tulo 2: Sintaxe e Significado de Programas Prolog

\pagebreak
\noindent{\LARGE\bf Vari\'aveis}

\vspace*{3mm}
\begin{itemize}\Large
 \item Come\c cam com letra mai\'uscula ou ``\verb|_|'':

       \begin{enumerate}
        \item[\ \ ] \verb|Res|, \verb|_x12|, \verb|X_12|.
       \end{enumerate}

 \item Vari\'avel {\bf an\^onima}: \verb|_|. Exemplos:

       \begin{enumerate}
        \item[\ \ ] \verb|hasachild(X) :- parent(X,_).|
        \item[\ \ ] \verb|somebody_has_child :- parent(_,_).|
        \item[\ \ ] \verb|?- parent(X,_).|
       \end{enumerate}

 \item Escopo l\'exico de uma vari\'avel: uma cl\'ausula.
\end{itemize}

\vfill
\hfill Cap\'{\i}tulo 2: Sintaxe e Significado de Programas Prolog

\pagebreak
\noindent{\LARGE\bf Estruturas}

\vspace*{3mm}
\begin{itemize}\Large
 \item {\bf Estruturas} (objetos estruturados): t\^em um {\bf funtor} e
       argumentos (que podem ser estruturas).

 \item Exemplo:

       \vspace*{8cm}
 \item Sintaticamente, todo objeto de dado \'e um {\bf termo}.

 \item Todo objeto estruturado pode ser desenhado como uma {\em \'arvore}.

\end{itemize}
\vfill
\hfill Cap\'{\i}tulo 2: Sintaxe e Significado de Programas Prolog

\pagebreak
\begin{itemize}\Large
 \item Outro exemplo:

\end{itemize}

\vfill
\hfill Cap\'{\i}tulo 2: Sintaxe e Significado de Programas Prolog

\pagebreak
\begin{itemize} \Large
 \item Mais um exemplo:

\end{itemize}

\vfill
\hfill Cap\'{\i}tulo 2: Sintaxe e Significado de Programas Prolog

\pagebreak
\noindent{\Huge\bf Casamento}

\vspace*{2cm}
\noindent {\LARGE Para verificar se 2 termos $S$ e $T$ casam:}

\begin{enumerate} \Large
 \item Se $S$ e $T$ s\~ao constantes, eles casam apenas se s\~ao o mesmo objeto.
 \item Se $S$ \'e vari\'avel, eles casam e $S$ \'e instanciado para $T$. Caso
       contr\'ario, se $T$ \'e vari\'avel, eles casam e $T$ \'e instanciado para
       $S$.
 \item Se $S$ e $T$ s\~ao estruturas, eles casam somente se:
       \begin{enumerate}
        \item[(a)] $S$ e $T$ t\^em o mesmo funtor principal, e
        \item[(b)] seus argumentos correspondentes casam.
       \end{enumerate}
\end{enumerate}

\vspace*{3mm}
\noindent{\Large $\Rightarrow$ \'E determinada a instancia\c c\~ao
{\bf mais geral}.}

\vspace*{5mm}
\noindent {\LARGE Exemplos:}

\begin{enumerate}\Large
 \item[\ \ ] \verb|?- date(D,M,2001)=date(D1,may,Y1).|
 \item[\ \ ] \verb|?- triangle(point(1,1),A,point(2,3))| \\
             \hspace*{15mm}\verb|=triangle(X,point(4,Y),point(2,Z)).|
\end{enumerate}

\vfill
\hfill Cap\'{\i}tulo 2: Sintaxe e Significado de Programas Prolog

\pagebreak

\begin{itemize} \Large
 \item Um exemplo:

         \vspace*{9cm}
         \begin{enumerate}
          \item[\ \ ] \verb|vertical(seg(point(X,Y),point(X,Y1))).|
          \item[\ \ ] \verb|horizontal(seg(point(X,Y),point(X1,Y))).|
         \end{enumerate}

         \vspace*{2mm}
         Consultas:
         \begin{enumerate}
          \item[\ \ ] \verb|?- vertical(seg(point(1,1),point(X,3))).| \\
                         \verb|X = 1|
          \item[\ \ ] \verb|?- horizontal(seg(point(2,3),P)).| \\
                         \verb|P = point(X,3)|
          \item[\ \ ] \verb|?- vertical(S), horizontal(S).|
         \end{enumerate}

\end{itemize}

\vfill
\hfill Cap\'{\i}tulo 2: Sintaxe e Significado de Programas Prolog

\pagebreak
\noindent{\Huge Significado declarativo de programas Prolog}

\vspace*{2cm}
\begin{itemize} \Large
 \item {\bf Inst\^ancia} de uma cl\'ausula: obtida substituindo-se suas vari\'aveis por termos.

        \vspace*{3mm}
        Inst\^ancias de \verb|hasachild(X) :- parent(X,Y).|:
        \begin{enumerate}
         \item[\ \ ] \verb|hasachild(A) :- parent(A,B).| (variante)
         \item[\ \ ] \verb|hasachild(ann) :- parent(ann,B).|
         \item[\ \ ] \verb|hasachild(pat) :- parent(pat,small(carol)).|
        \end{enumerate}

 \vspace*{1cm}
 \item Uma meta $G$ \'e {\em verdadeira\/} se, e somente se:
         \begin{enumerate}
          \item[(1)] h\'a uma cl\'ausula $C$ tal que
          \item[(2)] h\'a uma inst\^ancia $I$ de $C$ tal que
                        \begin{enumerate}
                         \item[(a)] a cabe\c ca de $I$ \'e id\^entica a $G$, e
                         \item[(b)] as metas do corpo de  $I$ s\~ao verdadeiras.
                       \end{enumerate}
         \end{enumerate}
\end{itemize}

\vfill
\hfill Cap\'{\i}tulo 2: Sintaxe e Significado de Programas Prolog

\pagebreak
\noindent{\Huge\bf Significado procedural}


\vfill
\hfill Cap\'{\i}tulo 2: Sintaxe e Significado de Programas Prolog

\pagebreak
\

\vfill
\hfill Cap\'{\i}tulo 2: Sintaxe e Significado de Programas Prolog

\pagebreak
\noindent{\Huge\bf Exemplo: macaco e bananas}

\vspace*{2cm}
\noindent {\LARGE\bf Estado inicial do ``mundo do macaco''}:

\vspace*{3mm}
\begin{itemize}\Large

 \item Macaco est\'a na porta.

 \item Macaco est\'a no ch\~ao.

 \item Caixa est\'a na janela.

 \item Macaco est\'a sem banana.

\end{itemize}


\vspace*{8cm}
\noindent {\LARGE\bf Estado meta}: {\Large\verb|state(_,_,_,has)|}

\vfill
\hfill Cap\'{\i}tulo 2: Sintaxe e Significado de Programas Prolog

\pagebreak
\noindent {\LARGE\bf Movimentos}:

\begin{itemize}\Large

 \item Formaliza\c c\~ao: \verb|move(State1,Move,State2)|

 \item {\LARGE\bf 4 operadores}:

       \begin{enumerate}\Large

        \item[(1)] pegue banana ({\em grasp}).

                   \verb|move(state(middle,onbox,middle,hasnot),| \\
                   \hspace*{1.6cm}\verb|grasp,| \\
                   \hspace*{1.6cm}\verb|state(middle,onbox,middle,has))|

        \item[(2)] suba na caixa ({\em climb}).

                   \verb|move(state(P,onfloor,P,H),| \\
                   \hspace*{1.6cm}\verb|climb,| \\
                   \hspace*{1.6cm}\verb|state(P,onbox,P,H))|

        \item[(3)] empurre a caixa ({\em push}).

                   \verb|move(state(P1,onfloor,P1,H),| \\
                   \hspace*{1.6cm}\verb|push(P1,P2),| \\
                   \hspace*{1.6cm}\verb|state(P2,onfloor,P2,H))|

        \item[(4)] ande ({\em walk}).

                   \verb|move(state(P1,onfloor,B,H),| \\
                   \hspace*{1.6cm}\verb|walk(P1,P2),| \\
                   \hspace*{1.6cm}\verb|state(P2,onfloor,B,H))|

       \end{enumerate}
\end{itemize}

\vspace*{1cm}
\noindent {\LARGE\bf A consulta}:

\begin{enumerate}\large

 \item[\ ] \verb|?- canget(state(atdoor,onfloor,atwindow,hasnot)).|
       

\end{enumerate}

\vfill
\hfill Cap\'{\i}tulo 2: Sintaxe e Significado de Programas Prolog

\pagebreak
\noindent {\LARGE\bf O programa}:

\vfill
\hfill Cap\'{\i}tulo 2: Sintaxe e Significado de Programas Prolog

\pagebreak
\noindent{\Huge\bf Ordem das cl\'ausulas e metas}

\vspace*{1cm}
\noindent {\Large Se a cl\'ausula}

\begin{enumerate} \Large
 \item[\ \ \ ]     \verb|move(state(P1,onfloor,B,H),| \\
                   \hspace*{1.6cm}\verb|walk(P1,P2),| \\
                   \hspace*{1.6cm}\verb|state(P2,onfloor,B,H))|
\end{enumerate}

\noindent {\Large for a primeira,}

\begin{enumerate} \Large
 \item[\ ] \verb|?- canget(state(atdoor,onfloor,atwindow,hasnot)).|
\end{enumerate}

\noindent {\Large causa {\em loop\/}}:

\begin{enumerate} \large
 \item[(1)] \verb|canget(state(atdoor,onfloor,atwindow,hasnot)).|
 \item[(2)] \verb|move(state(atdoor,onfloor,atwindow,hasnot),M',S2'),| \\
            \verb|canget(S2')|
 \item[(3)] \verb|canget(state(P2',onfloor,atwindow,hasnot))|
 \item[(4)] \verb|move(state(P2',onfloor,atwindow,hasnot),M'',S2''),| \\
            \verb|canget(S2'')|
 \item[(5)] \verb|canget(state(P2'',onfloor,atwindow,hasnot))|
 \item[(6)] \verb|move(state(P2'',onfloor,atwindow,hasnot),M''',S2'''),| \\
            \verb|canget(S2''')|
 \item[(7)] \verb|canget(state(P2''',onfloor,atwindow,hasnot))|
\end{enumerate}

\vfill
\hfill Cap\'{\i}tulo 2: Sintaxe e Significado de Programas Prolog

\pagebreak

\end{document}

