import Control.Monad amb = id joins left right = last left == head right example = do w1 <- amb ["the", "that", "a"] w2 <- amb ["frog", "elephant", "thing"] w3 <- amb ["walked", "treaded", "grows"] w4 <- amb ["slowly", "quickly"] guard (w1 `joins` w2) guard (w2 `joins` w3) guard (w3 `joins` w4) pure $ unwords [w1, w2, w3, w4]