当 Idris 中的 lambda 抽象相关类型时,如何证明“看似显而易见”的事实?

2024-01-14

我正在 Idris 中编写一个基本的单子解析器,以习惯其语法以及与 Haskell 的差异。我的基础知识工作得很好,但我坚持尝试为解析器创建 VerifiedSemigroup 和 VerifiedMonoid 实例。

言归正传,这里是解析器类型、Semigroup 和 Monoid 实例,以及 VerifiedSemigroup 实例的开始。

data ParserM a          = Parser (String -> List (a, String))
parse                   : ParserM a -> String -> List (a, String)
parse (Parser p)        = p
instance Semigroup (ParserM a) where
    p <+> q             = Parser (\s => parse p s ++ parse q s)
instance Monoid (ParserM a) where
    neutral             = Parser (const []) 
instance VerifiedSemigroup (ParserM a) where
    semigroupOpIsAssociative (Parser p) (Parser q) (Parser r) = ?whatGoesHere

我基本上被困了intros,具有以下证明状态:

-Parser.whatGoesHere> intros
----------              Other goals:              ----------
{hole3},{hole2},{hole1},{hole0}
----------              Assumptions:              ----------
 a : Type
 p : String -> List (a, String)
 q : String -> List (a, String)
 r : String -> List (a, String)
----------                 Goal:                  ----------
{hole4} : Parser (\s => p s ++ q s ++ r s) =
          Parser (\s => (p s ++ q s) ++ r s)
-Parser.whatGoesHere> 

看来我应该能够使用rewrite和...一起appendAssociative不知何故, 但我不知道如何“进入”lambda\s.

不管怎样,我陷入了练习的定理证明部分——而且我似乎找不到太多以伊德里斯为中心的定理证明文档。我想也许我需要开始查看 Agda 教程(尽管 Idris 是我确信我想学习的依赖类型语言!)。


简单的答案是你不能。在内涵类型理论中,关于函数的推理是相当尴尬的。例如,Martin-Löf 的类型论无法证明:

S x + y = S (x + y)
0   + y = y

x +′ S y = S (x + y)
x +′ 0   = x

_+_ ≡ _+′_  -- ???

(据我所知,这是一个实际的定理,而不仅仅是“缺乏想象力的证明”;但是,我找不到阅读它的来源)。这也意味着没有证据证明更一般的:

ext : ∀ {A : Set} {B : A → Set}
        {f g : (x : A) → B x} →
        (∀ x → f x ≡ g x) → f ≡ g

这就是所谓的功能外延性:如果您可以证明所有参数的结果都相等(即函数在外延上相等),那么函数也相等。

这对于您遇到的问题非常有效:

<+>-assoc : {A : Set} (p q r : ParserM A) →
  (p <+> q) <+> r ≡ p <+> (q <+> r)
<+>-assoc (Parser p) (Parser q) (Parser r) =
  cong Parser (ext λ s → ++-assoc (p s) (q s) (r s))

where ++-assoc是你的关联财产的证明_++_。我不确定它在战术上会是什么样子,但它会非常相似:应用一致性Parser目标应该是:

(\s => p s ++ q s ++ r s) = (\s => (p s ++ q s) ++ r s)

然后您可以应用外延性来获得假设s : String和一个目标:

p s ++ q s ++ r s = (p s ++ q s) ++ r s

然而,正如我之前所说,我们没有函数外延性(请注意,这对于一般类型理论来说并非如此:外延类型理论、同伦类型理论和其他理论都能够证明这一说法)。最简单的选择是将其假设为公理。与任何其他公理一样,您面临的风险是:

  • 失去一致性(即能够证明错误;尽管我认为函数外延性还可以)

  • 突破性还原(仅进行案例分析的函数有何作用?refl当给出这个公理时做什么?)

我不确定伊德里斯如何处理公理,所以我不会详细介绍。请注意,如果您不小心,公理可能会弄乱一些东西。


困难的选择是使用 setoids。 setoid 基本上是一种配备了自定义相等性的类型。这个想法是,而不是有一个Monoid (or VerifiedSemigroup在你的情况下)适用于内置的平等(=在伊德里斯,在 Agda 中),你有一个特殊的幺半群(或半群),具有不同的底层等式。这通常是通过将幺半群(半群)运算与等式和一堆证明打包在一起来完成的,即(伪代码):

