<?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=R13</id>
	<title>R13 - 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=R13"/>
	<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2019/index.php?title=R13&amp;action=history"/>
	<updated>2026-07-19T12:20:21Z</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=R13&amp;diff=716&amp;oldid=prev</id>
		<title>Mjoseh en 06:48 21 may 2019</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2019/index.php?title=R13&amp;diff=716&amp;oldid=prev"/>
		<updated>2019-05-21T06:48:07Z</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 06:48 21 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>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2019/index.php?title=R13&amp;diff=715&amp;oldid=prev</id>
		<title>Mjoseh en 06:47 21 may 2019</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2019/index.php?title=R13&amp;diff=715&amp;oldid=prev"/>
		<updated>2019-05-21T06:47:55Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;a href=&quot;https://www.glc.us.es/~jalonso/LMF2019/index.php?title=R13&amp;amp;diff=715&amp;amp;oldid=714&quot;&gt;Mostrar los cambios&lt;/a&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2019/index.php?title=R13&amp;diff=714&amp;oldid=prev</id>
		<title>Mjoseh en 06:46 21 may 2019</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2019/index.php?title=R13&amp;diff=714&amp;oldid=prev"/>
		<updated>2019-05-21T06:46:50Z</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 {* R13: Definiciones inductivas: clausuras *}&lt;br /&gt;
&lt;br /&gt;
theory R13&lt;br /&gt;
imports Main&lt;br /&gt;
begin&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, como conjunto:&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, como conjunto, se puede expresar en &lt;br /&gt;
   Isabelle/HOL como 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* es reflexiva.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;(x,x) ∈ r*&amp;quot;&lt;br /&gt;
  oops&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;
(* La demostración aplicativa es *)&lt;br /&gt;
lemma &amp;quot;(x,y) ∈ r ⟹ (x,y) ∈ r*&amp;quot;  &lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
(* La demostración automática es *)&lt;br /&gt;
lemma r_contenida_clausura [intro]: &lt;br /&gt;
  &amp;quot;(x,y) ∈ r ⟹ (x,y) ∈ r*&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
    &lt;br /&gt;
(* La demostración declarativa es *)&lt;br /&gt;
lemma &amp;quot;(x,y) ∈ r ⟹ (x,y) ∈ r*&amp;quot;  &lt;br /&gt;
  oops&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;
(* La demostración aplicativa es *)&lt;br /&gt;
lemma &amp;quot;⟦(x,y) ∈ r*; (y,z) ∈ r*⟧ ⟹ (x,z) ∈ r*&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;⟦ (x,y) ∈ r*; (y,z) ∈ r* ⟧ ⟹ (x,z) ∈ r*&amp;quot;&lt;br /&gt;
  oops &lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Otra formulación del lema, con la variable y a la derecha.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* La demostración aplicativa es *)&lt;br /&gt;
lemma &amp;quot;(x,y) ∈ r* ⟹ (y,z) ∈ r* ⟶ (x,z) ∈ r*&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
  &lt;br /&gt;
(* La demostración automática es *)&lt;br /&gt;
lemma &amp;quot;(x,y) ∈ r* ⟹ (y,z) ∈ r* ⟶ (x,z) ∈ r*&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
(* La demostración declarativa es *)&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;
  oops&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;
  La relación r* está contenida en cualquier relación reflexiva y &lt;br /&gt;
  transitiva que contenga a r.&lt;br /&gt;
&lt;br /&gt;
  Mediante (crt2 r) se define la menor relación reflexiva y transitiva &lt;br /&gt;
  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;                      (* contiene a r *) &lt;br /&gt;
