<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="es">
	<id>https://www.glc.us.es/~jalonso/LMF2019/index.php?action=history&amp;feed=atom&amp;title=Desarrollo_de_teor%C3%ADas_formalizadas_con_Isabelle%2FHOL</id>
	<title>Desarrollo de teorías formalizadas con Isabelle/HOL - Historial de revisiones</title>
	<link rel="self" type="application/atom+xml" href="https://www.glc.us.es/~jalonso/LMF2019/index.php?action=history&amp;feed=atom&amp;title=Desarrollo_de_teor%C3%ADas_formalizadas_con_Isabelle%2FHOL"/>
	<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2019/index.php?title=Desarrollo_de_teor%C3%ADas_formalizadas_con_Isabelle/HOL&amp;action=history"/>
	<updated>2026-09-18T03:05:50Z</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/LMF2019/index.php?title=Desarrollo_de_teor%C3%ADas_formalizadas_con_Isabelle/HOL&amp;diff=827&amp;oldid=prev</id>
		<title>Jalonso en 15:20 20 may 2020</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2019/index.php?title=Desarrollo_de_teor%C3%ADas_formalizadas_con_Isabelle/HOL&amp;diff=827&amp;oldid=prev"/>
		<updated>2020-05-20T15:20:32Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;a href=&quot;https://www.glc.us.es/~jalonso/LMF2019/index.php?title=Desarrollo_de_teor%C3%ADas_formalizadas_con_Isabelle/HOL&amp;amp;diff=827&amp;amp;oldid=826&quot;&gt;Mostrar los cambios&lt;/a&gt;</summary>
		<author><name>Jalonso</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2019/index.php?title=Desarrollo_de_teor%C3%ADas_formalizadas_con_Isabelle/HOL&amp;diff=826&amp;oldid=prev</id>
		<title>Jalonso en 15:19 20 may 2020</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2019/index.php?title=Desarrollo_de_teor%C3%ADas_formalizadas_con_Isabelle/HOL&amp;diff=826&amp;oldid=prev"/>
		<updated>2020-05-20T15:19:48Z</updated>

		<summary type="html">&lt;p&gt;&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 15:19 20 may 2020&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/LMF2019/index.php?title=Desarrollo_de_teor%C3%ADas_formalizadas_con_Isabelle/HOL&amp;diff=668&amp;oldid=prev</id>
		<title>Jalonso en 08:43 13 may 2019</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2019/index.php?title=Desarrollo_de_teor%C3%ADas_formalizadas_con_Isabelle/HOL&amp;diff=668&amp;oldid=prev"/>
		<updated>2019-05-13T08:43:26Z</updated>

		<summary type="html">&lt;p&gt;&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 08:43 13 may 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/LMF2019/index.php?title=Desarrollo_de_teor%C3%ADas_formalizadas_con_Isabelle/HOL&amp;diff=667&amp;oldid=prev</id>
		<title>Jalonso en 17:19 12 may 2019</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2019/index.php?title=Desarrollo_de_teor%C3%ADas_formalizadas_con_Isabelle/HOL&amp;diff=667&amp;oldid=prev"/>
		<updated>2019-05-12T17:19:16Z</updated>

		<summary type="html">&lt;p&gt;&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 {* Desarrollo de teorías formalizadas *}&lt;br /&gt;
&lt;br /&gt;
theory T11_Desarrollo_de_teorias_formalizadas&lt;br /&gt;
imports Main&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
section {* Desarrollo de la teoría de grupos*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  El objetivo de este tema es mostrar cómo se puede trabajar en&lt;br /&gt;
  estructuras algebraicas por medio de locales. Se usará como ejemplo la&lt;br /&gt;
  teoría de grupos. *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Ejemplo 1. Un grupo es una estructura (G,·,𝟭,^) tal que G es un&lt;br /&gt;
  conjunto, · es una operación binaria en G, 𝟭 es un elemento de G y ^&lt;br /&gt;
  es una función de G en G tales que se cumplen las siguientes&lt;br /&gt;
  propiedades:&lt;br /&gt;
  * asociativa: ∀x y z. x ⋅ (y ⋅ z) = (x ⋅ y) ⋅ z&lt;br /&gt;
  * neutro por la izquierda: ∀x. 𝟭 ⋅ x = x&lt;br /&gt;
  * inverso por la izquierda: ∀x. x^ ⋅ x = 𝟭 &lt;br /&gt;
  Definir el entorno axiomático de los grupos. *}&lt;br /&gt;
&lt;br /&gt;
locale grupo = &lt;br /&gt;
  fixes prod :: &amp;quot;[&amp;#039;a, &amp;#039;a] ⇒ &amp;#039;a&amp;quot; (infixl &amp;quot;⋅&amp;quot; 70)&lt;br /&gt;
    and neutro (&amp;quot;𝟭&amp;quot;) &lt;br /&gt;
    and inverso (&amp;quot;_^&amp;quot; [100] 100)&lt;br /&gt;
  assumes asociativa: &amp;quot;(x ⋅ y) ⋅ z = x ⋅ (y ⋅ z)&amp;quot;&lt;br /&gt;
      and neutro_i:   &amp;quot;𝟭 ⋅ x = x&amp;quot;&lt;br /&gt;
      and inverso_i:  &amp;quot;x^ ⋅ x = 𝟭&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Notas sobre notación:&lt;br /&gt;
  * El producto es ⋅ y se escribe con \ cdot (sin espacio entre ellos). &lt;br /&gt;
  * El neutro es 𝟭 y se escribe con \ y &amp;lt;one&amp;gt; (sin espacio entre ellos).&lt;br /&gt;
  * El inverso de x es x^ y se escribe con pulsando 2 veces en ^. *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  A continuación se crea un contexto en el que se supone la notación y&lt;br /&gt;
  axiomas de grupos. En el contexto se demuestran propiedades de los&lt;br /&gt;
  grupos. *}&lt;br /&gt;
