Étant donné un terme t : ∀x.∃y.(¬(x = 0) ⇒ x = S(y))
dans la théorie des types de Martin-Lof, quelle est la valeur de w(t(0))
, où w
est l'opérateur qui extrait le témoin d'un terme de type existentiel?
Étant donné un terme t : ∀x.∃y.(¬(x = 0) ⇒ x = S(y))
dans la théorie des types de Martin-Lof, quelle est la valeur de w(t(0))
, où w
est l'opérateur qui extrait le témoin d'un terme de type existentiel?
Réponses:
Pour démontrer la réponse de Mark, considérez la preuve suivante t
de votre déclaration, écrite en Coq. Dans la preuve, nous supposons qu'un paramètre k
de type nat
est donné. Nous utilisons k
la valeur de y
dans le cas où x = 0
:
Parameter k : nat.
Theorem t : forall x : nat, { y : nat | x <> 0 -> x = S y}.
Proof.
induction x.
exists k; tauto.
induction x.
exists 0; auto.
destruct IHx as [z G].
exists (S z).
intro H.
elim G; auto.
Defined.
Nous pouvons prouver que t 0
c'est égal à k
:
Theorem A: projT1 (t 0) = k.
Proof.
auto.
Qed.
Le protT1
est là parce t 0
est non seulement un nombre naturel, mais en fait un nombre naturel avec une preuve 0 <> 0 -> 0 = S y
et projT1
jette la preuve.
Le code Ocaml extrait pour t
, obtenu avec la commande Extraction k
est
(** val t : nat -> nat **)
let rec t = function
| O -> k
| S n0 -> (match n0 with
| O -> O
| S n1 -> S (t n0))
Encore une fois, nous pouvons voir que t 0
est égal à k
, qui était un paramètre présumé aribtrairement.