How to solve the very simple Syntax error: 'end' expected after [branches] (in [term_match]). in Coq? (in Gallina and not ltac)

How to solve the very simple Syntax error: 'end' expected after [branches] (in [term_match]). in Coq? (in Gallina and not ltac)

我试图编写一个非常简单的程序来对列表中的 nats 求和 (copy pasted from here):

  Fixpoint sum (l : list nat) : nat :=
    match l with
    | [] => 0
    | x :: xs => x + sum xs
    end.

但是我本地的 Coq 和 jsCoq 抱怨:

Syntax error: 'end' expected after [branches] (in [term_match]).

这是为什么? (注意我什至没有实现这个,但我的实现看起来几乎一样)

我之前实现过递归函数:

  Inductive my_nat : Type :=
    | O : my_nat
    | S : my_nat -> my_nat.

  Fixpoint add_left (n m : my_nat) : my_nat := 
    match n with
    | O => m
    | S n' => S (add_left n' m)
  end.

没有抱怨...

我确实看到了这个问题,但它似乎解决了 ltac 中的一些特殊问题,而我没有使用 ltac。

错误位置在 [] 上,这表明 Coq 不理解该符号。找到未定义的符号后,解析器不知道该做什么,并产生一条本质上毫无意义的错误消息。

要定义标准列表符号,您需要通过以下方式从标准库中导入它:

Require Import List.
Import ListNotations.

stdlib 模块 List 包含模块 ListNotations,它定义了 [](更普遍的是 [ x ; y ; .. ; z ])。 List 还定义了符号 x :: xs.

从开发中提取摘录时,您还必须找到对这些摘录有影响的语法更改命令是什么:模块导入、作用域打开、参数声明(用于隐式)、符号和强制转换” . 在目前的情况下,该文件实际上是由练习的作者通过 this pointer.

提供的