&lt;br /&gt;
context grupo&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Ejemplo 2. En los grupos, x^ también es el inverso de x por la&lt;br /&gt;
  derecha; es decir &lt;br /&gt;
     x ⋅ x^ = 𝟭   *}&lt;br /&gt;
&lt;br /&gt;
― ‹La demostración automática (obtenida con Sledgehammer) es›&lt;br /&gt;
lemma &amp;quot;x ⋅ x^ = 𝟭&amp;quot;&lt;br /&gt;
  by (metis asociativa inverso_i neutro_i)&lt;br /&gt;
&lt;br /&gt;
― ‹La demostración detallada es›&lt;br /&gt;
lemma inverso_d: &lt;br /&gt;
  &amp;quot;x ⋅ x^ = 𝟭&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;x ⋅ x^ = 𝟭 ⋅ (x ⋅ x^)&amp;quot; by (simp only: neutro_i)&lt;br /&gt;
  also have &amp;quot;… = (𝟭 ⋅ x) ⋅ x^&amp;quot; by (simp only: asociativa)&lt;br /&gt;
  also have &amp;quot;… = (((x^)^ ⋅ x^) ⋅ x) ⋅ x^&amp;quot; by (simp only: inverso_i)&lt;br /&gt;
  also have &amp;quot;… = ((x^)^ ⋅ (x^ ⋅ x)) ⋅ x^&amp;quot; by (simp only: asociativa)&lt;br /&gt;
  also have &amp;quot;… = ((x^)^ ⋅ 𝟭) ⋅ x^&amp;quot; by (simp only: inverso_i)&lt;br /&gt;
  also have &amp;quot;… = (x^)^ ⋅ (𝟭 ⋅ x^)&amp;quot; by (simp only: asociativa)&lt;br /&gt;
  also have &amp;quot;… = (x^)^ ⋅ x^&amp;quot; by (simp only: neutro_i)&lt;br /&gt;
  also have &amp;quot;… = 𝟭&amp;quot; by (simp only: inverso_i)&lt;br /&gt;
  finally show ?thesis .&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Ejemplo 2. En los grupos, 𝟭 también es el neutro por la derecha; es decir &lt;br /&gt;
     x ⋅ 𝟭 = x   *}&lt;br /&gt;
&lt;br /&gt;
― ‹La demostración automática (obtenida con Sledgehammer) es›&lt;br /&gt;
lemma &amp;quot;x ⋅ 𝟭 = x&amp;quot;&lt;br /&gt;
  by (metis asociativa inverso_i neutro_i)&lt;br /&gt;
&lt;br /&gt;
― ‹La demostración detallada es›&lt;br /&gt;
lemma neutro_d: &lt;br /&gt;
  &amp;quot;x ⋅ 𝟭 = x&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;x ⋅ 𝟭 = x ⋅ (x^ ⋅ x)&amp;quot; by (simp only: inverso_i)&lt;br /&gt;
  also have &amp;quot;… = (x ⋅ x^) ⋅ x&amp;quot; by (simp only: asociativa)&lt;br /&gt;
  also have &amp;quot;… = 𝟭 ⋅ x&amp;quot; by (simp only: inverso_d)&lt;br /&gt;
  also have &amp;quot;… = x&amp;quot; by (simp only: neutro_i)&lt;br /&gt;
  finally show &amp;quot;x ⋅ 𝟭 = x&amp;quot; .&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Ejemplo 3. En los grupos, se tiene la propiedad cancelativa por la&lt;br /&gt;
  izquierda; es decir,&lt;br /&gt;
     x ⋅ y = x ⋅ z syss y = z   *}&lt;br /&gt;
&lt;br /&gt;
― ‹La demostración automática (obtenida con Sledgehammer) es›&lt;br /&gt;
lemma &amp;quot;(x ⋅ y = x ⋅ z) = (y = z)&amp;quot;&lt;br /&gt;
  by (metis asociativa inverso_i neutro_i)&lt;br /&gt;
&lt;br /&gt;
― ‹La demostración detallada es›&lt;br /&gt;
lemma cancelativa_i: &lt;br /&gt;
  &amp;quot;(x ⋅ y = x ⋅ z) = (y = z)&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume &amp;quot;x ⋅ y = x ⋅ z&amp;quot;&lt;br /&gt;
  hence &amp;quot;x^ ⋅ (x ⋅ y) = x^ ⋅ (x ⋅ z)&amp;quot; by simp&lt;br /&gt;
  hence &amp;quot;(x^ ⋅ x) ⋅ y = (x^ ⋅ x) ⋅ z&amp;quot; by (simp only: asociativa)&lt;br /&gt;
  hence &amp;quot;𝟭 ⋅ y = 𝟭 ⋅ z&amp;quot; by (simp only: inverso_i)&lt;br /&gt;
  thus &amp;quot;y = z&amp;quot; by (simp only: neutro_i)&lt;br /&gt;
next&lt;br /&gt;
  assume &amp;quot;y = z&amp;quot;&lt;br /&gt;
  then show &amp;quot;x ⋅ y = x ⋅ z&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Ejemplo 4. En los grupos, el elemento neutro por la izquierda es&lt;br /&gt;
  único; es decir, si e es un elemento tal que para todo x se tiene que &lt;br /&gt;
  e ⋅ x = x, entonces e = 𝟭. *}&lt;br /&gt;
&lt;br /&gt;
― ‹La demostración automática es (obtenida con Sledgehammer) es›&lt;br /&gt;
lemma &lt;br /&gt;
  assumes &amp;quot;e ⋅ x = x&amp;quot;&lt;br /&gt;
  shows &amp;quot;𝟭 = e&amp;quot;&lt;br /&gt;
  using assms&lt;br /&gt;
  by (metis asociativa inverso_d neutro_d)&lt;br /&gt;
