El problema de la igualdad de los bordes de los árboles binarios (sameFringe)

Dos árboles binarios tienen iguales los bordes si tienen exactamente
las mismas hojas leídas de izquierda a derecha, independientemente de
nodos interiores. Por ejemplo,

Los bordes de los árboles 1 y 2 son iguales, aunque tiene distintas
estructuras internas. El árbol 3 no tiene el mismo borde que el 1 o
el 2, debido al nodo 4. El árbol 4 tampoco tiene el mismo borde que
el 1 debido al orden en que se leen las hojas.

El problema de la igualdad de los bordes de los árboles binarios
(samefringe, en inglés) consiste en decidir si dos árboles tienen los bordes iguales.

Según Richard Gabriel en su artículo The Design of Parallel Programming Languages, en 1977 hubo un debate en el ACM SIGART Newsletter sobre si samefringe es el problema más simple que necesita multiproceso o corrutinas para resolverse fácil y eficientemente. En el debate intervinieron muchas personas, entre ellas John McCarthy cuya primera solución fue la siguiente:

En Same Fringe Problem se presentan soluciones del problema en distintos lenguajes de programación.

Recientemente se propuso samefringe como tarea de Programming Praxis.

A continuación voy a mostrar soluciones al problema samefringe en lenguajes funcionales perezosos (Haskell) e impacientes (Maxima y Lisp.

Las soluciones se presentan como ejercicios para el curso de Informática (del Grado de Matemáticas) y para los libros de Introducción al cálculo simbólico con Maxima y Ejercicios de programación en Haskell.

Como se observa en la tabla del final del artículo, el perezoso Haskell agota a los impacientes Maxima y Lisp.

Solución en Haskell

Este ejercicio se basa en el artículo Carl Hewitt’s Same-Fringe Problem de Remco Niemeijer publicada en Bonsai Code.

Solución en Maxima

Solución en Lisp

Comparaciones

Respecto de la simplicidad, las soluciones en los 3 lenguajes son análogas a la de J. McCarthy.

Respecto de la eficiencia, hay grandes diferencias en los tiempos empleados como se resume en la siguiente tabla
<br /> \begin{array}{|l|r|r|r|} \hline<br /> n  & Haskell<br />          & Maxima<br />                    & Lisp \\ \hline<br /> 20 &  0  & 30.71   &   9.30      \\ \hline<br /> 21 &  0  & 55.96   &  19.09      \\ \hline<br /> 22 &  0  & Agotado &  37.92      \\ \hline<br /> 23 &  0  &         &  74.48      \\ \hline<br /> 24 &  0  &         & 150.76      \\ \hline<br /> 25 &  0  &         & 265.78      \\ \hline<br /> 30 &  0  &         & Agotado     \\ \hline<br /> \end{array}<br />

Las versiones utilizadas son GHC 6.12.1 para Haskell, la 5.20.1 de Maxima y CLISP 2.44.1 para Lisp.

Se observa que el perezoso Haskell agota a los impacientes Maxima y Lisp.