Acciones

R1

De Seminario de Lógica Computacional (2018)

(* Relación 1: Programación funcional en Coq *)

Definition admit {T: Type} : T.  Admitted.

(* ---------------------------------------------------------------------
   Ejercicio 1. Definir la función 
      nandb :: bool -> bool -> bool 
   tal que (nanb x y) se verifica si x e y no son verdaderos.

   Demostrar las siguientes propiedades de nand
      (nandb true  false) = true.
      (nandb false false) = true.
      (nandb false true)  = true.
      (nandb true  true)  = false.
   ------------------------------------------------------------------ *)

Definition nandb (b1:bool) (b2:bool) : bool :=
  admit. 

Example prop_nandb1: (nandb true false) = true.
Admitted.

Example prop_nandb2: (nandb false false) = true.
Admitted.


Example prop_nandb3: (nandb false true) = true.
Admitted.

Example prop_nandb4: (nandb true true) = false.
Admitted.

(* ---------------------------------------------------------------------
   Ejercicio 2.1. Definir la función
      andb3 :: bool -> bool -> bool -> bool
   tal que (andb3 x y z) se verifica si x, y y z son verdaderos.

   Demostrar las siguientes propiedades de andb3
      (andb3 true  true  true)  = true.
      (andb3 false true  true)  = false.
      (andb3 true  false true)  = false.
      (andb3 true  true  false) = false.
   ------------------------------------------------------------------ *)

Definition andb3 (x:bool) (y:bool) (z:bool) : bool :=
  admit.

Example prop_andb31: (andb3 true true true) = true.
Admitted.

Example prop_andb32: (andb3 false true true) = false.
Admitted. 

Example prop_andb33: (andb3 true false true) = false.
Admitted.

Example prop_andb34: (andb3 true true false) = false.
Admitted.

(* ---------------------------------------------------------------------
   Ejercicio 3. Definir la función
      factorial :: nat -> nat1
   tal que (factorial n) es el factorial de n. 

      (factorial 3) = 6.
      (factorial 5) = (mult 10 12).
   ------------------------------------------------------------------ *)

Fixpoint factorial (n:nat) : nat := 
  admit.

Example prop_factorial1: (factorial 3) = 6.
Admitted.

Example prop_factorial2: (factorial 5) = (mult 10 12).
Admitted.

(* ---------------------------------------------------------------------
   Ejercicio 4. Definir la función
      blt_nat :: nat -> nat -> bool
   tal que (blt n m) se verifica si n es menor que m.

   Demostrar las siguientes propiedades
      (blt_nat 2 2) = false.
      (blt_nat 2 4) = true.
      (blt_nat 4 2) = false.
   ------------------------------------------------------------------ *)

(* Nota: Se puede usar las funciones beq_nat y leb del texto del tema 1 *)
Fixpoint beq_nat (n m : nat) : bool :=
  match n with
  | O => match m with
         | O => true
         | S m' => false
         end
  | S n' => match m with
            | O => false
            | S m' => beq_nat n' m'
            end
  end.

Fixpoint leb (n m : nat) : bool :=
  match n with
  | O => true
  | S n' =>
      match m with
      | O => false
      | S m' => leb n' m'
      end
  end.

Definition blt_nat (n m : nat) : bool :=
  admit.
                                   
Example prop_blt_nat1: (blt_nat 2 2) = false.
Admitted.

Example prop_blt_nat2: (blt_nat 2 4) = true.
Admitted.

Example prop_blt_nat3: (blt_nat 4 2) = false.
Admitted.

(* ---------------------------------------------------------------------
   Ejercicio 5. Demostrar que
      forall n m o : nat,
         n = m -> m = o -> n + m = m + o.
   ------------------------------------------------------------------ *)

Theorem plus_id_exercise: forall n m o : nat,
  n = m -> m = o -> n + m = m + o.
Admitted.


(* ---------------------------------------------------------------------
   Ejercicio 6. Demostrar que
      forall n m : nat,
        m = S n ->
        m * (1 + n) = m * m.
   ------------------------------------------------------------------ *)


(* Nota: Se puede usar el lema plus_1_l del texto del tema 1 *)
Theorem plus_1_l : forall n:nat, 1 + n = S n.
Proof.
  intros n. reflexivity.  Qed.

Theorem mult_S_1 : forall n m : nat,
  m = S n ->
  m * (1 + n) = m * m.
Admitted.

(* ---------------------------------------------------------------------
   Ejercicio 7. Demostrar que
      forall b c : bool,
        andb b c = true -> c = true.
   ------------------------------------------------------------------ *)

Theorem andb_true_elim2 : forall b c : bool,
  andb b c = true -> c = true.
Admitted.

(* ---------------------------------------------------------------------
   Ejercicio 8. Dmostrar que
      forall n : nat,
        beq_nat 0 (n + 1) = false.
   ------------------------------------------------------------------ *)

Theorem zero_nbeq_plus_1: forall n : nat,
  beq_nat 0 (n + 1) = false.
Admitted.

(* ---------------------------------------------------------------------
   Ejercicio 9. Demostrar que
      forall (f : bool -> bool),
        (forall (x : bool), f x = x) -> 
        forall (b : bool), f (f b) = b.
   ------------------------------------------------------------------ *)

Theorem identity_fn_applied_twice :
  forall (f : bool -> bool),
    (forall (x : bool), f x = x) ->
    forall (b : bool), f (f b) = b.
Admitted.

(* ---------------------------------------------------------------------
   Ejercicio 10. Demostrar que
      forall (b c : bool),
        (andb b c = orb b c) -> b = c.
   ------------------------------------------------------------------ *)

Theorem andb_eq_orb :
  forall (b c : bool),
    (andb b c = orb b c) -> b = c.
Admitted.

(* ---------------------------------------------------------------------
   Ejercicio 11. En este ejercicio se considera la siguiente
   representación de los números naturales
      Inductive nat2 : Type :=
        | C  : nat2
        | D  : nat2 -> nat2
        | SD : nat2 -> nat2.
   donde C representa el cero, D el doble y SD el siguiente del doble.

   Definir la función
      nat2Anat :: nat2 -> nat
   tal que (nat2Anat x) es el número natural representado por x. 

   Demostrar que 
      nat2Anat (SD (SD C))     = 3
      nat2Anat (D (SD (SD C))) = 6.
   ------------------------------------------------------------------ *)

Inductive nat2 : Type :=
  | C  : nat2
  | D  : nat2 -> nat2
  | SD : nat2 -> nat2.

Fixpoint nat2Anat (x:nat2) : nat :=
  admit.

Example prop_nat2Anat1: (nat2Anat (SD (SD C))) = 3.
Admitted.

Example prop_nat2Anat2: (nat2Anat (D (SD (SD C)))) = 6.
Admitted.