Ltac-tical абстрагирование на подтерме типа цели - PullRequest
16 голосов
/ 26 января 2012

В качестве грубого и необученного фона, в HoTT каждый выводит черт из индуктивно определенного типа

Inductive paths {X : Type } : X -> X -> Type :=
 | idpath : forall x: X, paths x x.

, что позволяет очень общую конструкцию

Lemma transport {X : Type } (P : X -> Type ){ x y : X} (γ : paths x y):
  P x -> P y.
Proof.
 induction γ.
 exact (fun a => a).
Defined.

Lemma transport будет лежать в основе тактики HoTT "заменить" или "переписать"; хитрость, насколько я понимаю, заключалась бы в том, чтобы предположить цель, которую вы или я можем абстрактно признать как

...
H : paths x y
[ Q : (G x) ]
_____________
(G y)

чтобы выяснить, что является необходимым зависимым типом G, чтобы мы могли apply (transport G H). Пока все, что я понял, это то, что

Ltac transport_along γ :=
match (type of γ) with 
| ?a ~~> ?b =>
 match goal with
 |- ?F b => apply (transport F γ)
 | _ => idtac "apparently couldn't abstract" b "from the goal."  end 
| _ => idtac "Are you sure" γ "is a path?" end.

недостаточно общий. То есть первый idtac используется довольно часто.

Вопрос

[Есть ли | Что такое Правильно сделать ?

Ответы [ 2 ]

5 голосов
/ 22 февраля 2012

Существует ошибка при использовании перезаписи для отношений в типе, которая позволит вам просто сказать rewrite <- y.

В то же время,

Ltac transport_along γ :=
  match (type of γ) with 
    | ?a ~~> ?b => pattern b; apply (transport _ y)
    | _ => idtac "Are you sure" γ "is a path?"
  end.

, вероятно, делает то, что вы хотите.

2 голосов
/ 29 сентября 2017

Запрос на функцию, упомянутый Томом Принцем в его ответе , был удовлетворен:

Require Import Coq.Setoids.Setoid Coq.Classes.CMorphisms.
Inductive paths {X : Type } : X -> X -> Type :=
| idpath : forall x: X, paths x x.

Lemma transport {X : Type } (P : X -> Type ){ x y : X} (γ : paths x y):
  P x -> P y.
Proof.
  induction γ.
  exact (fun a => a).
Defined.

Global Instance paths_Reflexive {A} : Reflexive (@paths A) := idpath.
Global Instance paths_Symmetric {A} : Symmetric (@paths A).
Proof. intros ?? []; constructor. Defined.

Global Instance proper_paths {A} (x : A) : Proper paths x := idpath x.
Global Instance paths_subrelation
       (A : Type) (R : crelation A)
       {RR : Reflexive R}
  : subrelation paths R.
Proof.
  intros ?? p.
  apply (transport _ p), RR.
Defined.
Global Instance reflexive_paths_dom_reflexive
       {B} {R' : crelation B} {RR' : Reflexive R'}
       {A : Type}
  : Reflexive (@paths A ==> R')%signature.
Proof. intros ??? []; apply RR'. Defined.

Goal forall (x y : nat) G, paths x y -> G x -> G y.
  intros x y G H Q.
  rewrite <- H.
  exact Q.
Qed.

Я нашел необходимые экземпляры, сравнив полученные журналы с Set Typeclasses Debug из setoid_rewrite <- H, когда H : paths x y и когда H : eq x y.

...