Beruflich Dokumente
Kultur Dokumente
nicamente por definiciones de funciones, entendiendo stas no como subprogramas clsicos de un lenguaje imperativo, sino como funciones puramente matemticas, en las que se verifican ciertas propiedades como:
la transparencia referencial (el significado de una expresin depende nicamente del significado de sus subexpresiones, por lo que una funcin puede ser reemplazada por su valor), y por tanto, la carencia total de efectos laterales. En ciencias de la computacin se dice que una funcin o expresin tiene efecto colateral o efecto secundario si sta, adems de retornar un valor, modifica el estado de su entorno
Otras caractersticas propias de estos lenguajes son la no existencia de asignaciones de variables y la falta de construcciones estructuradas como la secuencia o la iteracin (lo que obliga en la prctica a que todas las repeticiones de instrucciones se lleven a cabo por medio de funciones recursivas).
Existen dos grandes categoras de lenguajes funcionales: los funcionales puros y los hbridos. La diferencia entre ambos estriba en que los lenguajes funcionales hbridos son menos dogmticos que los puros, al admitir conceptos tomados de los lenguajes imperativos, como las secuencias de instrucciones o la asignacin de variables (LISP, Scala, Scheme, Ocaml, SAP y Standard ML ).
En contraste, los lenguajes funcionales puros tienen una mayor potencia expresiva, conservando a la vez su transparencia referencial, algo que no se cumple siempre con un lenguaje funcional hbrido. (Haskell y Miranda )
Orgenes de LISP.
Creado en 1956 por John McCarthy (investigador en Inteligencia Artificial). Propsito inicial: procesamiento simblico de datos. LISP = LISt Processing. En los 80 fue la poca de oro de Lisp (surgi el estndar Common Lisp en 1984, ANSI en 1996). Aplicaciones actuales programadas en Lisp: Emacs, Yahoo Store, etc. (Ms aplicaciones en http://common-lisp.net.)
Dra. Nancy G. Arana Daniel, CUCEI, UdG 6
Paul Graham On Lisp. Prentice Hall. 1993. Disponible en http://www.paulgraham.com/onlisp.html. Guy Steele Common Lisp. The Language. Segunda edicin. Digital Press. 1990. Disponible en
http://www.cs.cmu.edu/Groups/AI/html/cltl/cltl2.html.
Dra. Nancy G. Arana Daniel, CUCEI, UdG 7
Existen varias distribuciones actuales. El curso se basa en Lisp works usando Common LISP. Puede obtenerse de http://www.lispworks.com/ Una alternativa es Lisp in a Box usando mdulo CLISP. Puede obtenerse de http://common-lisp.net/project/lispbox/
Listas. Construdas recursivamente por tomos. Esto significa que una lista puede contener tanto tomos u otras listas como miembros.
Ambas clases son mutuamente excluyentes, con excepcin de la entidad especial, la lista vaca conocida como ``()'' o ``nil,' la cual pertenece a ambas clases.
Ejemplos
SMBOLOS a john 34 c3po LISTAS () (a) (a john 34 c3po) ((john 34) a ((c3po)))
tomos: nmeros.
Enteros. Ej. 4 Fracciones. Ej. 1/5 Reales. Ej. 1.4142135 Complejos. Ej. #C(2 3)
Dra. Nancy G. Arana Daniel, CUCEI, UdG 11
12
13
Evaluacin de tomos
Para cada tomo, el intrprete LISP lo evala encontrando su valor. Para la mayora de los tomos el evaluador regresar un error a menos que se le asigne previamente un valor. Ej. CL-USER 2 > atomo Error: The variable ATOMO is unbound. Se pueden asignar valores a los smbolo usando setq Ej CL-USER 1 > (setq horas-por-dia 24) 24 *Nota: setq puede tomar un nmero arbitrario de pares de smbolos valores: ahora si tenemos variables para reasignar valores!!!!.
Dra. Nancy G. Arana Daniel, CUCEI, UdG 14
Evaluacin de tomos.
Una vez asignado un valor a un tomo, se podr probar CL-USER 3 : 1 > horas-por-dia 24 Los tomos especiales que no necesitan que se les asigne previamente un valor para ser correctamente evaluados son Nmeros. Se predefine que su evaluacin (valor) sea ellos mismos CL-USER 4 : 1 > 9 9 CL-USER 5 : 1 > 3.5 3.5 CL-USER 6 : 1 > #C(2 3) #C(2 3)
15
Evaluacin de tomos.
Adems de los nmeros, existen otros dos tomos especiales, para los cuales su valor est predefinida, t y nil (verdadero y falso respectivamente). El intrprete considera nil como el valor idntico a la lista vaca. CL-USER 7 : 1 > t T CL-USER 8 : 1 > () NIL CL-USER 9 : 1 > nil NIL
Dra. Nancy G. Arana Daniel, CUCEI, UdG 16
Qu pasa?
Si intentamos realizar las siguientes asignaciones de valor. > (setq 1 2) Error: 1 is not a symbol. Error signalled by SETQ. > (setq t nil) Error: Cannot assign to the constant T. Error signalled by SETQ.
Dra. Nancy G. Arana Daniel, CUCEI, UdG 17
Listas.
Cuando el intrprete Lisp encuentra una lista, asume que es de la forma (funcin arg1 arg2 ...) Todas las funciones debern estar previamente definidas antes de ser usadas. > ( sqrt (+ (* x x) (* y y))) 4.472136 > (abs #C(3 4)) 5.0 >(+ 3 4 5) 12
Algunas primitivas (funciones pre;(x^2+y^2) ^0.5 definidas en Lisp): +, -, *, /, exp, expt, log, ;raz cuadradacos, tan, max, min. de C sqrt, sin, del determinante *busquen ms primitivas en la Bibliografa y prubenlas.
18
Todos los parmetros se evalan uno a uno tambin de izquierda a derecha. Por ejemplo.en qu nivel dara el error la De izquierda a siguiente consulta: derecha! Y no de anidamiento ms >(cons a (cons b nil)) profundo a menos Error: La variable A is unbound. profundo.
Dra. Nancy G. Arana Daniel, CUCEI, UdG 19
20
21
Supongan que se quiere construir la lista (1 b c d e) Cuando el intrprete llega a evaluar > (cons 1 (b c d e))
Error: Undefined operator B in form (B C D). El segundo parmetro, se da cuenta de que se trata de una lista, pero el primer trmino de ella NO ES UNA FUNCIN!
Solucin: Con un apstrofe al frente del trmino que no deseamos que el intrprete evale! > (cons 1 (b c d e)) (1 B C D E) y si cambiamos el 1 por a? >(cons a (b c d e)) >(cons a (b c d e))
Error: The variable A is unbound.
(A B C D E)
Noten que (setq algo 1) no necesita apstrofe al frente del smbolo algo, porque setq sustituye al antiguo >(set (quote a) 4).
Dra. Nancy G. Arana Daniel, CUCEI, UdG 22
Quote
> (quote (a b c)) (a b c) > (a b c) (a b c) En los ltimos dos ejemplos se hace uso de una funcin predeterminada de LISP llamada quote o simplemente . Esta funcin es especial en el sentido de que evita la evaluacin de su nico argumento y devuelve su argumento al evaluarse.
23
Cuando cons es usado con dos tomos o un tomo como segundo argumento, produce lo que se conoce como un par punto . Un par punto es la imagen externa de un nodo con una estructura interna con dos componentes llamados car (head) y cdr (tail) por razones histricas. Cada componente en los pares punto puede ser un tomo o una lista y es la representacin de lista en functores como lo hace prolog. De esta manera cada lista se representa internamente como un par punto (A) = (A.NIL). (A B) = (A.(B.NIL)). (A B C ) = (A.(B.(C.NIL)) ). (A B C D ... Y Z) = (A.(B.(C.(.D ... (Y. (Z. NIL)) ... ).
24
26
27
first permite seleccionar el primer elemento de una lista (car). > (first '(a s d f)) a > (first '((a s) d f)) (a s) rest permite seleccionar todos los elementos excepto el primero (cdr). > (rest '(a s d f)) (s d f) > (rest '((a s) d f)) (d f) > (rest '((a s) (d f))) ((d f))
28
> (setq a '(a s d f)) (a s d f) >(first a) a > (rest a) (s d f) > (first (rest a)) s * Ahora se imaginarn cmo llegar al tercer y cuarto elemento de una lista usando first y rest.
Dra. Nancy G. Arana Daniel, CUCEI, UdG 29
30
de una lista, requiere un solo argumento: la lista en cuestin. >a (a a s d f) > (length '(1 2 3)) 3 > (length a) 5 > (length (append a a)) 10 > (length '(append a a)) 3 > (length (list a a)) 2
Dra. Nancy G. Arana Daniel, CUCEI, UdG
31
>a (a a s d f)
32
Tarea.
33
Setf.
setf permite cambiar la parte seleccionada de una lista >( setq mi-lista ( Sara es mi nombre )) (SARA ES MI NOMBRE) >( setf ( first mi-lista ) Ana ) ANA >mi-lista (ANA ES MI NOMBRE) > (setf (third mi-lista) el) EL > mi-lista (ANA ES EL NOMBRE) > (setf (rest mi-lista) '(estudia mucho)) (ESTUDIA MUCHO) >mi-lista (ANA ESTUDIA MUCHO)
Dra. Nancy G. Arana Daniel, CUCEI, UdG 34
Sintxis:
(defun <nombre> <lista-parametros> <cuerpo> )
*muchas versiones de lisp consideran a pi como constante que no puede ser reasignada, lispworks es uno de ellos! **defun se encarga como setf y setq de las apstrofes automticamente
35
36
Ejemplos
>(defun f (a1 a2 &optional a3 &rest a4) <cuerpo> )
>(f a b) a1=valor(a) a2=valor(b) a3=NIL a4=NIL >(f a b c) a1=valor(a) a2=valor(b) a3=valor(c) a4=NIL >(f a b c d e) a1=valor(a) a2=valor(b) a3=valor(c) a4=(valor(d) valor(e))
>(defun f (&key ((:clave1 a1)(:clave2 a2)(:clave3 a3))) ...) >(f :clave3 23 :clave2 (a b c)) a1=NIL a2=(a b c) a3=23
37
Definicin de funciones
Las funciones pueden tener un nmero indefinido de expresiones en el cuerpo. El valor que retorna es el resultado de la ltima expresin.
Qu diferencias hay?
Dra. Nancy G. Arana Daniel, CUCEI, UdG 38
39
Qu mbito tiene la variable z? >(setq z 10 ) >(defun cuadrado (x) (* x x)) >(defun potencia4 (x) (cuadrado (cuadrado x))) >(defun potencia-de (x) (setq y (cuadrado x)) (potencia4 x) ) Qu mbito tiene la variable x? Qu mbito tiene la variable y?
40
PROCESAMIENTO DE LISTAS
INSERCIN, OBTENCIN DE UN ELEMENTO, ELIMINACIN, BSQUEDA EN LISTAS. PONER EJEMPLOS
41
Insertar un elemento
insert-at 'e '(a b c d f) 5 (A B C D E F) (defun i-at (elem org-list pos) (if (or (eql pos 1) (eql org-list nil)) (cons elem org-list) (cons (car org-list) (i-at elem (cdr org-list) (- pos 1)))))
Dra. Nancy G. Arana Daniel, CUCEI, UdG 42
Remueve k-simo
(defun r-at (org-list pos &optional (ini 1)) (if (eql pos ini) (cdr org-list) (cons (car org-list) (r-at (cdr org-list) pos (+ ini 1)))))
43
ltimo de la lista
(defun ml (lista) (if (null lista) nil (if (null (rest lista)) lista ; tiene un elemento (ml (rest lista)) ; recursin en el resto lista ) ) )
Dra. Nancy G. Arana Daniel, CUCEI, UdG 44
45
Funciona para expresar y evaluar si una funcin es computable o no (lo es si puede expresarse usando este formalismo). Enfatiza el uso de reglas de transformacin y no pone atencin en la mquina real en la que se implementen, lo que lo hace un enfoque ms relacionado al sw que al hw.
Clculo lambda
46
Es el principal concepto del clculo lambda. Y se define de manera recursiva como sigue:
<expresin>:= <variable> | <funcin>|<aplicacin> <funcin>:= <variable>.<expresin> <aplicacin>:= <expresin><expresin> - Una expresin puede estar rodeada con parntesis por claridad, esto es, si E == (E). - Las nicas palabras clave en el clculo lambda son y el punto.
Dra. Nancy G. Arana Daniel, CUCEI, UdG 47
Expresiones lambda
Funcin identidad <funcin>:= <variable>.<expresin> x.x - El nombre despus de es el identificador del argumento de la funcin. La expresin despus del punto (en este caso x) es llamado el cuerpo de la definicin.
Ejemplos
48
Las funciones pueden ser aplicadas a expresiones. Un ejemplo de un aplicacin es <aplicacin>:= <expresin><expresin> (x.x)y - Las aplicaciones de funciones son evaluadas sustituyendo el valor del argumento x, en el cuerpo de la funcin: (x.x)y=[y/x]x=y - La notacin [y/x] es usada para indicar que todas las ocurrencias de x son sustituidas por y en la expresin de la derecha.
49
Suponga que se tiene f(x)=x+1, y g(x)=x+2, tal que si llamamos f(g(x))= g(x)+1=x+2+1=x+3 En clculo lambda: (x.x+1)(x.x+2) Y si queremos evaluar a x=2 (x.x+1)(x.x+2)2 En CL: >((lambda (x) (+ x 1)) ((lambda (x) (+ x 2)) 2)) 5
Dra. Nancy G. Arana Daniel, CUCEI, UdG 50
2.- Los nombres de los argumentos de funciones es igual de irrelevante que la de los nombres de las funciones. Esto es: (z.z) (x.x) (y.y) (lambda (x) x) POR LO TANTO, AL PRESCINDIR DE NOMBRES DE FUNCIONES Y/O VARIABLES HACEMOS LA OPERACIN CON FUNCIONES (a travs de funcionales aplicaciones-) LIBRE DE AMBIGEDADES (EJ. DECIDIR SI DOS FUNCIONES SON IGUALES).
Dra. Nancy G. Arana Daniel, CUCEI, UdG 52
Para expresar una funcin f(x,y)= 3x+y2 sera escrita como (x,y).(3x+y2 ) Notacin lambda (lambda (x y) (+ (* 3 x) (* y y))) ;Lisp Como se puede observar, la sintxis de las expresiones lambda en Lisp son similares ala notacin de Church y an ms similares a la notacin de DEFUN. - Ojo: a diferencia de DEFUN, LAMBDA no es una
El trabajo de DEFUN es asociar nombres con funciones. Cuando tecleamos una nueva definicin de funcin, digamos HALF hay dos cosas a considerar: 1.- La cadena HALF representa un smbolo 2.- El smbolo HALF nombra la funcin.
El objeto que representa a la funcin contiene en la celda del nombre un puntero a la cadena HALF, mientras que la celda que apunta al objeto funcin contiene la funcin real, lo que indica que existir una expresin lambda en cada funcin,en algn lugar de memoria cuando se define dicha funcin
Dra. Nancy G. Arana Daniel, CUCEI, UdG 54
Una de las principales caractersticas de Lisp y de las ventajas de representar las funciones como expresiones lambda, es la de conceptualizar dichas funciones como DATOS u objetos de primera clase (por la funcin que realizan a su vez con datos pasivos: listas, estructuras, reales, etc). De esta manera las funciones son suceptibles de ser referenciadas, pasadas como parmetros, devueltas como valor de retorno de otras funciones.. en general operadas
Dra. Nancy G. Arana Daniel, CUCEI, UdG 55
Programacin de aplicaciones
Otra caracterstica del paradigma de programacin funcional es que las funciones son objetos de primera clase, adems de realizar una accin, pueden ser referenciados, operados y regresados por operadores llamados funcionales. En contraste, los lenguajes procedurales tradicionales , los objetos de primera clase son normalmente estructuras de datos pasivas, tales como nmeros, caracteres y cadenas. En un lenguaje funcional, la programacin impllica aplicar funcionales en varias formas en vez de manipular variables con asignaciones, ciclos, etc.
56
entrada regresar el primer elemento de la lista para el cual el predicado regresa TRUE (cualquier valor no-nil). >(find-if # oddp (2 4 6 7 8 9)) 7 >(find-if # (lambda (x) (> x 3)) (0 2 4 5 6)) 4 - Si no existe elemento que satisfaga el predicado se regresar nil >(find-if # oddp (2 4 6 8)) nil
Dra. Nancy G. Arana Daniel, CUCEI, UdG 57
> (remove-if #numberp (2 for 1 sale)) (FOR SALE) > (remove-if #oddp (1 2 3 4 5 6 7)) (2 4 6)
Dra. Nancy G. Arana Daniel, CUCEI, UdG 58
Ejercicio. Supongan que queremos encontrar todos los elementos positivos de una lista de nmeros. Nos ayudaremos con el predicado plusp, el cual prueba si un nmero es mayor que cero. > (remove-if #(lambda (x) (not (plusp x))) (2 0 4 6 -8 10)) (2 6 10)
59
60
Formato: (eval <exp> ) Argumentos requeridos: 1 <exp> : Cualquier expresin Lisp eval provee acceso directo al evaluador de expresiones Lisp. Esto causa la evaluacin de lo que sea que <exp> regrese. Por lo tanto, si <exp> es una expresin evaluable, que a su vez regresa una expresin Lisp evaluable, entonces eval regresa el valor de la evaluacin de esta segunda expresin. Examples:
> (eval (+ 3 4)) 7 > (eval '(+ 1 2)) 3 > (eval (cons '+ '(1 2))) 3 >(setq forma (cons + (1 2))) (CONS (QUOTE +) (QUOTE (1 2))) >(eval forma) (+ 1 2) > (eval 3) 3 > (eval (cons 'a '(s d f))) Error: The function A is undefined.
Dra. Nancy G. Arana Daniel, CUCEI, UdG 61
Operadores relacionales
> (> 5 2 1 0) T (= a b) y (equal a b) son los ms usados Operadores de igualdad, pero existen otros Eq y eql investiguen su funcionamiento y Diferencias. > (> 2 1 10 ) NIL > (> 5 1 4) NIL * Las evaluaciones se realizan por pares.
Dra. Nancy G. Arana Daniel, CUCEI, UdG 62
Los predicados null y not son equivalentes Ambos verifican si el operando es nil. Se prefiere null para verificar listas vacas y not en los restantes casos (por estilo de programacin).
> (null nil) T > (not nil) T > (null ()) T > (not ()) ;;usar null T
> (null '(a s)) NIL > (not '(a s)) ;;usar null NIL > (not (= 1 (* 1 1))) NIL > (null (= 1 (/ 1 1))) ;;usar not NIL
63
Operadoresorden en los que aparecen, pero slo los lgicos and y or. Ambos evalan sus argumentos en el
suficientes para proveer un resultado definitivo. And regresa NIL tan pronto encuentre un argumento que se evale con ese valor. De otra manera regresa el valor de su ltimo argumento.
> (and 1 2 3 4) 4 > (and 1 (cons 'a '(b)) (rest '(a)) (setf y 'hello)) NIL >y Error: The variable Y is unbound.
64
Or regresa el resultado de su primer argumento no-nil (por lo tanto, para el evaluador en ese punto). Regresa nil si todos los argumentos se evalan a nil
> (or (rest '(a)) (equal 3 4)) NIL > (or nil nil 2 (setf y 'goodbye)) 2 >y Error: The variable Y is unbound.
Or
65
La estructura if nos permite ejecutar determinado cdigo en dependencia de determinada condicin (if <test> <then> <else> ) La parte marcada con <then> se ejecuta cuando <test> da T o cualquier otro valor distinto de NIL. Cuando da NIL se ejecuta <else>. <test>, <then> y <else> pueden ser cualquier expresin evaluable de lisp.
Control condicional: if
>absdiff(3 4) 1 >absdiff(5 3) 2
Dra. Nancy G. Arana Daniel, CUCEI, UdG 66
A cada uno de los (<test> <form1> ... <result>) se le llama clusula. Slo la parte <test> es requerida, pero generalmente contienen <test> y <result>, ste ltimo sera el valor que regresa el evaluador si la parte <test> resulta en un valor diferente de NIL, por lo tanto los <formi> intermedios se usan para producir efectos secundarios en los cond. El test de la ltima clusula es generalmente t. (defun absdiff (x y) (cond ((> x y) (- x y)) (t (- y x))))
67
Recursin e iteracin.
68
69
ns ns
(+1 <arg>) suma uno a su nico argumento y lo devuelve. (-1 <arg>) decrementa su argumento en 1 y lo devuelve. >(setq a (a b c d e)) >(setq b (cons (ab) a)) >(ns a) 0 >(ns b) 1
Dra. Nancy G. Arana Daniel, CUCEI, UdG 70
Cada nmero al principio de la lnea representa la profundidad de la recursin. Las lneas con > despus del nmero son las llamadas recursivas y las lneas con < antes del nmero son los valores que regresa la llamada recursiva en el nivel determinado. La llamada al trace permanecer activa (cuando se llame a power) a menos que la funcin sea redefinida. Para deshacer el trace por funciones >(untrace power) (power) Para deshacer el trace con toda la lista de funciones >(untrace) (func1 func2funcn)
71
Lisp provee varios macros para realizar iteraciones, tales como:loop, do, do*, dotimes, y dolist La sintxis de dotimes es la siguiente:
(dotimes (<contador> <limite> <resultado> ) <cuerpo> )
Iteraciones: Dotimes
contador es una variable local que se inicializa a cero. Cada vez que itera, incrementa contador hasta llegar a limite (entero positivo dif. de cero). resultado es opcional. Se evala y es retornado por dotimes al finalizar las iteraciones. En otro caso nil. En cada iteracin se evalan las expresiones en el cuerpo que puede constituirse de varias de ellas.
72
Ejemplo:
(defun power-i (x y) (let ((result 1)) (dotimes (count y result) (setf result (* x result))))) La funcin let declara una variable local y la inicializa con el segundo parmetro.qu hace entonces la funcin power-i??
Dra. Nancy G. Arana Daniel, CUCEI, UdG 73
74
75
prox-elem va iterando sobre la lista. Su valor cambia segn el nmero de iteracin. resultado es opcional. Se evala y es retornado por dolist al finalizar las iteraciones. En cada iteracin se evalan las expresiones en el cuerpo.
Dra. Nancy G. Arana Daniel, CUCEI, UdG 76
(defun nsl-i (lis) (let ((result 0)) (dolist (next lis result) (if (listp next) (setf result (1+ result)))))) >(nsl-i-i (a b c (d e) f (g))) 2 >(dolist (c (a b c d) 3)(print c)) A B C D 3
Ejemplo dolist
77
NO ES TAL-RECURSIVE
Ejemplo: Traten de desarrollar una funcin tail-recursive para encontrar el elemento mayor de una lista numrica.
(defun my-max (nums) (cond ((= (length nums) 1) (car nums)) ;; ((> (car nums) (cadr nums)) ;; (my-max (cons (car nums) (cddr nums)))) ;; (t (my-max (cdr nums))))) ;;
En el nivel de compilacin, muchos algoritmos que efectan dicho paso en diferentes lenguajes, se denominan inteligentes porque son capaces de reconocer funciones tail-recursive y cortan el proceso de evaluacin en cuanto se llega al nivel ms profundo de la recursin, incrementando en gran medida la velocidad de procesamiento
Dra. Nancy G. Arana Daniel, CUCEI, UdG
> (mymax '(2 5 1 32 2)) 0 MYMAX > ... >> NUMS : (2 5 1 32 2) 1 MYMAX > ... >> NUMS : (5 1 32 2) 2 MYMAX > ... >> NUMS : (5 32 2) 3 MYMAX > ... >> NUMS : (32 2) 4 MYMAX > ... >> NUMS : (32) 4 MYMAX < ... << VALUE-0 : 32 3 MYMAX < ... << VALUE-0 : 32 2 MYMAX < ... << VALUE-0 : 32 1 MYMAX < ... << VALUE-0 : 32 0 MYMAX < ... << VALUE-0 : 32 32
81
(defun factorialtail (n) (fact_times n 1) ) Dra. Nancy G. Arana Daniel, CUCEI, UdG
82
RULE OF THUMB 1: When recurring on a list, do three things: 1. check for the termination condition; 2. use the first element of the list; 3. recur with the ``rest'' of the list. RULE OF THUMB 2: If a function builds a list using ``cons,'' return () at the terminating line.
Dra. Nancy G. Arana Daniel, CUCEI, UdG 83
84
85
(make-bin-tree-node E L R): Un nodo con siste en tres componentes, un elemento E, un subrbol izquierdo L y un subrbol derecho R
(defun make-bin-tree-node (E L R) "Crea un nodo eon elemento E, L, R (list E B1 B2))
2.- Selectores: Definimos selectores para cada componente de cada clase de rbol binario
(bin-tree-elem-leaf L): Recupera el elemento de una hoja L (defun bin-tree-elem-hoja (L) "Recupera el elemento de la hoja L." (first L))
86
(bin-tree-node-element N): Recupera el elemento de l nodo N. (defun bin-tree-node-element (N) Recupera el elemento del nodo N." (first N)) (bin-tree-node-left N): Recupera el subarbol izq del node N. (defun bin-tree-node-left (N) "Recupera e subrbol izq. Del node N." (second N)) (bin-tree-node-right N): Recupera el subrbol der. del node N. (defun bin-tree-node-right (N) "Recupera el subrbol der. Del nodo node N." (third N))
87
(defun bin-tree-leaf-p (B) "Test if binary tree B is a leaf." (and (listp B) (= (list-length B) 1))) (defun bin-tree-node-p (B) "Test if binary tree B is a node." (and (listp B) (= (list-length B) 3)))
88