<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="es">
	<id>https://www.glc.us.es/~jalonso/RA2014/index.php?action=history&amp;feed=atom&amp;title=Tema_10%3A_Conjuntos_definidos_inductivamente</id>
	<title>Tema 10: Conjuntos definidos inductivamente - Historial de revisiones</title>
	<link rel="self" type="application/atom+xml" href="https://www.glc.us.es/~jalonso/RA2014/index.php?action=history&amp;feed=atom&amp;title=Tema_10%3A_Conjuntos_definidos_inductivamente"/>
	<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2014/index.php?title=Tema_10:_Conjuntos_definidos_inductivamente&amp;action=history"/>
	<updated>2026-09-27T15:40:38Z</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/RA2014/index.php?title=Tema_10:_Conjuntos_definidos_inductivamente&amp;diff=301&amp;oldid=prev</id>
		<title>WikiSysop en 08:18 16 jul 2018</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2014/index.php?title=Tema_10:_Conjuntos_definidos_inductivamente&amp;diff=301&amp;oldid=prev"/>
		<updated>2018-07-16T08:18:04Z</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;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;es&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;← Revisión anterior&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;Revisión del 08:18 16 jul 2018&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l1&quot; &gt;Línea 1:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Línea 1:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&#039;diff-marker&#039;&gt;−&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;source lang=&amp;quot;&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;isar&lt;/del&gt;&amp;quot;&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&#039;diff-marker&#039;&gt;+&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;source lang=&amp;quot;&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;isabelle&lt;/ins&gt;&amp;quot;&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&#039;diff-marker&#039;&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;header {* Tema 10: Conjuntos definidos inductivamente *}&lt;/div&gt;&lt;/td&gt;&lt;td class=&#039;diff-marker&#039;&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;header {* Tema 10: Conjuntos definidos inductivamente *}&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&#039;diff-marker&#039;&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class=&#039;diff-marker&#039;&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>WikiSysop</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2014/index.php?title=Tema_10:_Conjuntos_definidos_inductivamente&amp;diff=265&amp;oldid=prev</id>
		<title>Jalonso: Página creada con &#039;&lt;source lang=&quot;isar&quot;&gt; header {* Tema 10: Conjuntos definidos inductivamente *}  theory T10_Conjuntos_definidos_inductivamente imports Main begin  section {* El conjunto de los n...&#039;</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2014/index.php?title=Tema_10:_Conjuntos_definidos_inductivamente&amp;diff=265&amp;oldid=prev"/>
		<updated>2015-01-22T05:30:07Z</updated>

		<summary type="html">&lt;p&gt;Página creada con &amp;#039;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt; header {* Tema 10: Conjuntos definidos inductivamente *}  theory T10_Conjuntos_definidos_inductivamente imports Main begin  section {* El conjunto de los n...&amp;#039;&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;isar&amp;quot;&amp;gt;&lt;br /&gt;
header {* Tema 10: Conjuntos definidos inductivamente *}&lt;br /&gt;
&lt;br /&gt;
theory T10_Conjuntos_definidos_inductivamente&lt;br /&gt;
imports Main&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
section {* El conjunto de los números pares *}&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  · El conjunto de los números pares se define inductivamente como el&lt;br /&gt;
    menor conjunto que contiene al 0 y es cerrado por la operación (+2).&lt;br /&gt;
&lt;br /&gt;
  · El conjunto de los números pares también puede definirse como los &lt;br /&gt;
    naturales divisible por 2.&lt;br /&gt;
&lt;br /&gt;
  · Veremos cómo se escriben las dos definiciones en Isabelle/HOL y cómo&lt;br /&gt;
    se demuestra su equivalencia.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
subsection {* Definición inductiva del conjunto de los pares *}&lt;br /&gt;
&lt;br /&gt;
inductive_set par :: &amp;quot;nat set&amp;quot; where&lt;br /&gt;
  cero [intro!]: &amp;quot;0 ∈ par&amp;quot; &lt;br /&gt;
| paso [intro!]: &amp;quot;n ∈ par ⟹ (Suc (Suc n)) ∈ par&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  · Una definición inductiva está formada con reglas de introducción.&lt;br /&gt;
&lt;br /&gt;
  · La definición inductiva genera varios teoremas:&lt;br /&gt;
    · par.cero:   0 ∈ par&lt;br /&gt;
    · par.paso:   n ∈ par ⟹ Suc (Suc n) ∈ par&lt;br /&gt;
    · par.simps:  (a ∈ par) = (a = 0 ∨ (∃n. a = Suc (Suc n) ∧ n ∈ par))&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
