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.

Bucle inteligente sobre listas utilizando | en Haskell.

Estoy tratando de construir una sentencia lógica (de tal manera que solo m proposiciones de n proposiciones pueden ser verdaderas) con un doble bucle, pero me confundo con el token “”|””. No puedo encontrar su significado preciso en Hoogle. La función “select” devuelve una lista de listas, una lista de índices que se pueden seleccionar. Con los índices quiero construir una conjunción de proposiciones “seleccionadas” positivas y proposiciones “no seleccionadas” negativas. ¿Qué estoy haciendo mal con el siguiente código?

genXorM :: Int -> Int -> Forma
genXorM n m = Disy [Conj [Neg $ PrpF $ P x, PrpF $ P y] | z <- select, y <- [0 .. n] \ z, x <- z] where
  select = combinaciones m [0 .. n]

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema que tienes es entender el operador “|” en tu sentencia lógica. El operador “|” es el operador OR lógico en Haskell, lo que significa que si cualquiera de los lados del operador es verdadero, toda la expresión se considera verdadera.

    Sin embargo, según tu descripción, parece que en realidad quieres usar el operador “&”, que es el operador AND lógico. Esto aseguraría que ambos lados del operador deben ser verdaderos para que toda la expresión se considere verdadera.

    En términos de tu código, estás generando correctamente una lista de listas de índices que se pueden seleccionar con la función combinations. Sin embargo, en tu doble bucle, iteras a través de las listas de índices, en lugar de iterar a través de los índices reales.

    Para solucionar esto, puedes cambiar tu bucle para iterar a través de los índices en su lugar. También puedes usar comprensión de listas para generar las proposiciones positivas y negativas en función de si están o no en la lista de índices seleccionados.

    Aquí hay una versión actualizada de tu código:

    genXorM :: Int -> Int -> Form 
    genXorM n m = Disj [Conj [if elem x z then PrpF $ P x else Neg $ PrpF $ P x | x <- [0 .. n]] | z <- select]
      where
        select = combinations m [0 .. n]
    

    En esta versión actualizada, usamos comprensión de listas para iterar a través de cada elemento z en select, y para cada elemento, iteramos a través de cada índice x de 0 a n. Usamos una declaración if dentro de la comprensión de lista para verificar si x está en z, y si lo está, generamos una proposición positiva PrpF $ P x, y si no lo está, generamos una proposición negativa Neg $ PrpF $ P x.

    Luego usamos otra comprensión de lista para generar las conjunciones de proposiciones positivas y negativas generadas en la primera comprensión de lista.

    Esto debería darte la sentencia lógica que estás intentando construir.

Comments are closed.