&lt;br /&gt;
― ‹La demostración estructurada es›&lt;br /&gt;
lemma unicidad_neutro_i:&lt;br /&gt;
  assumes &amp;quot;e ⋅ x = x&amp;quot;&lt;br /&gt;
  shows &amp;quot;𝟭 = e&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;𝟭 = x ⋅ x^&amp;quot; by (simp only: inverso_d)&lt;br /&gt;
  also have &amp;quot;... = (e ⋅ x) ⋅ x^&amp;quot; using assms by simp&lt;br /&gt;
  also have &amp;quot;... = e ⋅ (x ⋅ x^)&amp;quot; by (simp only: asociativa)&lt;br /&gt;
  also have &amp;quot;... = e ⋅ 𝟭&amp;quot; by (simp only: inverso_d)&lt;br /&gt;
  also have &amp;quot;... = e&amp;quot; by (simp only: neutro_d)&lt;br /&gt;
  finally show ?thesis .&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Ejemplo 5. En los grupos, los inversos por la izquierda son únicos; es&lt;br /&gt;
  decir, si x&amp;#039; es un elemento tal que x&amp;#039; ⋅ x = 𝟭, entonces x^ x&amp;#039;. *}&lt;br /&gt;
&lt;br /&gt;
― ‹La demostración automática (obtenida con Sledgehammer) es›&lt;br /&gt;
lemma &lt;br /&gt;
  assumes &amp;quot;x&amp;#039; ⋅ x = 𝟭&amp;quot;&lt;br /&gt;
  shows &amp;quot;x^ = x&amp;#039;&amp;quot;&lt;br /&gt;
  using assms&lt;br /&gt;
  by (metis asociativa inverso_i neutro_i)&lt;br /&gt;
&lt;br /&gt;
― ‹La demostración estructurada es›&lt;br /&gt;
lemma unicidad_inverso_i:&lt;br /&gt;
  assumes &amp;quot;x&amp;#039; ⋅ x = 𝟭&amp;quot;&lt;br /&gt;
  shows &amp;quot;x^ = x&amp;#039;&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;x^ = 𝟭 ⋅ x^&amp;quot; by (simp only: neutro_i)&lt;br /&gt;
  also have &amp;quot;... = (x&amp;#039; ⋅ x) ⋅ x^&amp;quot; using assms by simp&lt;br /&gt;
  also have &amp;quot;... = x&amp;#039; ⋅ (x ⋅ x^)&amp;quot; by (simp only: asociativa)&lt;br /&gt;
  also have &amp;quot;... = x&amp;#039; ⋅ 𝟭&amp;quot; by (simp only: inverso_d)&lt;br /&gt;
  also have &amp;quot;... = x&amp;#039;&amp;quot; by (simp only: neutro_d)&lt;br /&gt;
  finally show ?thesis .&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Ejemplo 6. En los grupos, es inverso de un producto es el producto de&lt;br /&gt;
  los inversos cambiados de orden; es decir,&lt;br /&gt;
     (x ⋅ y)^ = y^ ⋅ x^    *}&lt;br /&gt;
&lt;br /&gt;
― ‹La demostración automática (obtenida con Sledgehammer) es›&lt;br /&gt;
lemma &amp;quot;(x ⋅ y)^ = y^ ⋅ x^&amp;quot;&lt;br /&gt;
  by (metis asociativa inverso_d neutro_d)&lt;br /&gt;
&lt;br /&gt;
― ‹La demostración detallada es›&lt;br /&gt;
lemma inversa_producto:&lt;br /&gt;
  &amp;quot;(x ⋅ y)^ = y^ ⋅ x^&amp;quot;&lt;br /&gt;
proof (rule unicidad_inverso_i)&lt;br /&gt;
  show &amp;quot;(y^ ⋅ x^) ⋅ (x ⋅ y) = 𝟭&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;(y^ ⋅ x^) ⋅ (x ⋅ y) = (y^ ⋅ (x^ ⋅ x)) ⋅ y&amp;quot; by (simp only: asociativa)&lt;br /&gt;
    also have &amp;quot;... = (y^ ⋅ 𝟭) ⋅ y&amp;quot; by (simp only: inverso_i)&lt;br /&gt;
    also have &amp;quot;... = y^ ⋅ y&amp;quot; by (simp only: neutro_d)&lt;br /&gt;
    also have &amp;quot;... = 𝟭&amp;quot; by (simp only: inverso_i)&lt;br /&gt;
    finally show ?thesis .&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Ejemplo 7. En los grupos, el inverso del inverso es el propio&lt;br /&gt;
  elemento; es decir, &lt;br /&gt;
     (x^)^ = x    *}&lt;br /&gt;
&lt;br /&gt;
― ‹La demostración automática (obtenida con Sledgehammer) es›&lt;br /&gt;
lemma &amp;quot;(x^)^ = x&amp;quot;&lt;br /&gt;
  using inverso_d unicidad_inverso_i by blast&lt;br /&gt;
&lt;br /&gt;
― ‹La demostración estructurada es›&lt;br /&gt;
lemma inverso_inverso: &lt;br /&gt;
  &amp;quot;(x^)^ = x&amp;quot;&lt;br /&gt;
proof (rule unicidad_inverso_i)&lt;br /&gt;
  show &amp;quot;x ⋅ x^ = 𝟭&amp;quot; by (simp only: inverso_d)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Ejemplo 8. En los grupos, la función inversa es inyectiva; es decir,&lt;br /&gt;
  si x e y tienen los mismos inversos, entonces son iguales. *}&lt;br /&gt;