subsection {* Uso de las reglas de introducción *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Lema: Los números de la forma 2*k son pares.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma dobles_son_pares [intro!]: &lt;br /&gt;
  &amp;quot;2*k ∈ par&amp;quot;&lt;br /&gt;
by (induct k) auto&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma dobles_son_pares_2:&lt;br /&gt;
  &amp;quot;2*k ∈ par&amp;quot;&lt;br /&gt;
proof (induct k)&lt;br /&gt;
  show &amp;quot;2 * 0 ∈ par&amp;quot; by auto&lt;br /&gt;
next&lt;br /&gt;
  show &amp;quot;⋀k. 2 * k ∈ par ⟹ 2 * Suc k ∈ par&amp;quot; by auto&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  · Nota: Nuestro objetivo es demostrar la equivalencia de la definición&lt;br /&gt;
    anterior y la definición mediante divisibilidad.&lt;br /&gt;
  &lt;br /&gt;
  · Lema: Si n es divisible por 2, entonces es par.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma dvd_imp_par: &amp;quot;2 dvd n ⟹ n ∈ par&amp;quot;&lt;br /&gt;
by (auto simp add: dvd_def)&lt;br /&gt;
&lt;br /&gt;
subsection {* Regla de inducción *} &lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Entre las reglas generadas por la definión de par está la de&lt;br /&gt;
  inducción:&lt;br /&gt;
  · par.induct: ⟦ x ∈ par; &lt;br /&gt;
                 P 0; &lt;br /&gt;
                 ⋀n. ⟦n ∈ par; P n⟧ ⟹ P (Suc (Suc n))⟧ &lt;br /&gt;
                ⟹ P x&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Lema: Los números pares son divisibles por 2.&lt;br /&gt;
*} &lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;1ª demostración (detallada)&amp;quot;&lt;br /&gt;
lemma par_imp_dvd: &lt;br /&gt;
  &amp;quot;n ∈ par ⟹ 2 dvd n&amp;quot;&lt;br /&gt;
proof (induction rule: par.induct)&lt;br /&gt;
  show &amp;quot;2 dvd (0::nat)&amp;quot; by (simp_all add: dvd_def)&lt;br /&gt;
next&lt;br /&gt;
  fix n::nat&lt;br /&gt;
  assume H1: &amp;quot;n ∈ par&amp;quot; and&lt;br /&gt;
         H2: &amp;quot;2 dvd n&amp;quot;&lt;br /&gt;
  have &amp;quot;∃k. n = 2*k&amp;quot; using H2 by (simp add: dvd_def)&lt;br /&gt;
  then obtain k where &amp;quot;n = 2*k&amp;quot; ..&lt;br /&gt;
  hence &amp;quot;Suc (Suc n) = 2*(k+1)&amp;quot; by auto&lt;br /&gt;
  hence &amp;quot;∃k. Suc (Suc n) = 2*k&amp;quot; ..&lt;br /&gt;
  thus &amp;quot;2 dvd Suc (Suc n)&amp;quot; by (simp add: dvd_def)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;2ª demostración (con arith)&amp;quot;&lt;br /&gt;
lemma par_imp_dvd_2: &lt;br /&gt;
  &amp;quot;n ∈ par ⟹ 2 dvd n&amp;quot;&lt;br /&gt;
proof (induction rule: par.induct)&lt;br /&gt;
  show &amp;quot;2 dvd (0::nat)&amp;quot; by (simp_all add: dvd_def)&lt;br /&gt;
next&lt;br /&gt;
  fix n::nat&lt;br /&gt;
  assume H1: &amp;quot;n ∈ par&amp;quot; and&lt;br /&gt;
         H2: &amp;quot;2 dvd n&amp;quot;&lt;br /&gt;
  thus &amp;quot;2 dvd Suc (Suc n)&amp;quot; by (auto simp add: dvd_def, arith)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;3ª demostración (automática)&amp;quot;&lt;br /&gt;
lemma par_imp_dvd_3: &lt;br /&gt;
  &amp;quot;n ∈ par ⟹ 2 dvd n&amp;quot;&lt;br /&gt;