| &amp;quot;(x,x) ∈ crt2 r&amp;quot;                                      (* reflexiva *)&lt;br /&gt;
| &amp;quot;⟦(x,y) ∈ crt2 r; (y,z) ∈ crt2 r⟧ ⟹ (x,z) ∈ crt2 r&amp;quot; (* transitiva *)&lt;br /&gt;
&lt;br /&gt;
text {* Probaremos que r* coincide con (crt2 r) *}&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;
(* La demostración aplicativa es *)&lt;br /&gt;
lemma &amp;quot;(x,y) ∈ crt2 r ⟹ (x,y) ∈ r*&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
(* La demostración automática es *)&lt;br /&gt;
lemma &amp;quot;(x,y) ∈ crt2 r ⟹ (x,y) ∈ r*&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
(* La demostración declarativa es *)&lt;br /&gt;
lemma &amp;quot;(x,y) ∈ crt2 r ⟹ (x,y) ∈ r*&amp;quot;&lt;br /&gt;
  oops&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;
(* La demostración aplicativa es *)&lt;br /&gt;
lemma &amp;quot;(x,y) ∈ r* ⟹ (x,y) ∈ crt2 r&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
(* La demostración automática es *)&lt;br /&gt;
lemma &amp;quot;(x,y) ∈ r* ⟹ (x,y) ∈ crt2 r&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
(* La demostración declarativa es *)&lt;br /&gt;
lemma &amp;quot;(x,y) ∈ r* ⟹ (x,y) ∈ crt2 r&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* ---------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. 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;
(* Demostración aplicativa *)&lt;br /&gt;
lemma &amp;quot;(x,y) ∈ r* ⟹ (y,z) ∈ r ⟶ (x,z) ∈ r*&amp;quot;&lt;br /&gt;
  oops &lt;br /&gt;
&lt;br /&gt;
(* Demostración aplicativa *)&lt;br /&gt;
lemma &amp;quot;(x,y) ∈ r* ⟹ (y,z) ∈ r ⟶ (x,z) ∈ r*&amp;quot;&lt;br /&gt;
  oops &lt;br /&gt;
&lt;br /&gt;
(* Demostración declarativa *)&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;
   oops &lt;br /&gt;
