<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="es">
	<id>https://www.glc.us.es/~jalonso/RA2018/index.php?action=history&amp;feed=atom&amp;title=Tema_7%3A_Definiciones_inductivas_en_Coq</id>
	<title>Tema 7: Definiciones inductivas en Coq - Historial de revisiones</title>
	<link rel="self" type="application/atom+xml" href="https://www.glc.us.es/~jalonso/RA2018/index.php?action=history&amp;feed=atom&amp;title=Tema_7%3A_Definiciones_inductivas_en_Coq"/>
	<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2018/index.php?title=Tema_7:_Definiciones_inductivas_en_Coq&amp;action=history"/>
	<updated>2026-09-19T16:03:34Z</updated>
	<subtitle>Historial de revisiones para esta página en el wiki</subtitle>
	<generator>MediaWiki 1.31.14</generator>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2018/index.php?title=Tema_7:_Definiciones_inductivas_en_Coq&amp;diff=380&amp;oldid=prev</id>
		<title>Jalonso: Protegió «Tema 7: Definiciones inductivas en Coq» ([Editar=Solo administradores] (indefinido) [Trasladar=Solo administradores] (indefinido))</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2018/index.php?title=Tema_7:_Definiciones_inductivas_en_Coq&amp;diff=380&amp;oldid=prev"/>
		<updated>2019-02-14T13:08:12Z</updated>

		<summary type="html">&lt;p&gt;Protegió «&lt;a href=&quot;/~jalonso/RA2018/index.php/Tema_7:_Definiciones_inductivas_en_Coq&quot; title=&quot;Tema 7: Definiciones inductivas en Coq&quot;&gt;Tema 7: Definiciones inductivas en Coq&lt;/a&gt;» ([Editar=Solo administradores] (indefinido) [Trasladar=Solo administradores] (indefinido))&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;es&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;← Revisión anterior&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;Revisión del 13:08 14 feb 2019&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;es&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(Sin diferencias)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Jalonso</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2018/index.php?title=Tema_7:_Definiciones_inductivas_en_Coq&amp;diff=379&amp;oldid=prev</id>
		<title>Jalonso: Página creada con «&lt;source lang=&quot;coq&quot;&gt; (* T7: Proposiciones definidas inductivamente *)  Set Warnings &quot;-notation-overridden,-parsing&quot;. Require Export T6_Logica. Require Coq.omega.Omega.  (* E…»</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2018/index.php?title=Tema_7:_Definiciones_inductivas_en_Coq&amp;diff=379&amp;oldid=prev"/>
		<updated>2019-02-14T13:08:00Z</updated>

		<summary type="html">&lt;p&gt;Página creada con «&amp;lt;source lang=&amp;quot;coq&amp;quot;&amp;gt; (* T7: Proposiciones definidas inductivamente *)  Set Warnings &amp;quot;-notation-overridden,-parsing&amp;quot;. Require Export T6_Logica. Require Coq.omega.Omega.  (* E…»&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Página nueva&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;lt;source lang=&amp;quot;coq&amp;quot;&amp;gt;&lt;br /&gt;
(* T7: Proposiciones definidas inductivamente *)&lt;br /&gt;
&lt;br /&gt;
Set Warnings &amp;quot;-notation-overridden,-parsing&amp;quot;.&lt;br /&gt;
Require Export T6_Logica.&lt;br /&gt;
Require Coq.omega.Omega.&lt;br /&gt;
&lt;br /&gt;
(* El contenido del tema es&lt;br /&gt;
   1. Proposiciones definidas inductivamente.&lt;br /&gt;
   2. Usando evidencias en demostraciones.&lt;br /&gt;
      1. Inversión sobre evidencias.&lt;br /&gt;
      2. Inducción sobre evidencias.&lt;br /&gt;
   3. Relaciones inductivas.&lt;br /&gt;
*)&lt;br /&gt;
&lt;br /&gt;
(* =====================================================================&lt;br /&gt;
   § 1. Proposiciones definidas inductivamente. &lt;br /&gt;
   ================================================================== *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 1.1. Definir inductivamente la proposición&lt;br /&gt;
      es_par: nat -&amp;gt; Prop&lt;br /&gt;
   tal que (es_par n) expresa que n es un número par.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Inductive es_par: nat -&amp;gt; Prop :=&lt;br /&gt;
| es_par_0  : es_par 0&lt;br /&gt;
| es_par_SS : forall n : nat, es_par n -&amp;gt; es_par (S (S n)).&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 1.2. Demostrar que&lt;br /&gt;
      es_par 4.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
(* 1ª demostración *)&lt;br /&gt;
Theorem es_par_4: es_par 4.&lt;br /&gt;
Proof.&lt;br /&gt;
  apply es_par_SS. (* es_par 2 *)&lt;br /&gt;
  apply es_par_SS. (* es_par 0 *)&lt;br /&gt;
  apply es_par_0.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* 2ª demostración *)&lt;br /&gt;
Theorem es_par_4&amp;#039;: es_par 4.&lt;br /&gt;
Proof.&lt;br /&gt;
  apply (es_par_SS 2 (es_par_SS 0 es_par_0)).&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* Nota *)&lt;br /&gt;
Check es_par_0.                             (* es_par 0 *)&lt;br /&gt;
Check es_par_SS.                            (* forall n : nat, &lt;br /&gt;
                                                es_par n -&amp;gt; es_par (S (S n)) *)&lt;br /&gt;
Check (es_par_SS 0).                        (* es_par 0 -&amp;gt; es_par 2 *)&lt;br /&gt;
Check (es_par_SS 0 es_par_0).               (* es_par 2 *)&lt;br /&gt;
Check (es_par_SS 2).                        (* es_par 2 -&amp;gt; es_par 4 *)&lt;br /&gt;
Check (es_par_SS 2 (es_par_SS 0 es_par_0)). (* es_par 4 *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 1.3. Demostrar que&lt;br /&gt;
      forall n : nat, es_par n -&amp;gt; es_par (4 + n).&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Theorem es_par_suma4:&lt;br /&gt;
  forall n : nat, es_par n -&amp;gt; es_par (4 + n).&lt;br /&gt;
Proof.&lt;br /&gt;
  intros n.        (* n : nat&lt;br /&gt;
                      ============================&lt;br /&gt;
                      es_par n -&amp;gt; es_par (4 + n) *)&lt;br /&gt;
  simpl.           (* es_par n -&amp;gt; es_par (S (S (S (S n)))) *)&lt;br /&gt;
  intros Hn.       (* Hn : es_par n&lt;br /&gt;
                      ============================&lt;br /&gt;
                      es_par (S (S (S (S n)))) *)&lt;br /&gt;
  apply es_par_SS. (* es_par (S (S n)) *)&lt;br /&gt;
  apply es_par_SS. (* es_par n *)&lt;br /&gt;
  apply Hn.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* =====================================================================&lt;br /&gt;
   § 2. Usando evidencias en demostraciones &lt;br /&gt;
   ================================================================== *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Nota. Programación y demostración en Coq son dos lados de la misma&lt;br /&gt;
   moneda. En programación se procesan datos y en demostración se&lt;br /&gt;
   procesan evidencias.  &lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
(* =====================================================================&lt;br /&gt;
   §§ 2.1. Inversión sobre evidencias&lt;br /&gt;
   ================================================================== *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 2.1.1. Demostrar que&lt;br /&gt;
      forall n : nat,&lt;br /&gt;
        es_par n -&amp;gt; es_par (pred (pred n)).&lt;br /&gt;
      ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
(* 1ª demostración *)&lt;br /&gt;
Theorem es_par_menos_2:&lt;br /&gt;
  forall n : nat,&lt;br /&gt;
    es_par n -&amp;gt; es_par (pred (pred n)).&lt;br /&gt;
Proof.&lt;br /&gt;
  intros n E.               (* n : nat&lt;br /&gt;
                               E : es_par n&lt;br /&gt;
                               ============================&lt;br /&gt;
                               es_par (Nat.pred (Nat.pred n)) *)&lt;br /&gt;
  inversion E as [| n&amp;#039; E&amp;#039;]. &lt;br /&gt;
  -                         (* H : 0 = n&lt;br /&gt;
                               ============================&lt;br /&gt;
                               es_par (Nat.pred (Nat.pred 0)) *)&lt;br /&gt;
    simpl.                  (* es_par 0 *)&lt;br /&gt;
    apply es_par_0.&lt;br /&gt;
  -                         (* n&amp;#039; : nat&lt;br /&gt;
                               E&amp;#039; : es_par n&amp;#039;&lt;br /&gt;
                               H : S (S n&amp;#039;) = n&lt;br /&gt;
                               ============================&lt;br /&gt;
                               es_par (Nat.pred (Nat.pred (S (S n&amp;#039;)))) *)&lt;br /&gt;
    simpl.                  (* es_par n&amp;#039; *)&lt;br /&gt;
    apply E&amp;#039;.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Nota. La táctica (inversion E), donde E es la etiqueta de una&lt;br /&gt;
   proposición P definida inductivamente, genera para cada uno de los&lt;br /&gt;
   constructores de P las condiciones bajo las que se puede usar el&lt;br /&gt;
   constructor para demostrar P.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
(* 2ª demostración *)&lt;br /&gt;
Theorem es_par_menos_2&amp;#039;:&lt;br /&gt;
  forall n : nat,&lt;br /&gt;
    es_par n -&amp;gt; es_par (pred (pred n)).&lt;br /&gt;
Proof.&lt;br /&gt;
  intros n E.              (* n : nat&lt;br /&gt;
                              E : es_par n&lt;br /&gt;
                              ============================&lt;br /&gt;
                              es_par (Nat.pred (Nat.pred n)) *)&lt;br /&gt;
  destruct E as [| n&amp;#039; E&amp;#039;]. &lt;br /&gt;
  -                        (* es_par (Nat.pred (Nat.pred 0)) *)&lt;br /&gt;
    simpl.                 (* es_par 0 *)&lt;br /&gt;
    apply es_par_0.&lt;br /&gt;
  -                        (* E&amp;#039; : es_par n&amp;#039;&lt;br /&gt;
                              ============================&lt;br /&gt;
                              es_par (Nat.pred (Nat.pred (S (S n&amp;#039;)))) *)&lt;br /&gt;
    simpl.                 (* es_par n&amp;#039; *)&lt;br /&gt;
    apply E&amp;#039;.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Nota. Uso de destruct sobre evidencia con (destruct E as [| n&amp;#039; E&amp;#039;]).&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 2.1.2. Demostrar que&lt;br /&gt;
      forall n : nat,&lt;br /&gt;
       es_par (S (S n)) -&amp;gt; es_par n.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
(* 1º intento *)&lt;br /&gt;
Theorem es_parSS_es_par:&lt;br /&gt;
  forall n : nat,&lt;br /&gt;
    es_par (S (S n)) -&amp;gt; es_par n.&lt;br /&gt;
Proof.&lt;br /&gt;
  intros n E.              (* n : nat&lt;br /&gt;
                              E : es_par (S (S n))&lt;br /&gt;
                              ============================&lt;br /&gt;
                              es_par n *)&lt;br /&gt;
  destruct E as [| n&amp;#039; E&amp;#039;]. &lt;br /&gt;
  -                        (* n : nat&lt;br /&gt;
                              ============================&lt;br /&gt;
                              es_par n *)&lt;br /&gt;
Abort.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Nota. Mal funcionamiento de destruct sobre evidencias de términos&lt;br /&gt;
   compuestos. &lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
(* 2º intento *)&lt;br /&gt;
Theorem es_parSS_es_par:&lt;br /&gt;
  forall n : nat,&lt;br /&gt;
    es_par (S (S n)) -&amp;gt; es_par n.&lt;br /&gt;
Proof.&lt;br /&gt;
  intros n E.               (* n : nat&lt;br /&gt;
                               E : es_par (S (S n))&lt;br /&gt;
                               ============================&lt;br /&gt;
                               es_par n *)&lt;br /&gt;
  inversion E as [| n&amp;#039; E&amp;#039;]. (* n&amp;#039; : nat&lt;br /&gt;
                               E&amp;#039; : es_par n&lt;br /&gt;
                               H : n&amp;#039; = n&lt;br /&gt;
                               ============================&lt;br /&gt;
                               es_par n *)&lt;br /&gt;
  apply E&amp;#039;.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 2.1.3. Demostrar que&lt;br /&gt;
      ~ es_par 1.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Theorem uno_no_es_par:&lt;br /&gt;
  ~ es_par 1.&lt;br /&gt;
Proof.&lt;br /&gt;
  intros H.    (* H : es_par 1&lt;br /&gt;
                  ============================&lt;br /&gt;
                  False *)&lt;br /&gt;
  inversion H. &lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Nota. Uso de inversión sobre evidencia para contradicción.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
(* =====================================================================&lt;br /&gt;
   §§ 2.2. Inducción sobre evidencias  &lt;br /&gt;
   ================================================================== *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 2.2.1. Demostrar que&lt;br /&gt;
      forall n : nat,&lt;br /&gt;
        es_par n -&amp;gt; exists k, n = doble k.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
(* 1º intento*)&lt;br /&gt;
Lemma es_par_par_1:&lt;br /&gt;
  forall n : nat,&lt;br /&gt;
    es_par n -&amp;gt; exists k, n = doble k.&lt;br /&gt;
Proof.&lt;br /&gt;
  intros n E.               (* n : nat&lt;br /&gt;
                               E : es_par n&lt;br /&gt;
                               ============================&lt;br /&gt;
                               exists k : nat, n = doble k *)&lt;br /&gt;
  inversion E as [| n&amp;#039; E&amp;#039;]. &lt;br /&gt;
  -                         (* H : 0 = n&lt;br /&gt;
                               ============================&lt;br /&gt;
                               exists k : nat, 0 = doble k *)&lt;br /&gt;
    exists 0.                    (* 0 = doble 0 *)&lt;br /&gt;
    reflexivity.&lt;br /&gt;
  -                         (* n&amp;#039; : nat&lt;br /&gt;
                               E&amp;#039; : es_par n&amp;#039;&lt;br /&gt;
                               H : S (S n&amp;#039;) = n&lt;br /&gt;
                               ============================&lt;br /&gt;
                               exists k : nat, S (S n&amp;#039;) = doble k *)&lt;br /&gt;
    simpl.                  (* exists k : nat, S (S n&amp;#039;) = doble k *)&lt;br /&gt;
    assert (I : (exists k&amp;#039;, n&amp;#039; = doble k&amp;#039;) -&amp;gt;&lt;br /&gt;
                (exists k, S (S n&amp;#039;) = doble k)).&lt;br /&gt;
    +                       (* (exists k&amp;#039; : nat, n&amp;#039; = doble k&amp;#039;) -&amp;gt; &lt;br /&gt;
                               exists k : nat, S (S n&amp;#039;) = doble k *)&lt;br /&gt;
      intros [k&amp;#039; Hk&amp;#039;].      (* k&amp;#039; : nat&lt;br /&gt;
                               Hk&amp;#039; : n&amp;#039; = doble k&amp;#039;&lt;br /&gt;
                               ============================&lt;br /&gt;
                               exists k : nat, S (S n&amp;#039;) = doble k *)&lt;br /&gt;
      rewrite Hk&amp;#039;.          (* exists k : nat, S (S (doble k&amp;#039;)) = doble k *)&lt;br /&gt;
      exists (S k&amp;#039;).             (* S (S (doble k&amp;#039;)) = doble (S k&amp;#039;) *)&lt;br /&gt;
      reflexivity.&lt;br /&gt;
    +                       (* I : (exists k&amp;#039; : nat, n&amp;#039; = doble k&amp;#039;) -&amp;gt; &lt;br /&gt;
                                   exists k : nat, S (S n&amp;#039;) = doble k&lt;br /&gt;
                               ============================&lt;br /&gt;
                               exists k : nat, S (S n&amp;#039;) = doble k *)&lt;br /&gt;
      apply I.              (* exists k&amp;#039; : nat, n&amp;#039; = doble k&amp;#039; *)&lt;br /&gt;
Abort.&lt;br /&gt;
&lt;br /&gt;
(* 2º intento *)&lt;br /&gt;
Lemma es_par_par:&lt;br /&gt;
  forall n : nat,&lt;br /&gt;
    es_par n -&amp;gt; exists k, n = doble k.&lt;br /&gt;
Proof.&lt;br /&gt;
  intros n E.                 (* n : nat&lt;br /&gt;
                                 E : es_par n&lt;br /&gt;
                                 ============================&lt;br /&gt;
                                 exists k : nat, n = doble k *)&lt;br /&gt;
  induction E as [|n&amp;#039; E&amp;#039; HI]. &lt;br /&gt;
  -                           (* exists k : nat, 0 = doble k *)&lt;br /&gt;
    exists 0.                      (* 0 = doble 0 *)&lt;br /&gt;
    reflexivity.&lt;br /&gt;
  -                           (* n&amp;#039; : nat&lt;br /&gt;
                                 E&amp;#039; : es_par n&amp;#039;&lt;br /&gt;
                                 HI : exists k : nat, n&amp;#039; = doble k&lt;br /&gt;
                                 ============================&lt;br /&gt;
                                 exists k : nat, S (S n&amp;#039;) = doble k *)&lt;br /&gt;
    destruct HI as [k&amp;#039; Hk&amp;#039;].  (* k&amp;#039; : nat&lt;br /&gt;
                                 Hk&amp;#039; : n&amp;#039; = doble k&amp;#039;&lt;br /&gt;
                                 ============================&lt;br /&gt;
                                 exists k : nat, S (S n&amp;#039;) = doble k *)&lt;br /&gt;
    rewrite Hk&amp;#039;.              (* exists k : nat, S (S (doble k&amp;#039;)) = doble k *)&lt;br /&gt;
    exists (S k&amp;#039;).                 (* S (S (doble k&amp;#039;)) = doble (S k&amp;#039;) *)&lt;br /&gt;
    reflexivity.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 2.2.2. Demostrar que&lt;br /&gt;
      forall n : nat,&lt;br /&gt;
        es_par n &amp;lt;-&amp;gt; exists k, n = doble k.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Lemma es_par_doble:&lt;br /&gt;
  forall n : nat, es_par (doble n).&lt;br /&gt;
Proof.&lt;br /&gt;
  induction n as [|n&amp;#039; HI]. &lt;br /&gt;
  -                        (* es_par (doble 0) *)&lt;br /&gt;
    simpl.                 (* es_par 0 *)&lt;br /&gt;
    apply es_par_0.&lt;br /&gt;
  -                        (* n&amp;#039; : nat&lt;br /&gt;
                              HI : es_par (doble n&amp;#039;)&lt;br /&gt;
                              ============================&lt;br /&gt;
                              es_par (doble (S n&amp;#039;)) *)&lt;br /&gt;
    simpl.                 (* es_par (S (S (doble n&amp;#039;))) *)&lt;br /&gt;
    apply es_par_SS.       (* es_par (doble n&amp;#039;) *)&lt;br /&gt;
    apply HI.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
Theorem es_par_par_syss:&lt;br /&gt;
  forall n : nat,&lt;br /&gt;
    es_par n &amp;lt;-&amp;gt; exists k, n = doble k.&lt;br /&gt;
Proof.&lt;br /&gt;
  intros n.             (* n : nat&lt;br /&gt;
                           ============================&lt;br /&gt;
                           es_par n &amp;lt;-&amp;gt; (exists k : nat, n = doble k) *)&lt;br /&gt;
  split.&lt;br /&gt;
  -                     (* es_par n -&amp;gt; exists k : nat, n = doble k *)&lt;br /&gt;
    apply es_par_par.&lt;br /&gt;
  -                     (* (exists k : nat, n = doble k) -&amp;gt; es_par n *)&lt;br /&gt;
    intros [k Hk].      (* n, k : nat&lt;br /&gt;
                           Hk : n = doble k&lt;br /&gt;
                           ============================&lt;br /&gt;
                           es_par n *)&lt;br /&gt;
    rewrite Hk.         (* es_par (doble k) *)&lt;br /&gt;
    apply es_par_doble. &lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* =====================================================================&lt;br /&gt;
   § 3. Relaciones inductivas&lt;br /&gt;
   ================================================================== *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Notas.&lt;br /&gt;
   1. Las proposiciones con un argumento definen conjuntos; por ejemplo,&lt;br /&gt;
      es_par define el conjunto de los números pares.&lt;br /&gt;
   2. Las proposiciones con dos argumento definen relaciones.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Nota. Creamos el módulo para redefinir la relación menor o igual&lt;br /&gt;
   (definida por le) como menOig. &lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Module RelInd. &lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 3.1. Definir inductivamente la relación&lt;br /&gt;
      menOig: nat -&amp;gt; nat -&amp;gt; Prop&lt;br /&gt;
   tal que (menOig n m) expresa que n es menor o igual que m.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
  &lt;br /&gt;
Inductive menOig: nat -&amp;gt; nat -&amp;gt; Prop :=&lt;br /&gt;
  | menOig_n : forall n, menOig n n&lt;br /&gt;
  | menOig_S : forall n m, (menOig n m) -&amp;gt; (menOig n (S m)).&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 3.2. Definir (m &amp;lt;= n) como abreviatura de (menOig m n).&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Notation &amp;quot;m &amp;lt;= n&amp;quot; := (menOig m n).&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Nota. Sobre la relaciones (p.e. &amp;lt;=) se pueden usar las mismas&lt;br /&gt;
   tácticas que sobre las propiedades (p.e. es_par).&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 3.3. Demostrar que&lt;br /&gt;
      3 &amp;lt;= 3.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Theorem prop_menOig1:&lt;br /&gt;
  3 &amp;lt;= 3.&lt;br /&gt;
Proof.&lt;br /&gt;
  apply menOig_n.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 3.4. Demostrar que&lt;br /&gt;
      3 &amp;lt;= 6.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Theorem prop_menOig2 :&lt;br /&gt;
  3 &amp;lt;= 6.&lt;br /&gt;
Proof.&lt;br /&gt;
  apply menOig_S. (* 3 &amp;lt;= 5 *)&lt;br /&gt;
  apply menOig_S. (* 3 &amp;lt;= 4 *)&lt;br /&gt;
  apply menOig_S. (* 3 &amp;lt;= 3 *)&lt;br /&gt;
  apply menOig_n.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 3.5. Demostrar que&lt;br /&gt;
      (2 &amp;lt;= 1) -&amp;gt; 2 + 2 = 5.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Theorem prop_menOig3 :&lt;br /&gt;
  (2 &amp;lt;= 1) -&amp;gt; 2 + 2 = 5.&lt;br /&gt;
Proof.&lt;br /&gt;
  intros H.       (* H : 2 &amp;lt;= 1&lt;br /&gt;
                     ============================&lt;br /&gt;
                     2 + 2 = 5 *)&lt;br /&gt;
  inversion H.    (* n, m : nat&lt;br /&gt;
                     H2 : 2 &amp;lt;= 0&lt;br /&gt;
                     H1 : n = 2&lt;br /&gt;
                     H0 : m = 0&lt;br /&gt;
                     ============================&lt;br /&gt;
                     2 + 2 = 5 *)&lt;br /&gt;
  inversion H2. &lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
End RelInd.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Nota. En lo que sigue, usaremos la predefiida le en lugar de menOig.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 3.6. Definir la relación&lt;br /&gt;
      mayor : nat -&amp;gt; nat -&amp;gt; Prop&lt;br /&gt;
   tal que (menor m n) expresa que m es menor que n.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Definition menor (n m : nat) := le (S n) m.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 3.7. Definir la abreviatura (m &amp;lt; n) para (menor m n).&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Notation &amp;quot;m &amp;lt; n&amp;quot; := (menor m n).&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 3.8. Definir inductivamente la relación&lt;br /&gt;
      cuadrado_de: nat -&amp;gt; nat -&amp;gt; Prop :=&lt;br /&gt;
   tal que (cuadrado x y) expresa que y es el cuadrado de x.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Inductive cuadrado_de: nat -&amp;gt; nat -&amp;gt; Prop :=&lt;br /&gt;
  | cuad : forall n : nat, cuadrado_de n (n * n).&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 3.9. Definir inductivamente la relación&lt;br /&gt;
      siguiente_nat : nat -&amp;gt; nat -&amp;gt; Prop&lt;br /&gt;
   tal que (siguiente_nat x y) expresa que y es el siguiente de x.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Inductive siguiente_nat : nat -&amp;gt; nat -&amp;gt; Prop :=&lt;br /&gt;
  | sn : forall n : nat, siguiente_nat n (S n).&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 3.9. Definir inductivamente la relación&lt;br /&gt;
      siguiente_par : nat -&amp;gt; nat -&amp;gt; Prop :=&lt;br /&gt;
   tal que (siguiente_par x y) expresa que y es el siguiente  número par&lt;br /&gt;
   de x. &lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Inductive siguiente_par : nat -&amp;gt; nat -&amp;gt; Prop :=&lt;br /&gt;
  | sp_1 : forall n, es_par (S n) -&amp;gt; siguiente_par n (S n)&lt;br /&gt;
  | sp_2 : forall n, es_par (S (S n)) -&amp;gt; siguiente_par n (S (S n)).&lt;br /&gt;
&lt;br /&gt;
(* =====================================================================&lt;br /&gt;
   § Bibliografía&lt;br /&gt;
   =====================================================================&lt;br /&gt;
&lt;br /&gt;
+ &amp;quot;Inductively defined propositions&amp;quot; de Peirce et als. &lt;br /&gt;
  http://bit.ly/2Lejw7s *)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jalonso</name></author>
		
	</entry>
</feed>