<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="es">
	<id>https://www.glc.us.es/~jalonso/RA2019/index.php?action=history&amp;feed=atom&amp;title=Tema_1%3A_Programaci%C3%B3n_funcional_en_Isabelle</id>
	<title>Tema 1: Programación funcional en Isabelle - Historial de revisiones</title>
	<link rel="self" type="application/atom+xml" href="https://www.glc.us.es/~jalonso/RA2019/index.php?action=history&amp;feed=atom&amp;title=Tema_1%3A_Programaci%C3%B3n_funcional_en_Isabelle"/>
	<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2019/index.php?title=Tema_1:_Programaci%C3%B3n_funcional_en_Isabelle&amp;action=history"/>
	<updated>2026-07-18T13:04:19Z</updated>
	<subtitle>Historial de revisiones de esta página en el wiki</subtitle>
	<generator>MediaWiki 1.36.1</generator>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2019/index.php?title=Tema_1:_Programaci%C3%B3n_funcional_en_Isabelle&amp;diff=26&amp;oldid=prev</id>
		<title>Jalonso en 12:45 31 oct 2019</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2019/index.php?title=Tema_1:_Programaci%C3%B3n_funcional_en_Isabelle&amp;diff=26&amp;oldid=prev"/>
		<updated>2019-10-31T12:45:58Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;a href=&quot;https://www.glc.us.es/~jalonso/RA2019/index.php?title=Tema_1:_Programaci%C3%B3n_funcional_en_Isabelle&amp;amp;diff=26&amp;amp;oldid=12&quot;&gt;Mostrar los cambios&lt;/a&gt;</summary>
		<author><name>Jalonso</name></author>
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2019/index.php?title=Tema_1:_Programaci%C3%B3n_funcional_en_Isabelle&amp;diff=12&amp;oldid=prev</id>
		<title>Jalonso: Protegió «Tema 1: Programación funcional en Isabelle» ([Editar=Solo administradores] (indefinido) [Trasladar=Solo administradores] (indefinido))</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2019/index.php?title=Tema_1:_Programaci%C3%B3n_funcional_en_Isabelle&amp;diff=12&amp;oldid=prev"/>
		<updated>2019-10-15T09:45:54Z</updated>

		<summary type="html">&lt;p&gt;Protegió «&lt;a href=&quot;/~jalonso/RA2019/index.php/Tema_1:_Programaci%C3%B3n_funcional_en_Isabelle&quot; title=&quot;Tema 1: Programación funcional en Isabelle&quot;&gt;Tema 1: Programación funcional en Isabelle&lt;/a&gt;» ([Editar=Solo administradores] (indefinido) [Trasladar=Solo administradores] (indefinido))&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&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: #202122; text-align: center;&quot;&gt;← Revisión anterior&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revisión del 09:45 15 oct 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/RA2019/index.php?title=Tema_1:_Programaci%C3%B3n_funcional_en_Isabelle&amp;diff=7&amp;oldid=prev</id>
		<title>Jalonso: Página creada con «&lt;source lang=&quot;isabelle&quot;&gt; chapter {* Tema 1: Programación funcional en Isabelle *}  theory T1_Programacion_funcional_en_Isabelle imports Main  begin  section {* Introducci…»</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2019/index.php?title=Tema_1:_Programaci%C3%B3n_funcional_en_Isabelle&amp;diff=7&amp;oldid=prev"/>
		<updated>2019-10-15T09:42:23Z</updated>

		<summary type="html">&lt;p&gt;Página creada con «&amp;lt;source lang=&amp;quot;isabelle&amp;quot;&amp;gt; chapter {* Tema 1: Programación funcional en Isabelle *}  theory T1_Programacion_funcional_en_Isabelle imports Main  begin  section {* Introducci…»&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;isabelle&amp;quot;&amp;gt;&lt;br /&gt;
chapter {* Tema 1: Programación funcional en Isabelle *}&lt;br /&gt;
&lt;br /&gt;
theory T1_Programacion_funcional_en_Isabelle&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
section {* Introducción *}&lt;br /&gt;
&lt;br /&gt;
text {* En este tema se presenta el lenguaje funcional que está&lt;br /&gt;
  incluido en Isabelle. El lenguaje funcional es muy parecido a&lt;br /&gt;
  Haskell. *}&lt;br /&gt;
&lt;br /&gt;
section {* Números naturales, enteros y booleanos *}&lt;br /&gt;
&lt;br /&gt;
text {* En Isabelle están definidos los número naturales con la sintaxis&lt;br /&gt;
  de Peano usando dos constructores: 0 (cero) y Suc (el sucesor).&lt;br /&gt;
&lt;br /&gt;
  Los números como el 1 son abreviaturas de los correspondientes en la&lt;br /&gt;
  notación de Peano, en este caso &amp;quot;Suc 0&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
  El tipo de los números naturales es nat. &lt;br /&gt;
&lt;br /&gt;
  Por ejemplo, el siguiente del 0 es el 1. *}&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;Suc 0&amp;quot;  &lt;br /&gt;
(* ↝ &amp;quot;1&amp;quot; :: &amp;quot;nat&amp;quot;*)&lt;br /&gt;
&lt;br /&gt;
text {* En Isabelle está definida la suma de los números naturales:&lt;br /&gt;
  (x + y) es la suma de x e y.&lt;br /&gt;
&lt;br /&gt;
  Por ejemplo, la suma de los números naturales 1 y 2 es el número&lt;br /&gt;
  natural 3. *}&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;(1::nat) + 2&amp;quot; &lt;br /&gt;
(* ↝ &amp;quot;3&amp;quot; :: &amp;quot;nat&amp;quot; *)&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;(1::nat) + 2 = 3&amp;quot;&lt;br /&gt;
(* ↝ &amp;quot;True&amp;quot; :: &amp;quot;bool&amp;quot; *) &lt;br /&gt;
&lt;br /&gt;
text {* La notación del par de dos puntos se usa para asignar un tipo a&lt;br /&gt;
  un término (por ejemplo, (1::nat) significa que se considera que 1 es&lt;br /&gt;
  un número natural).   &lt;br /&gt;
&lt;br /&gt;
  En Isabelle está definida el producto de los números naturales:&lt;br /&gt;
  (x * y) es el producto de x e y.&lt;br /&gt;
&lt;br /&gt;
  Por ejemplo, el producto de los números naturales 2 y 3 es el número&lt;br /&gt;
  natural 6. *}&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;(2::nat) * 3&amp;quot; &lt;br /&gt;
(* ↝ &amp;quot;6&amp;quot; :: &amp;quot;nat&amp;quot;*)&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;(2::nat) * 3 = 6&amp;quot;&lt;br /&gt;
(* ↝ &amp;quot;True&amp;quot; :: &amp;quot;bool&amp;quot; *) &lt;br /&gt;
&lt;br /&gt;
text {* En Isabelle está definida la división de números naturales: &lt;br /&gt;
  (n div m) es el cociente entero de x entre y.&lt;br /&gt;
&lt;br /&gt;
  Por ejemplo, la división natural de 7 entre 3 es 2. *}&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;(7::nat) div 3&amp;quot;&lt;br /&gt;
(* ↝ &amp;quot;2&amp;quot; :: &amp;quot;nat&amp;quot; *)&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;(7::nat) div 3 = 2&amp;quot;&lt;br /&gt;
(* ↝ &amp;quot;True&amp;quot; :: &amp;quot;bool&amp;quot; *)&lt;br /&gt;
&lt;br /&gt;
text {* En Isabelle está definida el resto de división de números&lt;br /&gt;
  naturales: (n mod m) es el resto de dividir n entre m.&lt;br /&gt;
&lt;br /&gt;
  Por ejemplo, el resto de dividir 7 entre 3 es 1. *}&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;(7::nat) mod 3&amp;quot;&lt;br /&gt;
(* ↝ &amp;quot;1&amp;quot; :: &amp;quot;nat&amp;quot; *)&lt;br /&gt;
&lt;br /&gt;
text {* En Isabelle también están definidos los números enteros. El tipo&lt;br /&gt;
  de los enteros se representa por int.&lt;br /&gt;
&lt;br /&gt;
  Por ejemplo, la suma de 1 y -2 es el número entero -1. *}&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;(1::int) + -2&amp;quot;  &lt;br /&gt;
(* ↝ &amp;quot;- 1&amp;quot; :: &amp;quot;int&amp;quot;*)&lt;br /&gt;
&lt;br /&gt;
text {* Los numerales están sobrecargados. Por ejemplo, el 1 puede ser&lt;br /&gt;
  un natural o un entero, dependiendo del contexto. &lt;br /&gt;
&lt;br /&gt;
  Isabelle resuelve ambigüedades mediante inferencia de tipos.&lt;br /&gt;
&lt;br /&gt;
  A veces, es necesario usar declaraciones de tipo para resolver la&lt;br /&gt;
  ambigüedad.&lt;br /&gt;
&lt;br /&gt;
  En Isabelle están definidos los valores booleanos (True y False), las&lt;br /&gt;
  conectivas (¬, ∧, ∨, ⟶ y ↔) y los cuantificadores (∀ y ∃). &lt;br /&gt;
&lt;br /&gt;
  El tipo de los booleanos es bool. *}&lt;br /&gt;
&lt;br /&gt;
text {* La conjunción de dos fórmulas verdaderas es verdadera. *}&lt;br /&gt;
value &amp;quot;True ∧ True&amp;quot;  &lt;br /&gt;
(* ↝ &amp;quot;True&amp;quot; :: &amp;quot;bool&amp;quot; *)&lt;br /&gt;
&lt;br /&gt;
text {* La conjunción de un fórmula verdadera y una falsa es falsa. *} &lt;br /&gt;
value &amp;quot;True ∧ False&amp;quot;  &lt;br /&gt;
(* ↝ &amp;quot;False&amp;quot; :: &amp;quot;bool&amp;quot; *)&lt;br /&gt;
&lt;br /&gt;
text {* La disyunción de una fórmula verdadera y una falsa es&lt;br /&gt;
  verdadera. *} &lt;br /&gt;
value &amp;quot;True ∨ False&amp;quot; &lt;br /&gt;
(* ↝ &amp;quot;True&amp;quot; :: &amp;quot;bool&amp;quot; *)&lt;br /&gt;
&lt;br /&gt;
text {* La disyunción de dos fórmulas falsas es falsa. *}&lt;br /&gt;
value &amp;quot;False ∨ False&amp;quot; &lt;br /&gt;
(* ↝ &amp;quot;False&amp;quot; :: &amp;quot;bool&amp;quot;*)&lt;br /&gt;
&lt;br /&gt;
text {* La negación de una fórmula verdadera es falsa. *}&lt;br /&gt;
value &amp;quot;¬True&amp;quot; &lt;br /&gt;
(* ↝ &amp;quot;False&amp;quot; :: &amp;quot;bool&amp;quot;*)&lt;br /&gt;
&lt;br /&gt;
text {* Una fórmula falsa implica una fórmula verdadera. *}&lt;br /&gt;
value &amp;quot;False ⟶ True&amp;quot; &lt;br /&gt;
(* ↝ &amp;quot;True&amp;quot; :: &amp;quot;bool&amp;quot;*)&lt;br /&gt;
&lt;br /&gt;
text {* Un lema introduce una proposición seguida de una demostración. &lt;br /&gt;
&lt;br /&gt;
  Isabelle dispone de varios procedimientos automáticos para generar&lt;br /&gt;
  demostraciones, uno de los cuales es el de simplificación (llamado&lt;br /&gt;
  simp). &lt;br /&gt;
&lt;br /&gt;
  El procedimiento simp aplica un conjunto de reglas de reescritura, que&lt;br /&gt;
  inicialmente contiene un gran número de reglas relativas a los objetos&lt;br /&gt;
  definidos. *}&lt;br /&gt;
&lt;br /&gt;
text {* Ej. de simp: Todo elemento es igual a sí mismo. *}&lt;br /&gt;
lemma &amp;quot;∀x. x = x&amp;quot; &lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
text {* Ej. de simp: Existe un elemento igual a 1. *}&lt;br /&gt;
lemma &amp;quot;∃x. x = 1&amp;quot; &lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
section {* Definiciones no recursivas *}&lt;br /&gt;
&lt;br /&gt;
text {* La disyunción exclusiva de A y B se verifica si una es verdadera&lt;br /&gt;
  y la otra no lo es. *}&lt;br /&gt;
&lt;br /&gt;
definition xor :: &amp;quot;bool ⇒ bool ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;xor A B ≡ (A ∧ ¬B) ∨ (¬A ∧ B)&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
text {* Prop.: La disyunción exclusiva de dos fórmulas verdaderas es&lt;br /&gt;
  falsa. &lt;br /&gt;
&lt;br /&gt;
  Dem.: Por simplificación, usando la definición de la disyunción&lt;br /&gt;
  exclusiva. &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;xor True True = False&amp;quot;&lt;br /&gt;
by (simp add: xor_def)&lt;br /&gt;
&lt;br /&gt;
text {* Se añade la definición de la disyunción exclusiva al conjunto de&lt;br /&gt;
  reglas de simplificación automáticas. *}&lt;br /&gt;
&lt;br /&gt;
declare xor_def [simp]&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;xor True False = True&amp;quot;&lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
section {* Definiciones locales *}&lt;br /&gt;
&lt;br /&gt;
text {* Se puede asignar valores a variables locales mediante &amp;#039;let&amp;#039; y&lt;br /&gt;
  usarlo en las expresiones dentro de &amp;#039;in&amp;#039;. &lt;br /&gt;
&lt;br /&gt;
  Por ejemplo, si x es el número natural 3, entonces &amp;quot;x*x = 9&amp;quot;. *}&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;let x = 3::nat in x * x&amp;quot; &lt;br /&gt;
(* ↝ &amp;quot;9&amp;quot; :: &amp;quot;nat&amp;quot; *)&lt;br /&gt;
&lt;br /&gt;
section {* Pares *}&lt;br /&gt;
&lt;br /&gt;
text {* Un par se representa escribiendo los elementos entre paréntesis&lt;br /&gt;
  y separados por coma.&lt;br /&gt;
  &lt;br /&gt;
  El tipo de los pares es el producto de los tipos.&lt;br /&gt;
  &lt;br /&gt;
  La función fst devuelve el primer elemento de un par y la snd el&lt;br /&gt;
  segundo. &lt;br /&gt;
&lt;br /&gt;
  Por ejemplo, si p es el par de números naturales (2,3), entonces la&lt;br /&gt;
  suma del primer elemento de p y 1 es igual al segundo elemento de&lt;br /&gt;
  p. *} &lt;br /&gt;
&lt;br /&gt;
value &amp;quot;let p = (2,3)::nat × nat in fst p + 1 = snd p&amp;quot; &lt;br /&gt;
(* ↝ &amp;quot;True&amp;quot; :: &amp;quot;bool&amp;quot; *)&lt;br /&gt;
&lt;br /&gt;
section {* Listas *}&lt;br /&gt;
&lt;br /&gt;
text {* Una lista se representa escribiendo los elementos entre&lt;br /&gt;
  corchetes y separados por comas.&lt;br /&gt;
  &lt;br /&gt;
  La lista vacía se representa por [].&lt;br /&gt;
  &lt;br /&gt;
  Todos los elementos de una lista tienen que ser del mismo tipo.&lt;br /&gt;
  &lt;br /&gt;
  El tipo de las listas de elementos del tipo a es (a list).&lt;br /&gt;
  &lt;br /&gt;
  El término (x#xs) representa la lista obtenida añadiendo el elemento x&lt;br /&gt;
  al principio de la lista xs. &lt;br /&gt;
&lt;br /&gt;
  Por ejemplo, la lista obtenida añadiendo sucesivamente a la lista&lt;br /&gt;
  vacía los elementos z, y y x a es [x,y,z]. *}&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;x#(y#(z#[]))&amp;quot; &lt;br /&gt;
(* ↝ &amp;quot;[x, y, z]&amp;quot; :: &amp;quot;&amp;#039;a list&amp;quot; *)&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;(1::int)#(2#(3#[]))&amp;quot;&lt;br /&gt;
(* ↝ &amp;quot;[1, 2, 3]&amp;quot; :: &amp;quot;int list&amp;quot; *)&lt;br /&gt;
&lt;br /&gt;
text {* Funciones de descomposición de listas:&lt;br /&gt;
  · (hd xs) es el primer elemento de la lista xs.&lt;br /&gt;
  · (tl xs) es el resto de la lista xs.&lt;br /&gt;
&lt;br /&gt;
  Por ejemplo, si xs es la lista [a,b,c], entonces el primero de xs es a&lt;br /&gt;
  y el resto de xs es [b,c]. *} &lt;br /&gt;
&lt;br /&gt;
value &amp;quot;let xs = [a,b,c] in hd xs = a ∧ tl xs = [b,c]&amp;quot; &lt;br /&gt;
(* ↝ &amp;quot;True&amp;quot; :: &amp;quot;bool&amp;quot; *)&lt;br /&gt;
&lt;br /&gt;
text {* (length xs) es la longitud de la lista xs. Por ejemplo, la&lt;br /&gt;
  longitud de la lista [1,2,5] es 3. *}&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;length [1::nat,2,5]&amp;quot; &lt;br /&gt;
(* ↝ &amp;quot;3&amp;quot; :: &amp;quot;nat&amp;quot; *)&lt;br /&gt;
&lt;br /&gt;
text {* En la página 10 de &amp;quot;What&amp;#039;s in Main&amp;quot; &lt;br /&gt;
  https://isabelle.in.tum.de/dist/Isabelle2018/doc/main.pdf&lt;br /&gt;
  y en la sesión 66 de &amp;quot;Isabelle/HOL — Higher-Order Logic&amp;quot;&lt;br /&gt;
  https://isabelle.in.tum.de/dist/library/HOL/HOL/document.pdf&lt;br /&gt;
  se encuentran más definiciones y propiedades de las listas. *}&lt;br /&gt;
&lt;br /&gt;
section {* Funciones anónimas *}&lt;br /&gt;
&lt;br /&gt;
text {* En Isabelle pueden definirse funciones anónimas.  &lt;br /&gt;
&lt;br /&gt;
  Por ejemplo, el valor de la función que a un número le asigna su doble&lt;br /&gt;
  aplicada a 1 es 2. *}&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;(λx. x + x) 1::nat&amp;quot; &lt;br /&gt;
(* ↝ &amp;quot;2&amp;quot; :: &amp;quot;nat&amp;quot; *)&lt;br /&gt;
&lt;br /&gt;
section {* Condicionales *}&lt;br /&gt;
&lt;br /&gt;
text {* El valor absoluto del entero x es x, si &amp;quot;x ≥ 0&amp;quot; y es -x en caso &lt;br /&gt;
  contrario. *}&lt;br /&gt;
&lt;br /&gt;
definition absoluto :: &amp;quot;int ⇒ int&amp;quot; where&lt;br /&gt;
  &amp;quot;absoluto x ≡ (if x ≥ 0 then x else -x)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* Ejemplo, el valor absoluto de -3 es 3. *}&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;absoluto(-3)&amp;quot; &lt;br /&gt;
(* ↝ &amp;quot;3&amp;quot; :: &amp;quot;int&amp;quot; *)&lt;br /&gt;
&lt;br /&gt;
text {* Def.: Un número natural n es un sucesor si es de la forma &lt;br /&gt;
  (Suc m). *}&lt;br /&gt;
&lt;br /&gt;
definition es_sucesor :: &amp;quot;nat ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;es_sucesor n ≡ (case n of &lt;br /&gt;
    0     ⇒ False &lt;br /&gt;
  | Suc m ⇒ True)&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
text {* Ejemplo, el número 3 es sucesor. *}&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;es_sucesor 3&amp;quot; &lt;br /&gt;
(* ↝ &amp;quot;True&amp;quot; :: &amp;quot;bool&amp;quot; *)&lt;br /&gt;
&lt;br /&gt;
section {* Tipos de datos y definiciones recursivas *}&lt;br /&gt;
&lt;br /&gt;
text {* Una lista de elementos de tipo a es la lista Vacia o se obtiene&lt;br /&gt;
  añadiendo, con Cons, un elemento de tipo a a una lista de elementos de&lt;br /&gt;
  tipo a. *} &lt;br /&gt;
&lt;br /&gt;
datatype &amp;#039;a Lista = Vacia | Cons &amp;#039;a &amp;quot;&amp;#039;a Lista&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* (conc xs ys) es la concatenación de las lista xs e ys. Por&lt;br /&gt;
  ejemplo, &lt;br /&gt;
     conc (Cons a (Cons b Vacia)) (Cons c Vacia)&lt;br /&gt;
     = Cons a (Cons b (Cons c Vacia))&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
fun conc :: &amp;quot;&amp;#039;a Lista ⇒ &amp;#039;a Lista ⇒ &amp;#039;a Lista&amp;quot; where&lt;br /&gt;
  &amp;quot;conc Vacia ys       = ys&amp;quot;&lt;br /&gt;
| &amp;quot;conc (Cons x xs) ys = Cons x (conc xs ys)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;conc (Cons a (Cons b Vacia)) (Cons c Vacia)&amp;quot;&lt;br /&gt;
(* ↝ Lista.Cons a (Lista.Cons b (Lista.Cons c Vacia)) *)&lt;br /&gt;
&lt;br /&gt;
text {* Se puede declarar que acorte los nombres. *}&lt;br /&gt;
&lt;br /&gt;
declare [[names_short]]&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;conc (Cons a (Cons b Vacia)) (Cons c Vacia)&amp;quot;&lt;br /&gt;
(* ↝ Cons a (Cons b (Cons c Vacia) *)&lt;br /&gt;
&lt;br /&gt;
text {* (suma n) es la suma de los primeros n números naturales. Por&lt;br /&gt;
  ejemplo,&lt;br /&gt;
     suma 3 = 6&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
fun suma :: &amp;quot;nat ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;suma 0       = 0&amp;quot;&lt;br /&gt;
| &amp;quot;suma (Suc m) = (Suc m) + suma m&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;suma 3&amp;quot; &lt;br /&gt;
(* ↝ &amp;quot;6&amp;quot; :: nat *)&lt;br /&gt;
&lt;br /&gt;
text {* (sumaImpares n) es la suma de los n primeros números impares. &lt;br /&gt;
  Por ejemplo, &lt;br /&gt;
     sumaImpares 3 = 9&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
fun sumaImpares :: &amp;quot;nat ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;sumaImpares 0       = 0&amp;quot;&lt;br /&gt;
| &amp;quot;sumaImpares (Suc n) = (2 * (Suc n) - 1) + sumaImpares n&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;sumaImpares 3&amp;quot; &lt;br /&gt;
(* ↝ &amp;quot;9&amp;quot; :: nat *)&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jalonso</name></author>
	</entry>
</feed>