&lt;br /&gt;
― ‹La demostración automática es (obtenida con Sledgehammer) es›&lt;br /&gt;
lemma &lt;br /&gt;
  assumes &amp;quot;x^ = y^&amp;quot;&lt;br /&gt;
  shows &amp;quot;x = y&amp;quot;&lt;br /&gt;
  using assms&lt;br /&gt;
  by (metis inverso_inverso)&lt;br /&gt;
&lt;br /&gt;
― ‹La demostración automática estructurada es›&lt;br /&gt;
lemma inversa_inyectiva:&lt;br /&gt;
  assumes &amp;quot;x^ = y^&amp;quot;&lt;br /&gt;
  shows &amp;quot;x = y&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;(x^)^ = (y^)^&amp;quot; using assms by simp&lt;br /&gt;
  thus &amp;quot;x = y&amp;quot; by (simp only: inverso_inverso)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
section {* Teorías de órdenes mediante clases *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  El tutorial sobre clases está en la teoría Clases.thy.&lt;br /&gt;
  &lt;br /&gt;
  La clase de los órdenes es la colección de los tipos que poseen una&lt;br /&gt;
  relación ≼ verificando las siguientes propiedades&lt;br /&gt;
  · reflexiva: x ≼ x&lt;br /&gt;
  · transitiva: ⟦x ≼ y; y ≼ z⟧ ⟹ x ≼ z&lt;br /&gt;
  · antisimétrica: ⟦x ≼ y; y ≼ x⟧ ⟹ x = y&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
class orden = &lt;br /&gt;
  fixes menor_ig :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a ⇒ bool&amp;quot;  (infix &amp;quot;≼&amp;quot; 50)&lt;br /&gt;
  assumes refl: &amp;quot;x ≼ x&amp;quot;&lt;br /&gt;
      and trans: &amp;quot;⟦x ≼ y; y ≼ z⟧ ⟹ x ≼ z&amp;quot;&lt;br /&gt;
      and antisim: &amp;quot;⟦x ≼ y; y ≼ x⟧ ⟹ x = y&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Ha generado los teoremas correspondientes a los axiomas. Pueden consultarse&lt;br /&gt;
  mediante thm como se muestra a continuación.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
thm trans&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Se inicia el contexto orden en el que se van a realizar definiciones y&lt;br /&gt;
  demostraciones. &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
context orden&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  x es menor que y si x es menor o igual que y y no son iguales.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
definition menor :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a ⇒ bool&amp;quot;  (infix &amp;quot;≺&amp;quot; 50)&lt;br /&gt;
  where &amp;quot;x ≺ y ⟷ x ≼ y ∧ ¬ y ≼ x&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
    La relación menor es irreflexiva.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma irrefl: &amp;quot;¬ x ≺ x&amp;quot;&lt;br /&gt;
  by (auto simp: menor_def)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  La relación menor es transitiva.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* Demostración aplicativa *)&lt;br /&gt;
lemma &amp;quot;⟦x ≺ y; y ≺ z⟧ ⟹ x ≺ z&amp;quot;&lt;br /&gt;
  apply (unfold menor_def)&lt;br /&gt;
    (* ⟦x ≼ y ∧ ¬ y ≼ x; y ≼ z ∧ ¬ z ≼ y⟧ ⟹ x ≼ z ∧ ¬ z ≼ x *)&lt;br /&gt;
  apply (auto intro: trans)&lt;br /&gt;
    (* *)&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
(* Demostración automática *)&lt;br /&gt;
lemma menor_trans: &amp;quot;⟦x ≺ y; y ≺ z⟧ ⟹ x ≺ z&amp;quot;&lt;br /&gt;
  by (auto simp: menor_def intro: trans)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  La relación menor es asimétrica; es decir, si x ≺ y e y ≺ x, entonces&lt;br /&gt;
  se verifica cualquier propiedad P. &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma asimetrica: &amp;quot;x ≺ y ⟹ y ≺ x ⟹ P&amp;quot;&lt;br /&gt;
  by (auto simp: menor_def)&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
subsection {* Subclase *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Un orden lineal es un orden en que cada par de elementos son comparables.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
class ordenLineal = orden +&lt;br /&gt;
  assumes lineal: &amp;quot;x ≼ y ∨ y ≼ x&amp;quot;&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  En los órdenes lineales se tiene que x ≺ y ∨ x = y ∨ y ≺ x.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* Demostración aplicativa *)&lt;br /&gt;
