gpt4 book ai didi

agda - 当相关类型被 Idris 中的 lambda 抽象时,如何证明 "seemingly obvious"事实?

转载 作者:行者123 更新时间:2023-12-04 01:04:04 29 4
gpt4 key购买 nike

我正在用 Idris 编写一个基本的 monadic 解析器,以适应与 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 .

无论如何,我被困在练习的定理证明部分 - 我似乎找不到太多以 Idris 为中心的定理证明文档。我想也许我需要开始查看 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))

哪里 ++-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 进行案例分析的函数会做什么?)

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

    困难的选择是使用 setoids。 setoid 基本上是一种配备自定义相等性的类型。这个想法是,而不是拥有 Monoid (或 VerifiedSemigroup 在您的情况下)适用于内置相等(在 Idris 中为 =,在 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

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

    关于agda - 当相关类型被 Idris 中的 lambda 抽象时,如何证明 "seemingly obvious"事实?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25175699/

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