2017-05-26 4 views
0

Je me demande s'il est possible de retirer cette correspondance de motif dépendant. Comme vous le voyez, j'essaie de mapper plusieurs valeurs à nul (et d'indiquer à la sortie d'avoir le type requis avec une clause return). Type N est un éboueur, je suis tout simplement essayer de se débarrasser de toutes les valeurs aprèsCoq: Problème avec correspondance de motif dépendant

| P, c => phy 
| P, b => phy 
| Ii, b => inf 

(Dans ce contexte particulier, en utilisant un type option semblait très difficile à manier.) Notez que si Coercion est impossible ici, Je serais aussi heureux w/Definition

Inductive R := P | Ii | S | N. 
Parameter rp:> R -> Prop. 
Inductive X: Type := | c {z:P} :> X | b {z:P} {y:Ii} :> X. 
Parameter (phy:P) (inf:Ii) (sen:S) (nul:N). 

Check phy: id P. 
Fail Coercion xi(y:R)(x:X): id y := match y, x with 
| P, c => phy 
| P, b => phy 
| Ii, b => inf 
| _, _ => match _ return N with _ => nul end end. 
(* The term "nul" has type "rp N" while it is expected to have type "rp Ii". *) 
+1

bien qui ne fait pas de ense, évidemment il y a beaucoup de cas qui seront typés différemment de 'N', comme' Ii, c' qui attend quelque chose de type 'Ii' (par votre clause de retour). – ejgallego

+0

@ejgallego: Vous avez probablement voulu dire "par' id y' ", pas" par la clause de retour "(' return N'). Y a-t-il une alternative qui pourrait fonctionner? Il peut falloir plus d'une définition, mais la dernière devrait se terminer par w/mappings à 'phy',' inf' et ordures – jaam

Répondre

0

Une solution plus courte w/a définition renvoyant un « match »:

Inductive R := P | Ii | S | N. Fail Check N: Type. 
Parameter rp:> R -> Prop. Check N: Type. 
Inductive X: Type := | c {z:P} :> X | b {z:P} {y:Ii} :> X. 
Parameter (phy:P) (inf:Ii) (sen:S) (nul:N). 

Definition xi (y:R) := match y return (match y with (P|Ii) => y | _ => N end) with 
    | P => phy 
    | Ii => inf 
    | _ => nul end. 

Eval hnf in xi S. (* = nul *) 

trouvé l'idée here

1

Vous dites: « Je suis tout simplement essayer de se débarrasser de toutes les valeurs après ... », et je suis un peu inquiet d'avoir plusieurs valeurs par défaut sans caractéristiques distinctives, et je soupçonne que votre code ne fera pas ce que vous pensez qu'il va, mais vous pouvez le faire:

Inductive R := P | Ii | S | N. 
Parameter rp:> R -> Prop. 
Inductive X: Type := | c {z:P} :> X | b {z:P} {y:Ii} :> X. 
Parameter (phy:P) (inf:Ii) (sen:S) (nul:N). 

Check phy: id P. 
Definition xi(y:R)(x:X): id y 
    := match y, x with 
    | P, c => phy 
    | P, b => phy 
    | Ii, b => inf 
    | Ii, _ => inf 
    | S, _ => sen 
    | N, _ => nul 
    end. 

Notez que vous pouvez aussi bien faire:

Definition xi(y:R)(x:X): id y 
    := match y with 
    | P => phy 
    | Ii => inf 
    | S => sen 
    | N => nul 
    end. 

Vous ne pouvez pas faire une contrainte parce qu'il n'y a aucun moyen de déduire y de x.


Si ce que vous aimez sont les valeurs, plutôt que les types, vous pouvez utiliser les types dépendants pour obtenir le type de retour que vous voulez dans chaque cas:

Inductive R := P | Ii | S | N. 
Parameter rp:> R -> Prop. 
Inductive X: Type := | c {z:P} :> X | b {z:P} {y:Ii} :> X. 
Parameter (phy:P) (inf:Ii) (sen:S) (nul:N). 

Check phy: id P. 
Definition xi_type(y:R)(x:X) 
    := match y, x return Type with 
    | P, c 
    | P, b 
    | Ii, b 
     => y 
    | _, _ 
     => N 
    end. 
Definition xi(y:R)(x:X): xi_type y x 
    := match y, x return xi_type y x with 
    | P, c => phy 
    | P, b => phy 
    | Ii, b => inf 
    | _, _ => nul 
    end. 
+0

Merci, mais j'essayais de mapper 'S' à' N' (ie poubelle), qui (comme @ejgallego mentionné) ne fonctionne pas w/'xi', donc ce dernier est probablement défectueux de toute façon (je soupçonne que, au minimum, il ne devrait pas se terminer sur« id y »). C'est pourquoi j'ai demandé (dans mon commentaire ci-dessus) "Y at-il une alternative qui pourrait fonctionner? Cela peut prendre plus d'une définition, mais la dernière devrait se terminer par" phy "," inf "et garbage". Je veux mapper plusieurs valeurs à la poubelle, qui est aussi la raison pour laquelle j'ai considéré le type d'option dans ma question (mais je l'ai trouvé trop lourd) – jaam

+0

Je ne savais pas de ton commentaire que tu n'étais pas attaché à l'id ' type de retour. J'ai mis à jour ma réponse avec une définition de 'xi' avec (fondamentalement) le corps que vous donnez, mais un type de retour différent. –

+0

Gut! BTW, vos définitions fonctionnent aussi sans les clauses de retour – jaam