没有隐式依赖 "match" 模式与 ssreflect

No implicits in dependent "match" pattern with ssreflect

在我看来,使用 ssreflect,当我们进行依赖模式匹配时,隐式构造函数字段会变成显式字段,并且设置各种隐式选项不会影响此行为。

以下代码适用于 Coq 8.6:

Require Import Coq.Unicode.Utf8.
Set Implicit Arguments.
Set Contextual Implicit.

Inductive Vec (A : Type) : nat → Type :=
  nil  : Vec A 0
| cons : ∀ {n}, A → Vec A n → Vec A (S n).

Fixpoint append {A n m}(xs : Vec A n)(ys : Vec A m) : Vec A (n + m) :=
  match xs with
    nil => ys
  | cons x xs => cons x (append xs ys)
  end.

当我导入 ssreflect 时它停止工作,因为它需要一个额外的字段用于 append 中的 cons 模式:

From mathcomp Require ssreflect.

Fixpoint append {A n m}(xs : Vec A n)(ys : Vec A m) : Vec A (n + m) :=
  match xs with
    nil => ys
  | cons _ x xs => cons x (append xs ys)
  end.

这是什么原因,有没有办法在模式匹配中仍然有隐式?

Coq 8.5 和 Coq 8.6 之间的模式行为发生了变化,基本上破坏了现有的每个 Coq 脚本,因为 8.6 将考虑模式中的隐式参数,正如您所注意到的那样。

ssreflect 没有为 8.6 的特定功能重写他们的所有库,这会阻止与 8.5 的兼容性,而是选择通过在加载插件时设置 Asymmetric Patterns 选项来恢复到 8.5 的行为。

您可以返回默认的 8.6 行为

Global Unset Asymmetric Patterns.

在导入 ssreflect 后的脚本中。