data Nat = Zero | Succ Nat
type Predicate = (Nat -> Bool)
-- forAllNat p = (p n) for every finite defined n :: Nat
implies :: Bool -> Bool -> Bool
implies p q = (not p) || q
basecase :: Predicate -> Bool
basecase p = p Zero
jump :: Predicate -> Predicate
jump p n = implies (p n) (p (Succ n))
indstep :: Predicate -> Bool
indstep p = forallnat (jump p)
Вопрос:Как реализовать индукцию по математике на Haskell
Докажите, что если basecase p
и indstep p
, то forAllNat p
То, что я не понимаю, что если basecase p
и indstep p
, так forAllNat p
должны быть True
, конечно.
Я думаю basecase p
говорит, что P(0)
верно, и indstep p
говорит, что P(Succ n)
что P(n+1)
истинно И мы должны доказать P(n)
верно. Я прав? Любое предложение о том, как это сделать?
Очень круто. Я не видел синглтонов, используемых для доказательства теоремы, как это раньше. Разумеется, обычные недостатки Haskell, связанные с _ _ _ _, означают, что вы можете «доказать» принцип индукции для необоснованных '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ' –
@BenjaminHodgson, действительно, отсутствие проверки завершения иногда раздражает. Интересно иногда выяснить, какие именно аргументы должны быть одиночными и которые могут быть просто прокси. Это действительно фокусирует ваше внимание на том, где происходит расчет. – dfeuer