功能证明 (Haskell)

2024-03-30

我没能读懂《RWH》;我命令没有人放弃Haskell:函数式编程的技巧。现在我对第 146 页上的这些功能证明很好奇。具体来说,我试图证明 8.5.1sum (reverse xs) = sum xs。我可以做一些归纳证明,但后来我陷入困境。

HYP:

sum ( reverse xs ) = sum xs

BASE:

sum ( reverse [] ) = sum []

Left  = sum ( [] ) (reverse.1)
      = 0          (sum.1)

Right = 0          (sum.1)

就职:

sum ( reverse (x:xs) ) = sum (x:xs) 

Left = sum ( reverse xs ++ [x] )    (reverse.2)

Right = sum (x:xs)   
      = x + sum xs                  (sum.2)

所以现在我只是想证明这一点Left sum ( reverse xs ++ [x] )等于Right x + sum xs,但这离我开始的地方并不太远sum ( reverse (x:xs) ) = sum (x:xs).

我不太清楚为什么需要证明这一点,使用符号证明似乎是完全合理的reverse x:y:z = z:y:x(by defn),并且因为 + 是可交换的 (arth) 那么reverse 1+2+3 = 3+2+1,


sum (reverse [])     = sum []                     -- def reverse
sum (reverse (x:xs)) = sum (reverse xs ++ [x])    -- def reverse
                     = sum (reverse xs) + sum [x] -- sum lemma below
                     = sum (reverse xs) + x       -- def sum
                     = x + sum (reverse xs)       -- commutativity assumption!
                     = x + sum xs                 -- inductive hypothesis
                     = sum (x:xs)                 -- definition of sum

