agda-compute-normalized-maybe-toplevel显示正确的类型,但不接受`refl`

时间:2017-02-10 12:56:21

标签: agda

我正在尝试为基本语言语法编写一个漂亮的打印件,其特性是漂亮的打印机的输出应该正确解析它正在打印的东西。我有以下内容:

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找到完整的来源,包括我漂亮的打印机的定义。

1 个答案:

答案 0 :(得分:3)

在#agda上的

{AS}只是我发布了这个并发现了问题 - 我将render-pretty标记为NON_TERMINATING。 Agda无法看到这个函数正在终止,但我知道它是 - 我只是没有意识到有一个TERMINATING pragma :)有了它,一切都很好。