Diferencia entre revisiones de «Relación 1»
De Seminario de Lógica Computacional (2018)
(Página creada con '<source lang="ocaml"> (* Relación 1: Programación funcional en Coq *) Require Export Basics. Definition admit {T: Type} : T. Admitted. (* ---------------------------------...') |
|||
Línea 17: | Línea 17: | ||
(nandb true true) = false. | (nandb true true) = false. | ||
------------------------------------------------------------------ *) | ------------------------------------------------------------------ *) | ||
− | + | -- alerodrod5 | |
Definition nandb (b1:bool) (b2:bool) : bool := | Definition nandb (b1:bool) (b2:bool) : bool := | ||
− | + | match b1 with | |
+ | | true => negb b2 | ||
+ | | false => true | ||
+ | end. | ||
Example prop_nandb1: (nandb true false) = true. | Example prop_nandb1: (nandb true false) = true. | ||
− | + | Proof. simpl. reflexivity. Qed. | |
Example prop_nandb2: (nandb false false) = true. | Example prop_nandb2: (nandb false false) = true. | ||
− | + | Proof. simpl. reflexivity. Qed. | |
Example prop_nandb3: (nandb false true) = true. | Example prop_nandb3: (nandb false true) = true. | ||
− | + | Proof. simpl. reflexivity. Qed. | |
− | |||
Example prop_nandb4: (nandb true true) = false. | Example prop_nandb4: (nandb true true) = false. | ||
− | + | Proof. simpl. reflexivity. Qed. | |
− | |||
(* --------------------------------------------------------------------- | (* --------------------------------------------------------------------- | ||
Ejercicio 2.1. Definir la función | Ejercicio 2.1. Definir la función | ||
Línea 45: | Línea 46: | ||
(andb3 true true false) = false. | (andb3 true true false) = false. | ||
------------------------------------------------------------------ *) | ------------------------------------------------------------------ *) | ||
+ | -- alerodrod5 | ||
+ | Definition andb3 (x:bool) (y:bool) (z:bool) : bool := | ||
+ | match b1 with | ||
+ | |true => andb b2 b3 | ||
+ | |false => false | ||
+ | end. | ||
− | |||
− | |||
Example prop_andb31: (andb3 true true true) = true. | Example prop_andb31: (andb3 true true true) = true. | ||
− | + | Proof. simpl. reflexivity. Qed. | |
− | |||
Example prop_andb32: (andb3 false true true) = false. | Example prop_andb32: (andb3 false true true) = false. | ||
− | + | Proof. simpl. reflexivity. Qed. | |
− | |||
Example prop_andb33: (andb3 true false true) = false. | Example prop_andb33: (andb3 true false true) = false. | ||
− | + | Proof. simpl. reflexivity. Qed. | |
− | |||
Example prop_andb34: (andb3 true true false) = false. | Example prop_andb34: (andb3 true true false) = false. | ||
− | + | Proof. simpl. reflexivity. Qed. | |
− | |||
(* --------------------------------------------------------------------- | (* --------------------------------------------------------------------- | ||
Ejercicio 3. Definir la función | Ejercicio 3. Definir la función | ||
Línea 69: | Línea 70: | ||
(factorial 5) = (mult 10 12). | (factorial 5) = (mult 10 12). | ||
------------------------------------------------------------------ *) | ------------------------------------------------------------------ *) | ||
− | + | -- alerodrod5 | |
Fixpoint factorial (n:nat) : nat := | Fixpoint factorial (n:nat) : nat := | ||
− | + | match n with | |
+ | |O => 1 | ||
+ | |S n' => S n' * factorial n' | ||
+ | end. | ||
Example prop_factorial1: (factorial 3) = 6. | Example prop_factorial1: (factorial 3) = 6. | ||
− | + | Proof. simpl. reflexivity. Qed. | |
Example prop_factorial2: (factorial 5) = (mult 10 12). | Example prop_factorial2: (factorial 5) = (mult 10 12). | ||
− | + | Proof. simpl. reflexivity. Qed. | |
(* --------------------------------------------------------------------- | (* --------------------------------------------------------------------- | ||
Línea 90: | Línea 94: | ||
------------------------------------------------------------------ *) | ------------------------------------------------------------------ *) | ||
+ | -- alerodrod5 | ||
Definition blt_nat (n m : nat) : bool := | Definition blt_nat (n m : nat) : bool := | ||
− | + | match n with | |
− | + | | O => true | |
+ | | S n' => | ||
+ | match m with | ||
+ | | O => false | ||
+ | | S m' => leb (S n') m' | ||
+ | end | ||
+ | end. | ||
Example prop_blt_nat1: (blt_nat 2 2) = false. | Example prop_blt_nat1: (blt_nat 2 2) = false. | ||
− | + | Proof. simpl. reflexivity. Qed. | |
Example prop_blt_nat2: (blt_nat 2 4) = true. | Example prop_blt_nat2: (blt_nat 2 4) = true. | ||
− | + | Proof. simpl. reflexivity. Qed. | |
Example prop_blt_nat3: (blt_nat 4 2) = false. | Example prop_blt_nat3: (blt_nat 4 2) = false. | ||
− | + | Proof. simpl. reflexivity. Qed. | |
(* --------------------------------------------------------------------- | (* --------------------------------------------------------------------- | ||
Línea 108: | Línea 119: | ||
------------------------------------------------------------------ *) | ------------------------------------------------------------------ *) | ||
+ | -- alerodrod5 | ||
Theorem plus_id_exercise: forall n m o : nat, | Theorem plus_id_exercise: forall n m o : nat, | ||
n = m -> m = o -> n + m = m + o. | n = m -> m = o -> n + m = m + o. | ||
− | + | Proof. | |
− | + | intros n m . intros o Ho. rewrite -> Ho . intros H. rewrite -> H. reflexivity. Qed. | |
(* --------------------------------------------------------------------- | (* --------------------------------------------------------------------- | ||
Línea 120: | Línea 132: | ||
------------------------------------------------------------------ *) | ------------------------------------------------------------------ *) | ||
− | + | -- alerodrod5 | |
Theorem mult_S_1 : forall n m : nat, | Theorem mult_S_1 : forall n m : nat, | ||
m = S n -> | m = S n -> | ||
m * (1 + n) = m * m. | m * (1 + n) = m * m. | ||
− | + | Proof. | |
+ | intros n m. intros H. rewrite -> H. reflexivity. Qed. | ||
(* --------------------------------------------------------------------- | (* --------------------------------------------------------------------- | ||
Línea 131: | Línea 144: | ||
andb b c = true -> c = true. | andb b c = true -> c = true. | ||
------------------------------------------------------------------ *) | ------------------------------------------------------------------ *) | ||
− | + | -- alerodrod5 | |
Theorem andb_true_elim2 : forall b c : bool, | Theorem andb_true_elim2 : forall b c : bool, | ||
andb b c = true -> c = true. | andb b c = true -> c = true. | ||
− | + | Proof. | |
+ | intros b c. destruct b. | ||
+ | - intros H. rewrite <-H. reflexivity. | ||
+ | - intros H. rewrite <-H. destruct false. | ||
+ | + reflexivity. | ||
+ | + destruct c. rewrite <-H. reflexivity. reflexivity | ||
+ | + reflexivity. | ||
+ | Qed. | ||
(* --------------------------------------------------------------------- | (* --------------------------------------------------------------------- | ||
Línea 142: | Línea 162: | ||
------------------------------------------------------------------ *) | ------------------------------------------------------------------ *) | ||
+ | -- alerodrod5 | ||
Theorem zero_nbeq_plus_1: forall n : nat, | Theorem zero_nbeq_plus_1: forall n : nat, | ||
beq_nat 0 (n + 1) = false. | beq_nat 0 (n + 1) = false. | ||
− | + | Proof. | |
+ | intros n. destruct n. | ||
+ | - reflexivity. | ||
+ | - reflexivity. | ||
+ | Qed. | ||
(* --------------------------------------------------------------------- | (* --------------------------------------------------------------------- |
Revisión del 17:39 24 feb 2018
(* Relación 1: Programación funcional en Coq *)
Require Export Basics.
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.
------------------------------------------------------------------ *)
-- alerodrod5
Definition nandb (b1:bool) (b2:bool) : bool :=
match b1 with
| true => negb b2
| false => true
end.
Example prop_nandb1: (nandb true false) = true.
Proof. simpl. reflexivity. Qed.
Example prop_nandb2: (nandb false false) = true.
Proof. simpl. reflexivity. Qed.
Example prop_nandb3: (nandb false true) = true.
Proof. simpl. reflexivity. Qed.
Example prop_nandb4: (nandb true true) = false.
Proof. simpl. reflexivity. Qed.
(* ---------------------------------------------------------------------
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.
------------------------------------------------------------------ *)
-- alerodrod5
Definition andb3 (x:bool) (y:bool) (z:bool) : bool :=
match b1 with
|true => andb b2 b3
|false => false
end.
Example prop_andb31: (andb3 true true true) = true.
Proof. simpl. reflexivity. Qed.
Example prop_andb32: (andb3 false true true) = false.
Proof. simpl. reflexivity. Qed.
Example prop_andb33: (andb3 true false true) = false.
Proof. simpl. reflexivity. Qed.
Example prop_andb34: (andb3 true true false) = false.
Proof. simpl. reflexivity. Qed.
(* ---------------------------------------------------------------------
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).
------------------------------------------------------------------ *)
-- alerodrod5
Fixpoint factorial (n:nat) : nat :=
match n with
|O => 1
|S n' => S n' * factorial n'
end.
Example prop_factorial1: (factorial 3) = 6.
Proof. simpl. reflexivity. Qed.
Example prop_factorial2: (factorial 5) = (mult 10 12).
Proof. simpl. reflexivity. Qed.
(* ---------------------------------------------------------------------
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.
------------------------------------------------------------------ *)
-- alerodrod5
Definition blt_nat (n m : nat) : bool :=
match n with
| O => true
| S n' =>
match m with
| O => false
| S m' => leb (S n') m'
end
end.
Example prop_blt_nat1: (blt_nat 2 2) = false.
Proof. simpl. reflexivity. Qed.
Example prop_blt_nat2: (blt_nat 2 4) = true.
Proof. simpl. reflexivity. Qed.
Example prop_blt_nat3: (blt_nat 4 2) = false.
Proof. simpl. reflexivity. Qed.
(* ---------------------------------------------------------------------
Ejercicio 5. Demostrar que
forall n m o : nat,
n = m -> m = o -> n + m = m + o.
------------------------------------------------------------------ *)
-- alerodrod5
Theorem plus_id_exercise: forall n m o : nat,
n = m -> m = o -> n + m = m + o.
Proof.
intros n m . intros o Ho. rewrite -> Ho . intros H. rewrite -> H. reflexivity. Qed.
(* ---------------------------------------------------------------------
Ejercicio 6. Demostrar que
forall n m : nat,
m = S n ->
m * (1 + n) = m * m.
------------------------------------------------------------------ *)
-- alerodrod5
Theorem mult_S_1 : forall n m : nat,
m = S n ->
m * (1 + n) = m * m.
Proof.
intros n m. intros H. rewrite -> H. reflexivity. Qed.
(* ---------------------------------------------------------------------
Ejercicio 7. Demostrar que
forall b c : bool,
andb b c = true -> c = true.
------------------------------------------------------------------ *)
-- alerodrod5
Theorem andb_true_elim2 : forall b c : bool,
andb b c = true -> c = true.
Proof.
intros b c. destruct b.
- intros H. rewrite <-H. reflexivity.
- intros H. rewrite <-H. destruct false.
+ reflexivity.
+ destruct c. rewrite <-H. reflexivity. reflexivity
+ reflexivity.
Qed.
(* ---------------------------------------------------------------------
Ejercicio 8. Dmostrar que
forall n : nat,
beq_nat 0 (n + 1) = false.
------------------------------------------------------------------ *)
-- alerodrod5
Theorem zero_nbeq_plus_1: forall n : nat,
beq_nat 0 (n + 1) = false.
Proof.
intros n. destruct n.
- reflexivity.
- reflexivity.
Qed.
(* ---------------------------------------------------------------------
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.