我正在尝试为基本语言语法编写一个漂亮的打印件,其特性是漂亮的打印机的输出应该正确解析它正在打印的东西。我有以下内容:
data Syntax : Set where
string : List Char -> Syntax
parse : List Char → Maybe Syntax
parse ('"' ∷ '"' ∷ _) = just (string [])
parse _ = nothing
解析器现在只能将字符串""
解析为空文字字符串,但这是一个开始:)
接下来,我有一台漂亮的打印机:
pretty-lit : (s : Syntax) → pretty-printer-for (string l)
pretty-lit (string []) = char '"' <> char '"', {!!}
pretty-lit (string (x ∷ xs)) = {!!}
漂亮的打印机类型是:
pretty-printer-for : (s : Syntax) → Set
pretty-printer-for s = Σ Doc (λ d → parse (display (render-pretty 80 d)) ≡ just s)
也就是说,Doc
(ala Wadler的漂亮打印)的依赖产品以及解析将Doc
呈现为字符串的结果的证明确实是您开始使用的语法。
现在,上面pretty-lit
的第一个洞就是这个目标:
Goal: parse
(display (render-pretty 80 (cat (char '\"') (char '\"'))))
≡ just (string [])
————————————————————————————————————————————————————————————
如果我完全评论pretty-lit
并使用agda-compute-normalised-maybe-toplevel
,则parse (display (render-pretty 80 (cat (char '\"') (char '\"'))))
会计算just (string [])
,这是我所期望的。但是,如果我尝试使用refl
作为该洞的内容,我会得到
parse
(display (render-pretty (fromNat 80) (char '\"' <> char '\"')))
!= just (string []) of type Maybe Syntax
when checking that the expression refl has type
parse
(display (render-pretty (fromNat 80) (char '\"' <> char '\"')))
≡ just (string [])
但我刚刚检查过,他们是平等的!奇怪的是,pretty-lit
有漏洞(如上所述)在范围内,agda-computer-normalised-maybe-toplevel
不计算just (string [])
,但我不明白为什么。
可以在https://github.com/ocharles/agda-nixfmt/commit/4df637cce0621b3d9d8a3ee0a104f46523dcc908找到完整的来源,包括我漂亮的打印机的定义。
答案 0 :(得分:3)
{AS}
只是我发布了这个并发现了问题 - 我将render-pretty
标记为NON_TERMINATING
。 Agda无法看到这个函数正在终止,但我知道它是 - 我只是没有意识到有一个TERMINATING
pragma :)有了它,一切都很好。