Как настроить индуктивное доказательство в haskell?

Мне нужно доказать

f (g xs) == g (f xs)

всякий раз, когда xs является конечным списком Ints.

Предположим, что f и g имеют тип [Int]->[Int]

2 ответа

Противопоказан контрпример:

f xs = []
g xs = [1]

Если вы хотите, чтобы это свойство сохранялось, вам нужны более конкретные ограничения на то, что f а также g являются.

Вы можете думать о законе, который

(map f . map g) == map (f . g)

что действительно может быть доказано.

Нашел это откуда-то

Theorem: (map f . map g) xs = map (f . g) xs
       - Proof is by induction on xs
    *** Base Case, xs = []
        - Left side: (map f . map g) [] = map f (map g []) = map f [] = []
        - Right side: map (f . g) [] = []
    *** Inductive Case, xs = k:ks
        - Inductive Hypothesis: (map f . map g) ks = map (f . g) ks
        - Left Side
          + (map f . map g) xs
          + map f (map g (k:ks))
          + map f ((g k) : (map g ks))
          + (f (g k)) : (map f (map g ks))
          + ((f . g) k) : ((map f . map g) ks)  i.e. change from bracket form back to point form
          + ((f . g) k) : (map (f . g) ks) by inductive hypothesis
          + map (f . g) (k:ks) by definition of map
          + map (f . g) xs 
Другие вопросы по тегам