Такое ощущение, что я застрял, друзья мои. Может ли кто-нибудь объяснить мне, как выбрать уравнения из «Жемчужины проектирования функциональных алгоритмов», глава 11 («Не максимальная сумма сегментов») .
Вот проблема (немного упрощенная) Пусть у нас есть несколько состояний с заданными переходами:
data State = E | S | M | N
deriving (Show, Eq)
step E False = E
step E True = S
step S False = M
step S True = S
step M False = M
step M True = N
step N False = N
step N True = N
Теперь давайте определим pick:
pick q = map snd . filter ((== q) . fst) . map (\a -> (foldl step E a, a))
Автор утверждает, что выполняются следующие семь уравнений:
pick E xs = [[]]
pick S [ ] = [ ]
pick S (xs ++ [x]) = map (++[x ]) (pick S xs ++ pick E xs)
pick M [ ] = [ ]
pick M (xs ++ [x ]) = pick M xs ++ pick S xs
pick N [ ] = [ ]
pick N (xs ++ [x]) = pick N xs ++ map (++[x]) (pick N xs ++ pick M xs)
Может ли кто-нибудь объяснить мне простыми словами, почему эти уравнения верны, как мы можем доказать очевидное доказательство? Я чувствую, что почти понимаю S-уравнения, но в целом это остается неуловимым.