lemma &amp;quot;x ≺ y ∨ x = y ∨ y ≺ x&amp;quot;&lt;br /&gt;
  apply (unfold menor_def)&lt;br /&gt;
      (* (x ≼ y ∧ ¬ y ≼ x) ∨ x = y ∨ (y ≼ x ∧ ¬ x ≼ y) *)&lt;br /&gt;
  apply auto&lt;br /&gt;
      (*  1. ⟦x ≠ y; ¬ x ≼ y⟧ ⟹ y ≼ x&lt;br /&gt;
          2. ⟦x ≠ y; y ≼ x; x ≼ y⟧ ⟹ False *)&lt;br /&gt;
   apply (cut_tac x=x and y=y in lineal)&lt;br /&gt;
      (* 1. ⟦x ≠ y; ¬ x ≼ y; x ≼ y ∨ y ≼ x⟧ ⟹ y ≼ x&lt;br /&gt;
         2. ⟦x ≠ y; y ≼ x; x ≼ y⟧ ⟹ False *)&lt;br /&gt;
   apply (erule disjE)&lt;br /&gt;
      (* 1. ⟦x ≠ y; ¬ x ≼ y; x ≼ y⟧ ⟹ y ≼ x&lt;br /&gt;
         2. ⟦x ≠ y; ¬ x ≼ y; y ≼ x⟧ ⟹ y ≼ x&lt;br /&gt;
         3. ⟦x ≠ y; y ≼ x; x ≼ y⟧ ⟹ False *)&lt;br /&gt;
    apply (erule_tac P=&amp;quot;x ≼ y&amp;quot; in notE)&lt;br /&gt;
      (* 1. ⟦x ≠ y; x ≼ y⟧ ⟹ x ≼ y&lt;br /&gt;
         2. ⟦x ≠ y; ¬ x ≼ y; y ≼ x⟧ ⟹ y ≼ x&lt;br /&gt;
         3. ⟦x ≠ y; y ≼ x; x ≼ y⟧ ⟹ False *)&lt;br /&gt;
    apply assumption&lt;br /&gt;
      (* 1. ⟦x ≠ y; ¬ x ≼ y; y ≼ x⟧ ⟹ y ≼ x&lt;br /&gt;
         2. ⟦x ≠ y; y ≼ x; x ≼ y⟧ ⟹ False *)&lt;br /&gt;
   apply assumption&lt;br /&gt;
      (* 1. ⟦x ≠ y; y ≼ x; x ≼ y⟧ ⟹ False *)&lt;br /&gt;
  apply (drule antisim)&lt;br /&gt;
      (* 1. ⟦x ≠ y; x ≼ y⟧ ⟹ x ≼ y&lt;br /&gt;
         2. ⟦x ≠ y; x ≼ y; y = x⟧ ⟹ False *)&lt;br /&gt;
   apply assumption&lt;br /&gt;
      (* 1. ⟦x ≠ y; x ≼ y; y = x⟧ ⟹ False *)&lt;br /&gt;
  apply (erule notE)&lt;br /&gt;
      (* 1. ⟦x ≼ y; y = x⟧ ⟹ x = y *)&lt;br /&gt;
  apply (erule sym)&lt;br /&gt;
      (* *)&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
(* Demostración automática *)&lt;br /&gt;
lemma &amp;quot;x ≺ y ∨ x = y ∨ y ≺ x&amp;quot;&lt;br /&gt;
  using menor_def lineal antisim  &lt;br /&gt;
  by blast&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
