Menu Close

Relación definida por una partición

Dos elementos están relacionados por una partición xss si pertenecen al mismo elemento de xss.

Definir la función

   relacionados :: Eq a => [[a]] -> a -> a -> Bool

tal que (relacionados xss y z) se verifica si los elementos y y z están relacionados por la partición xss. Por ejemplo,

   relacionados [[1,3],[2],[9,5,7]] 7 9  ==  True
   relacionados [[1,3],[2],[9,5,7]] 3 9  ==  False
   relacionados [[1,3],[2],[9,5,7]] 4 9  ==  False

Soluciones

import Data.List ((\\), intersect)
 
-- 1ª definición
-- =============
 
relacionados :: Eq a => [[a]] -> a -> a -> Bool
relacionados [] _ _ = False
relacionados (xs:xss) y z
  | y `elem` xs = z `elem` xs
  | otherwise   = relacionados xss y z
 
-- 2ª definición
-- =============
 
relacionados2 :: Eq a => [[a]] -> a -> a -> Bool
relacionados2 xss y z =
  or [elem y xs && elem z xs | xs <- xss]
 
-- 3ª definición
-- =============
 
relacionados3 :: Eq a => [[a]] -> a -> a -> Bool
relacionados3 xss y z =
  or [[y,z] `subconjunto` xs | xs <- xss]
 
-- (subconjunto xs ys) se verifica si xs es un subconjunto de ys; es
-- decir, si todos los elementos de xs pertenecen a ys. Por ejemplo,  
--    subconjunto [3,2,3] [2,5,3,5]  ==  True
--    subconjunto [3,2,3] [2,5,6,5]  ==  False
subconjunto :: Eq a => [a] -> [a] -> Bool
subconjunto xs ys = and [elem x ys | x <- xs]
 
-- 4ª definición
-- =============
 
relacionados4 :: Eq a => [[a]] -> a -> a -> Bool
relacionados4 xss y z =
  any ([y,z] `subconjunto`) xss

Pensamiento

No hay lío político que no sea un trueque, una confusión de máscaras, un mal ensayo de comedia, en que nadie sabe su papel.

Antonio Machado

10 soluciones de “Relación definida por una partición

  1. luipromor
    relacionados :: Eq a => [[a]] -> a -> a -> Bool
    relacionados xss y x =
      or [elem y xs && elem x xs | xs <- xss]
  2. adogargon
    relacionados :: Eq a => [[a]] -> a -> a -> Bool
    relacionados xss x y =
      x `elem` concat (filter (elem y) xss)
  3. sermurgar

    relacionados :: Eq a => [[a]] -> a -> a -> Bool       
    relacionados xss x y =
      elem (True, True) (zip (map (elem x) xss) (map (elem y) xss))
    

  4. ireprirod
    relacionados :: Eq a => [[a]] -> a -> a -> Bool
    relacionados [] _ _ = False
    relacionados (xs:xss) x y
      | subconjunto [x,y] xs = True
      | otherwise            = relacionados xss x y
     
    subconjunto :: Eq a => [a] -> [a] -> Bool
    subconjunto xs ys = and [elem x ys | x <- xs]
    • ireprirod
      relacionados :: Eq a => [[a]] -> a -> a -> Bool
      relacionados [] _ _ = False
      relacionados (xs:xss) x y =
         subconjunto [x,y] xs || relacionados xss x y
       
      subconjunto :: Eq a => [a] -> [a] -> Bool
      subconjunto xs ys = and [elem x ys | x <- xs]
  5. marmorval9
    relacionados :: Eq a => [[a]] -> a -> a -> Bool
    relacionados [] y z = False
    relacionados (xs:xss) y z
      | elem y xs && elem z xs = True
      | otherwise              = relacionados xss y z
  6. frahidzam
    relacionados :: Eq a => [[a]] -> a -> a -> Bool
    relacionados (xs:xss) x y
      | elem x xs && elem y xs = True || relacionados xss x y
      | otherwise              = False || relacionados xss x y
    relacionados _ _ _ = False
  7. lucsanand
    relacionados :: Eq a => [[a]] -> a -> a -> Bool
    relacionados (xs:xss) y z 
      | elem y xs && elem z xs = True
      | otherwise              = relacionados xss y z
    relacionados _ _ _         = False
  8. berarcmat
    relacionados :: Eq a => [[a]] -> a -> a -> Bool
    relacionados xss x y = (elem [x,y]. map (interseccion [x,y])) xss
     
    interseccion :: Eq a => [a] -> [a] -> [a]
    interseccion xs ys = [x | x <- xs, elem x ys]
  9. pabreggar
    relacionados :: Eq a => [[a]] -> a -> a -> Bool
    relacionados [] _ _ = False
    relacionados xss x y = and [x `elem` ys | ys <- xss, y `elem` ys]

Escribe tu solución

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.