当 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 抽象相关类型时,如何证明“看似显而易见”的事实? 的相关文章

  • Idris:是否可以使用“with”重写所有函数以使用“case”而不是“with”?如果不是,能举个反例吗?

    在 Idris 中 是否可以使用 重写所有函数 with 使用 case 而不是 with 如果不是 能举个反例吗 不可能 当你模式匹配时with 上下文中的类型将使用从匹配的构造函数中提取的信息进行更新 case不会导致此类更新 例如 以
  • Agda 中的 Arity 通用编程

    如何在 Agda 中编写 arity generic 函数 是否可以编写完全依赖且全域多态的泛型函数 我将以 n 元复合函数为例 最简单的版本 open import Data Vec N ary comp n X Set Y Set Z
  • 有限的数字如何运作? (依赖类型)

    我对依赖类型语言感兴趣 有限数对我来说似乎非常有用 例如 安全地索引固定大小的数组 但这个定义对我来说并不清楚 Idris 中有限数的数据类型可以如下 Agda 中可能类似 data FiniteNum Natural gt Type wh
  • 隐含的路径归纳

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

    我在终止检查时遇到问题 与中描述的问题非常相似这个问题还有这个Agda 错误报告 功能请求 问题是让编译器相信以下内容unionWith终止 使用重复键的组合功能 unionWith合并表示为按键排序的 键 值 对列表的两个映射 有限映射的
  • 是否可以使用 Agda 作为库?

    是否可以直接从 Haskell 将其用作库 而不是在文件系统 使用 EMACS 终端等 上使用 Agda 例如 UsingAgda hs import Agda Prints the type of a term on some Agda
  • 代表自由团体的好方法是什么?

    很容易表示自由岩浆 二叉叶树 自由半群 非空列表 和自由幺半群 列表 并且不难证明它们实际上就是它们所声称的那样 但自由团体似乎要棘手得多 似乎至少有两种方法可以使用通常的方法List Either a 表示 将要求编码为类型 如果您有Le
  • Haskell 中 Idris 的 Fin 的首选替代方案是什么

    我想要一个可以包含 0 到 n 值的类型 其中 n 位于类型级别 我正在尝试类似的事情 import GHC TypeLits import Data Proxy newtype FiniteNat n FiniteNat toIntege
  • Haskell 版本的 Idris !-表示法(爆炸表示法)

    我最近有幸学习了一些 Idris 我发现非常方便的一件事是 符号 https idris2 readthedocs io en latest tutorial interfaces html highlight do 20notation
  • Ltac:通过回溯重复策略 n 次

    假设我有一个像这样的策略 取自 HaysTac 它搜索一个参数来专门化一个特定的假设 Ltac find specialize in H multimatch goal with v gt specialize H v end 然而 我想写
  • 显示 (head .unit ) = Agda 中的 head

    我试图证明 Agda 中的一个简单引理 我认为这是正确的 如果向量有两个以上元素 则取其head继采取init与取其相同head立即地 我将其表述如下 lem headInit l xs Vec suc suc l gt head init
  • 如何阅读 Coq 对 proj1_sig 的定义?

    In Coq sig定义为 Inductive sig A Type P A gt Prop Type exist forall x A P x gt sig P 我读为 sig P 是一种类型 其中 P 是一个接受 A 并返回 Prop
  • 在 Idris 中证明如果 n = m 且 m = o,则 n + m = m + o?

    我正在尝试通过查看一些练习来提高我的伊德里斯技能软件基础 https softwarefoundations cis upenn edu lf current toc html 最初是为 Coq 设计的 但我希望对 Idris 的翻译不会太
  • Idris:函数使用 Nat 参数,但使用 Integer 参数时类型检查失败

    我是伊德里斯的新手 我正在尝试类型 我的任务是制作一个 洋葱 一个带有两个参数的函数 一个数字和任何东西 并将任何东西放入List嵌套了这么多次 例如 结果为mkOnion 3 Hello World 应该 Hello World 我做了这
  • 将排序列表与大小类型合并

    假设我们有一个排序列表的数据类型 具有与证明无关的排序见证 我们将使用 Agda 的实验性大小类型功能 这样我们就有希望在数据类型上获得一些递归函数来通过 Agda 的终止检查器 OPTIONS sized types open impor
  • 理解 `k : Nat ** 5 * k = n` 签名

    以下函数编译 onlyModByFive n Nat gt k Nat 5 k n gt Nat onlyModByFive n k 100 但有什么作用k以其代表Nat 5 k n syntax 另外 我该如何称呼它 这是我尝试过的 但我
  • 为什么在这种情况下重写不改变表达式的类型?

    在 1 中可以阅读下一篇 rewrite prf in expr 如果我们有prf x y 并且 expr 所需的类型是以下属性x the rewrite in语法将搜索x在所需的类型中expr并将其替换为y 现在 我有下一段代码 您可以将
  • 结构归纳终止

    我无法让 Agda 的终止检查器接受使用结构归纳定义的函数 我认为 我创建了以下最简单的示例来展示此问题 以下定义size被拒绝 即使它总是在严格较小的组件上递归 module Tree where open import Data Nat
  • 约束接口中的函数参数

    在接受函数的接口中约束函数参数的语法是什么 我试过 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

随机推荐

  • 尽管存在 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 实例 言归正传 这里是解析器