\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} \end{frame} \end{document}