<?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_3%3A_Datos_estructurados_en_Coq</id>
	<title>Tema 3: Datos estructurados 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_3%3A_Datos_estructurados_en_Coq"/>
	<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2018/index.php?title=Tema_3:_Datos_estructurados_en_Coq&amp;action=history"/>
	<updated>2026-09-18T01:07:13Z</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_3:_Datos_estructurados_en_Coq&amp;diff=370&amp;oldid=prev</id>
		<title>Jalonso: Protegió «Tema 3: Datos estructurados 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_3:_Datos_estructurados_en_Coq&amp;diff=370&amp;oldid=prev"/>
		<updated>2019-02-14T07:36:22Z</updated>

		<summary type="html">&lt;p&gt;Protegió «&lt;a href=&quot;/~jalonso/RA2018/index.php/Tema_3:_Datos_estructurados_en_Coq&quot; title=&quot;Tema 3: Datos estructurados en Coq&quot;&gt;Tema 3: Datos estructurados 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 07:36 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_3:_Datos_estructurados_en_Coq&amp;diff=364&amp;oldid=prev</id>
		<title>Jalonso: Página creada con «&lt;source lang=&quot;coq&quot;&gt; Require Export T2_Induccion.  (* En este capítulos se estudian datos estructurados con números     naturales. Su contenido es    1. Pares de números…»</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2018/index.php?title=Tema_3:_Datos_estructurados_en_Coq&amp;diff=364&amp;oldid=prev"/>
		<updated>2019-02-14T07:31:43Z</updated>

		<summary type="html">&lt;p&gt;Página creada con «&amp;lt;source lang=&amp;quot;coq&amp;quot;&amp;gt; Require Export T2_Induccion.  (* En este capítulos se estudian datos estructurados con números     naturales. Su contenido es    1. Pares de números…»&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;
Require Export T2_Induccion.&lt;br /&gt;
&lt;br /&gt;
(* En este capítulos se estudian datos estructurados con números &lt;br /&gt;
   naturales. Su contenido es&lt;br /&gt;
   1. Pares de números &lt;br /&gt;
   2. Listas de números &lt;br /&gt;
      1. El tipo de la lista de números. &lt;br /&gt;
      2. La función repite (repeat)  &lt;br /&gt;
      3. La función longitud (length)  &lt;br /&gt;
      4. La función conc (app)  &lt;br /&gt;
      5. Las funciones primero (hd) y resto (tl)&lt;br /&gt;
      6. Ejercicios sobre listas de números &lt;br /&gt;
      7. Multiconjuntos como listas &lt;br /&gt;
   3. Razonamiento sobre listas&lt;br /&gt;
      1. Demostraciones por simplificación &lt;br /&gt;
      2. Demostraciones por casos &lt;br /&gt;
      3. Demostraciones por inducción&lt;br /&gt;
      4. Ejercicios &lt;br /&gt;
   4. Opcionales&lt;br /&gt;
   5. Diccionarios (o funciones parciales)&lt;br /&gt;
   6. Bibliografía&lt;br /&gt;
*)&lt;br /&gt;
&lt;br /&gt;
(* =====================================================================&lt;br /&gt;
   § 1. Pares de números &lt;br /&gt;
   ================================================================== *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Nota. Se inicia el módulo ListaNat.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Module ListaNat. &lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 1.1. Definir el tipo ProdNat para los pares de números&lt;br /&gt;
   naturales con el constructor&lt;br /&gt;
      par : nat -&amp;gt; nat -&amp;gt; ProdNat.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Inductive ProdNat : Type :=&lt;br /&gt;
  par : nat -&amp;gt; nat -&amp;gt; ProdNat.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 1.2. Calcular el tipo de la expresión (par 3 5)&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Check (par 3 5).&lt;br /&gt;
(* ===&amp;gt; par 3 5 : ProdNat *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 1.3. Definir la función&lt;br /&gt;
      fst : ProdNat -&amp;gt; nat&lt;br /&gt;
   tal que (fst p) es la primera componente de p.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Definition fst (p : ProdNat) : nat := &lt;br /&gt;
  match p with&lt;br /&gt;
  | par x y =&amp;gt; x&lt;br /&gt;
  end.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 1.4. Evaluar la expresión &lt;br /&gt;
      fst (par 3 5)&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Compute (fst (par 3 5)).&lt;br /&gt;
(* ===&amp;gt; 3 : nat *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 1.5. Definir la función&lt;br /&gt;
      snd : ProdNat -&amp;gt; nat&lt;br /&gt;
   tal que (snd p) es la segunda componente de p.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Definition snd (p : ProdNat) : nat := &lt;br /&gt;
  match p with&lt;br /&gt;
  | par x y =&amp;gt; y&lt;br /&gt;
  end.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 1.6. Definir la notación (x,y) como una abreviaura de &lt;br /&gt;
   (par x y).&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Notation &amp;quot;( x , y )&amp;quot; := (par x y).&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 1.7. Evaluar la expresión &lt;br /&gt;
      fst (3,5)&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Compute (fst (3,5)).&lt;br /&gt;
(* ===&amp;gt; 3 : nat *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 1.8. Redefinir la función fst usando la abreviatura de pares.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Definition fst&amp;#039; (p : ProdNat) : nat := &lt;br /&gt;
  match p with&lt;br /&gt;
  | (x,y) =&amp;gt; x&lt;br /&gt;
  end.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 1.9. Redefinir la función snd usando la abreviatura de pares.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Definition snd&amp;#039; (p : ProdNat) : nat := &lt;br /&gt;
  match p with&lt;br /&gt;
  | (x,y) =&amp;gt; y&lt;br /&gt;
  end.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 1.10. Definir la función&lt;br /&gt;
      intercambia : ProdNat -&amp;gt; ProdNat&lt;br /&gt;
   tal que (intercambia p) es el par obtenido intercambiando las&lt;br /&gt;
   componentes de p.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Definition intercambia (p : ProdNat) : ProdNat := &lt;br /&gt;
  match p with&lt;br /&gt;
  | (x,y) =&amp;gt; (y,x)&lt;br /&gt;
  end.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 1.11. Demostrar que para todos los naturales&lt;br /&gt;
      (n,m) = (fst (n,m), snd (n,m)).&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Theorem par_componentes1 : forall n m : nat,&lt;br /&gt;
  (n,m) = (fst (n,m), snd (n,m)).&lt;br /&gt;
Proof.&lt;br /&gt;
  reflexivity.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 1.12. Demostrar que para todo par de naturales&lt;br /&gt;
      p = (fst p, snd p).&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
(* 1º intento *)&lt;br /&gt;
Theorem par_componentes2 : forall p : ProdNat,&lt;br /&gt;
  p = (fst p, snd p).&lt;br /&gt;
Proof.&lt;br /&gt;
  simpl. (* &lt;br /&gt;
            ============================&lt;br /&gt;
            forall p : ProdNat, p = (fst p, snd p) *)&lt;br /&gt;
Abort.&lt;br /&gt;
&lt;br /&gt;
(* 2º intento *)&lt;br /&gt;
Theorem par_componentes : forall p : ProdNat,&lt;br /&gt;
  p = (fst p, snd p).&lt;br /&gt;
Proof.&lt;br /&gt;
  intros p.            (* p : ProdNat&lt;br /&gt;
                          ============================&lt;br /&gt;
                          p = (fst p, snd p) *)&lt;br /&gt;
  destruct p as [n m]. (* n, m : nat&lt;br /&gt;
                          ============================&lt;br /&gt;
                          (n, m) = (fst (n, m), snd (n, m)) *)&lt;br /&gt;
  simpl.               (* (n, m) = (n, m) *)&lt;br /&gt;
  reflexivity.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* =====================================================================&lt;br /&gt;
   § 2. Listas de números &lt;br /&gt;
   ================================================================== *)&lt;br /&gt;
&lt;br /&gt;
(* =====================================================================&lt;br /&gt;
   §§ 2.1. El tipo de la lista de números. &lt;br /&gt;
   ================================================================== *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 2.1.1. Definir el tipo ListaNat de la lista de los números&lt;br /&gt;
   naturales y cuyo constructores son &lt;br /&gt;
   + nil (la lista vacía) y &lt;br /&gt;
   + cons (tal que (cons x ys) es la lista obtenida añadiéndole x a ys). &lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Inductive ListaNat : Type :=&lt;br /&gt;
  | nil  : ListaNat&lt;br /&gt;
  | cons : nat -&amp;gt; ListaNat -&amp;gt; ListaNat.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 2.1.2. Definir la constante &lt;br /&gt;
      ejLista : ListaNat&lt;br /&gt;
   que es la lista cuyos elementos son 1, 2 y 3.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Definition ejLista := cons 1 (cons 2 (cons 3 nil)).&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 2.1.3. Definir la notación (x :: ys) como una abreviatura de &lt;br /&gt;
   (cons x ys).&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Notation &amp;quot;x :: l&amp;quot; := (cons x l)&lt;br /&gt;
                     (at level 60, right associativity).&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 2.1.4. Definir la notación de las listas finitas escribiendo&lt;br /&gt;
   sus elementos entre corchetes y separados por puntos y comas.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Notation &amp;quot;[ ]&amp;quot; := nil.&lt;br /&gt;
Notation &amp;quot;[ x ; .. ; y ]&amp;quot; := (cons x .. (cons y nil) ..).&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 2.1.5. Definir la lista cuyos elementos son 1, 2 y 3 mediante&lt;br /&gt;
   sistintas representaciones.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Definition ejLista1 := 1 :: (2 :: (3 :: nil)).&lt;br /&gt;
Definition ejLista2 := 1 :: 2 :: 3 :: nil.&lt;br /&gt;
Definition ejLista3 := [1;2;3].&lt;br /&gt;
&lt;br /&gt;
(* =====================================================================&lt;br /&gt;
   §§ 2.2. La función repite (repeat)  &lt;br /&gt;
   ================================================================== *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 2.2.1. Definir la función&lt;br /&gt;
      repite : nat -&amp;gt; nat -&amp;gt; ListaNat&lt;br /&gt;
   tal que (repite n k) es la lista formada por k veces el número n. Por&lt;br /&gt;
   ejemplo, &lt;br /&gt;
      repite 5 3 = [5; 5; 5]&lt;br /&gt;
&lt;br /&gt;
   Nota: La función repite es quivalente a la predefinida repeat.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Fixpoint repite (n k : nat) : ListaNat :=&lt;br /&gt;
  match k with&lt;br /&gt;
  | O    =&amp;gt; nil&lt;br /&gt;
  | S k&amp;#039; =&amp;gt; n :: repite n k&amp;#039;&lt;br /&gt;
  end.&lt;br /&gt;
&lt;br /&gt;
Compute (repite 5 3).&lt;br /&gt;
(* ===&amp;gt; [5; 5; 5] : ListaNat*)&lt;br /&gt;
&lt;br /&gt;
(* =====================================================================&lt;br /&gt;
   §§ 2.3. La función longitud (length)  &lt;br /&gt;
   ================================================================== *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 2.3.1. Definir la función&lt;br /&gt;
      longitud : ListaNat -&amp;gt; nat&lt;br /&gt;
   tal que (longitud xs) es el número de elementos de xs. Por ejemplo, &lt;br /&gt;
      longitud [4;2;6] = 3&lt;br /&gt;
&lt;br /&gt;
   Nota: La función longitud es equivalente a la predefinida length&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Fixpoint longitud (xs : ListaNat) : nat :=&lt;br /&gt;
  match xs with&lt;br /&gt;
  | nil    =&amp;gt; O&lt;br /&gt;
  | _ :: xs =&amp;gt; S (longitud xs)&lt;br /&gt;
  end.&lt;br /&gt;
&lt;br /&gt;
Compute (longitud [4;2;6]).&lt;br /&gt;
(* ===&amp;gt; 3 : nat *)&lt;br /&gt;
&lt;br /&gt;
(* =====================================================================&lt;br /&gt;
   §§ 2.4. La función conc (app)  &lt;br /&gt;
   ================================================================== *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 2.4.1. Definir la función&lt;br /&gt;
      conc : ListaNat -&amp;gt; ListaNat -&amp;gt; ListaNat&lt;br /&gt;
   tal que (conc xs ys) es la concatenación de xs e ys. Por ejemplo, &lt;br /&gt;
      conc [1;3] [4;2;3;5] =  [1; 3; 4; 2; 3; 5]&lt;br /&gt;
&lt;br /&gt;
   Nota: La función conc es equivalente a la predefinida app.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Fixpoint conc (xs ys : ListaNat) : ListaNat :=&lt;br /&gt;
  match xs with&lt;br /&gt;
  | nil     =&amp;gt; ys&lt;br /&gt;
  | x :: zs =&amp;gt; x :: conc zs ys&lt;br /&gt;
  end.&lt;br /&gt;
&lt;br /&gt;
Compute (conc [1;3] [4;2;3;5]).&lt;br /&gt;
(* ===&amp;gt; [1; 3; 4; 2; 3; 5] : ListaNat *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 2.4.2. Definir la notación (xs ++ ys) como una abreviaura de &lt;br /&gt;
   (conc xs ys).&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Notation &amp;quot;x ++ y&amp;quot; := (conc x y)&lt;br /&gt;
                     (right associativity, at level 60).&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 2.4.3. Demostrar que&lt;br /&gt;
      [1;2;3] ++ [4;5] = [1;2;3;4;5].&lt;br /&gt;
      nil     ++ [4;5] = [4;5].&lt;br /&gt;
      [1;2;3] ++ nil   = [1;2;3].&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Example test_conc1: [1;2;3] ++ [4;5] = [1;2;3;4;5].&lt;br /&gt;
Proof. reflexivity.  Qed.&lt;br /&gt;
&lt;br /&gt;
Example test_conc2: nil ++ [4;5] = [4;5].&lt;br /&gt;
Proof. reflexivity.  Qed.&lt;br /&gt;
&lt;br /&gt;
Example test_conc3: [1;2;3] ++ nil = [1;2;3].&lt;br /&gt;
Proof. reflexivity.  Qed.&lt;br /&gt;
&lt;br /&gt;
(* =====================================================================&lt;br /&gt;
   §§ 2.5. Las funciones primero (hd) y resto (tl)&lt;br /&gt;
   ================================================================== *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 2.5.1. Definir la función&lt;br /&gt;
      primero : nat -&amp;gt; ListaNat -&amp;gt; ListaNat&lt;br /&gt;
   tal que (primero d xs) es el primer elemento de xs o d, si xs es la lista&lt;br /&gt;
   vacía. Por ejemplo,&lt;br /&gt;
      primero 7 [3;2;5] = 3 &lt;br /&gt;
      primero 7 []      = 7 &lt;br /&gt;
&lt;br /&gt;
   Nota. La función primero es equivalente a la predefinida hd&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Definition primero (d : nat) (xs : ListaNat) : nat :=&lt;br /&gt;
  match xs with&lt;br /&gt;
  | nil     =&amp;gt; d&lt;br /&gt;
  | y :: ys =&amp;gt; y&lt;br /&gt;
  end.&lt;br /&gt;
&lt;br /&gt;
Compute (primero 7 [3;2;5]).&lt;br /&gt;
(* ===&amp;gt; 3 : nat *)&lt;br /&gt;
Compute (primero 7 []).&lt;br /&gt;
(* ===&amp;gt; 7 : nat *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 2.5.2. Demostrar que &lt;br /&gt;
       primero 0 [1;2;3] = 1.&lt;br /&gt;
       resto [1;2;3]     = [2;3].&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Example prop_primero1: primero 0 [1;2;3] = 1.&lt;br /&gt;
Proof. reflexivity.  Qed.&lt;br /&gt;
&lt;br /&gt;
Example prop_primero2: primero 0 [] = 0.&lt;br /&gt;
Proof. reflexivity.  Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 2.5.3. Definir la función&lt;br /&gt;
      resto : ListaNat -&amp;gt; ListaNat&lt;br /&gt;
   tal que (resto xs) es el resto de xs. Por ejemplo.&lt;br /&gt;
      resto [3;2;5] = [2; 5]&lt;br /&gt;
      resto []      = [ ]&lt;br /&gt;
&lt;br /&gt;
   Nota. La función resto es equivalente la predefinida tl.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Definition resto (xs:ListaNat) : ListaNat :=&lt;br /&gt;
  match xs with&lt;br /&gt;
  | nil     =&amp;gt; nil&lt;br /&gt;
  | y :: ys =&amp;gt; ys&lt;br /&gt;
  end.&lt;br /&gt;
&lt;br /&gt;
Compute (resto [3;2;5]).&lt;br /&gt;
(* ===&amp;gt; [2; 5] : ListaNat *)&lt;br /&gt;
Compute (resto []).&lt;br /&gt;
(* ===&amp;gt; [ ] : ListaNat *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 2.5.4. Demostrar que &lt;br /&gt;
       resto [1;2;3] = [2;3].&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Example prop_resto: resto [1;2;3] = [2;3].&lt;br /&gt;
Proof. reflexivity.  Qed.&lt;br /&gt;
&lt;br /&gt;
(* =====================================================================&lt;br /&gt;
   § 3. Razonamiento sobre listas&lt;br /&gt;
   ================================================================== *)&lt;br /&gt;
&lt;br /&gt;
(* =====================================================================&lt;br /&gt;
   §§ 3.1. Demostraciones por simplificación &lt;br /&gt;
   ================================================================== *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 3.1.1. Demostrar que, para toda lista de naturales xs,&lt;br /&gt;
      [] ++ xs = xs&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Theorem nil_conc : forall xs:ListaNat,&lt;br /&gt;
  [] ++ xs = xs.&lt;br /&gt;
Proof.&lt;br /&gt;
  reflexivity.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* =====================================================================&lt;br /&gt;
   §§ 3.2. Demostraciones por casos &lt;br /&gt;
   ================================================================== *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 3.2.1. Demostrar que, para toda lista de naturales xs,&lt;br /&gt;
      pred (longitud xs) = longitud (resto xs)&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Theorem resto_longitud_pred : forall xs : ListaNat,&lt;br /&gt;
  pred (longitud xs) = longitud (resto xs).&lt;br /&gt;
Proof.&lt;br /&gt;
  intros xs.                (* xs : ListaNat&lt;br /&gt;
                               ============================&lt;br /&gt;
                               Nat.pred (longitud xs) = longitud (resto xs) *)&lt;br /&gt;
  destruct xs as [|x xs&amp;#039;]. &lt;br /&gt;
  -                         (* &lt;br /&gt;
                               ============================&lt;br /&gt;
                               Nat.pred (longitud []) = longitud (resto []) *)&lt;br /&gt;
    reflexivity.&lt;br /&gt;
  -                         (* x : nat&lt;br /&gt;
                               xs&amp;#039; : ListaNat&lt;br /&gt;
                               ============================&lt;br /&gt;
                               Nat.pred (longitud (x :: xs&amp;#039;)) = &lt;br /&gt;
                                longitud (resto (x :: xs&amp;#039;)) *)&lt;br /&gt;
    reflexivity.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* =====================================================================&lt;br /&gt;
   §§ 3.3. Demostraciones por inducción&lt;br /&gt;
   ================================================================== *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 3.3.1. Demostrar que la concatenación de listas de naturales&lt;br /&gt;
   es asociativa; es decir,&lt;br /&gt;
      (xs ++ ys) ++ zs = xs ++ (ys ++ zs).&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Theorem conc_asociativa: forall xs ys zs : ListaNat,&lt;br /&gt;
  (xs ++ ys) ++ zs = xs ++ (ys ++ zs).&lt;br /&gt;
Proof.&lt;br /&gt;
  intros xs ys zs.             (* xs, ys, zs : ListaNat&lt;br /&gt;
                                  ============================&lt;br /&gt;
                                  (xs ++ ys) ++ zs = xs ++ (ys ++ zs) *)&lt;br /&gt;
  induction xs as [|x xs&amp;#039; HI]. &lt;br /&gt;
  -                            (* ys, zs : ListaNat&lt;br /&gt;
                                  ============================&lt;br /&gt;
                                  ([ ] ++ ys) ++ zs = [ ] ++ (ys ++ zs) *)&lt;br /&gt;
    reflexivity.&lt;br /&gt;
  -                            (* x : nat&lt;br /&gt;
                                  xs&amp;#039;, ys, zs : ListaNat&lt;br /&gt;
                                  HI : (xs&amp;#039; ++ ys) ++ zs = xs&amp;#039; ++ (ys ++ zs)&lt;br /&gt;
                                  ============================&lt;br /&gt;
                                  ((x :: xs&amp;#039;) ++ ys) ++ zs = &lt;br /&gt;
                                   (x :: xs&amp;#039;) ++ (ys ++ zs) *)&lt;br /&gt;
    simpl.                     (* (x :: (xs&amp;#039; ++ ys)) ++ zs = &lt;br /&gt;
                                  x :: (xs&amp;#039; ++ (ys ++ zs)) *)&lt;br /&gt;
    rewrite -&amp;gt; HI.             (* x :: (xs&amp;#039; ++ (ys ++ zs)) = &lt;br /&gt;
                                  x :: (xs&amp;#039; ++ (ys ++ zs)) *)&lt;br /&gt;
    reflexivity.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 3.3.2. Definir la función&lt;br /&gt;
      inversa : ListaNat -&amp;gt; ListaNat&lt;br /&gt;
   tal que (inversa xs) es la inversa de xs. Por ejemplo,&lt;br /&gt;
      inversa [1;2;3] = [3;2;1].&lt;br /&gt;
      inversa nil     = nil.&lt;br /&gt;
&lt;br /&gt;
   Nota. La función inversa es equivalente a la predefinida rev.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Fixpoint inversa (xs:ListaNat) : ListaNat :=&lt;br /&gt;
  match xs with&lt;br /&gt;
  | nil    =&amp;gt; nil&lt;br /&gt;
  | x::xs&amp;#039; =&amp;gt; inversa xs&amp;#039; ++ [x]&lt;br /&gt;
  end.&lt;br /&gt;
&lt;br /&gt;
Example prop_inversa1:&lt;br /&gt;
  inversa [1;2;3] = [3;2;1].&lt;br /&gt;
Proof. reflexivity.  Qed.&lt;br /&gt;
&lt;br /&gt;
Example prop_inversa2:&lt;br /&gt;
  inversa nil = nil.&lt;br /&gt;
Proof. reflexivity.  Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 3.3.3. Demostrar que&lt;br /&gt;
      longitud (inversa xs) = longitud xs&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
(* 1º intento *)&lt;br /&gt;
Theorem longitud_inversa1: forall xs : ListaNat,&lt;br /&gt;
  longitud (inversa xs) = longitud xs.&lt;br /&gt;
Proof.&lt;br /&gt;
  intros xs.&lt;br /&gt;
  induction xs as [|x xs&amp;#039; HI]. &lt;br /&gt;
  -                            (* &lt;br /&gt;
                                  ============================&lt;br /&gt;
                                  longitud (inversa [ ]) = longitud [ ] *)&lt;br /&gt;
    reflexivity.&lt;br /&gt;
  -                            (* x : nat&lt;br /&gt;
                                  xs&amp;#039; : ListaNat&lt;br /&gt;
                                  HI : longitud (inversa xs&amp;#039;) = longitud xs&amp;#039;&lt;br /&gt;
                                  ============================&lt;br /&gt;
                                  longitud (inversa (x :: xs&amp;#039;)) = &lt;br /&gt;
                                   longitud (x :: xs&amp;#039;) *)&lt;br /&gt;
    simpl.                     (* longitud (inversa xs&amp;#039; ++ [x]) = &lt;br /&gt;
                                   S (longitud xs&amp;#039;)*)&lt;br /&gt;
    rewrite &amp;lt;- HI.             (* longitud (inversa xs&amp;#039; ++ [x]) = &lt;br /&gt;
                                   S (longitud (inversa xs&amp;#039;)) *)&lt;br /&gt;
Abort.&lt;br /&gt;
&lt;br /&gt;
(* Nota: Para simplificar la última expresión se necesita los siguientes &lt;br /&gt;
  lemas. *) &lt;br /&gt;
&lt;br /&gt;
Lemma longitud_conc : forall xs ys : ListaNat,&lt;br /&gt;
  longitud (xs ++ ys) = longitud xs + longitud ys.&lt;br /&gt;
Proof.&lt;br /&gt;
  intros xs ys.                 (* xs, ys : ListaNat&lt;br /&gt;
                                   ============================&lt;br /&gt;
                                   longitud (xs ++ ys) = &lt;br /&gt;
                                    longitud xs + longitud ys *)&lt;br /&gt;
  induction xs as [| x xs&amp;#039; HI]. &lt;br /&gt;
  -                             (* ys : ListaNat&lt;br /&gt;
                                   ============================&lt;br /&gt;
                                   longitud ([ ] ++ ys) = &lt;br /&gt;
                                    longitud [ ] + longitud ys *)&lt;br /&gt;
    reflexivity.&lt;br /&gt;
  -                             (* x : nat&lt;br /&gt;
                                   xs&amp;#039;, ys : ListaNat&lt;br /&gt;
                                   HI : longitud (xs&amp;#039; ++ ys) = &lt;br /&gt;
                                         longitud xs&amp;#039; + longitud ys&lt;br /&gt;
                                   ============================&lt;br /&gt;
                                   longitud ((x :: xs&amp;#039;) ++ ys) = &lt;br /&gt;
                                   longitud (x :: xs&amp;#039;) + longitud ys *)&lt;br /&gt;
    simpl.                      (* S (longitud (xs&amp;#039; ++ ys)) = &lt;br /&gt;
                                   S (longitud xs&amp;#039; + longitud ys) *)&lt;br /&gt;
    rewrite HI.                 (* S (longitud xs&amp;#039; + longitud ys) = &lt;br /&gt;
                                   S (longitud xs&amp;#039; + longitud ys) *)&lt;br /&gt;
    reflexivity.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
Theorem suma_n_1 : forall n : nat,&lt;br /&gt;
    n + 1 = S n.&lt;br /&gt;
Proof.&lt;br /&gt;
  intro n.                   (* n : nat&lt;br /&gt;
                                ============================&lt;br /&gt;
                                n + 1 = S n *)&lt;br /&gt;
  induction n as [|n&amp;#039; HIn&amp;#039;]. &lt;br /&gt;
  -                          (* &lt;br /&gt;
                                ============================&lt;br /&gt;
                                0 + 1 = 1 *)&lt;br /&gt;
    reflexivity.&lt;br /&gt;
  -                          (* n&amp;#039; : nat&lt;br /&gt;
                                HIn&amp;#039; : n&amp;#039; + 1 = S n&amp;#039;&lt;br /&gt;
                                ============================&lt;br /&gt;
                                S n&amp;#039; + 1 = S (S n&amp;#039;) *)&lt;br /&gt;
    simpl.                   (* S (n&amp;#039; + 1) = S (S n&amp;#039;) *)&lt;br /&gt;
    rewrite HIn&amp;#039;.            (* S (S n&amp;#039;) = S (S n&amp;#039;) *)&lt;br /&gt;
    reflexivity.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* 2º intento *)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Theorem longitud_inversa : forall xs:ListaNat,&lt;br /&gt;
  longitud (inversa xs) = longitud xs.&lt;br /&gt;
Proof.&lt;br /&gt;
  intros xs.                    (* xs : ListaNat&lt;br /&gt;
                                   ============================&lt;br /&gt;
                                   longitud (inversa xs) = longitud xs *)&lt;br /&gt;
  induction xs as [| x xs&amp;#039; HI].&lt;br /&gt;
  -                             (* &lt;br /&gt;
                                   ============================&lt;br /&gt;
                                   longitud (inversa [ ]) = longitud [ ] *)&lt;br /&gt;
    reflexivity.&lt;br /&gt;
  -                             (* x : nat&lt;br /&gt;
                                   xs&amp;#039; : ListaNat&lt;br /&gt;
                                   HI : longitud (inversa xs&amp;#039;) = longitud xs&amp;#039;&lt;br /&gt;
                                   ============================&lt;br /&gt;
                                   longitud (inversa (x :: xs&amp;#039;)) = &lt;br /&gt;
                                    longitud (x :: xs&amp;#039;) *)&lt;br /&gt;
    simpl.                      (* longitud (inversa xs&amp;#039; ++ [x]) = &lt;br /&gt;
                                   S (longitud xs&amp;#039;) *)&lt;br /&gt;
    rewrite longitud_conc.      (* longitud (inversa xs&amp;#039;) + longitud [x] = &lt;br /&gt;
                                   S (longitud xs&amp;#039;) *)&lt;br /&gt;
    rewrite HI.                 (* longitud xs&amp;#039; + longitud [x] = &lt;br /&gt;
                                   S (longitud xs&amp;#039;) *)&lt;br /&gt;
    simpl.                      (* longitud xs&amp;#039; + 1 = S (longitud xs&amp;#039;) *)&lt;br /&gt;
    rewrite suma_n_1.           (* 1 + longitud xs&amp;#039; = S (longitud xs&amp;#039;) *)&lt;br /&gt;
    reflexivity.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* =====================================================================&lt;br /&gt;
   § 4. Opcionales&lt;br /&gt;
   ================================================================== *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 4.1. Definir el tipo OpcionalNat con los contructores&lt;br /&gt;
      Some : nat -&amp;gt; OpcionalNat&lt;br /&gt;
      None : OpcionalNat.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Inductive OpcionalNat : Type :=&lt;br /&gt;
  | Some : nat -&amp;gt; OpcionalNat&lt;br /&gt;
  | None : OpcionalNat.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 4.2. Definir la función&lt;br /&gt;
      nthOpcional : ListaNat -&amp;gt; nat -&amp;gt; OpcionalNat&lt;br /&gt;
   tal que (nthOpcional xs n) es el n-ésimo elemento de la lista xs o None&lt;br /&gt;
   si la lista tiene menos de n elementos. Por ejemplo,&lt;br /&gt;
      nthOpcional [4;5;6;7] 0 = Some 4.&lt;br /&gt;
      nthOpcional [4;5;6;7] 3 = Some 7.&lt;br /&gt;
      nthOpcional [4;5;6;7] 9 = None.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Fixpoint nthOpcional (xs : ListaNat) (n : nat) : OpcionalNat :=&lt;br /&gt;
  match xs with&lt;br /&gt;
  | nil      =&amp;gt; None&lt;br /&gt;
  | x :: xs&amp;#039; =&amp;gt; match iguales_nat n O with&lt;br /&gt;
                | true  =&amp;gt; Some x&lt;br /&gt;
                | false =&amp;gt; nthOpcional xs&amp;#039; (pred n)&lt;br /&gt;
                end&lt;br /&gt;
  end.&lt;br /&gt;
&lt;br /&gt;
Example prop_nthOpcional1 :&lt;br /&gt;
  nthOpcional [4;5;6;7] 0 = Some 4.&lt;br /&gt;
Proof. reflexivity. Qed.&lt;br /&gt;
&lt;br /&gt;
Example prop_nthOpcional2 :&lt;br /&gt;
  nthOpcional [4;5;6;7] 3 = Some 7.&lt;br /&gt;
Proof. reflexivity. Qed.&lt;br /&gt;
&lt;br /&gt;
Example prop_nthOpcional3 :&lt;br /&gt;
  nthOpcional [4;5;6;7] 9 = None.&lt;br /&gt;
Proof. reflexivity. Qed.&lt;br /&gt;
&lt;br /&gt;
(* La definición con condicionales es: *)&lt;br /&gt;
Fixpoint nthOpcional&amp;#039; (xs : ListaNat) (n : nat) : OpcionalNat :=&lt;br /&gt;
  match xs with&lt;br /&gt;
  | nil      =&amp;gt; None&lt;br /&gt;
  | x :: xs&amp;#039; =&amp;gt; if iguales_nat x O&lt;br /&gt;
               then Some x&lt;br /&gt;
               else nthOpcional&amp;#039; xs&amp;#039; (pred n)&lt;br /&gt;
  end.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 4.3. Definir la función&lt;br /&gt;
      extraeOpcionalNat -&amp;gt; OpcionalNat -&amp;gt; nat&lt;br /&gt;
   tal que (extraeOpcionalNat d o) es el valor de o, si o tiene valor o es d&lt;br /&gt;
   en caso contrario. Por ejemplo,&lt;br /&gt;
      extraeOpcionalNat 3 (Some 7) = 7&lt;br /&gt;
      extraeOpcionalNat 3 None     = 3&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Definition extraeOpcionalNat (d : nat) (o : OpcionalNat) : nat :=&lt;br /&gt;
  match o with&lt;br /&gt;
  | Some n&amp;#039; =&amp;gt; n&amp;#039;&lt;br /&gt;
  | None    =&amp;gt; d&lt;br /&gt;
  end.&lt;br /&gt;
&lt;br /&gt;
Compute (extraeOpcionalNat 3 (Some 7)).&lt;br /&gt;
(* ===&amp;gt; 7 : nat *)&lt;br /&gt;
Compute (extraeOpcionalNat 3 None).&lt;br /&gt;
(* ===&amp;gt; 3 : nat *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Nota. Finalizar el módulo ListaNat.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
End ListaNat.&lt;br /&gt;
&lt;br /&gt;
(* =====================================================================&lt;br /&gt;
   § 5. Diccionarios (o funciones parciales)&lt;br /&gt;
   ================================================================== *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 5.1. Definir el tipo id (por identificador) con el&lt;br /&gt;
   constructor &lt;br /&gt;
      Id : nat -&amp;gt; id.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Inductive id : Type :=&lt;br /&gt;
  | Id : nat -&amp;gt; id.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 5.2. Definir la función&lt;br /&gt;
      iguales_id : id -&amp;gt; id -&amp;gt; bool&lt;br /&gt;
   tal que (iguales_id x1 x2) se verifica si tienen la misma clave. Por&lt;br /&gt;
   ejemplo, &lt;br /&gt;
      iguales_id (Id 3) (Id 3) = true : bool&lt;br /&gt;
      iguales_id (Id 3) (Id 4) = false : bool&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Definition iguales_id (x1 x2 : id) :=&lt;br /&gt;
  match x1, x2 with&lt;br /&gt;
  | Id n1, Id n2 =&amp;gt; iguales_nat n1 n2&lt;br /&gt;
  end.&lt;br /&gt;
&lt;br /&gt;
Compute (iguales_id (Id 3) (Id 3)).&lt;br /&gt;
(* ===&amp;gt; true : bool *)&lt;br /&gt;
Compute (iguales_id (Id 3) (Id 4)).&lt;br /&gt;
(* ===&amp;gt; false : bool *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 5.3. Iniciar el módulo Diccionario que importa a ListaNat.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Module Diccionario.&lt;br /&gt;
Export ListaNat.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 5.4. Definir el tipo diccionario con los contructores&lt;br /&gt;
      vacio    : diccionario&lt;br /&gt;
      registro : id -&amp;gt; nat -&amp;gt; diccionario -&amp;gt; diccionario.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Inductive diccionario : Type :=&lt;br /&gt;
  | vacio    : diccionario&lt;br /&gt;
  | registro : id -&amp;gt; nat -&amp;gt; diccionario -&amp;gt; diccionario.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 5.5. Definir los diccionarios cuyos elementos son&lt;br /&gt;
      + []&lt;br /&gt;
      + [(3,6)]&lt;br /&gt;
      + [(2,4), (3,6)]&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Definition diccionario1 := vacio.&lt;br /&gt;
Definition diccionario2 := registro (Id 3) 6 diccionario1.&lt;br /&gt;
Definition diccionario3 := registro (Id 2) 4 diccionario2.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 5.6. Definir la función&lt;br /&gt;
      valor : id -&amp;gt; diccionario -&amp;gt; OpcionalNat &lt;br /&gt;
   tal que (valor i d) es el valor de la entrada de d con clave i, o&lt;br /&gt;
   None si d no tiene ninguna entrada con clave i. Por ejemplo,&lt;br /&gt;
      valor (Id 2) diccionario3 = Some 4&lt;br /&gt;
      valor (Id 2) diccionario2 = None&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Fixpoint valor (x : id) (d : diccionario) : OpcionalNat :=&lt;br /&gt;
  match d with&lt;br /&gt;
  | vacio           =&amp;gt; None&lt;br /&gt;
  | registro y v d&amp;#039; =&amp;gt; if iguales_id x y&lt;br /&gt;
                      then Some v&lt;br /&gt;
                      else valor x d&amp;#039;&lt;br /&gt;
  end.&lt;br /&gt;
&lt;br /&gt;
Compute (valor (Id 2) diccionario3).&lt;br /&gt;
(* = Some 4 : OpcionalNat *)&lt;br /&gt;
Compute (valor (Id 2) diccionario2).&lt;br /&gt;
(* = None : OpcionalNat*)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 5.7. Definir la función&lt;br /&gt;
      actualiza : diccionario -&amp;gt; id -&amp;gt; nat -&amp;gt; diccionario&lt;br /&gt;
   tal que (actualiza d x v) es el diccionario obtenido a partir del d&lt;br /&gt;
   + si d tiene un elemento con clave x, le cambia su valor a v&lt;br /&gt;
   + en caso contrario, le añade el elemento v con clave x &lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Definition actualiza (d : diccionario)&lt;br /&gt;
                     (x : id) (v : nat)&lt;br /&gt;
                     : diccionario :=&lt;br /&gt;
  registro x v d.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 5.8. Finalizar el módulo Diccionario&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
End Diccionario.&lt;br /&gt;
&lt;br /&gt;
(* =====================================================================&lt;br /&gt;
   § Bibliografía&lt;br /&gt;
   ================================================================== *)&lt;br /&gt;
&lt;br /&gt;
(*&lt;br /&gt;
 + &amp;quot;Working with structured data&amp;quot; de Peirce et als. &lt;br /&gt;
   http://bit.ly/2LQABsv&lt;br /&gt;
 *)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jalonso</name></author>
		
	</entry>
</feed>