\documentclass[12pt]{beamer}
\usetheme{Copenhagen}
\usepackage[utf8]{inputenc}
\usepackage[spanish]{babel}
\usepackage{amsmath}
\usepackage {xcolor}
\usepackage{amsfonts}
\usepackage{amssymb}
\usepackage{graphicx}
\usepackage{caption}
\usepackage{subcaption}
\usepackage{multicol}
\usepackage{xcolor}
\usepackage{tikz}
\usetikzlibrary{automata,positioning,arrows}
\usepackage[compat=1.1.0]{tikz-feynman}
\usepackage{listings}             %Paquete para agregar codigo



\lstloadlanguages{Matlab} %use listings with Matlab for Pseudocode
\lstnewenvironment{PseudoCode}[1][]
{\lstset{language=Matlab,basicstyle=\scriptsize, keywordstyle=\color{darkblue},numbers=left,xleftmargin=.04\textwidth,#1}}
{}

\usepackage{appendixnumberbeamer}

%\setbeamerfont{page number in head}{size=\large}
%\setbeamertemplate{footline}{Diapositiva}
\setbeamertemplate{footline}[frame number]

\newcommand{\backupbegin}{
	\newcounter{finalframe}
	\setcounter{finalframe}{\value{framenumber}}		
}

\newcommand{\backupend}{
	\setcounter{framenumber}{\value{finalframe}}
}

\author{Lógica computacional}
\title{Una (h)ojeada a Haskell para la programación lógica}
%\setbeamercovered{transparent} 
%\setbeamertemplate{navigation symbols}{} 
%\logo{} 
%\institute{} 
%\date{} 
%\subject{} 
\begin{document}

\begin{frame}
  \titlepage
\end{frame}

\begin{frame}{Mutación de los datos}
  \lstinputlisting[firstline=1,lastline=5]{muta.py}
\end{frame}

\begin{frame}{Definiendo funciones en Haskell}
  \begin{itemize}
  \item Funciones \emph{curriadas} o \emph{no curriadas} (\emph{curried, non-curried})
  \item Podemos pasar de una definición a la otra
  \item Nos ahorra teclear y trabajamos en una idea más básica
  \end{itemize}
\end{frame}

\begin{frame}{Haskell con curry y sin curry}
  \begin{multicols}{2}
    \lstinputlisting[firstline=1,lastline=3]{inc.hs}
    \vspace{1 cm}
    \lstinputlisting[firstline=1,lastline=4]{incurry.hs}
  \end{multicols}
  
\end{frame}

\begin{frame}{Cálculo $\lambda$}
  \begin{figure}[ht!]
    %\begin{center}
    \centering
    \begin{subfigure}[b]{0.2\linewidth}
      \includegraphics[width=\linewidth]{Alonzo_Church.jpeg}
      \label{f:Alonzo Church}
      \caption{Alonzo Church}
    \end{subfigure}
    \begin{subfigure}[b]{0.2\linewidth}
      \label{f:Emil Leon Post}
      \caption{Emi Leon Post}
      \includegraphics[width=\linewidth]{Emil_Leon_Post.jpeg}
    \end{subfigure}
    \begin{subfigure}[b]{0.2\linewidth}
      \includegraphics[width=\linewidth]{haskell_curry.jpg}
      \label{f:Haskell Curry}
      \caption{Haskell Curry}
    \end{subfigure}
    \begin{subfigure}[b]{0.2\linewidth}
      \label{f:Alan Turing}
      \caption{Alan Turing}
      \includegraphics[width=\linewidth]{alan_turing.jpg}
    \end{subfigure}
    \caption{Aportaron al cálculo $\lambda$, entre muchas personas más. Algunas de estas imágenes cuentan con derechos de autor, son usada con fines educativos.}
    \label{fig:Church}
    %\end{center}
  \end{figure}
\end{frame}

\begin{frame}{$\lambda$-términos en Haskell}
  \begin{align*}
    suma\ x=& \setminus y -> x+y \\
    suma =& \setminus x -> (\setminus y -> x+y) \\
    suma =& \setminus x -> \setminus y -> x+y
  \end{align*}

  ¿Cuál es el chiste de eso?

  \begin{align*}
    (+=) =& \setminus x -> \setminus y -> x+y\\
    (+=) =& \setminus x\ y -> x+y \\
    3\ +=\ 5
  \end{align*}
  
\end{frame}

\begin{frame}{Listas}
  \begin{itemize}
  \item Conjunto nordenado de objetos no necesariamente del mismo tipo
  \item Versátiles y base de otro tipo de estructuras
  \item Los arreglos tienen un nombre y un apuntador
  \item Listas tienen dos apuntadores
  \end{itemize}
\end{frame}

\begin{frame}{Sumando en una lista}
  \begin{equation*}
    sum\ [1..100]
  \end{equation*}
  \lstinputlisting[firstline=1,lastline=3]{sumalista.hs}
  Prueben $a=[1,2,3,4]$ y $b=['a','b','c','d']$
\end{frame}

\begin{frame}{Aplicación de funciones en Haskell}
  \begin{center}
    \begin{tabular}{||c|c||} 
      \hline
      Matemática & Haskell  \\ [0.5ex] 
      \hline\hline
      $f(x)$ & $f\ x$ \\ 
      \hline
      $f(x,y)$ & $f\ x\ y$ \\
      \hline
      $f(g(x))$ & $f\ (g\ x)$ \\
      \hline
      $f(x,g(y))$ & $f\ x\ (g\ y)$ \\
      \hline
      $f(x)g(y)$ & $f\ x\ *\ g\ y$ \\ [1ex] 
      \hline
    \end{tabular}
  \end{center}
\end{frame}

\begin{frame}{Comandos para scripts}
  \begin{center}
    \begin{tabular}{||p{3cm} | p{4cm}||} 
      \hline
      Comando & Accion  \\ [0.5ex] 
      \hline\hline
      $:load\ nombre$ & Cargar $script$ \\ 
      \hline
      $:reload$ & Recargar script \\
      \hline
      $:edit\ nombre$ & Cambiar nombre del $script$ \\
      \hline
      $:edit$ & Editar el $script$ \\
      \hline
      $:type\ expr$ & Mostrar el tipo de la expresión \\  
      \hline
      $:?$ & Mostrar los comandos \\  
      \hline
      $:q$ & Salir de $GHCi$ \\  
      \hline
    \end{tabular}
  \end{center}
\end{frame}

\begin{frame}{Cadenas especiales y comentarios}
  \textbf{case class data default deriving do else if import in infix infixl infixr instance let module newtype of then type where}
  \begin{itemize}
  \item Comentarios ordinarios (máximo una línea), empiezan con $--$.
    \item Comentarios anidados (multilínea), empiezan con $\{-$ y terminan con $-\}$
  \end{itemize}
\end{frame}

\begin{frame}{Ordenar una lista}
  \lstinputlisting[basicstyle=\ttfamily\scriptsize,firstline=1,lastline=6,language=haskell]{ordenar.hs}
  Prueben $a=[1,2,3,4]$ y $b=['a','b','c','d']$
\end{frame}

\begin{frame}{Operaciones sobre listas}
  \begin{multicols}{2}
    \begin{align*}
      a\ =&\ [1,2,3,4,5]\\
      head\ a&\\
      tail\ a&\\
      init\ a&\\
      last\ a&\\
      a!!2&\\
      take\ 3\ a& \\
      filter\ odd\ a&
    \end{align*}
    \begin{align*}
      drop\ 3\ a&\\
      length\ a&\\
      sum\ a&\\
      product\ a&\\
      [1,2,3]++[4,5]&\\
      reverse\ a&\\
      null\ a&\\
      minimum\ a\\
      head\ []&\text{ (¿?)}
    \end{align*}
  \end{multicols}
\end{frame}

\begin{frame}{Expresiones condicionales}
  \begin{itemize}
  \item Expresiones condicionales
    \lstinputlisting[basicstyle=\ttfamily\scriptsize,firstline=10,lastline=12,language=haskell]{fun.hs}
  \item Expresiones condicionales anidadas
    \lstinputlisting[basicstyle=\ttfamily\scriptsize,firstline=13,lastline=16,language=haskell]{fun.hs}
  \end{itemize}
\end{frame}

\begin{frame}{Guardas}
  \lstinputlisting[basicstyle=\ttfamily\scriptsize,firstline=17,lastline=21,language=haskell]{fun.hs}
\end{frame}

\begin{frame}{Números primos}
  \lstinputlisting[basicstyle=\ttfamily\scriptsize,firstline=48,lastline=56,language=haskell]{fun.hs}
\end{frame}

\begin{frame}{Verificador de tautologíoas}
  \lstinputlisting[basicstyle=\ttfamily\scriptsize,firstline=1,lastline=8,language=haskell]{taut.hs}
\end{frame}

\begin{frame}{Declarando la sustitución}
  \lstinputlisting[basicstyle=\ttfamily\scriptsize,firstline=48,lastline=62,language=haskell]{taut.hs}
\end{frame}

\begin{frame}{Las variables en una proposición}
  \lstinputlisting[basicstyle=\ttfamily\scriptsize,firstline=63,lastline=71,language=haskell]{taut.hs}
\end{frame}

\begin{frame}{Las posibles combinaciones en una sustitución}
  \begin{itemize}
  \item Pensando en $veradero=1$ y $falso=0$ es equivalente a contar en binario.
  \item O se puede hacer de otra forma viendo las regularidades
    \begin{center}
      \begin{tabular}{c|cc}
        F & F & F \\
        F & F & T \\
        F & T & F \\
        F & T & T \\
        \hline
        T & F & F \\
        T & F & T \\
        T & T & F \\
        T & T & T \\
      \end{tabular}
    \end{center}
  \end{itemize}
  \lstinputlisting[basicstyle=\ttfamily\scriptsize,firstline=72,lastline=76,language=haskell]{taut.hs}
\end{frame}

\begin{frame}{Ahora sí a definir todas las posibles sustituciones}
  \begin{itemize}
  \item Remover duplicados de la lista de variables
  \item Generar los posibles valores con $bools$
  \item Emparejar las lista $zip$
  \end{itemize}
  \lstinputlisting[basicstyle=\ttfamily\scriptsize,firstline=77,lastline=84,language=haskell]{taut.hs}
\end{frame}

\begin{frame}{La fase final, el que decide}
  \lstinputlisting[basicstyle=\ttfamily\scriptsize,firstline=85,lastline=90,language=haskell]{taut.hs}
  Armamos una proposición:
  \lstinputlisting[basicstyle=\ttfamily\scriptsize,firstline=30,lastline=32,language=haskell]{taut.hs}
\end{frame}

\end{document}
