【发布时间】:2025-11-25 00:05:02
【问题描述】:
我正在 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。
无论如何,我被困在练习的定理证明部分 - 我似乎找不到太多以 Idris 为中心的定理证明文档。我想也许我需要开始查看 Agda 教程(尽管 Idris 是我确信我想学习的依赖类型语言!)。
【问题讨论】:
-
要使用 lambda,您需要 函数扩展性 (
funext : (f, g : a -> b) -> ((x : a) -> f x = g x) -> f = g)。遗憾的是,Agda 和 Idris(据我所知)都无法证明这个陈述,所以它必须被假定为一个公理。另一种选择是引入您自己的平等概念(例如p = q <=> forall s. parse p s = parse q s),但我认为 Idris 的VerifiedSemigroup无法处理自定义平等。 -
谢谢!这在一定程度上澄清了一些事情。了解术语,function extensionality 引导我对这个想法进行一些更深入的解释。看起来我会在某个地方或其他地方依赖一个公理来让这个经过验证的实例工作——至少现在是这样。所以我不完全有信心如何继续 -
funext = believe me似乎是在作弊 - 再说一次,对于一个玩具问题,我需要一个严格的证据,在我过去尝试使用其他语言时,如果有的话,只有在 cmets 中才有任何形式的证明。 -
既然还没有答案:你想让我把评论变成实际答案吗?
-
我还没有时间真正尝试使用您的答案解决问题。我正计划尝试解决这个问题,然后更新我的问题,但工作和夏季学期期末考试来了。如果你有解决方案,我一定很想看看!
标签: agda theorem-proving idris