=   : A → A → Set  -- equality
_*_ : A → A → A    -- associative binary operation
1   : A            -- neutral element

=-refl  : x = x
=-trans : x = y → y = z → x = z
=-sym   : x = y → y = x

*-cong : x = y → u = v → x * u = y * v  -- the operation respects
                                        -- our equality

*-assoc : x * (y * z) = (x * y) * z
1-left  : 1 * x = x
1-right : x * 1 = x

解析器的相等性选择很明确:如果两个解析器的输出与所有可能的输入一致,则它们相等。

-- Parser equality
_≡p_ : {A : Set} (p q : ParserM A) → Set
Parser p ≡p Parser q = ∀ x → p x ≡ q x

这一解决方案有不同的权衡,即新的等式不能完全替代内置的等式(当您需要重写某些术语时,这往往会出现)。但如果您只是想证明您的代码做了它应该做的事情(达到某些自定义的相等性),那就太好了。

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

当 Idris 中的 lambda 抽象相关类型时,如何证明“看似显而易见”的事实? 的相关文章

  • 在 Coq 中实现向量加法

    在某些依赖类型语言 例如 Idris 中实现向量加法相当简单 根据维基百科上的例子 import Data Vect default total pairAdd Num a gt Vect n a gt Vect n a gt Vect n
  • 隐含的路径归纳

    这是一个后续问题在 Agda 中进行路径归纳 我想知道什么时候这个结构可能更具表现力 在我看来 我们总是可以这样表达 f forall A gt x y A gt x y gt some type f refl instance of so
  • 是否可以使用 Agda 作为库?

    是否可以直接从 Haskell 将其用作库 而不是在文件系统 使用 EMACS 终端等 上使用 Agda 例如 UsingAgda hs import Agda Prints the type of a term on some Agda
  • 如何在 Idris 中表达范围有效性?

    我正在尝试在 Idris 中构建一个简单的调查表单 目前正在努力验证用户输入 该输入以字符串形式出现 所提出问题的类型 目前我有以下几种类型 data Question Type where QCM numOptions Nat gt qu
  • 在编译时确定 Nat 是否能被 5 整除的函数

    Using Cactus有帮助answer 我尝试编写一个函数 给定一个Nat 将返回Nat如果它能被整除5 onlyModBy5Helper n Nat gt k Nat k mod 5 0 gt Nat onlyModBy5Helper
  • 如何在类型中编码可能的状态转换?

    我试图在 Haskell 中复制这段 Idris 代码 它通过类型强制执行正确的操作顺序 data DoorState DoorClosed DoorOpen data DoorCmd Type gt DoorState gt DoorSt
  • 如何使用 Agda 的分隔延续实现?

    我们可以很容易地在 Agda 中实现定界延续 monad 然而 没有必要 因为 Agda 标准库 已经定界延续单子的实现 http www cse chalmers se nad listings lib 0 7 Category Mona
  • 显示 (head .unit ) = Agda 中的 head

    我试图证明 Agda 中的一个简单引理 我认为这是正确的 如果向量有两个以上元素 则取其head继采取init与取其相同head立即地 我将其表述如下 lem headInit l xs Vec suc suc l gt head init
  • 直觉类型理论的组合逻辑等价物是什么?

    我最近完成了一门以 Haskell 和 Agda 一种依赖类型函数编程语言 为特色的大学课程 并且想知道是否有可能用组合逻辑代替其中的 lambda 演算 在 Haskell 中 使用 S 和 K 组合器似乎可以实现这一点 从而使其成为无点
  • 依赖类型:依赖对类型与不相交联合有何相似之处?

    我一直在研究依赖类型 我了解以下内容 Why 通用量化 https en wikipedia org wiki Universal quantification被表示为依赖函数类型 x A B x means 对全部x类型的A有一个类型的值
  • 在 Agda 中对 ST monad 进行建模

    最近这个所以问题 https stackoverflow com questions 33975270 can a st like monad be executed purely without the st library促使我在 Ha
  • 如何解释agda中的REL

    我试图理解 Agda 标准库的某些部分 但我似乎无法弄清楚REL FWIW 这是定义REL Binary relations Heterogeneous binary relations REL a b Set a Set b Level
  • 使用异质等式 =

    到目前为止我所拥有的是 module Foo postulate P P postulate NP NP complexityProof P NP complexityProof complexityProof rhs 但在尝试加载文件时
  • 如何学习阿格达

    我正在努力学习agda 但是 我遇到了一个问题 我在 agda wiki 上找到的所有教程对我来说都太复杂了 并且涵盖了编程的不同方面 在并行阅读了 3 个关于 agda 的教程后 我能够编写简单的证明 但我仍然没有足够的知识来使用它来实现
  • Agda 中的递归方案

    不用说 Haskell 中的标准构造 newtype Fix f Fix getFix f Fix f cata Functor f gt f a gt a gt Fix f gt a cata f f fmap cata f getFix
  • 约束接口中的函数参数

    在接受函数的接口中约束函数参数的语法是什么 我试过 interface Num a gt Color f a gt Type where defs 但它说Name a is not bound in interface Your inter
  • Agda 中实例参数的问题

    我正在尝试遵循 McBride s 的代码如何维持邻居秩序 https personal cis strath ac uk conor mcbride pub Pivotal pdf 并且无法理解为什么 Agda 我正在使用 Agda 2
  • Z3:执行矩阵运算

    我的情况 我正在开展一个项目 需要 证明正确性3D 矩阵变换 http rodrigo silveira com 3d programming transformation matrix tutorial UU65YicWsYZ涉及矩阵运算
  • 在依赖类型的函数式编程语言中,扁平化列表是否更容易?

    在 haskell 中寻找一个可以展平任意深度嵌套列表的函数时 即应用的函数concat递归并在最后一次迭代时停止 使用非嵌套列表 我注意到这需要有一个更灵活的类型系统 因为随着列表深度的变化 输入类型也会变化 确实 有几个 stackov
  • 为什么这个“with”块会破坏这个函数的整体性?

    我正在尝试在自然数上计算奇偶校验和一半的下限 data IsEven Nat gt Nat gt Type where Times2 n Nat gt IsEven n n n data IsOdd Nat gt Nat gt Type w

