baz_num_elts esercita da Software Foundations


9

Sono al seguente esercizio in 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 *)
[] *)

Tutte le risposte che ho visto su Internet dicono che la risposta è 2 e che gli elementi sono xey. In tal caso, non mi è chiaro cosa si intende per elementi . Esistono certamente due costruttori, ma è impossibile creare effettivamente un valore di tipo baz .

È impossibile creare un valore di tipo bazperché xha tipo baz -> baz. yha tipo baz -> bool -> baz. Per ottenere un valore di tipo bazè necessario passare un valore di tipo baza xo y. Non possiamo ottenere un valore di tipo bazsenza avere già un valore di tipo baz.

Finora ho interpretato elementi per significare valori . Quindi (cons nat 1 nil)e (cons nat 1 (cons nat 2 nil))sarebbero entrambi elementi di tipo list nate ci sarebbe un numero infinito di elementi di tipo list nat. Ci sarebbero due elementi di tipo bool, che sono truee false. Sotto questa interpretazione, direi che ci sono zero elementi di tipo baz.

Ho ragione o qualcuno può spiegare cosa sto fraintendendo?


1
Sicuro. Ho aggiunto un paragrafo che spiega perché penso che sia impossibile creare un valore di tipo baz.
Twernmilt,

Bello. Questo è quello che pensavo stessi pensando. Grazie, Twernmilt. Per quello che vale, ho la stessa reazione che fai: anche io mi sarei aspettato che la risposta fosse che ci sono zero elementi di tipo baz.
DW

Risposte:


8

Sono d'accordo con te. C'è una biiezione tra 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.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.