Почему Coq возражает против следующего типа модуля PairUsualDecidableTypeFull? - PullRequest
0 голосов
/ 09 апреля 2019

В Coq.Structures.EqualitiesFacts есть удобный тип модуля PairUsualDecidableType для построения модуля UsualDecidableType из декартового произведения двух других.

Кажется, что нет PairUsualDecidableTypeFullТип модуля для того же самого с UsualDecidableTypeFull s.

Я пытался создать его, начиная с:

Module PairUsualDecidableTypeFull(D1 D2:UsualDecidableTypeFull) <: UsualDecidableTypeFull.

  Definition t := (D1.t * D2.t)%type.
  Definition eq := @eq t.
  Instance eq_equiv : Equivalence eq := _.
  Definition eq_refl : forall x : t, x = x. Admitted.
  Definition eq_sym : forall x y : t, x = y -> y = x. Admitted.
  Definition eq_trans : forall x y z : t, x = y -> y = z -> x = z. Admitted.
  Definition eq_dec : forall x y, { eq x y }+{ ~eq x y }. Admitted.
  Definition eqb : t -> t -> bool. Admitted.
  Definition eqb_eq : forall x y : t, eqb x y = true <-> x = y. Admitted.

End PairUsualDecidableTypeFull.

, но Coq жалуется, что:

Signature components for label eq_refl do not match: the body of definitions differs.

Я не понимаю, что означает «компоненты подписи».Учитывая, что вывод Print UsualDecidableTypeFull включает в себя:

Definition eq_refl : forall x : t, @Logic.eq t x x.

тип из eq_refl по крайней мере выглядит правильно.Что еще может быть не так?

Я абсолютный любитель и чрезвычайно новичок в Coq, работающий в версии 8.9.0.Возможно, то, что я пытаюсь сделать, не имеет смысла по какой-то причине;тот факт, что стандартные библиотеки включают PairUsualDecidableType, но не PairUsualDecidableTypeFull, делает меня немного подозрительным, что я что-то упустил.

Любое руководство будет приветствоваться, и спасибо заранее.

Ответы [ 2 ]

1 голос
/ 19 апреля 2019

Во-первых, стандартная библиотека, как известно, неполная.Таким образом, тот факт, что одно конкретное определение / лемма / модуль не предоставлен, не означает, что его там быть не должно.И это еще более справедливо для модулей, поскольку система модулей Coq мало используется.

Что касается вашей проблемы, то в Coq граница между Module и Module Type является тонкой.В частности, у вас могут быть определения в Module Type, а не только декларации (я не уверен, что эти термины «определение» и «декларация» являются правильными словами для использования здесь, но я надеюсь, что это по крайней мере понятно).Например,

Module Type Sig.
  Parameter n : nat.
  Definition plus x y := x + y.
End Sig.

- это подпись, объявляющая поле n типа nat и определяющая поле plus как сложение натуральных чисел.При написании модуля, который должен соответствовать этой сигнатуре, вы можете реализовать декларации по своему усмотрению, при условии, что типы соответствуют, но для определений вы должны в основном написать то же тело, что и в сигнатуре.Например, вы можете написать:

Module M <: Sig.
  Definition n := 3.
  Definition plus x y := x + y.
End M.

Вы можете наблюдать, какие поля являются объявлениями, а какие - определениями, используя Print: объявления отображаются как Parameter, а определения отображаются как Definition (но фактическое телоопределения не напечатано, что, по общему признанию, сбивает с толку).В вашем случае eq, eq_equiv, eq_refl, eq_sym и eq_trans - все определения в UsualDecidableTypeFull, поэтому у вас нет выбора для их реализации, вы должны определить eq как Logic.eq, eq_equiv как eq_equivalence (см. Определения в Equalsities ) и т. Д. При использовании Admitted для реализации eq_refl вы используете тело, отличное от указанного в подписи.Таким образом, определение вашего модуля отклоняется с сообщением the body of definitions differs.

Если я вернусь к вашей первоначальной проблеме написания функтора PairUsualDecidableTypeFull, перейдя к Equalities и EqualitiesFacts, я написал эту реализацию, которая максимально использует существующие компоненты стандартной библиотеки.

Module DT_to_Full (D:DecidableType') <: DecidableTypeFull.
    Include Backport_DT (D).
    Include HasEqDec2Bool.
End DT_to_Full.

Module PairUsualDecidableTypeFull (D1 D2:UsualDecidableTypeFull)
  <: UsualDecidableTypeFull.

    Module M := PairUsualDecidableType D1 D2.
    Include DT_to_Full (M).
End PairUsualDecidableTypeFull.
0 голосов
/ 11 апреля 2019

Мне удалось обойти это, просто «обернув» Coq's UsualDecidableTypeFull, определив:

Module Type UDTFW <: UsualDecidableType.

  Parameter t : Type.
  Definition eq := @Logic.eq t.
  Definition eq_equiv : Equivalence eq := _.
  Parameter eq_refl : forall x : t, x = x.
  Parameter eq_sym : forall x y : t, x = y -> y = x.
  Parameter eq_trans : forall x y z : t, x = y -> y = z -> x = z.
  Parameter eq_dec : forall x y, { @Logic.eq t x y }+{ ~@Logic.eq t x y }.
  Parameter eqb : t -> t -> bool.
  Parameter eqb_eq : forall x y : t, eqb x y = true <-> x = y.

End UDTFW.

вместе с:

Module Make_UDTFW (X : UsualDecidableTypeFull) <: UDTFW.

  Definition t := X.t.
  Definition eq := X.eq.
  Definition eq_equiv := X.eq_equiv.
  Definition eq_refl := X.eq_refl.
  Definition eq_sym := X.eq_sym.
  Definition eq_trans := X.eq_trans.
  Definition eq_dec := X.eq_dec.
  Definition eqb := X.eqb.
  Definition eqb_eq := X.eqb_eq.

End Make_UDTFW.

Введя этот причудливый вид дополнительного уровнякосвенного обращения на уровне модуля, определение PairUsualDecidableTypeFull в вопросе действительно работает, за исключением использования UDTFW всюду от целого числа UsualDecidableTypeFull.

Этот довольно уродливый обходной путь оказывается достаточным для моих целей, но яМне было бы очень интересно понять, в чем здесь проблема.

...