随机推荐

  • 尽管存在 OpenSessionInViewFilter,但出现 LazyInitializationException

    尽管在堆栈跟踪本身中看到了过滤器 但我似乎在 Spring MVC 3 0 Hibernate 3 5 应用程序中随机收到以下 LazyInitializationException 知道我应该调查什么吗 07 Jun 2011 13 48
  • 如何在javascript中替换对象数组中的对象(lodash)

    我有以下对象数组 var arr id a1 guid sdfsfd value abc status false id a2 guid sdfsfd value def status true 我有这个对象 var obj id a1 g
  • Hotelling 在 python 中的 T^2 分数

    我在 python 中使用 matplotlib 将 pca 应用于数据集 然而 matplotlib 并不像 Matlab 那样提供 t 平方分数 有没有办法像Matlab一样计算Hotelling的T 2分数 Thanks matplo
  • 在 Interface Builder 中为通用应用程序创建单个 .xib? (iOS)

    如果这是一个愚蠢的问题 我深表歉意 但我已经做了一些谷歌搜索并进行了搜索 但没有发现有人问这个确切的问题 我从事 iOS 开发已经有一段时间了 但我对 Interface Builder 完全陌生 我想知道的是 有没有办法只创建一个 xib
  • 有没有办法刷新 WPF 中的所有绑定?

    如果我的代码看起来有点像下面的代码 是否可以直接刷新所有绑定 或者我是否必须对所有绑定进行硬编码才能刷新 服务端 ServiceContract public interface IMyServiceContract OperationCo
  • 图着色算法:典型的调度问题

    我正在训练像 UvA 这样的代码问题 我有这样一个问题 其中我必须 给定一组n考试和k参加考试的学生 了解是否可以将所有考试安排在two时隙 Input 几个测试用例 每个都以包含以下内容的行开头1 安排不同的考试 第2行是案例数k其中至少
  • Stracing 以附加到多线程进程

    如果我想跟踪一个多线程进程 其所有线程 我应该怎么做 我知道可以执行 strace f 来跟踪分叉进程吗 但是当我开始跟踪时附加到已经是多线程的进程怎么样 有一种方法可以告诉 strace 跟踪属于该进程的所有线程的所有系统调用吗 2021
  • 显式指定 KSQL 流主题名称

    我有两个 KSQL 主题my topic 1 and my topic 2 消息通过 AVRO 序列化 由于历史原因 my topic 1架构不在推荐范围内topic value格式 而是my custom subject name 我想通
  • 如何使用 PowerShell 搜索文件夹

    我想搜索特定目录和子目录中的文件夹 我尝试用谷歌搜索它 但没有真正找到任何有用的例子 Get ChildItem C test recurse Where Object PSIsContainer eq true and Name matc
  • 设置颜色以清晰显示数字

    在这个特定 viridis 选项的条形图中 是否可以设置颜色 即使对于刻度的较暗选项 也可以清晰地显示图表内的数字 library ggplot2 Year lt c rep c 2006 07 2007 08 2008 09 2009 1
  • 在 dc.js 中向饼图标签添加百分比

    我有一个饼图 我想为其添加百分比到标签 这里有一个jsfiddle http jsfiddle net vz64xbmw 22 饼图和代码如下 现在图表显示了实际值 我看了看dc js 入门和操作指南 http dc js github i
  • Java - 契约测试

    我正在尝试为一些广泛使用的接口编写契约测试 沿着以下思路 public abstract class MyInterfaceContractTest extends TestCase private MyInterface toTest p
  • 如何使用 $resource 填充 Angular UI Bootstrap typeahead

    我正在尝试让 Angular UI 引导程序提前输入我设置的 REST 资源 但我不确定如何让它发挥异步性质 目前我已经改编了 Angular UI Bootstrap 给出的示例 所以我的 html 看起来像这样 调用 getLibs 来
  • 如何根据列的当前值和其他两列的值覆盖列的映射?

    我有以下熊猫数据框 is and mp market state reason 100 None NaN 400 None NaN 100 ALGO NaN 400 OPENING NaN 我想写两个映射 如果is and mp或者是 10
  • C++优雅解决分区问题

    我希望看到最优雅的 STL 之类的分区算法扩展 标准格式 given a vector of ints partition the vector so that the positive integers appear to the fro
  • 有没有办法使用dust.js 进行多级继承值覆盖?

    我正在使用灰尘模板 设计的一个方面一直困扰着我 这让我想知道我是否 做错了 所以我想我应该问S O 有没有办法在dust js 中使用块和内联部分创建多级继承 假设您有一个带有布局的基本模板 一个覆盖某些内容的继承模板 以及另一个从该模板继
  • 终止 bluestacks 进程/结束进程

    我正在尝试制作一个可以打开和关闭 bluestacks 应用程序的程序 关闭意味着完全退出应用程序 因为即使您退出 bluestacks 应用程序 该过程也会重新启动 我试图杀死的进程是 HD BlockDevice exe HD Agen
  • LLDB 如何加载崩溃日志

    我正在研究iOS崩溃分析 现在 我需要将崩溃日志文件导入 LLDB 作为WWDC18 第 414 场会议 https developer apple com videos play wwdc2018 414 说 我现在有 myApp dSY
  • Windows 上的 PyQt4 应用程序在退出时崩溃

    我正在使用 PyQt4 编写一个桌面应用程序 突然它在退出时开始崩溃 我检查了所有代码 以确保我没有做任何有趣的事情来使其崩溃 并且我不认为代码有任何问题 我之前见过一些对此的抱怨 但它与以前的版本有关 人们建议将 PyQt4 升级到最新版
  • 当 Idris 中的 lambda 抽象相关类型时,如何证明“看似显而易见”的事实?

    我正在 Idris 中编写一个基本的单子解析器 以习惯其语法以及与 Haskell 的差异 我的基础知识工作得很好 但我坚持尝试为解析器创建 VerifiedSemigroup 和 VerifiedMonoid 实例 言归正传 这里是解析器