gpt4 book ai didi

haskell - 如何在 Haskell 上实现数学归纳法

转载 作者:行者123 更新时间:2023-12-02 13:11:54 24 4
gpt4 key购买 nike

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)

问题:

证明如果basecase pindstep p,则forAllNat p

我不明白的是,如果basecase pindstep p,那么forAllNat p应该是True,当然。

我认为basecase pP(0)是正确的,并且 indstep p 表示 P(Succ n)P(n+1) 为 true我们需要证明 P(n) 是正确的。我对吗?关于如何执行此操作有什么建议吗?

最佳答案

正如 Benjamin Hodgson 指出的那样,你无法在 Haskell 中完全证明这一点。但是,您可以用稍强的前提条件来证明一个命题。我还将忽略 Bool 不必要的复杂性。

{-# LANGUAGE GADTs, KindSignatures, DataKinds, RankNTypes, ScopedTypeVariables #-}

data Nat = Z | S Nat

data Natty :: Nat -> * where
Zy :: Natty 'Z
Sy :: Natty n -> Natty ('S n)

type Base (p :: Nat -> *) = p 'Z
type Step (p :: Nat -> *) = forall (n :: Nat) . p n -> p ('S n)

induction :: forall (p :: Nat -> *) (n :: Nat) .
Base p -> Step p -> Natty n -> p n
induction b _ Zy = b
induction b s (Sy n) = s (induction b s n)

关于haskell - 如何在 Haskell 上实现数学归纳法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36481476/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com