Exercício baz_num_elts do Software Foundations

9

Estou no seguinte exercício no Software Foundations :

(** **** Exercise: 2 stars (baz_num_elts) *)
(** Consider the following inductive definition: *)

Inductive baz : Type :=
   | x : baz -> baz
   | y : baz -> bool -> baz.

(** How _many_ elements does the type [baz] have? 
(* FILL IN HERE *)
[] *)

Todas as respostas que eu vi na Internet dizem que a resposta é 2 e que os elementos são x e y. Se for esse o caso, não está claro para mim o que se entende por elementos . Certamente existem dois construtores, mas é impossível criar um valor do tipo baz .

É impossível criar um valor do tipo bazporque xtem o tipo baz -> baz.ytem o tipo baz -> bool -> baz. Para obter um valor do tipo baz, precisamos passar um valor do tipo bazpara xou y. Não podemos obter um valor do tipo bazsem já ter um valor do tipo baz.

Até agora, tenho interpretado elementos para significar valores . Então (cons nat 1 nil)e(cons nat 1 (cons nat 2 nil)) ambos seriam elementos do tipo list nate haveria um número infinito de elementos do tipo list nat. Haveria dois elementos do tipo bool, que são truee false. Sob essa interpretação, eu argumentaria que existem zero elementos do tipo baz.

Estou correto ou alguém pode explicar o que estou entendendo mal?

Twernmilt
fonte
11
Certo. Adicionei um parágrafo explicando por que acho impossível criar um valor do tipo baz.
Twernmilt
Agradável. Foi o que pensei que você estava pensando. Obrigado, Twernmilt. Pelo que vale, eu tenho a mesma reação que você: eu também esperava que a resposta fosse que não existem elementos do tipo baz.
DW

Respostas:

8

Eu concordo com você. Há uma bijeção entre baze False.

Definition injective : forall {t1 t2}, (t1 -> t2) -> Prop := fun t1 t2 f1 => forall x1 x2, f1 x1 = f1 x2 -> x1 = x2.

Definition surjective : forall {t1 t2}, (t1 -> t2) -> Prop := fun t1 t2 f1 => forall x1, exists x2, f1 x2 = x1.

Definition bijective : forall {t1 t2}, (t1 -> t2) -> Prop := fun t1 t2 f1 => injective f1 /\ surjective f1.

Inductive baz : Type :=
   | x : baz -> baz
   | y : baz -> bool -> baz.

Theorem baz_False : baz -> False. Proof. induction 1; firstorder. Qed.

Goal exists f1 : baz -> False, bijective f1.
Proof.
exists baz_False. unfold bijective, injective, surjective. firstorder.
assert (H2 := baz_False x1). firstorder.
assert (H2 := x1). firstorder.
Qed.
Rui Baptista
fonte