Biorąc pod uwagę termin t : ∀x.∃y.(¬(x = 0) ⇒ x = S(y))
z teorii typów Martina-Lofa, jaka jest wartość w(t(0))
, gdzie w
jest operator wydobywający świadka terminu typu egzystencjalnego?
Biorąc pod uwagę termin t : ∀x.∃y.(¬(x = 0) ⇒ x = S(y))
z teorii typów Martina-Lofa, jaka jest wartość w(t(0))
, gdzie w
jest operator wydobywający świadka terminu typu egzystencjalnego?
Odpowiedzi:
Dowolna wartość. To zależy od tego, który dostaniesz. Termin typu ∃ y . ( Ź ( 0 = 0 ) ⇒ 0 = S ( T ) ) jest parą int Y i funkcja wykonuje dowód Ź ( 0 = 0 ) i daje dowód 0 = S ( . Możesz użyć terminu typu ¬ ( 0 = 0 ) i typu 0 = 0(z zwrotności), aby uzyskać termin dowolnego typu. Obejmuje to termin typu , 0 = S ( 1 ) , … . Możesz więc ustawić dowolną liczbę całkowitą, jaką chcesz.
Aby zademonstrować odpowiedź Marka, rozważ następujący dowód t
twojego oświadczenia, napisany w Coq. W dowodzie zakładamy, że podano parametr k
typu nat
. Używamy k
jako wartości y
w przypadku 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.
Możemy udowodnić, że t 0
jest to równe k
:
Theorem A: projT1 (t 0) = k.
Proof.
auto.
Qed.
protT1
Jest tam, bo t 0
nie jest tylko liczbą naturalną, ale w rzeczywistości liczbą naturalną z dowodem, że 0 <> 0 -> 0 = S y
i projT1
wyrzuca dowód.
Wyodrębniony kod Ocaml dla t
, uzyskany za pomocą polecenia Extraction k
to
(** val t : nat -> nat **)
let rec t = function
| O -> k
| S n0 -> (match n0 with
| O -> O
| S n1 -> S (t n0))
Ponownie możemy zobaczyć, że t 0
jest równy k
, który był arbtralnie przyjętym parametrem.