; _____________________________________________________________
; Programa que descompone una frase en sus elementos atOmicos
;
; Iniciar la ejecuciOn con la funciOn: (frase)
;
;
; _____________________________________________________________
; Lista de datos iniciales
;______________________________________________________________
(setq L_verbos '(corre corta brinca camina))
(setq L_articulos '(el la))
(setq L_adverbios '(rapidamente))
(setq L_preposiciones '(hacia sobre))
(setq L_adjetivos '(alta rojo))
(setq L_sustantivos '(casa jardin joven perro))
;______________________________________________________________
; Frase de prueba
; (setq Texto '(el perro corre rapidamente sobre el jardin))
; (setq Texto '(el joven corre rapidamente hacia la alta casa))
; Objetivo: Indicar si Elemento es un Objeto definido
; Si no es regresa nil
; Si sI es regresa una lista -funciOn member-
;_____________________________________________________________
(defun Es_Verbo(Elemento) (member Elemento L_verbos) )
(defun Es_Articulo(Elemento) (member Elemento L_articulos) )
(defun Es_Adverbio(Elemento) (member Elemento L_adverbios) )
(defun Es_Preposicion(Elemento) (member Elemento L_preposiciones) )
(defun Es_Adjetivo(Elemento) (member Elemento L_adjetivos) )
(defun Es_Sustantivo(Elemento) (member Elemento L_sustantivos) )
(defun frase ()
(print "Introduce una frase: ")
(setq Texto (Lee-frase))
(setq Resto (PN Texto))
(PV Resto)
)
; ============================================================================================
; ============================================================================================
; PREDICADO NOMINAL
; (1) PN ---> articulo + sustantivo
; (2) PN ---> articulo + adjetivo + sustantivo
; (3) PN ---> preposicion + PN
;_____________________________________________________________________________________________
(defun PN (Frase)
; (1) PN ---> articulo + sustantivo <=====
; ----------------------------------------------------
(setq Palabra_1 (nth 0 Frase))
(setq Palabra_2 (nth 1 Frase))
(if
(and
(eql (not (Es_Articulo Palabra_1)) nil)
(eql (not (Es_Sustantivo Palabra_2)) nil)
)
(when t
(print (format nil "Articulo ==> ~a" Palabra_1))
(print (format nil "Sustantivo ==> ~a" Palabra_2))
(cdr (cdr Frase))
)
; (2) PN ---> articulo + adjetivo + sustantivo <=====
; ----------------------------------------------------
(when t
(setq Palabra_3 (nth 2 Frase))
(if
(and (and
(eql (not (Es_Articulo Palabra_1)) nil)
(eql (not (Es_Adjetivo Palabra_2)) nil)
)
(eql (not (Es_Sustantivo Palabra_3)) nil)
)
(when t
(print (format nil "Articulo ==> ~a" Palabra_1))
(print (format nil "Adjetivo ==> ~a" Palabra_2))
(print (format nil "Sustantivo ==> ~a" Palabra_3))
(cdr (cdr (cdr Frase)))
)
; (3) PN ---> preposicion + PN <=====
; ----------------------------------------------------
(when t
(if (eql (not (Es_Preposicion Palabra_1)) nil)
(when t
(print (format nil "Preposicion ==> ~a" Palabra_1))
(setq Resto (cdr Frase))
(setq Resto (PN Resto))
)
(print 'frase_no_reconocida)
)
)
)
)
)
)
; ============================================================================================
; ============================================================================================
; PREDICADO VERBAL
; (1) PV ---> verbo + PN
; (2) PV ---> verbo + adverbio + PN
; (3) PV ---> verbo + adverbio
; (4) PV ---> verbo
;_____________________________________________________________________________________________
(defun PV (Frase)
; (1) PV ---> verbo + PN <=====
; ----------------------------------------------------
(setq Palabra_1 (nth 0 Frase))
(setq Palabra_2 (nth 1 Frase))
(setq Resto (cdr Frase)) ; DESPUES DE LA PRIMERA PALABRA.
; SE USA PARA EL CASO (1)
(if
(and
(eql (not (Es_Verbo Palabra_1)) nil)
(ES_PN Resto)
)
(when t
(print (format nil "Verbo ==> ~a" Palabra_1))
(PN Resto)
)
; (2) PV ---> verbo + adverbio + PN <=====
; ----------------------------------------------------
(when t
(if
(and
(eql (not (Es_Verbo Palabra_1)) nil)
(and
(eql (not (Es_Adverbio Palabra_2)) nil)
(ES_PN (cdr Resto))
)
)
(when t
(print (format nil "Verbo ==> ~a" Palabra_1))
(print (format nil "Adverbio ==> ~a" Palabra_2))
(PN (cdr Resto))
)
; (3) PV ---> verbo + adverbio <=====
; ----------------------------------------------------
(when t
(if
(and
(eql (not (Es_Verbo Palabra_1)) nil)
(eql (not (Es_Adverbio Palabra_2)) nil)
)
(when t
(print (format nil "Verbo ==> ~a" Palabra_1))
(print (format nil "Adverbio ==> ~a" Palabra_2))
)
; (4) PV ---> verbo <=====
; ----------------------------------------------------
(when t
(if
(eql (not (Es_Verbo Palabra_1)) nil)
(print (format nil "Verbo ==> ~a" Palabra_1))
(print 'frase_no_reconocida)
)
)
)
)
)
)
)
)
;________________________________________________________________________
; Solo se identifica si es un articulo o preposiciOn
; lo cual indica que inicia un predicado nominal
;------------------------------------------------------------------------
(defun ES_PN (Frase)
(if
(or
(eql (not (Es_Articulo (car Frase))) nil)
(eql (not (Es_Preposicion (car Frase))) nil)
) t nil
)
)
;
;________________________________________________________________________
; Se introduce una cadena de texto y la convierte a una lista de palabras
;------------------------------------------------------------------------
;
; FUNCIONES QUE SE UTILIZAN
; string-trim Recorta los caracteres extremos indicados entre comillas
; with-input-from-string Convierte una cadena de texto en una lista de palabras
; construyendo una variable flujo entre la cadena y READ
(defun Lee-frase ()
(with-input-from-string (Cadena (string-trim " ." (read-line)))
(do ((Palabra (read Cadena nil) (read Cadena nil)) (oracion nil))
((not Palabra) (return (reverse oracion)))
(push Palabra oracion)
)
)
)