es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Función que acepta dos listas de predicados y una lista de elementos y divide la lista de elementos según corresponda.

Quiero escribir una función que acepte dos listas de funciones de predicados y una lista de elementos, y devuelva todos los miembros de la lista original que cumplan todos los predicados en pre1_list y elimine los miembros de la lista original que no cumplan los predicados en pre2_list.

Estoy escribiendo este código en un lenguaje llamado mini lisp, que es similar a lisp pero más simple, pero eso no importa, solo quiero ayuda sobre cómo hacer algo así. ¿Alguna idea de cómo implementar este código?

Cómo estoy pensando en hacerlo: (solo el comienzo de mi idea)

(defun get_pred_1_not_2 (pre1_list pre2_list lista)
(cond
((null lista) NIL)
; devuelve todos los miembros de la lista original que cumplen todos los predicados en pre1_list
(pre1_list (get_pred_1_not_2 (cdr pre1_list) pre2_list (filter_pre lista (car pre1_list))))
; elimina todos los miembros de la lista original que no cumplen todos los predicados en pre2_list
(pre2_list (get_pred_1_not_2 pre1_list (cdr pre2_list) ;…. (

donde filter_pre es una función que devuelve todos los elementos de la lista que cumplen los predicados que se le dan.

Espero que alguien pueda ayudar, ya que esta función es realmente difícil de escribir y no quiero rendirme. Gracias.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Aquí tienes una posible implementación de la función:

    (defun obtener_pred_1_no_2 (pre1-lista pre2-lista lista)
      (remove-if-not 
        (lambda (elem)
          (every #'funcall pre1-lista elem)
          (not-any #'funcall pre2-lista elem))
        lista))
    

    Esta función recibe tres argumentos: pre1-lista, pre2-lista y lista, que representan las listas de predicados a incluir y excluir, así como la lista original de elementos, respectivamente.

    El cuerpo principal de la función utiliza la función remove-if-not, que toma como primer argumento un predicado que devuelve T para los elementos a mantener y NIL para los elementos a eliminar. El predicado está definido como una función lambda que toma un elemento de lista y aplica las funciones every y not-any a este utilizando los predicados pre1-lista y pre2-lista.

    La función every aplica las funciones de predicado en pre1-lista al elemento y devuelve T si todas ellas se cumplen, mientras que la función not-any aplica las funciones de predicado en pre2-lista y devuelve NIL si alguna de ellas se cumple. El operador and se utiliza para combinar los resultados de estas dos funciones, de manera que un elemento se mantiene únicamente si cumple todos los predicados en pre1-lista y ninguno de los predicados en pre2-lista.

    La lista resultante contiene únicamente los elementos que satisfacen las condiciones requeridas.

    Ten en cuenta que se utiliza la función funcall para aplicar cada función de predicado al elemento, permitiendo así que los nombres de las funciones se pasen como argumentos en lugar de evaluarse como variables.

Comments are closed.