2017-09-05 4 views

Répondre

5

Plus ou moins comme vous avez écrit. Tout d'abord, vous devez avoir une fonction f0 : nat -> nat à laquelle vous souhaitez appliquer cette définition. Ce que vous avez fait ici

Definition f0 := nat -> nat. 

était de nommer le type nat -> nat des fonctions de Naturals à Naturals f0. Vous avez probablement eu à l'esprit quelque chose comme ceci:

Variable f0 : nat -> nat. 

Ceci déclare une f0 variable qui appartient au type nat -> nat. Maintenant, nous pouvons adapter votre description originale au code Coq:

Definition A : Set := {x : nat | f0 x = 0}. 

Il y a deux choses à savoir ici. Tout d'abord, vous voudrez peut-être appliquer cette définition ultérieurement à une fonction particulièref0 : nat -> nat, telle que la fonction précédente pred : nat -> nat. Dans ce cas, vous devez placer votre code dans une section:

Section Test. 
Variable f0 : nat -> nat. 
Definition A : Set := {x : nat | f0 x = 0}. 
End Test. 

En dehors de la section, A est en fait une fonction (nat -> nat) -> Set, qui prend une fonction f0 : nat -> nat du type {x : nat | f0 x = 0}. Vous pouvez utiliser A comme vous utiliseriez n'importe quelle autre fonction, par ex.

Check (A pred). 
(* A pred : set *) 

La deuxième chose que vous devez garder à l'esprit est que Set en Coq est pas la même chose comme un ensemble en mathématiques conventionnelles. En math, un élément de l'ensemble {x | f(x) = 0} est aussi un élément de l'ensemble des nombres naturels. Mais pas dans Coq. Dans Coq, vous devez appliquer une fonction de projection explicite proj1_sig pour convertir un élément de {x : nat | f0 x = 0} en nat.

+0

Merci beaucoup, c'est tellement parfait! :) –