section {* Teoría de órdenes mediante ámbitos (&amp;quot;Locales&amp;quot;) *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Un orden es una estructura con una relación reflexiva, transitiva y&lt;br /&gt;
  antisimétrica. &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
locale Orden =&lt;br /&gt;
  fixes menor_ig :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a ⇒ bool&amp;quot;  (infix &amp;quot;⊑&amp;quot; 50)&lt;br /&gt;
  assumes refl:    &amp;quot;x ⊑ x&amp;quot;&lt;br /&gt;
      and trans:   &amp;quot;⟦x ⊑ y; y ⊑ z⟧ ⟹ x ⊑ z&amp;quot;&lt;br /&gt;
      and antisim: &amp;quot;⟦x ⊑ y; y ⊑ x⟧ ⟹ x = y&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
    Los teoremas se diferencian por el nombre y el ámbito. Por ejemplo,&lt;br /&gt;
    refl: ?x ≼ ?x&lt;br /&gt;
    Orden.refl: Orden ?menor_ig ⟹ ?menor_ig ?x ?x&lt;br /&gt;
    Orden_def: Orden ?menor_ig ≡&lt;br /&gt;
               (∀x. ?menor_ig x x) ∧&lt;br /&gt;
               (∀x y z. ?menor_ig x y ⟶ ?menor_ig y z ⟶ ?menor_ig x z) ∧&lt;br /&gt;
               (∀x y. ?menor_ig x y ⟶ ?menor_ig y x ⟶ x = y)&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
thm refl&lt;br /&gt;
thm Orden.refl&lt;br /&gt;
thm Orden_def&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Un orden lineal es un orden en el que todos los pares de elementos son &lt;br /&gt;
  comparables. &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
locale OrdenLineal = Orden +&lt;br /&gt;
  assumes lineal: &amp;quot;x ⊑ y ∨ y ⊑ x&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Los boooleanos está ordenados con el condicional.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
interpretation Orden_imp: Orden &amp;quot;λx y. x ⟶ y&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  fix P show &amp;quot;P ⟶ P&amp;quot; by blast&lt;br /&gt;
next&lt;br /&gt;
  fix P Q R show &amp;quot;P ⟶ Q ⟹ Q ⟶ R ⟹ P ⟶ R&amp;quot; by blast&lt;br /&gt;
next&lt;br /&gt;
  fix P Q show &amp;quot;P ⟶ Q ⟹ Q ⟶ P ⟹ P = Q&amp;quot; by blast&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Los naturales con la relación de divisibilidad es un conjunto ordenado.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
interpretation Orden_dvd: Orden &amp;quot;(dvd) :: nat ⇒ nat ⇒ bool&amp;quot;&lt;br /&gt;
proof &lt;br /&gt;
  fix x :: nat&lt;br /&gt;
  show &amp;quot;x dvd x&amp;quot; using dvd_refl by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x y z :: nat&lt;br /&gt;
  show &amp;quot;⟦x dvd y; y dvd z⟧ ⟹ x dvd z&amp;quot; using dvd_trans by auto&lt;br /&gt;
next&lt;br /&gt;
  fix x y :: nat&lt;br /&gt;
  show &amp;quot;⟦x dvd y; y dvd x⟧ ⟹ x = y&amp;quot; using dvd_antisym by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Ámbito de las funciones monótonas (ver la página 12 del tutorial de&lt;br /&gt;
  locales). &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
locale Mono =&lt;br /&gt;
  le1: Orden le1 +&lt;br /&gt;
  le2: Orden le2 &lt;br /&gt;
    for le1 (infix &amp;quot;⊑⇩1&amp;quot; 50) and le2 (infix &amp;quot;⊑⇩2&amp;quot; 50) +&lt;br /&gt;
  fixes f :: &amp;quot;&amp;#039;a ⇒ &amp;#039;b&amp;quot;&lt;br /&gt;
  assumes mono: &amp;quot;x ⊑⇩1 y ⟹ f(x) ⊑⇩2 f(y)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Si f es monótona, x ⊑_1 y e y ⊑_1 z, entonces f(x) ⊑_2 f(z).&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma (in Mono) mono_trans: &lt;br /&gt;
  assumes &amp;quot;x ⊑⇩1 y&amp;quot; and &amp;quot;y ⊑⇩1 z&amp;quot; &lt;br /&gt;
  shows &amp;quot;f(x) ⊑⇩2 f(z)&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;x ⊑⇩1 z&amp;quot; using assms and le1.trans by blast&lt;br /&gt;
  then show &amp;quot;f(x) ⊑⇩2 f(z)&amp;quot; using mono by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  El teorema generado se llama Mono.mono_trans.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
thm Mono.mono_trans&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  En el contexto Mono el nombre es mono_trans.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
context Mono &lt;br /&gt;
begin &lt;br /&gt;
thm mono_trans &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  El predicado `ser par&amp;#039; es un operador monótono entre los naturales con la&lt;br /&gt;
  relación de divisibilidad y los booleanos con el condicional; es decir, &lt;br /&gt;
     x dvd y ⟹ even x ⟶ even y&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
interpretation Mono &amp;quot;(dvd)&amp;quot; &amp;quot;(⟶)&amp;quot; &amp;quot;λn::nat. 2 dvd n&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  fix x y :: nat &lt;br /&gt;
  show &amp;quot;x dvd y ⟹ even x ⟶ even y&amp;quot;&lt;br /&gt;
    proof &lt;br /&gt;
      assume &amp;quot;x dvd y&amp;quot; and &amp;quot;even x&amp;quot;&lt;br /&gt;
      then show &amp;quot;even y&amp;quot; &lt;br /&gt;
        using  Rings.comm_monoid_mult_class.dvd_trans by auto&lt;br /&gt;
    qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
section {* Semigrupos, monoides y grupos *}&lt;br /&gt;
&lt;br /&gt;
subsection {* Definición de clases *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Un semigrupo es una estructura compuesta por un conjunto A y una&lt;br /&gt;
  operación binaria en A.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
class semigrupo =&lt;br /&gt;
  fixes mult :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a ⇒ &amp;#039;a&amp;quot; (infixl &amp;quot;⊗&amp;quot; 70) &lt;br /&gt;
  assumes asoc: &amp;quot;(x ⊗ y) ⊗ z = x ⊗ (y ⊗ z )&amp;quot;&lt;br /&gt;
&lt;br /&gt;
subsection {* Instanciación de clases *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Los enteros con la suma forman un semigrupo.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
instantiation int :: semigrupo &lt;br /&gt;
begin &lt;br /&gt;
definition &lt;br /&gt;
  mult_int_def: &amp;quot;i ⊗ j = i + (j ::int)&amp;quot; &lt;br /&gt;
&lt;br /&gt;
instance proof &lt;br /&gt;
  fix i j k :: &amp;quot;int&amp;quot; &lt;br /&gt;
  have &amp;quot;(i + j ) + k = i + (j + k)&amp;quot; by simp &lt;br /&gt;
  then show &amp;quot;(i ⊗ j ) ⊗ k = i ⊗ (j ⊗ k)&amp;quot; unfolding mult_int_def . &lt;br /&gt;
qed &lt;br /&gt;
end &lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Los naturales con la suma forman un semigrupo.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
instantiation nat :: semigrupo &lt;br /&gt;
begin &lt;br /&gt;
primrec mult_nat where &lt;br /&gt;
  &amp;quot;(0::nat) ⊗ n = n&amp;quot; &lt;br /&gt;
| &amp;quot;Suc m ⊗ n = Suc (m ⊗ n)&amp;quot; &lt;br /&gt;
&lt;br /&gt;
instance proof &lt;br /&gt;
  fix m n q :: &amp;quot;nat&amp;quot; &lt;br /&gt;
  show &amp;quot;m ⊗ n ⊗ q = m ⊗ (n ⊗ q)&amp;quot; &lt;br /&gt;
    by (induct m) auto&lt;br /&gt;
qed &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
subsection {* Instancias recursivas *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Si (A,⊗) y (B,⊗) son semigrupos, entonces ((A×B,⊗), donde el producto&lt;br /&gt;
  se define por &lt;br /&gt;
     (x,y)⊗(x&amp;#039;,y&amp;#039;) = (x⊗x&amp;#039;,y⊗y&amp;#039;),&lt;br /&gt;
  es un semigrupo.&lt;br /&gt;
*}&lt;br /&gt;
 &lt;br /&gt;
instantiation prod :: (semigrupo, semigrupo) semigrupo &lt;br /&gt;
begin &lt;br /&gt;
&lt;br /&gt;
definition &lt;br /&gt;
  mult_prod_def : &amp;quot;p1 ⊗ p2 = (fst p1 ⊗ fst p2, snd p1 ⊗ snd p2)&amp;quot; &lt;br /&gt;
&lt;br /&gt;
instance proof &lt;br /&gt;
  fix p1 p2 p3 :: &amp;quot;&amp;#039;a::semigrupo × &amp;#039;b::semigrupo&amp;quot; &lt;br /&gt;
  show &amp;quot;(p1 ⊗ p2) ⊗ p3 = p1 ⊗ (p2 ⊗ p3)&amp;quot; &lt;br /&gt;
    unfolding mult_prod_def by (simp add: asoc) &lt;br /&gt;
qed &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
subsection {* Subclases *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Un monoide izquierdo es un semigrupo con elemento neutro por la izquierda. &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
class monoideI = semigrupo + &lt;br /&gt;
  fixes neutro :: &amp;quot;&amp;#039;a&amp;quot; (&amp;quot;𝟭&amp;quot;) &lt;br /&gt;
  assumes neutroI: &amp;quot;𝟭 ⊗ x = x&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Los naturales y los enteros con la suma forman monoides por la izquierda.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
instantiation nat and int :: monoideI &lt;br /&gt;
begin &lt;br /&gt;
&lt;br /&gt;
definition &lt;br /&gt;
  neutro_nat_def : &amp;quot;𝟭 = (0::nat)&amp;quot; &lt;br /&gt;
&lt;br /&gt;
definition &lt;br /&gt;
  neutro_int_def : &amp;quot;𝟭 = (0::int)&amp;quot; &lt;br /&gt;
&lt;br /&gt;
instance proof &lt;br /&gt;
  fix n :: nat &lt;br /&gt;
  show &amp;quot;𝟭 ⊗ n = n&amp;quot; unfolding neutro_nat_def by simp&lt;br /&gt;
next &lt;br /&gt;
  fix k :: int &lt;br /&gt;
  show &amp;quot;𝟭 ⊗ k = k&amp;quot; unfolding neutro_int_def mult_int_def by simp &lt;br /&gt;
qed &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  El producto de dos monoides por la izquierda es un monoide por la&lt;br /&gt;
  izquierda, donde el neutro es el par formado por los elementos neutros.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
instantiation prod :: (monoideI , monoideI) monoideI &lt;br /&gt;
begin &lt;br /&gt;
&lt;br /&gt;
definition &lt;br /&gt;
  neutro_prod_def : &amp;quot;𝟭 = (𝟭, 𝟭)&amp;quot; &lt;br /&gt;
&lt;br /&gt;
instance proof &lt;br /&gt;
  fix p :: &amp;quot;&amp;#039;a::monoideI × &amp;#039;b::monoideI&amp;quot; &lt;br /&gt;
  show &amp;quot;𝟭 ⊗ p = p&amp;quot; &lt;br /&gt;
    unfolding neutro_prod_def mult_prod_def by (simp add: neutroI) &lt;br /&gt;
qed &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Un monoide es un monoide por la izquierda cuyo elemento neutro por la&lt;br /&gt;
  izquierda lo es también por la derecha.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
class monoide = monoideI + &lt;br /&gt;
  assumes neutro: &amp;quot;x ⊗ 𝟭 = x&amp;quot; &lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Los naturales y los enteros con la suma son monoides.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
instantiation nat and int :: monoide &lt;br /&gt;
begin &lt;br /&gt;
&lt;br /&gt;
instance proof &lt;br /&gt;
  fix n :: nat &lt;br /&gt;
  show &amp;quot;n ⊗ 𝟭 = n&amp;quot; &lt;br /&gt;
    unfolding neutro_nat_def by (induct n) simp_all &lt;br /&gt;
next &lt;br /&gt;
  fix k :: int &lt;br /&gt;
  show &amp;quot;k ⊗ 𝟭 = k&amp;quot; &lt;br /&gt;
    unfolding neutro_int_def mult_int_def by simp &lt;br /&gt;
qed&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  El producto de dos monoides es un monoide.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
instantiation prod :: (monoide, monoide) monoide &lt;br /&gt;
begin &lt;br /&gt;
&lt;br /&gt;
instance proof &lt;br /&gt;
  fix p :: &amp;quot;&amp;#039;a::monoide × &amp;#039;b::monoide&amp;quot; &lt;br /&gt;
  show &amp;quot;p ⊗ 𝟭 = p&amp;quot; &lt;br /&gt;
    unfolding neutro_prod_def mult_prod_def by (simp add: neutro) &lt;br /&gt;
qed &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Un grupo es un monoide por la izquierda tal que todo elemento posee un&lt;br /&gt;
  inverso por la izquierda.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
class grupo2 = monoideI + &lt;br /&gt;
  fixes inverso :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a&amp;quot; (&amp;quot;(_⇧-⇧1)&amp;quot; [1000] 999)&lt;br /&gt;
  assumes inversoI: &amp;quot;x⇧-⇧1 ⊗ x = 𝟭&amp;quot; &lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Los enteros con la suma forman un grupo.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
instantiation int :: grupo2 &lt;br /&gt;
begin &lt;br /&gt;
&lt;br /&gt;
definition&lt;br /&gt;
  inverso_int_def: &amp;quot;i⇧-⇧1 = -(i::int)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
instance proof &lt;br /&gt;
  fix i :: &amp;quot;int&amp;quot; &lt;br /&gt;
  have &amp;quot;-i + i = 0&amp;quot; by simp &lt;br /&gt;
  then show &amp;quot;i⇧-⇧1 ⊗ i = 𝟭&amp;quot; &lt;br /&gt;
    unfolding mult_int_def neutro_int_def inverso_int_def . &lt;br /&gt;
qed &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
subsection {* Razonamiento abstracto *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  En los grupos se verifica la propiedad cancelativa por la izquierda, i.e.&lt;br /&gt;
     x ⊗ y = x ⊗ z ⟷ y = z&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma (in grupo2) cancelativa_izq: &amp;quot;x ⊗ y = x ⊗ z ⟷ y = z&amp;quot; &lt;br /&gt;
proof &lt;br /&gt;
  assume &amp;quot;x ⊗ y = x ⊗ z&amp;quot;&lt;br /&gt;
  hence &amp;quot;x⇧-⇧1 ⊗ (x ⊗ y) = x⇧-⇧1 ⊗ (x ⊗ z)&amp;quot; by simp &lt;br /&gt;
  hence &amp;quot;(x⇧-⇧1 ⊗ x) ⊗ y = (x⇧-⇧1 ⊗ x) ⊗ z&amp;quot; using asoc by simp &lt;br /&gt;
  then show &amp;quot;y = z&amp;quot; using neutroI and inversoI by simp&lt;br /&gt;
next &lt;br /&gt;
  assume &amp;quot;y = z&amp;quot; &lt;br /&gt;
  then show &amp;quot;x ⊗ y = x ⊗ z&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
thm grupo2.cancelativa_izq&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Se genera el teorema grupo.cancelativa_izq&lt;br /&gt;
     class.grupo2 ?mult ?neutro ?inverso ⟹ &lt;br /&gt;
     (?mult ?x ?y = ?mult ?x ?z) = (?y = ?z)&lt;br /&gt;
&lt;br /&gt;
  El teorema se aplica automáticamente a todas las instancias de la clase&lt;br /&gt;
  grupo. Por ejemplo, a los enteros.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
subsection {* Definiciones derivadas *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  En los monoides se define la potencia natural por&lt;br /&gt;
  · x^0     = 1&lt;br /&gt;
  · x^{n+1} = x*x^n&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
fun (in monoide) potencia_nat :: &amp;quot;nat ⇒ &amp;#039;a ⇒ &amp;#039;a&amp;quot; where &lt;br /&gt;
  &amp;quot;potencia_nat 0 x       = 𝟭&amp;quot;  &lt;br /&gt;
| &amp;quot;potencia_nat (Suc n) x = x ⊗ potencia_nat n x&amp;quot;&lt;br /&gt;
&lt;br /&gt;
subsection {* Analogía entre clases y functores *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Las listas con la operación de concatenación y la lista vacía como elemento&lt;br /&gt;
  neutro forman un monoide.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
interpretation list_monoide: monoide &amp;quot;append&amp;quot; &amp;quot;[]&amp;quot;&lt;br /&gt;
proof &lt;br /&gt;
  show &amp;quot;⋀x y z. (x @ y) @ z = x @ (y @ z)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  show &amp;quot;⋀x. [] @ x = x&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  show &amp;quot;⋀x. x @ [] = x&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Se pueden aplicar propiedades de los monides a las listas. Por ejemplo,&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;append [] xs = xs&amp;quot;&lt;br /&gt;
  by simp&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  (repite n xs) es la lista obtenida concatenando n veces la lista xs. &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
fun repite :: &amp;quot;nat ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where &lt;br /&gt;
  &amp;quot;repite 0 _        = []&amp;quot;&lt;br /&gt;
| &amp;quot;repite (Suc n) xs = xs @ repite n xs&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Las listas con la operación de concatenación y la lista vacía como elemento&lt;br /&gt;
  neutro forman un monoide. Además, la potencia natural se intepreta como&lt;br /&gt;
  repite. &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
interpretation list_monoide: monoide &amp;quot;append&amp;quot; &amp;quot;[]&amp;quot; rewrites&lt;br /&gt;
  &amp;quot;monoide.potencia_nat append [] = repite&amp;quot; &lt;br /&gt;
proof -&lt;br /&gt;
  interpret monoide &amp;quot;append&amp;quot; &amp;quot;[]&amp;quot; .. &lt;br /&gt;
  show &amp;quot;monoide.potencia_nat append [] = repite&amp;quot; &lt;br /&gt;
  proof &lt;br /&gt;
    fix n &lt;br /&gt;
    show &amp;quot;monoide.potencia_nat append [] n = repite n&amp;quot;&lt;br /&gt;
      by (induct n) auto &lt;br /&gt;
  qed &lt;br /&gt;
qed intro_locales&lt;br /&gt;
&lt;br /&gt;
subsection {* Relaciones de subclase adicionales *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Los grupos son monoides.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
subclass (in grupo2) monoide &lt;br /&gt;
proof &lt;br /&gt;
  fix x &lt;br /&gt;
  have &amp;quot;x⇧-⇧1 ⊗ (x ⊗ 𝟭) = x⇧-⇧1 ⊗ (x ⊗ (x⇧-⇧1 ⊗ x))&amp;quot; using inversoI by simp&lt;br /&gt;
  also have &amp;quot;… = (x⇧-⇧1 ⊗ x) ⊗ (x⇧-⇧1 ⊗ x)&amp;quot; using asoc [symmetric] by simp&lt;br /&gt;
  also have &amp;quot;… = 𝟭 ⊗ (x⇧-⇧1 ⊗ x)&amp;quot; using inversoI by simp&lt;br /&gt;
  also have &amp;quot;… = x⇧-⇧1 ⊗ x&amp;quot; using neutroI by simp&lt;br /&gt;
  finally have &amp;quot;x⇧-⇧1 ⊗ (x ⊗ 𝟭) = x⇧-⇧1 ⊗ x&amp;quot; . &lt;br /&gt;
  then show &amp;quot;x ⊗ 𝟭 = x&amp;quot; using cancelativa_izq by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  La potencia entera en los grupos se define a partir de la potencia natural&lt;br /&gt;
  como sigue:&lt;br /&gt;
  · x^k = x^k si k ≥ 0&lt;br /&gt;
  · x^k = (x^{-k})^{-1}, en caso contrario.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
definition (in grupo2) potencia_entera :: &amp;quot;int ⇒ &amp;#039;a ⇒ &amp;#039;a&amp;quot; where &lt;br /&gt;
  &amp;quot;potencia_entera k x = &lt;br /&gt;
   (if k &amp;gt;= 0 &lt;br /&gt;
    then potencia_nat (nat k) x &lt;br /&gt;
    else (potencia_nat (nat (- k)) x)⇧-⇧1)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
section {* Bibliografía *}&lt;br /&gt;
text {* &lt;br /&gt;
  + &amp;quot;Haskell-style type classes with Isabelle/Isar&amp;quot; ~ F. Haftmann.&lt;br /&gt;
    http://bit.ly/2E55pAJ&lt;br /&gt;
  + &amp;quot;Tutorial to locales and locale interpretation&amp;quot; ~ C. Ballarin.&lt;br /&gt;
    http://bit.ly/2E3ozXB  &lt;br /&gt;
*}&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>