by (induction rule:par.induct) (auto simp add: dvd_def, arith)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Lema: Un número n es par syss es divisible por 2. &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
theorem par_iff_dvd: &amp;quot;(n ∈ par) = (2 dvd n)&amp;quot;&lt;br /&gt;
by (blast intro: dvd_imp_par par_imp_dvd)&lt;br /&gt;
&lt;br /&gt;
subsection{* Generalización y regla de inducción *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  · Antes de aplicar inducción se debe de generalizar la fórmula a&lt;br /&gt;
    probar.&lt;br /&gt;
 &lt;br /&gt;
  · Vamos a ilustrar el principio anterior en el caso de los conjuntos&lt;br /&gt;
    inductivamente definidos, con el siguiente ejemplo: si n+2 es par,&lt;br /&gt;
    entonces n también lo es.&lt;br /&gt;
&lt;br /&gt;
  · El siguiente intento falla:&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;Suc (Suc n) ∈ par ⟹ n ∈ par&amp;quot;&lt;br /&gt;
apply (erule par.induct) &lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  En el intento anterior, los subobjetivos generados son&lt;br /&gt;
     1. n ∈ par&lt;br /&gt;
     2. ⋀na. ⟦na ∈ par; n ∈ par⟧ ⟹ n ∈ par&lt;br /&gt;
  que no se pueden demostrar.&lt;br /&gt;
&lt;br /&gt;
  Se ha perdido la información sobre Suc (Suc n).&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Reformulación del lema: Si n es par, entonces n-2 también lo es.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma par_imp_par_menos_2: &lt;br /&gt;
  &amp;quot;n ∈ par ⟹ n - 2 ∈ par&amp;quot;&lt;br /&gt;
by (induction rule:par.induct) auto&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma &amp;quot;n ∈  par ⟹ n - 2 ∈ par&amp;quot;&lt;br /&gt;
proof (induction rule:par.induct)&lt;br /&gt;
  show &amp;quot;0 - 2 ∈ par&amp;quot; by auto&lt;br /&gt;
next&lt;br /&gt;
  show &amp;quot;⋀n. ⟦n ∈ par; n - 2 ∈ par⟧ ⟹ Suc (Suc n) - 2 ∈ par&amp;quot; by auto&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Con el lema anterior se puede demostrar el original.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma&lt;br /&gt;
  assumes &amp;quot;Suc (Suc n) ∈ par&amp;quot; &lt;br /&gt;
  shows   &amp;quot;n ∈ par&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;Suc (Suc n) - 2 ∈ par&amp;quot; using assms by (rule par_imp_par_menos_2)&lt;br /&gt;
  thus &amp;quot;n ∈ par&amp;quot; by simp &lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración aplicativa es&amp;quot;&lt;br /&gt;
lemma &lt;br /&gt;
  &amp;quot;Suc (Suc n) ∈ par ⟹ n ∈ par&amp;quot;&lt;br /&gt;
apply (drule par_imp_par_menos_2) &lt;br /&gt;
apply (simp)&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
(* Comentar el uso de drule *)&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma Suc_Suc_par_imp_par: &lt;br /&gt;
  &amp;quot;Suc (Suc n) ∈ par ⟹ n ∈ par&amp;quot;&lt;br /&gt;
by (drule par_imp_par_menos_2, simp)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Lemma. Un número natural n es par syss n+2 es par.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma [iff]: &amp;quot;((Suc (Suc n)) ∈ par) = (n ∈ par)&amp;quot;&lt;br /&gt;
by (blast dest: Suc_Suc_par_imp_par)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Se usa el atributo &amp;quot;iff&amp;quot; porque sirve como regla de simplificación.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
subsection {* Definiciones mutuamente inductivas *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Definición cruzada de los conjuntos inductivos de los pares y de los &lt;br /&gt;
  impares:&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
inductive_set&lt;br /&gt;
  Pares    :: &amp;quot;nat set&amp;quot; and&lt;br /&gt;
  Impares  :: &amp;quot;nat set&amp;quot;&lt;br /&gt;
where&lt;br /&gt;
  ceroP:    &amp;quot;0 ∈ Pares&amp;quot;&lt;br /&gt;
| ParesI:   &amp;quot;n ∈ Impares ⟹ Suc n ∈ Pares&amp;quot;&lt;br /&gt;
| ImparesI: &amp;quot;n ∈ Pares   ⟹ Suc n ∈ Impares&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  El esquema de inducción generado por la definición anterior es&lt;br /&gt;
  · Pares_Impares.induct:&lt;br /&gt;
    ⟦P1 0; &lt;br /&gt;
     ⋀n. ⟦n ∈ Impares; P2 n⟧ ⟹ P1 (Suc n);&lt;br /&gt;
     ⋀n. ⟦n ∈ Pares;   P1 n⟧ ⟹ P2 (Suc n)⟧&lt;br /&gt;
    ⟹ (x1 ∈ Pares ⟶ P1 x1) ∧ (x2 ∈ Impares ⟶ P2 x2)&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Ejemplo de demostración usando el esquema anterior.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;(m ∈ Pares ⟶ 2 dvd m) ∧ (n ∈ Impares ⟶ 2 dvd (Suc n))&amp;quot;&lt;br /&gt;
proof (induction rule:Pares_Impares.induct)&lt;br /&gt;
  show &amp;quot;2 dvd (0::nat)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix n :: &amp;quot;nat&amp;quot;&lt;br /&gt;
  assume H1: &amp;quot;n ∈ Impares&amp;quot; and&lt;br /&gt;
         H2: &amp;quot;2 dvd Suc n&amp;quot;&lt;br /&gt;
  show &amp;quot;2 dvd Suc n&amp;quot; using H2 by simp&lt;br /&gt;
next&lt;br /&gt;
  fix n :: &amp;quot;nat&amp;quot;&lt;br /&gt;
  assume H1: &amp;quot;n ∈ Pares&amp;quot; and&lt;br /&gt;
         H2: &amp;quot;2 dvd n&amp;quot;&lt;br /&gt;
  have &amp;quot;∃k. n = 2*k&amp;quot; using H2 by (simp add: dvd_def)&lt;br /&gt;
  then obtain k where &amp;quot;n = 2*k&amp;quot; ..&lt;br /&gt;
  hence &amp;quot;Suc (Suc n) = 2*(k+1)&amp;quot; by auto&lt;br /&gt;
  hence &amp;quot;∃k. Suc (Suc n) = 2*k&amp;quot; ..&lt;br /&gt;
  thus &amp;quot;2 dvd Suc (Suc n)&amp;quot; by (simp add: dvd_def)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
subsection {* Definición inductiva de predicados *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Definición inductiva del predicado es_par tal que (es_par n) se&lt;br /&gt;
  verifica si n es par.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
inductive es_par :: &amp;quot;nat ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;es_par 0&amp;quot; &lt;br /&gt;
| &amp;quot;es_par n ⟹ es_par(Suc(Suc n))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Heurística para elegir entre definir conjuntos o predicados:&lt;br /&gt;
  · si se va a combinar con operaciones conjuntistas, definir conjunto;&lt;br /&gt;
  · en caso contrario, definir predicado.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
section {* La clausura reflexiva transitiva *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  · Las definiciones inductivas aceptan parámetros; por tanto, permite&lt;br /&gt;
    expresar funciones que construyen conjuntos.&lt;br /&gt;
&lt;br /&gt;
  · La relaciones binarias son conjuntos de pares; por tanto, se pueden&lt;br /&gt;
    definir inductivamente.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  · La clausura reflexiva y transitiva de una relación r es la menor&lt;br /&gt;
    relación reflexiva y transitiva que contiene a r. &lt;br /&gt;
&lt;br /&gt;
  · Se representa por r*.&lt;br /&gt;
&lt;br /&gt;
  · Se puede definir inductivamente:&lt;br /&gt;
    · (x,x) ∈ r*&lt;br /&gt;
    · Si (x,y) ∈ r e (y,z) ∈ r*, entonces (x,z) ∈ r*&lt;br /&gt;
&lt;br /&gt;
  · La definición inductiva se puede expresar en Isabelle/HOL como&lt;br /&gt;
    sigue: &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
inductive_set&lt;br /&gt;
  crt :: &amp;quot;(&amp;#039;a × &amp;#039;a) set ⇒ (&amp;#039;a × &amp;#039;a) set&amp;quot;   (&amp;quot;_*&amp;quot; [1000] 999)&lt;br /&gt;
  for r :: &amp;quot;(&amp;#039;a × &amp;#039;a) set&amp;quot;&lt;br /&gt;
where&lt;br /&gt;
  crt_refl [iff]: &amp;quot;(x,x) ∈ r*&amp;quot;&lt;br /&gt;
| crt_paso:       &amp;quot;⟦ (x,y) ∈ r; (y,z) ∈ r* ⟧ ⟹ (x,z) ∈ r*&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Notas:&lt;br /&gt;
  · La sintaxis concreta permite escribir r* en lugar de (crt r).&lt;br /&gt;
  · La definición consta de dos reglas.&lt;br /&gt;
  · A la regla reflexiva se le añade el atributo iff para aumentar la&lt;br /&gt;
    automatización. &lt;br /&gt;
  · A la regla del paso no se le añade ningún atributo, porque r* ocurre&lt;br /&gt;
    en la izquierda. &lt;br /&gt;
  · En el resto de esta sección se demuestra que esta definición&lt;br /&gt;
    coincide con la menor relación reflexiva y transitiva que contiene a&lt;br /&gt;
    r.  &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Lema. La relación r* contiene a r.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma [intro]: &amp;quot;(x,y) ∈ r ⟹ (x,y) ∈ r*&amp;quot;&lt;br /&gt;
by (blast intro: crt_paso)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Notas:&lt;br /&gt;
  · La ventaja del lema es que se puede declarar como regla de&lt;br /&gt;
    introducción, porque r* ocurre sólo en la derecha.&lt;br /&gt;
  · Con la declaración, algunas demostraciones que usan crt_paso se&lt;br /&gt;
    hacen de manera automática.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  El esquema de inducción de la clausura reflexiva transitiva es&lt;br /&gt;
  · crt.induct:&lt;br /&gt;
    ⟦(x1, x2) ∈ r*; &lt;br /&gt;
     ⋀x. P x x; &lt;br /&gt;
     ⋀x y z. ⟦(x,y) ∈ r; (y,z) ∈ r*; P y z⟧ ⟹ P x z⟧&lt;br /&gt;
    ⟹ P x1 x2&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Lema. La relación r* es transitiva.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma crt_trans: &amp;quot;⟦ (x,y) ∈ r*; (y,z) ∈ r* ⟧ ⟹ (x,z) ∈ r*&amp;quot;&lt;br /&gt;
proof (induction rule:crt.induct)&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  · El caso base que genera es&lt;br /&gt;
       ⋀x. (y, z) ∈ r* ⟹ (x, z) ∈ r*&lt;br /&gt;
    que no se puede demostrar.&lt;br /&gt;
&lt;br /&gt;
  · El problema está que que en la conclusión no aparece la y. Se puede&lt;br /&gt;
    reformular como sigue:&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma crt_trans [rule_format]:&lt;br /&gt;
  &amp;quot;(x,y) ∈ r* ⟹ (y,z) ∈ r* ⟶ (x,z) ∈ r*&amp;quot;&lt;br /&gt;
proof (induction rule:crt.induct)&lt;br /&gt;
  show &amp;quot;⋀x. (x,z) ∈ r* ⟶ (x,z) ∈ r*&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x y u&lt;br /&gt;
  assume H1: &amp;quot;(x,y) ∈ r&amp;quot; and&lt;br /&gt;
         H2: &amp;quot;(y,u) ∈ r*&amp;quot; and&lt;br /&gt;
         H3: &amp;quot;(u,z) ∈ r* ⟶ (y,z) ∈ r*&amp;quot;&lt;br /&gt;
  show &amp;quot;(u,z) ∈ r* ⟶ (x,z) ∈ r*&amp;quot;&lt;br /&gt;
  proof&lt;br /&gt;
    assume &amp;quot;(u,z) ∈ r*&amp;quot;&lt;br /&gt;
    with H3 have &amp;quot;(y,z) ∈ r*&amp;quot; ..&lt;br /&gt;
    with H1 show &amp;quot;(x,z) ∈ r*&amp;quot; by (rule crt_paso) &lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Notas:&lt;br /&gt;
  · La reformulación anterior es un caso particular de la siguiente&lt;br /&gt;
    heurística:&lt;br /&gt;
       &amp;quot;Para probar una fórmula por inducción sobre (x1,...,xn) ∈ R,&lt;br /&gt;
       poner todas las premisas conteniendo cualquiera de lax xi en la&lt;br /&gt;
       conclusión usando ⟶&amp;quot;. &lt;br /&gt;
  · El atributo &amp;quot;rule_format&amp;quot; transforma ⟶ en ⟹.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  (crt2 r) es la menor relación reflexiva y transitiva que contiene a r.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
inductive_set&lt;br /&gt;
  crt2 :: &amp;quot;(&amp;#039;a × &amp;#039;a)set ⇒ (&amp;#039;a × &amp;#039;a)set&amp;quot;&lt;br /&gt;
  for r :: &amp;quot;(&amp;#039;a × &amp;#039;a)set&amp;quot;&lt;br /&gt;
where&lt;br /&gt;
  &amp;quot;(x,y) ∈ r ⟹ (x,y) ∈ crt2 r&amp;quot;&lt;br /&gt;
| &amp;quot;(x,x) ∈ crt2 r&amp;quot;&lt;br /&gt;
| &amp;quot;⟦ (x,y) ∈ crt2 r; (y,z) ∈ crt2 r ⟧ ⟹ (x,z) ∈ crt2 r&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Lema. La relación (crt2 r) está contenida en r*.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;(x,y) ∈ crt2 r ⟹ (x,y) ∈ r*&amp;quot;&lt;br /&gt;
proof (induction rule: crt2.induct)&lt;br /&gt;
  fix x y&lt;br /&gt;
  assume &amp;quot;(x,y) ∈ r&amp;quot;&lt;br /&gt;
  thus &amp;quot;(x,y) ∈ r*&amp;quot; by blast&lt;br /&gt;
next&lt;br /&gt;
  fix x&lt;br /&gt;
  show &amp;quot;(x,x) ∈ r*&amp;quot; by blast&lt;br /&gt;
next&lt;br /&gt;
  fix x y z&lt;br /&gt;
  assume H1: &amp;quot;(x,y) ∈ crt2 r&amp;quot; and&lt;br /&gt;
         H2: &amp;quot;(x,y) ∈ r*&amp;quot;     and&lt;br /&gt;
         H3: &amp;quot;(y,z) ∈ crt2 r&amp;quot; and &lt;br /&gt;
         H4: &amp;quot;(y,z) ∈ r*&amp;quot;&lt;br /&gt;
  show &amp;quot;(x,z) ∈ r*&amp;quot; using H2 H4 by (blast intro: crt_trans)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Lema. La relación r* está contenida en (crt2 r).&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;(x,y) ∈ r* ⟹ (x,y) ∈ crt2 r&amp;quot;&lt;br /&gt;
proof (induction rule:crt.induct)&lt;br /&gt;
  fix x&lt;br /&gt;
  show &amp;quot;(x,x) ∈ crt2 r&amp;quot; by (rule crt2.intros(2))&lt;br /&gt;
next&lt;br /&gt;
  fix x y z&lt;br /&gt;
  assume H1: &amp;quot;(x,y) ∈ r&amp;quot; and &lt;br /&gt;
         H2: &amp;quot;(y,z) ∈ r*&amp;quot; and &lt;br /&gt;
         H3: &amp;quot;(y,z) ∈ crt2 r&amp;quot;&lt;br /&gt;
  have &amp;quot;(x,y) ∈ crt2 r&amp;quot; using H1 by (rule crt2.intros(1))&lt;br /&gt;
  thus &amp;quot;(x,z) ∈ crt2 r&amp;quot; using H3 by (rule crt2.intros(3))&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Ejercicio: Demostrar que si (x,y) ∈ r* e (y,z) ∈ r, entonces &lt;br /&gt;
  (x,z) ∈ r*&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma crt_paso2 [rule_format]: &lt;br /&gt;
  &amp;quot;(x,y) ∈ r* ⟹ (y,z) ∈ r ⟶ (x,z) : r*&amp;quot;&lt;br /&gt;
proof (induction rule: crt.induct)&lt;br /&gt;
  fix x&lt;br /&gt;
  show &amp;quot;(x,z) ∈ r ⟶ (x,z) ∈ r*&amp;quot;&lt;br /&gt;
  proof&lt;br /&gt;
    assume &amp;quot;(x,z) ∈ r&amp;quot;&lt;br /&gt;
    thus &amp;quot;(x,z) ∈ r*&amp;quot; by blast&lt;br /&gt;
  qed&lt;br /&gt;
next&lt;br /&gt;
  fix x y u&lt;br /&gt;
  assume H1: &amp;quot;(x,y) ∈ r&amp;quot; and &lt;br /&gt;
         H2: &amp;quot;(y,u) ∈ r*&amp;quot; and &lt;br /&gt;
         H3: &amp;quot;(u,z) ∈ r ⟶ (y,z) ∈ r*&amp;quot;&lt;br /&gt;
  show &amp;quot;(u,z) ∈ r ⟶ (x,z) ∈ r*&amp;quot;&lt;br /&gt;
  proof&lt;br /&gt;
    assume &amp;quot;(u,z) ∈ r&amp;quot;&lt;br /&gt;
    with H3 have &amp;quot;(y,z) ∈ r*&amp;quot; ..&lt;br /&gt;
    with H1 show &amp;quot;(x,z) ∈ r*&amp;quot; by (rule crt_paso)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
section {* Definiciones inductivas avanzadas *}&lt;br /&gt;
&lt;br /&gt;
subsection {* Cuantificadores universales en las reglas de introducción&lt;br /&gt;
  (términos básicos) *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Como caso de estudio se presenta la teoría de los términos básicos&lt;br /&gt;
  (i.e. sin variables).&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  · Un término básico se obtiene aplicando una función a una lista de&lt;br /&gt;
    términos básicos.&lt;br /&gt;
  &lt;br /&gt;
  · Las constantes se representan mediante funciones 0-arias.&lt;br /&gt;
&lt;br /&gt;
  · terminoB es el tipo de los términos básicos.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
datatype &amp;#039;f terminoB = Aplica &amp;#039;f &amp;quot;&amp;#039;f terminoB list&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  op_entera es el tipo de las operaciones enteras y está formado por las&lt;br /&gt;
  constantes enteras, el opuesto y la suma. &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
datatype op_entera = Numero int | Opuesto | Suma&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  El tipo &amp;quot;op_entera terminoB&amp;quot; está formado por los términos básicos con&lt;br /&gt;
  operaciones enteras. &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  El conjunto de los téminos básicos sobre un conjunto de símbolos de&lt;br /&gt;
  función F se define inductivamente:&lt;br /&gt;
     si f ∈ F y t1,...,tn son términos básicos sobre F, entonces&lt;br /&gt;
     f(t1,...,tn) es un término básico sobre F.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
inductive_set terminosB :: &amp;quot;&amp;#039;f set ⇒ &amp;#039;f terminoB set&amp;quot;&lt;br /&gt;
  for F :: &amp;quot;&amp;#039;f set&amp;quot;&lt;br /&gt;
  where&lt;br /&gt;
  paso [intro!]: &amp;quot;⟦∀t ∈ set args. t ∈ terminosB F;  f ∈ F⟧&lt;br /&gt;
                  ⟹ (Aplica f args) ∈ terminosB F&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Ejemplo de demostración sobre el conjunto de los términos básicos: &lt;br /&gt;
  Lema: terminosB es monótona; es decir, si F ⊆ G, entonces&lt;br /&gt;
  terminosB F ⊆ terminosB G.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma terminosB_mono: &lt;br /&gt;
  assumes &amp;quot;F ⊆ G&amp;quot;&lt;br /&gt;
  shows &amp;quot;terminosB F ⊆ terminosB G&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;⋀x. x ∈ terminosB F ⟹ x ∈ terminosB G&amp;quot;&lt;br /&gt;
  proof (rule terminosB.induct)&lt;br /&gt;
    fix x ys f&lt;br /&gt;
    assume H1: &amp;quot;∀t ∈ set ys. t ∈ terminosB F ∧ t ∈ terminosB G&amp;quot; and &lt;br /&gt;
           H2: &amp;quot;f ∈ F&amp;quot;&lt;br /&gt;
    have &amp;quot;∀t ∈ set ys. t ∈ terminosB G&amp;quot; using H1 by simp&lt;br /&gt;
    thus &amp;quot;(Aplica f ys) ∈ terminosB G&amp;quot; using assms H2 by blast&lt;br /&gt;
  qed&lt;br /&gt;
  thus ?thesis ..&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  · La aridad de un símbolo de función es el número de argumentos a los&lt;br /&gt;
    que se puede aplicar.&lt;br /&gt;
&lt;br /&gt;
  · Un término está bien formado si la longitud de la lista de&lt;br /&gt;
    argumentos de cada símbolo de función es igual a su aridad.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
inductive_set&lt;br /&gt;
  terminoB_bien_formado :: &amp;quot;(&amp;#039;f ⇒ nat) ⇒ &amp;#039;f terminoB set&amp;quot;&lt;br /&gt;
  for aridad :: &amp;quot;&amp;#039;f ⇒ nat&amp;quot;&lt;br /&gt;
where&lt;br /&gt;
paso [intro!]: &amp;quot;⟦∀t ∈ set args. t ∈ terminoB_bien_formado aridad;  &lt;br /&gt;
                 length args = aridad f⟧&lt;br /&gt;
                ⟹ (Aplica f args) ∈ terminoB_bien_formado aridad&amp;quot;&lt;br /&gt;
&lt;br /&gt;
subsection {* Definición alternativa mediante una función monótona *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  En la siguiente definición se usa&lt;br /&gt;
  · &amp;quot;lists A&amp;quot; que es el conjunto de las listas cuyos elementos &lt;br /&gt;
    pertenecen conjunto A. Está definido en la teoría Lists por&lt;br /&gt;
       inductive_set&lt;br /&gt;
         lists :: &amp;quot;&amp;#039;a set =&amp;gt; &amp;#039;a list set&amp;quot;&lt;br /&gt;
         for A :: &amp;quot;&amp;#039;a set&amp;quot;&lt;br /&gt;
       where&lt;br /&gt;
           &amp;quot;[] ∈ lists A&amp;quot;&lt;br /&gt;
         | &amp;quot;⟦ a ∈ A; l ∈ lists A ⟧ ⟹ a # l ∈ lists A&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  · Para demostrar la terminación, se usa el lema&lt;br /&gt;
    lists_mono: A ⊆ B ⟹ lists A ⊆ lists B&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
inductive_set&lt;br /&gt;
  terminoB_bien_formado&amp;#039; :: &amp;quot;(&amp;#039;f ⇒ nat) ⇒ &amp;#039;f terminoB set&amp;quot;&lt;br /&gt;
  for aridad :: &amp;quot;&amp;#039;f ⇒ nat&amp;quot;&lt;br /&gt;
where&lt;br /&gt;
paso [intro!]: &amp;quot;⟦args ∈ lists (terminoB_bien_formado&amp;#039; aridad);  &lt;br /&gt;
                 length args = aridad f⟧&lt;br /&gt;
                ⟹ (Aplica f args) ∈ terminoB_bien_formado&amp;#039; aridad&amp;quot;&lt;br /&gt;
monos lists_mono&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  El uso de lists_mono no es necesario. Se incluye para mostrar la&lt;br /&gt;
  sintaxis de la declaración de &amp;quot;monos&amp;quot;.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
subsection {* Demostración de equivalencia *}&lt;br /&gt;
&lt;br /&gt;
lemma &lt;br /&gt;
  &amp;quot;terminoB_bien_formado aridad ⊆ terminoB_bien_formado&amp;#039; aridad&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;⋀x. x ∈ terminoB_bien_formado aridad ⟹&lt;br /&gt;
            x ∈ terminoB_bien_formado&amp;#039; aridad&amp;quot;&lt;br /&gt;
  proof (erule terminoB_bien_formado.induct)&lt;br /&gt;
    fix x ys f&lt;br /&gt;
    assume H1: &amp;quot;∀t ∈ set ys. t ∈ terminoB_bien_formado aridad ∧&lt;br /&gt;
                             t ∈ terminoB_bien_formado&amp;#039; aridad&amp;quot; and&lt;br /&gt;
           H2: &amp;quot;length ys = aridad f&amp;quot;&lt;br /&gt;
    thus &amp;quot;Aplica f ys ∈ terminoB_bien_formado&amp;#039; aridad&amp;quot; by auto&lt;br /&gt;
  qed&lt;br /&gt;
  thus ?thesis ..&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma &lt;br /&gt;
  &amp;quot;terminoB_bien_formado&amp;#039; aridad ⊆ terminoB_bien_formado aridad&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;⋀x. x ∈ terminoB_bien_formado&amp;#039; aridad ⟹&lt;br /&gt;
            x ∈ terminoB_bien_formado aridad&amp;quot;&lt;br /&gt;
  proof (erule terminoB_bien_formado&amp;#039;.induct)&lt;br /&gt;
    fix x ys f&lt;br /&gt;
    assume H1: &amp;quot;ys ∈ lists (terminoB_bien_formado&amp;#039; aridad ∩&lt;br /&gt;
                            {a. a ∈ terminoB_bien_formado aridad})&amp;quot; and&lt;br /&gt;
           H2: &amp;quot;length ys = aridad f&amp;quot;&lt;br /&gt;
    have &amp;quot;ys ∈ lists (terminoB_bien_formado&amp;#039; aridad) ∩&lt;br /&gt;
               lists (terminoB_bien_formado aridad)&amp;quot;&lt;br /&gt;
      using H1 by (simp add: lists_Int_eq)&lt;br /&gt;
    hence &amp;quot;ys ∈ lists (terminoB_bien_formado aridad)&amp;quot; by simp&lt;br /&gt;
    thus &amp;quot;Aplica f ys ∈ terminoB_bien_formado aridad&amp;quot; using H2 by auto &lt;br /&gt;
  qed&lt;br /&gt;
  thus ?thesis ..&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración anterior se puede simplificar:&amp;quot;&lt;br /&gt;
lemma &lt;br /&gt;
  &amp;quot;terminoB_bien_formado&amp;#039; aridad ⊆ terminoB_bien_formado aridad&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;⋀x. x ∈ terminoB_bien_formado&amp;#039; aridad ⟹&lt;br /&gt;
            x ∈ terminoB_bien_formado aridad&amp;quot;&lt;br /&gt;
  proof (erule terminoB_bien_formado&amp;#039;.induct)&lt;br /&gt;
    fix x ys f&lt;br /&gt;
    assume &amp;quot;ys ∈ lists (terminoB_bien_formado&amp;#039; aridad ∩&lt;br /&gt;
                        {a. a ∈ terminoB_bien_formado aridad})&amp;quot;&lt;br /&gt;
           &amp;quot;length ys = aridad f&amp;quot;&lt;br /&gt;
    thus &amp;quot;Aplica f ys ∈ terminoB_bien_formado aridad&amp;quot; by auto &lt;br /&gt;
  qed&lt;br /&gt;
  thus ?thesis ..&lt;br /&gt;
qed&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>