&lt;br /&gt;
text {* ---------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Considerar la siguiente definición de la clausura tran-&lt;br /&gt;
  sitiva de una relación r, y probar que es la menor relación reflexiva &lt;br /&gt;
  y transitiva que contiene a r.&lt;br /&gt;
&lt;br /&gt;
  Nota: Establecer los lemas necesarios.&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
inductive star&amp;#039; :: &amp;quot;(&amp;#039;a ⇒ &amp;#039;a ⇒ bool) ⇒ &amp;#039;a ⇒ &amp;#039;a ⇒ bool&amp;quot; for r where&lt;br /&gt;
  refl&amp;#039;: &amp;quot;star&amp;#039; r x x&amp;quot; &lt;br /&gt;
| step&amp;#039;: &amp;quot;star&amp;#039; r x y ⟹ r y z ⟹ star&amp;#039; r x z&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* Demostración de que (star&amp;#039; r) es reflexiva *)&lt;br /&gt;
lemma star&amp;#039;Refl: &amp;quot;star&amp;#039; r x x&amp;quot;&lt;br /&gt;
  oops &lt;br /&gt;
&lt;br /&gt;
(* Demostración aplicativa de r contenida en (star&amp;#039; r) *)&lt;br /&gt;
lemma &amp;quot;r x y ⟹ star&amp;#039; r x y&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
(* Demostración automática de r contenida en (star&amp;#039; r) *)&lt;br /&gt;
lemma &amp;quot;r x y ⟹ star&amp;#039; r x y&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
(* Demostración declarativa de r contenida en (star&amp;#039; r) *)&lt;br /&gt;
lemma rsubsetStar&amp;#039;: &amp;quot;r x y ⟹ star&amp;#039; r x y&amp;quot;&lt;br /&gt;
   oops &lt;br /&gt;
&lt;br /&gt;
text {* A continuación se prueba una condición suficiente para star&amp;#039; r *}&lt;br /&gt;
&lt;br /&gt;
(* Demostración aplicativa *)&lt;br /&gt;
lemma &lt;br /&gt;
  &amp;quot;⟦star&amp;#039; r y z; r x y⟧ ⟹ star&amp;#039; r x z&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
(* Demostración automática *)&lt;br /&gt;
lemma star&amp;#039;_subset_star&amp;#039;_l1:&lt;br /&gt;
  &amp;quot;⟦star&amp;#039; r y z; r x y⟧ ⟹ star&amp;#039; r x z&amp;quot;&lt;br /&gt;
  oops &lt;br /&gt;
&lt;br /&gt;
(* Demostraciones de que  (star&amp;#039; r) es transitiva *)&lt;br /&gt;
&lt;br /&gt;
(* Demostración aplicativa *)&lt;br /&gt;
lemma &amp;quot;⟦star&amp;#039; r x y; star&amp;#039; r y z⟧ ⟹ star&amp;#039; r x z&amp;quot;   &lt;br /&gt;
  oops &lt;br /&gt;
&lt;br /&gt;
(* Demostración automática *)&lt;br /&gt;
lemma star&amp;#039;Trans: &lt;br /&gt;
  &amp;quot;⟦star&amp;#039; r x y; star&amp;#039; r y z⟧ ⟹ star&amp;#039; r x z&amp;quot;&lt;br /&gt;
  oops &lt;br /&gt;
   &lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. Considerar la siguiente definición inductiva. Probar que &lt;br /&gt;
  &amp;quot;star&amp;#039; r x y syss (∃n. iter r n x y)&amp;quot;&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
inductive iter :: &amp;quot;(&amp;#039;a ⇒ &amp;#039;a ⇒ bool) ⇒ nat ⇒ &amp;#039;a ⇒ &amp;#039;a ⇒ bool&amp;quot;&lt;br /&gt;
for r where&lt;br /&gt;
  iterRefl: &amp;quot;iter r 0 x x&amp;quot;&lt;br /&gt;
| iterStep: &amp;quot;⟦iter r n x y; r y z⟧ ⟹ iter r (n+1) x z&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* El esquema de inducción correspondiente es *)&lt;br /&gt;
thm iter.induct&lt;br /&gt;
(*&lt;br /&gt;
  ⟦iter ?r ?x1.0 ?x2.0 ?x3.0; &lt;br /&gt;
   ⋀x. ?P 0 x x;&lt;br /&gt;
   ⋀n x y z. ⟦iter ?r n x y; ?P n x y; ?r y z⟧ ⟹ ?P (n + 1) x z⟧&lt;br /&gt;
  ⟹ ?P ?x1.0 ?x2.0 ?x3.0&lt;br /&gt;
*)&lt;br /&gt;
&lt;br /&gt;
(* Algunos teoremas derivados son *)&lt;br /&gt;
&lt;br /&gt;
thm iterRefl&lt;br /&gt;
(* iter ?r 0 ?x ?x *)&lt;br /&gt;
&lt;br /&gt;
thm iterRefl [of r y]&lt;br /&gt;
(* iter r 0 y y *)&lt;br /&gt;
&lt;br /&gt;
thm iterStep&lt;br /&gt;
(* ⟦iter ?r ?n ?x ?y; ?r ?y ?z⟧ ⟹ iter ?r (?n + 1) ?x ?z *)&lt;br /&gt;
&lt;br /&gt;
thm iterStep [of r x y n z]&lt;br /&gt;
(* ⟦iter r x y n; r n z⟧ ⟹ iter r (x + 1) y z *)&lt;br /&gt;
&lt;br /&gt;
thm iterStep [of r x y 0 y]&lt;br /&gt;
(* ⟦iter r x y 0; r 0 y⟧ ⟹ iter r (x + 1) y y *)&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3.1. Demostrar  &lt;br /&gt;
     star&amp;#039; r x y ⟹ (∃n. iter r n x y)&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
(* Demostración aplicativa *)&lt;br /&gt;
lemma &amp;quot;star&amp;#039; r x y ⟹ (∃n. iter r n x y)&amp;quot;&lt;br /&gt;
  oops &lt;br /&gt;
&lt;br /&gt;
(* Demostración automática *)&lt;br /&gt;
lemma [rule_format]: &amp;quot;star&amp;#039; r x y ⟹ (∃n. iter r n x y)&amp;quot;    &lt;br /&gt;
  oops &lt;br /&gt;
&lt;br /&gt;
(* Demostración declarativa *)&lt;br /&gt;
lemma [rule_format]: &amp;quot;star&amp;#039; r x y ⟹ (∃n. iter r n x y)&amp;quot;    &lt;br /&gt;
  oops &lt;br /&gt;
  &lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3.2. Demostrar  &lt;br /&gt;
     (∃n. iter r n x y) ⟹ star&amp;#039; r x y&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
(* En la demostración se usará el siguiente lema:&lt;br /&gt;
      iter r n x y ⟹ star&amp;#039; r x y *)&lt;br /&gt;
&lt;br /&gt;
(* Demostración aplicativa del lema *) &lt;br /&gt;
lemma iter_star&amp;#039;_subset: &amp;quot;iter r n x y ⟹ star&amp;#039; r x y&amp;quot;&lt;br /&gt;
  oops &lt;br /&gt;
&lt;br /&gt;
(* Demostración automática del lema *) &lt;br /&gt;
lemma &amp;quot;iter r n x y ⟹ star&amp;#039; r x y&amp;quot;&lt;br /&gt;
  oops &lt;br /&gt;
&lt;br /&gt;
(* Demostración aplicativa *)&lt;br /&gt;
lemma &amp;quot;(∃n. iter r n x y) ⟹ star&amp;#039; r x y&amp;quot;&lt;br /&gt;
  oops &lt;br /&gt;
&lt;br /&gt;
(* Demostración automática *)&lt;br /&gt;
lemma &amp;quot;(∃n. iter r n x y) ⟹ star&amp;#039; r x y&amp;quot;&lt;br /&gt;
  oops &lt;br /&gt;
&lt;br /&gt;
(* Demostración declarativa *)&lt;br /&gt;
lemma assumes &amp;quot;(∃n. iter r n x y)&amp;quot;&lt;br /&gt;
      shows &amp;quot;star&amp;#039; r x y&amp;quot;&lt;br /&gt;
  oops &lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
chapter {* R13: Definiciones inductivas: clausuras *}&lt;br /&gt;
&lt;br /&gt;
theory R13&lt;br /&gt;
imports Main&lt;br /&gt;
begin&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, como conjunto:&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, como conjunto, se puede expresar en &lt;br /&gt;
   Isabelle/HOL como 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* es reflexiva.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;(x,x) ∈ r*&amp;quot;&lt;br /&gt;
  oops&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;
(* La demostración aplicativa es *)&lt;br /&gt;
lemma &amp;quot;(x,y) ∈ r ⟹ (x,y) ∈ r*&amp;quot;  &lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
(* La demostración automática es *)&lt;br /&gt;
lemma r_contenida_clausura [intro]: &lt;br /&gt;
  &amp;quot;(x,y) ∈ r ⟹ (x,y) ∈ r*&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
    &lt;br /&gt;
(* La demostración declarativa es *)&lt;br /&gt;
lemma &amp;quot;(x,y) ∈ r ⟹ (x,y) ∈ r*&amp;quot;  &lt;br /&gt;
  oops&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;
(* La demostración aplicativa es *)&lt;br /&gt;
lemma &amp;quot;⟦(x,y) ∈ r*; (y,z) ∈ r*⟧ ⟹ (x,z) ∈ r*&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;⟦ (x,y) ∈ r*; (y,z) ∈ r* ⟧ ⟹ (x,z) ∈ r*&amp;quot;&lt;br /&gt;
  oops &lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Otra formulación del lema, con la variable y a la derecha.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* La demostración aplicativa es *)&lt;br /&gt;
lemma &amp;quot;(x,y) ∈ r* ⟹ (y,z) ∈ r* ⟶ (x,z) ∈ r*&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
  &lt;br /&gt;
(* La demostración automática es *)&lt;br /&gt;
lemma &amp;quot;(x,y) ∈ r* ⟹ (y,z) ∈ r* ⟶ (x,z) ∈ r*&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
(* La demostración declarativa es *)&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;
  oops&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;
  La relación r* está contenida en cualquier relación reflexiva y &lt;br /&gt;
  transitiva que contenga a r.&lt;br /&gt;
&lt;br /&gt;
  Mediante (crt2 r) se define la menor relación reflexiva y transitiva &lt;br /&gt;
  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;                      (* contiene a r *) &lt;br /&gt;
| &amp;quot;(x,x) ∈ crt2 r&amp;quot;                                      (* reflexiva *)&lt;br /&gt;
| &amp;quot;⟦(x,y) ∈ crt2 r; (y,z) ∈ crt2 r⟧ ⟹ (x,z) ∈ crt2 r&amp;quot; (* transitiva *)&lt;br /&gt;
&lt;br /&gt;
text {* Probaremos que r* coincide con (crt2 r) *}&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;
(* La demostración aplicativa es *)&lt;br /&gt;
lemma &amp;quot;(x,y) ∈ crt2 r ⟹ (x,y) ∈ r*&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
(* La demostración automática es *)&lt;br /&gt;
lemma &amp;quot;(x,y) ∈ crt2 r ⟹ (x,y) ∈ r*&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
(* La demostración declarativa es *)&lt;br /&gt;
lemma &amp;quot;(x,y) ∈ crt2 r ⟹ (x,y) ∈ r*&amp;quot;&lt;br /&gt;
  oops&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;
(* La demostración aplicativa es *)&lt;br /&gt;
lemma &amp;quot;(x,y) ∈ r* ⟹ (x,y) ∈ crt2 r&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
(* La demostración automática es *)&lt;br /&gt;
lemma &amp;quot;(x,y) ∈ r* ⟹ (x,y) ∈ crt2 r&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
(* La demostración declarativa es *)&lt;br /&gt;
lemma &amp;quot;(x,y) ∈ r* ⟹ (x,y) ∈ crt2 r&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* ---------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. 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;
(* Demostración aplicativa *)&lt;br /&gt;
lemma &amp;quot;(x,y) ∈ r* ⟹ (y,z) ∈ r ⟶ (x,z) ∈ r*&amp;quot;&lt;br /&gt;
  oops &lt;br /&gt;
&lt;br /&gt;
(* Demostración aplicativa *)&lt;br /&gt;
lemma &amp;quot;(x,y) ∈ r* ⟹ (y,z) ∈ r ⟶ (x,z) ∈ r*&amp;quot;&lt;br /&gt;
  oops &lt;br /&gt;
&lt;br /&gt;
(* Demostración declarativa *)&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;
   oops &lt;br /&gt;
&lt;br /&gt;
text {* ---------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Considerar la siguiente definición de la clausura tran-&lt;br /&gt;
  sitiva de una relación r, y probar que es la menor relación reflexiva &lt;br /&gt;
  y transitiva que contiene a r.&lt;br /&gt;
&lt;br /&gt;
  Nota: Establecer los lemas necesarios.&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
inductive star&amp;#039; :: &amp;quot;(&amp;#039;a ⇒ &amp;#039;a ⇒ bool) ⇒ &amp;#039;a ⇒ &amp;#039;a ⇒ bool&amp;quot; for r where&lt;br /&gt;
  refl&amp;#039;: &amp;quot;star&amp;#039; r x x&amp;quot; &lt;br /&gt;
| step&amp;#039;: &amp;quot;star&amp;#039; r x y ⟹ r y z ⟹ star&amp;#039; r x z&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* Demostración de que (star&amp;#039; r) es reflexiva *)&lt;br /&gt;
lemma star&amp;#039;Refl: &amp;quot;star&amp;#039; r x x&amp;quot;&lt;br /&gt;
  oops &lt;br /&gt;
&lt;br /&gt;
(* Demostración aplicativa de r contenida en (star&amp;#039; r) *)&lt;br /&gt;
lemma &amp;quot;r x y ⟹ star&amp;#039; r x y&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
(* Demostración automática de r contenida en (star&amp;#039; r) *)&lt;br /&gt;
lemma &amp;quot;r x y ⟹ star&amp;#039; r x y&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
(* Demostración declarativa de r contenida en (star&amp;#039; r) *)&lt;br /&gt;
lemma rsubsetStar&amp;#039;: &amp;quot;r x y ⟹ star&amp;#039; r x y&amp;quot;&lt;br /&gt;
   oops &lt;br /&gt;
&lt;br /&gt;
text {* A continuación se prueba una condición suficiente para star&amp;#039; r *}&lt;br /&gt;
&lt;br /&gt;
(* Demostración aplicativa *)&lt;br /&gt;
lemma &lt;br /&gt;
  &amp;quot;⟦star&amp;#039; r y z; r x y⟧ ⟹ star&amp;#039; r x z&amp;quot;&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
(* Demostración automática *)&lt;br /&gt;
lemma star&amp;#039;_subset_star&amp;#039;_l1:&lt;br /&gt;
  &amp;quot;⟦star&amp;#039; r y z; r x y⟧ ⟹ star&amp;#039; r x z&amp;quot;&lt;br /&gt;
  oops &lt;br /&gt;
&lt;br /&gt;
(* Demostraciones de que  (star&amp;#039; r) es transitiva *)&lt;br /&gt;
&lt;br /&gt;
(* Demostración aplicativa *)&lt;br /&gt;
lemma &amp;quot;⟦star&amp;#039; r x y; star&amp;#039; r y z⟧ ⟹ star&amp;#039; r x z&amp;quot;   &lt;br /&gt;
  oops &lt;br /&gt;
&lt;br /&gt;
(* Demostración automática *)&lt;br /&gt;
lemma star&amp;#039;Trans: &lt;br /&gt;
  &amp;quot;⟦star&amp;#039; r x y; star&amp;#039; r y z⟧ ⟹ star&amp;#039; r x z&amp;quot;&lt;br /&gt;
  oops &lt;br /&gt;
   &lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. Considerar la siguiente definición inductiva. Probar que &lt;br /&gt;
  &amp;quot;star&amp;#039; r x y syss (∃n. iter r n x y)&amp;quot;&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
inductive iter :: &amp;quot;(&amp;#039;a ⇒ &amp;#039;a ⇒ bool) ⇒ nat ⇒ &amp;#039;a ⇒ &amp;#039;a ⇒ bool&amp;quot;&lt;br /&gt;
for r where&lt;br /&gt;
  iterRefl: &amp;quot;iter r 0 x x&amp;quot;&lt;br /&gt;
| iterStep: &amp;quot;⟦iter r n x y; r y z⟧ ⟹ iter r (n+1) x z&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* El esquema de inducción correspondiente es *)&lt;br /&gt;
thm iter.induct&lt;br /&gt;
(*&lt;br /&gt;
  ⟦iter ?r ?x1.0 ?x2.0 ?x3.0; &lt;br /&gt;
   ⋀x. ?P 0 x x;&lt;br /&gt;
   ⋀n x y z. ⟦iter ?r n x y; ?P n x y; ?r y z⟧ ⟹ ?P (n + 1) x z⟧&lt;br /&gt;
  ⟹ ?P ?x1.0 ?x2.0 ?x3.0&lt;br /&gt;
*)&lt;br /&gt;
&lt;br /&gt;
(* Algunos teoremas derivados son *)&lt;br /&gt;
&lt;br /&gt;
thm iterRefl&lt;br /&gt;
(* iter ?r 0 ?x ?x *)&lt;br /&gt;
&lt;br /&gt;
thm iterRefl [of r y]&lt;br /&gt;
(* iter r 0 y y *)&lt;br /&gt;
&lt;br /&gt;
thm iterStep&lt;br /&gt;
(* ⟦iter ?r ?n ?x ?y; ?r ?y ?z⟧ ⟹ iter ?r (?n + 1) ?x ?z *)&lt;br /&gt;
&lt;br /&gt;
thm iterStep [of r x y n z]&lt;br /&gt;
(* ⟦iter r x y n; r n z⟧ ⟹ iter r (x + 1) y z *)&lt;br /&gt;
&lt;br /&gt;
thm iterStep [of r x y 0 y]&lt;br /&gt;
(* ⟦iter r x y 0; r 0 y⟧ ⟹ iter r (x + 1) y y *)&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3.1. Demostrar  &lt;br /&gt;
     star&amp;#039; r x y ⟹ (∃n. iter r n x y)&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
(* Demostración aplicativa *)&lt;br /&gt;
lemma &amp;quot;star&amp;#039; r x y ⟹ (∃n. iter r n x y)&amp;quot;&lt;br /&gt;
  oops &lt;br /&gt;
&lt;br /&gt;
(* Demostración automática *)&lt;br /&gt;
lemma [rule_format]: &amp;quot;star&amp;#039; r x y ⟹ (∃n. iter r n x y)&amp;quot;    &lt;br /&gt;
  oops &lt;br /&gt;
&lt;br /&gt;
(* Demostración declarativa *)&lt;br /&gt;
lemma [rule_format]: &amp;quot;star&amp;#039; r x y ⟹ (∃n. iter r n x y)&amp;quot;    &lt;br /&gt;
  oops &lt;br /&gt;
  &lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3.2. Demostrar  &lt;br /&gt;
     (∃n. iter r n x y) ⟹ star&amp;#039; r x y&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
(* En la demostración se usará el siguiente lema:&lt;br /&gt;
      iter r n x y ⟹ star&amp;#039; r x y *)&lt;br /&gt;
&lt;br /&gt;
(* Demostración aplicativa del lema *) &lt;br /&gt;
lemma iter_star&amp;#039;_subset: &amp;quot;iter r n x y ⟹ star&amp;#039; r x y&amp;quot;&lt;br /&gt;
  oops &lt;br /&gt;
&lt;br /&gt;
(* Demostración automática del lema *) &lt;br /&gt;
lemma &amp;quot;iter r n x y ⟹ star&amp;#039; r x y&amp;quot;&lt;br /&gt;
  oops &lt;br /&gt;
&lt;br /&gt;
(* Demostración aplicativa *)&lt;br /&gt;
lemma &amp;quot;(∃n. iter r n x y) ⟹ star&amp;#039; r x y&amp;quot;&lt;br /&gt;
  oops &lt;br /&gt;
&lt;br /&gt;
(* Demostración automática *)&lt;br /&gt;
lemma &amp;quot;(∃n. iter r n x y) ⟹ star&amp;#039; r x y&amp;quot;&lt;br /&gt;
  oops &lt;br /&gt;
&lt;br /&gt;
(* Demostración declarativa *)&lt;br /&gt;
lemma assumes &amp;quot;(∃n. iter r n x y)&amp;quot;&lt;br /&gt;
      shows &amp;quot;star&amp;#039; r x y&amp;quot;&lt;br /&gt;
  oops &lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
</feed>