Dado un término t : ∀x.∃y.(¬(x = 0) ⇒ x = S(y))
en la teoría de tipos de Martin-Lof, ¿cuál es el valor de w(t(0))
, dónde w
está el operador que extrae el testigo de un término de tipo existencial?
Dado un término t : ∀x.∃y.(¬(x = 0) ⇒ x = S(y))
en la teoría de tipos de Martin-Lof, ¿cuál es el valor de w(t(0))
, dónde w
está el operador que extrae el testigo de un término de tipo existencial?
Respuestas:
Para demostrar la respuesta de Mark, considere la siguiente prueba t
de su declaración, escrita en Coq. En la prueba asumimos que se da un parámetro k
de tipo nat
. Usamos k
como el valor de y
en caso 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.
Podemos demostrar que t 0
es igual a k
:
Theorem A: projT1 (t 0) = k.
Proof.
auto.
Qed.
El protT1
está ahí porque t 0
no es sólo un número natural, pero en realidad un número natural con una prueba de que 0 <> 0 -> 0 = S y
y projT1
desecha la prueba.
El código Ocaml extraído para t
, obtenido con el comando Extraction k
es
(** val t : nat -> nat **)
let rec t = function
| O -> k
| S n0 -> (match n0 with
| O -> O
| S n1 -> S (t n0))
De nuevo, podemos ver que t 0
es igual a k
, que era un parámetro asumido de forma arbitraria.