Хорошо, мне нужно визуализировать ваш график состояний:
И дать подпись типа для pick :: State -> [[Bool]] -> [(State, [Bool])
.
Теперь это не совпадает с вашим первым уравнением pick E xs = [[]]
- это должно быть pick E xs = [(E,[])]
.
Возможно, вы хотели определить pick
так:
pick :: State -> [[Bool]] -> [[Bool]]
pick q = map snd . filter ((== q) . fst) . map (\a -> (foldl step E a, a))
Принимая это определение, первое уравнение теперь имеет смысл. Он утверждает, что если вы начнете с E
, единственная последовательность логических значений в xs
, которая оканчивается на E
, это пустой список.
Обратите внимание, что это предполагает, что []
& isin; xs
.
Кроме того, если ys = replicate n False
, pick E [ys] = [ys]
, то это означает, что & forall; n
, ys
& notin; xs
.
Второе, четвертое и шестое уравнения имеют форму pick _ [ ] = [ ]
, что тривиально верно по определению map
и filter
.
Третье уравнение, pick S (xs ++ [x]) = map (++[x ]) (pick S xs ++ pick E xs)
тоже не имеет смысла. Я предполагаю, что он пытается сказать:
pick S (map (++[True] xs) = map (++[True]) (pick S xs ++ pick E xs)
То есть любой путь, начинающийся с E
и заканчивающийся S
, можно построить, взяв существующий путь к E
или S
и добавив True
. Эквивалентно, что каждый путь, который заканчивается в S
, должен заканчиваться True
.
Пятое уравнение аналогично бессмысленно и должно быть сформулировано как:
pick S (map (++[False] xs) = map (++[False]) (pick S xs ++ pick M xs)
И седьмое уравнение следует переформулировать как:
pick N (map (++ [True]) xs) = pick N xs ++ map (++[True]) (pick N xs ++ pick M xs)