然而,结合性和交换性的基本假设并没有得到严格保证,并且这对于许多数字类型(例如Float and Double违反这些假设的地方。

Lemma: sum (xs ++ ys) == sum xs + sum ys给定关联性(+)

Proof:

sum ([] ++ ys)     = sum ys           -- def (++)
                   = 0 + sum ys       -- identity of addition
                   = sum [] ++ sum ys -- def sum

sum ((x:xs) ++ ys) = sum (x : (xs ++ ys))  -- def (++)
                   = x + sum (xs ++ ys)    -- def sum 
                   = x + (sum xs + sum ys) -- inductive hypothesis
                   = (x + sum xs) + sum ys -- associativity assumption!
                   = sum (x:xs) + sum ys   -- def sum
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

功能证明 (Haskell) 的相关文章

  • XMonad 在不同工作区启动

    我想在 xmonad start 上启动不同工作区中的一些应用程序 这很重要 所以 我写了以下内容startupHook startupApps String startupApps konsole emacs firefox gvim k
  • 在自己的定义中使用变量?

    无限流 val ones Stream Int Stream cons 1 ones 一个值怎么可能在它自己的声明中使用呢 看起来这应该会产生编译器错误 但它确实有效 它并不总是递归定义 这实际上有效并产生 1 val a Int a 1
  • 我需要什么类型签名才能将函数列表转换为 Haskell 代码? [复制]

    这个问题在这里已经有答案了 可能的重复 为什么 haskell 中不允许这样的函数定义 https stackoverflow com questions 6168880 why is such a function definition
  • 移动列表中特定元素的简单函数

    我是 Haskell 的新手 我正在尝试弄清楚如何创建一个函数 shift Eq a gt a gt a gt Int gt a shift x h t z 输入 一个通用列表和一个相同类型的元素 x 前提条件 元素x存在于列表中 Outp
  • 使用 cabal new-install 重新安装相同版本的软件包

    我正在开发 Haskell 包 我还没有上传到Hackage 版本号是0 1 0 0 我正在使用新风格的 Cabal 命令 为了在我处理包的同时测试它 使库可用于测试项目 我运行cabal new install lib构建包后 然而 我注
  • 使用 ocaml List.fold_left 列表中的最后一个元素

    我可以通过以下代码找到列表的最后一个元素 let last xs a list a let rec aux xs prev match xs with gt prev x ys gt aux ys x in match xs with gt
  • GHC 可以为 monad 转换器派生 Functor 和 Applicative 实例吗?

    我正在尝试实施MaybeT本着mtl图书馆 使用这个非编译解决方案 LANGUAGE FlexibleInstances MultiParamTypeClasses UndecidableInstances import Control M
  • 函数式编程是否需要新的命名约定?

    我最近开始使用 Haskell 学习函数式编程 并在 Haskell 官方 wiki 上发现了这篇文章 如何阅读哈斯克尔 http www haskell org haskellwiki How to read Haskell What t
  • 在 Haskell 中将字节转换为 Int64s/Floats/Doubles

    我正在尝试解析 Haskell 中的二进制文件格式 Apple 的二进制属性列表格式 该格式所需的内容之一是将字节序列视为 a 无符号 1 2 或 4 字节整数 b 有符号 8 字节整数 c 32 位floats d 64 位doubles
  • Haskell,optparse-generic 的未命名命令行参数

    我在用着optparse 通用 https hackage haskell org package optparse generic解析名为的程序的命令行参数example 我有一个带有命名字段的数据类型 记录语法 例如 data Exam
  • Swit 中的函数式编程将数组元素分配到正确的“桶”

    我是函数式编程的新手 我的问题是我有一个主数组和固定数量的 目标 数组 我想根据每个元素的特定值将主数组中的元素分配到正确的结果数组中 我猜测一种方法是使用一个映射函数来遍历主数组元素 确定正确的 目标数组 值 基于某种逻辑 然后将元素添加
  • 整数转浮点数

    这段代码的工作原理 posToXY Float gt Float gt Integer posToXY a b do let y a b round y 但这不起作用 posToXY Integer gt Integer gt Intege
  • f# 运行总计序列

    好吧 这看起来应该很容易 但我就是不明白 如果我有一个数字序列 如何生成由运行总计组成的新序列 例如 对于序列 1 2 3 4 我想将其映射到 1 3 6 10 以适当的功能方式 Use List scan https msdn micro
  • 将系统命令的结果绑定到 Haskell 中的变量

    如何在 Haskell 中运行系统命令and将其结果 即标准输出 绑定到变量 在伪 Haskell 中 我正在寻找类似以下内容的内容 import System Process main do output lt callCommand e
  • 导入 Haskell 模块

    我是哈斯克尔的新手 为什么当我尝试使用时Days from Data Time我收到此错误 Could not find module Data Time It is a member of the hidden package time
  • 如何在 Perl 中以函数式风格进行编码?

    你如何 have a sub返回一个sub or 将文本作为代码执行 in Perl 另外 如何拥有匿名函数存储状态 子返回子作为coderef example 1 return a sub that is defined inline s
  • 如何从 haskell 中的 IOError 获取 errno?

    我在 haskell 平台上 GHC 6 12 1 作为 apt get 安装在 Debian Squeeze 上 鉴于我需要在与最初引发它的线程不同的线程上使用它 如何从 IOError 中获取底层 errno 我需要这个的原因是因为我正
  • OCaml 作为 C 库,hello world 示例

    我希望通过 C 调用 OCaml 代码 方法是将 OCaml 编译为包含 C 接口的静态或共享库 这一页 https caml inria fr pub docs manual ocaml intfc html似乎解释了如何为 OCaml
  • Haskell 下划线与显式变量

    我已经学习 Haskell 几个星期了 我有一个关于下划线的使用的问题 作为函数参数 我认为用一个具体的例子来问我的问题会更好 假设我想定义一个函数 根据提供的索引提取列表的元素 是的 我意识到 已经是预先定义的 我可以定义该函数的两种方法
  • 什么是欣德利米尔纳?

    我遇到过这个词欣德利 米尔纳 我不确定是否理解它的意思 我已阅读以下帖子 史蒂夫 叶格 动态语言的反击 http steve yegge blogspot com 2008 05 dynamic languages strike back

随机推荐

  • 如何创建 WPF 圆角容器?

    我们正在创建一个 XBAP 应用程序 我们需要在单个页面的各个位置具有圆角 并且我们希望有一个 WPF 圆角容器来在其中放置一堆其他元素 有人对我们如何最好地实现这一目标有一些建议或示例代码吗 是使用样式还是创建自定义控件 您不需要自定义控
  • 在 Groovy 中,为什么扩展 Comparable 的接口的“==”行为会发生变化?

    我正在尝试在 Groovy 中开发一个项目 我发现我的一些测试以一种奇怪的方式失败 我有一个界面Version extends Comparable
  • div 不会以 margin: 0 auto 居中;

    我的问题只是将 div 居中 目前 我只有一个简单的 html 文件 我不知道为什么margin 0 auto不工作 这是我的 html 的布局
  • 什么是最简单的 Tomcat/Apache 连接器 (Windows)?

    我在 Windows XP 机器上运行 apache 2 2 和 tomcat 5 5 哪个 tomcat apache 连接器最容易设置并且有详细的文档记录 mod proxy ajp http httpd apache org docs
  • 如何正确使用SyncManager.Lock或Event?

    我使用时遇到问题SyncManager Lock正确 我读了官方文档 https docs python org 3 library multiprocessing html multiprocessing managers SyncMan
  • 如何集中primefaces菜单栏?

    我需要集中 primefaces 菜单栏 我试过这个
  • 使用 Apache Ant 清理陈旧的 .class 文件

    怎样清理陈旧的东西 class文件出自 workdir 给定一组现有的 java文件在 srcdir 我所说的陈旧是指 class从现在开始生成的文件被删除 java文件 我尝试过使用 Ant 映射器和文件集等来想出一些东西 但失败了 删除
  • SlugRelatedField 查询集

    我正在努力找出 SlugRelatedField 的查询集 我的数据是这样的 我有一堆Object属于 a 的实例Project 一个项目有一个独特的 顶 Object Object仅当它们位于不同的下面时才可以具有相同的名称Project
  • 在 C# 中复制带有身份验证的文件

    我正在尝试将文件从本地驱动器复制到服务器上的文件夹之一 服务器上文件夹的名称是 DBFiles 除了用户名 user 和密码 password1 之外 没有人可以访问此内容 在复制文件之前 如果目录不存在 它也会创建该目录 有人可以帮助在创
  • 使用 Google Cloud PubSub 时不断收到“向 Cloud PubSub 发送测试消息时出错...”

    我正在尝试将 Google 的推送 PubSub 设置到我的服务器以接收 Gmail 推送通知 我得到以下范围 https mail google com https mail google com https www googleapis
  • PHP 生成 UL LI , UL LI

    无法弄清楚如何使用 while 循环生成此菜单 这是我的代码的示例 ul li a href Hoofdmenu 1 a ul class sub li a href Submenu 1 1 a li li a href Submenu 1
  • 如何让 CSS 浮动保持在一行?

    我想使用以下命令将两个项目放在同一行上float left对于左侧的项目 我独自实现这一点没有任何问题 问题是 我想要这两个项目stay在同一条线上即使您将浏览器大小调整得很小 你知道 就像桌子一样 目标是防止右侧的物品缠绕无论 如何使用
  • 如何包装 ui 控件(mapbox 地理定位控件)

    我想扩展 更改具有某些功能的地图框地理定位控件 例如 我想飞到而不是跳到当前位置 我想在打开地理控制按钮时添加一些行为 例如防止拖动 我怎么做 我尝试制作包装纸 但后来遇到了一些问题 按钮的颜色在打开时应变为蓝色 但确实如此 不再工作了 我
  • Flutter/Dart DateTime 解析 UTC 并转换为本地

    我正在尝试将 UTC 日期字符串解析为DateTime然后将其解析为本地时间 但是我在将其转换为本地时间时遇到了麻烦 在英国它应该加一 但是当我打印时 isUtc它返回为 false 这就是我现在所拥有的 print widget asse
  • 升级到 Google 通用分析

    我一直在四处寻找 以找出升级到 Universal Analytics 时需要考虑的任何事项 我找到了这个帖子 Google Analytics 升级到异步代码 https stackoverflow com questions 12060
  • VB.NET 中的“空安全”点表示法...或者它是否存在于任何语言中? “安全解引用运算符”或使用 LINQ 的等效操作?

    我正在 VB net 中寻找 安全 点符号 在 VB NET 或任何语言中是否存在这样的东西 我想要做的是 当使用不可为空遗留对象 解决如下问题 如果有一个计划 如果有一个案例 如果它有一个人 那个人的配偶 否则什么都没有 VBS表示 空
  • 在 Mac OS X Yosemite 上安装 pymssql 时出错

    我在 OS X Yosemite 10 10 3 上安装 pymssql 时收到以下错误 有人解决了以下错误吗 我正在使用 FreeTDS v0 91 112 版本 7 1 和 Python 2 7 6 tsql 实用程序连接到 SQL 数
  • sh 和 bash 中 pgrep 的区别

    这是一个测试 bash c pgrep f novalidname sh c pgrep f novalidname 11202 Why is pgrep运行时给出输出sh 据我所知 我的计算机上没有名为novalidname 这可能是一个
  • 链接到外部 css 文件

    我一直在尝试将我在本地计算机中创建的 css 文件链接到我的 html 代码 但它似乎不起作用 我们应该在 html 代码中保存想要链接的 css 文件 或者我们应该如何链接到该文件 作为一个例子 我发布了这个 html 代码
  • 功能证明 (Haskell)

    我没能读懂 RWH 我命令没有人放弃Haskell 函数式编程的技巧 现在我对第 146 页上的这些功能证明很好奇 具体来说 我试图证明 8 5 1sum reverse xs sum xs 我可以做一些归纳证明 但后来我陷入困境 HYP