tl;dr le candidat proposé n'est pas tout à fait un égaliseur, mais sa pertinence homologue de l'
Le candidat à un égaliseur dans Agda semble bon. Donc, nous allons juste essayer. Nous allons avoir besoin de quelques kit de base. Voici mon refusenik ASCII dépendante de la paire type et homogène intensionnel de l'égalité.
record Sg (S : Set)(T : S -> Set) : Set where
constructor _,_
field
fst : S
snd : T fst
open Sg
data _==_ {X : Set}(x : X) : X -> Set where
refl : x == x
Voici votre candidat pour un égaliseur pour deux fonctions
Q : {S T : Set}(f g : S -> T) -> Set
Q {S}{T} f g = Sg S \ s -> f s == g s
avec l' fst
projection envoyant Q f g
en S
.
Ce qu'il dit: un élément de Q f g
est un élément s
du type de source, avec une preuve qu' f s == g s
. Mais est-ce un égaliseur? Nous allons essayer de faire en sorte.
Pour vous dire que l'égaliseur est, je dois définir la fonction de la composition.
_o_ : {R S T : Set} -> (S -> T) -> (R -> S) -> R -> T
(f o g) x = f (g x)
Alors maintenant, j'ai besoin de prouver que l' h : R -> S
qui identifie f o h
et g o h
doit facteur par le candidat fst : Q f g -> S
. J'ai besoin à la fois d'offrir à l'autre composant, u : R -> Q f g
et la preuve qu'en effet, h
facteurs comme l' fst o u
. Voici l'image: (Q f g , fst)
est un égaliseur si à chaque fois que le diagramme commute sans u
, il existe un unique façon d'ajouter de la u
avec le diagramme encore les déplacements.
![equaliser diagram]()
Ici va à l'existence de la médiation u
.
mediator : {R S T : Set}(f g : S -> T)(h : R -> S) ->
(q : (f o h) == (g o h)) ->
Sg (R -> Q f g) \ u -> h == (fst o u)
Clairement, je doit choisir le même élément de la S
que h
choix.
mediator f g h q = (\ r -> (h r , ?0)) , ?1
me laissant avec deux obligations de preuve
?0 : f (h r) == g (h r)
?1 : h == (\ r -> h r)
Maintenant, ?1
peut-être juste refl
comme Agda de la définition de l'égalité a l'eta-droit pour les fonctions. Pour ?0
, nous sommes bénis en q
. L'égalité des fonctions à l'égard de l'application
funq : {S T : Set}{f g : S -> T} -> f == g -> (s : S) -> f s == g s
funq refl s = refl
afin que nous puissions prendre en ?0 = funq q r
.
Mais laissez-nous célébrons pas prématurément, l'existence d'une médiation morphism n'est pas suffisant. Nous avons besoin aussi de son unicité. Et ici, la roue est susceptible d'être bancale, car ==
est intensionnel, de sorte que l'unicité n'y a qu'une seule façon de mettre en œuvre la médiation de la carte. Mais alors, nos hypothèses sont également intensionnel...
Voici notre obligation de preuve. Nous devons montrer que toute autre médiation morphism est égale à celle choisie par l' mediator
.
mediatorUnique :
{R S T : Set}(f g : S -> T)(h : R -> S) ->
(qh : (f o h) == (g o h)) ->
(m : R -> Q f g) ->
(qm : h == (fst o m)) ->
m == fst (mediator f g h qh)
Nous pouvons immédiatement remplacer par qm
et obtenir
mediatorUnique f g .(fst o m) qh m refl = ?
? : m == (\ r -> (fst (m r) , funq qh r))
ce qui semble bon, parce que Agda a eta lois pour les enregistrements, nous savons que
m == (\ r -> (fst (m r) , snd (m r)))
mais quand nous essayons de faire en ? = refl
, nous obtenons la plainte
snd (m _) != funq qh _ of type f (fst (m _)) == g (fst (m _))
ce qui est gênant, car l'identité des épreuves uniques (dans la configuration standard). Maintenant, vous pouvez sortir de ce en postulant la fusion et à l'aide de quelques autres faits au sujet de l'égalité
postulate ext : {S T : Set}{f g : S -> T} -> ((s : S) -> f s == g s) -> f == g
sndq : {S : Set}{T : S -> Set}{s : S}{t t' : T s} ->
t == t' -> _==_ {Sg S T} (s , t) (s , t')
sndq refl = refl
uip : {X : Set}{x y : X}{q q' : x == y} -> q == q'
uip {q = refl}{q' = refl} = refl
? = ext (\ s -> sndq uip)
mais c'est exagéré, parce que le seul problème est l'ennuyeux égalité de preuve d'incompatibilité: la calculable parties de la mise en œuvre de match sur le nez. Donc la solution est de travailler avec des non-pertinence. - Je remplacer Sg
par l' Ex
istential quantificateur, dont le deuxième élément est marqué comme non pertinente d'un point. Maintenant, il n'importe pas qui la preuve que nous utilisons que le témoin est bon.
record Ex (S : Set)(T : S -> Set) : Set where
constructor _,_
field
fst : S
.snd : T fst
open Ex
et le nouveau candidat de l'égaliseur est
Q : {S T : Set}(f g : S -> T) -> Set
Q {S}{T} f g = Ex S \ s -> f s == g s
L'ensemble de la construction passe par comme avant, sauf que dans le dernier obligation
? = refl
sont acceptés!
Donc oui, même dans le intensionnel réglage, l'eta lois et la capacité de marquer des champs comme hors de propos nous donner des égaliseurs.
Pas de indécidable le typage a été impliqué dans cette construction.