Уравнение из «Жемчужины программирования» - может кто-нибудь объяснить мне?

Такое ощущение, что я застрял, друзья мои. Может ли кто-нибудь объяснить мне, как выбрать уравнения из «Жемчужины проектирования функциональных алгоритмов», глава 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-уравнения, но в целом это остается неуловимым.

8
задан shabunc 1 November 2011 в 14:37
поделиться