Без подразбиране в зависим модел на съвпадение с 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, защото изисква допълнително поле за шаблона cons в append:

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.

Каква е причината за това и има ли начин все още да има имплицитни елементи в съвпадението на шаблони?


person András Kovács    schedule 16.03.2017    source източник


Отговори (1)


Имаше промяна в поведението на шаблона между Coq 8.5 и Coq 8.6, която на практика развали всеки съществуващ Coq скрипт, тъй като 8.6 ще вземе под внимание неявните аргументи в шаблоните, както забелязахте.

Вместо да пренапише цялата си библиотека за специфичната функция 8.6, която би предотвратила съвместимостта с 8.5, ssreflect избра да се върне обратно към поведението 8.5, като зададе опцията Asymmetric Patterns, когато заредите приставката.

Можете да се върнете към поведението по подразбиране 8.6

Global Unset Asymmetric Patterns.

във вашия скрипт, след като импортирате ssreflect.

person ejgallego    schedule 16.03.2017