Я пытаюсь доказать следующее утверждение структурной индукции:Доказывая foldr е го (хз ++ Я.С.) = F (foldr е го хз) (foldr е й ув)
foldr f st (xs++yx) = f (foldr f st xs) (foldr f st ys) (foldr.3)
Однако я не даже уверен, как определить foldr, поэтому я застрял, поскольку мне не было предоставлено никаких определений. Сейчас я считаю, что foldr может быть определена как
foldr f st [] = st (foldr.1)
foldr f st x:xs = f x (foldr f st xs) (foldr.2)
Теперь я хочу, чтобы начать работать на базовом случае прохождения пустой список foldr. У меня это есть, но я не думаю, что это правильно.
foldr f st ([]++[]) = f (foldr f st []) (foldr f st [])
LHS:
foldr f st ([]++[]) = foldr f st [] by (++)
foldr f st [] = st by (foldr.1)
RHS:
f (foldr f st []) (foldr f st []) = f st st by (foldr.1)
= st by definition of identity, st = 0
LHS = RHS, therefore base case holds
Теперь это то, что у меня есть для моего шага индукции:
Assume that:
foldr f st (xs ++ ys) = f (foldr f st xs) (foldr f st ys) (ind. hyp)
Show that:
foldr f st (x:xs ++ ys) = f (foldr f st x:xs) (foldr f st ys) (inductive step)
LHS:
foldr f st (x:xs ++ ys) = f x (foldr f st xs) (foldr f st ys) (by foldr.2)
RHS:
f (foldr f st x:xs) (foldr f st ys) =
= f f x (foldr f st xs) (foldr f st ys) (by foldr.2)
= f x (foldr f st xs) (foldr f st ys)
LHS = RHS, therefore inductive step holds. End of proof.
Я не уверен, если это доказательство является действительным. Мне нужна помощь в определении, правильно ли это, а если нет - в какой части нет.
Uh ... no. Это правда, что 'foldr f st (xs ++ ys) = foldr f (foldr f st ys) xs'. –
это только в случае, если 'f' ассоциативно,' '(' f' b) 'f' c == a' f' (b 'f' c)' '_ (но' foldr' в общем случае допускает асимметричный тип 'f :: a -> b -> b') _, а' st' - его правый нуль: 'fa st == a' _ (counterexample:' foldr (+) 1 (a ++ b) = foldr (+) 1 a + foldr (+) 1 b' ** '- 1' **) _. –