2017-04-22 2 views
0

Je souhaite définir une fonction dont le comportement dépend de son argument (au moins) d'une fonction n-place. Un rudimentaire (échec) tentativeCoq: Définition d'une fonction par appariement de motif sur l'arité de son argument

Definition rT {y:Type}(x:y) := ltac: (match y with 
| _ -> _ -> _ => exact True 
| _ => exact False end). 

Check prod: Type -> Type -> Type. 
Compute rT prod. (*= False: Prop*) 
Print rT. (*rT = fun (y : Type) (_ : y) => False: forall y : Type, y -> Prop*) 

Comme vous le voyez, les cartes rT tout pour False. Pourquoi? Le résultat reste le même si je remplace y dans la clause de correspondance w/type of x

Répondre

3

La fonction que vous voulez ne peut pas exister dans Gallina au type que vous attendez.

Votre fonction est acceptée, mais si vous l'imprimez, vous pouvez voir son corps est:

rT = fun (y : Type) (_ : y) => False 

Gallina n'a aucun moyen de match -ment sur un Type. Il existe des moyens de traiter les fonctions n-aires, de telle sorte que vous pouvez inspecter leur arité, mais cela implique des types dépendants pour capturer statiquement l'arité. Par exemple, pour les fonctions de n-aire uniformes:

https://coq.inria.fr/library/Coq.Numbers.NaryFunctions.html

+0

est la raison derrière ce que la correspondance de motif de Coq est conçu pour fonctionner uniquement sur les constructeurs d'un type inductif? – jaam

+2

Il existe deux niveaux de correspondance de motif. Le motif "Gallina" ne fonctionne en effet que sur les types inductifs et coinducteurs. Le modèle "Ltac" que votre code utilise est plus syntaxique, donc ce qu'il fait ne peut pas être exprimé comme un terme de Gallina (en général). – Ptival