notas-lc/pres_haskell.tex
2024-03-22 10:21:21 -06:00

288 lines
8.3 KiB
TeX

\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}