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)
Frage implementieren:Wie Mathematik Induktion auf Haskell
Beweisen Sie, dass, wenn basecase p
und indstep p
, dann forAllNat p
Was ich nicht verstehe, ist, dass, wenn basecase p
und indstep p
, so forAllNat p
True
sein sollte, Na sicher.
Ich denke, basecase p
sagt, dass P(0)
wahr ist, und indstep p
sagt, dass P(Succ n)
die P(n+1)
ist, ist wahr Und wir müssen beweisen, P(n)
wahr ist. Bin ich richtig? Irgendwelche Vorschläge, wie man das macht?
Sehr cool. Ich habe keine Singletons gesehen, die für einen solchen Beweis verwendet wurden. Natürlich können Haskells übliche '_ | _-bedingte Mängel dazu führen, dass man das Induktionsprinzip für unbegründete' p's oder 'n's" beweisen "kann, was durch einen Terminations-Checker in einem echten Proof-Assistenten ausgeschlossen wäre. –
@BenjaminHodgson, in der Tat ist das Fehlen der Terminierungsprüfung manchmal nervig. Es ist manchmal interessant, genau herauszufinden, welche Argumente Singletons sein müssen und welche nur Proxies sein können. Es konzentriert sich wirklich darauf, wo Berechnungen stattfinden. – dfeuer