<?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=Examen_4</id>
	<title>Examen 4 - 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=Examen_4"/>
	<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2019/index.php?title=Examen_4&amp;action=history"/>
	<updated>2026-07-20T02:20: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=Examen_4&amp;diff=811&amp;oldid=prev</id>
		<title>Jalonso en 11:13 11 sep 2019</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2019/index.php?title=Examen_4&amp;diff=811&amp;oldid=prev"/>
		<updated>2019-09-11T11:13:00Z</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;
text ‹Examen de Lógica Matemática y Fundamentos (10 septiembre 2019)›&lt;br /&gt;
&lt;br /&gt;
theory examen_4_10_sep_sol&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
text ‹Nota: En las demostraciones se pueden las reglas básicas de &lt;br /&gt;
  deducción natural de la lógica proposicional, de los cuantificadores &lt;br /&gt;
  y de la igualdad:  &lt;br /&gt;
  · conjI:      ⟦P; Q⟧ ⟹ P ∧ Q&lt;br /&gt;
  · conjunct1:  P ∧ Q ⟹ P&lt;br /&gt;
  · conjunct2:  P ∧ Q ⟹ Q  &lt;br /&gt;
  · notnotD:    ¬¬ P ⟹ P&lt;br /&gt;
  · mp:         ⟦P ⟶ Q; P⟧ ⟹ Q &lt;br /&gt;
  · impI:       (P ⟹ Q) ⟹ P ⟶ Q&lt;br /&gt;
  · disjI1:     P ⟹ P ∨ Q&lt;br /&gt;
  · disjI2:     Q ⟹ P ∨ Q&lt;br /&gt;
  · disjE:      ⟦P ∨ Q; P ⟹ R; Q ⟹ R⟧ ⟹ R &lt;br /&gt;
  · FalseE:     False ⟹ P&lt;br /&gt;
  · notE:       ⟦¬P; P⟧ ⟹ R&lt;br /&gt;
  · notI:       (P ⟹ False) ⟹ ¬P&lt;br /&gt;
  · iffI:       ⟦P ⟹ Q; Q ⟹ P⟧ ⟹ P = Q&lt;br /&gt;
  · iffD1:      ⟦Q = P; Q⟧ ⟹ P &lt;br /&gt;
  · iffD2:      ⟦P = Q; Q⟧ ⟹ P&lt;br /&gt;
  · ccontr:     (¬P ⟹ False) ⟹ P&lt;br /&gt;
  · excluded_middle: (¬P ∨ P) &lt;br /&gt;
&lt;br /&gt;
  · allE:       ⟦∀x. P x; P x ⟹ R⟧ ⟹ R&lt;br /&gt;
  · allI:       (⋀x. P x) ⟹ ∀x. P x&lt;br /&gt;
  · exI:        P x ⟹ ∃x. P x&lt;br /&gt;
  · exE:        ⟦∃x. P x; ⋀x. P x ⟹ Q⟧ ⟹ Q&lt;br /&gt;
&lt;br /&gt;
  · refl:       t = t&lt;br /&gt;
  · subst:      ⟦s = t; P s⟧ ⟹ P t&lt;br /&gt;
  · trans:      ⟦r = s; s = t⟧ ⟹ r = t&lt;br /&gt;
  · sym:        s = t ⟹ t = s&lt;br /&gt;
  · not_sym:    t ≠ s ⟹ s ≠ t&lt;br /&gt;
  · ssubst:     ⟦t = s; P s⟧ ⟹ P t&lt;br /&gt;
  · box_equals: ⟦a = b; a = c; b = d⟧ ⟹ c = d&lt;br /&gt;
  · arg_cong:   x = y ⟹ f x = f y&lt;br /&gt;
  · fun_cong:   f = g ⟹ f x = g x&lt;br /&gt;
  · cong:       ⟦f = g; x = y⟧ ⟹ f x = g y&lt;br /&gt;
&lt;br /&gt;
  También se pueden usar las reglas notnotI y mt que demostramos a&lt;br /&gt;
  continuación. &lt;br /&gt;
›&lt;br /&gt;
&lt;br /&gt;
lemma notnotI: &amp;quot;P ⟹ ¬¬ P&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
lemma mt: &amp;quot;⟦F ⟶ G; ¬G⟧ ⟹ ¬F&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
text ‹-----------------------------------------------------------------&lt;br /&gt;
  Ejercicio 1. (2.5 puntos) Demostrar detalladamente que la siguiente&lt;br /&gt;
  fórmula es una tautología: &lt;br /&gt;
     ((p ⟶ r) ∨ (q ⟶ s)) ⟶ ((p ∧ q) ⟶ (r ∨ s))&lt;br /&gt;
&lt;br /&gt;
  Nota: No usar ninguno de los métodos automáticos: simp, simp_all, &lt;br /&gt;
  auto, blast, force, fast, arith o metis&lt;br /&gt;
  --------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
(* Demostración aplicativa *)&lt;br /&gt;
lemma &amp;quot;((p ⟶ r) ∨ (q ⟶ s)) ⟶ ((p ∧ q) ⟶ (r ∨ s))&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume 1: &amp;quot;(p ⟶ r) ∨ (q ⟶ s)&amp;quot;&lt;br /&gt;
  show &amp;quot;(p ∧ q) ⟶ (r ∨ s)&amp;quot;&lt;br /&gt;
  proof&lt;br /&gt;
    assume &amp;quot;p ∧ q&amp;quot;&lt;br /&gt;
    hence &amp;quot;p&amp;quot; by (rule conjunct1)&lt;br /&gt;
    have &amp;quot;q&amp;quot; using `p ∧ q` by (rule conjunct2)&lt;br /&gt;
    note 1&lt;br /&gt;
    then show &amp;quot;r ∨ s&amp;quot;&lt;br /&gt;
    proof&lt;br /&gt;
      assume &amp;quot;p ⟶ r&amp;quot;&lt;br /&gt;
      then have &amp;quot;r&amp;quot; using `p` by (rule mp)&lt;br /&gt;
      then show &amp;quot;r ∨ s&amp;quot; by (rule disjI1)&lt;br /&gt;
    next&lt;br /&gt;
      assume &amp;quot;q ⟶ s&amp;quot;&lt;br /&gt;
      then have &amp;quot;s&amp;quot; using `q` by (rule mp)&lt;br /&gt;
      then show &amp;quot;r ∨ s&amp;quot; by (rule disjI2)&lt;br /&gt;
    qed&lt;br /&gt;
    qed&lt;br /&gt;
  qed&lt;br /&gt;
&lt;br /&gt;
(* Demostración aplicativa. *)&lt;br /&gt;
lemma &amp;quot;((p ⟶ r) ∨ (q ⟶ s)) ⟶ ((p ∧ q) ⟶ (r ∨ s))&amp;quot;&lt;br /&gt;
  apply (rule impI)+&lt;br /&gt;
  apply (erule disjE)&lt;br /&gt;
   apply (rule disjI1)&lt;br /&gt;
   apply (erule mp)&lt;br /&gt;
   apply (erule conjunct1)&lt;br /&gt;
  apply (rule disjI2)&lt;br /&gt;
  apply (erule mp)&lt;br /&gt;
  apply (erule conjunct2)&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
text ‹-----------------------------------------------------------------&lt;br /&gt;
  Ejercicio 2. (2.5 puntos) Demostrar por deducción natural que la&lt;br /&gt;
  fórmula ∀x. (∃y. ((P(x,y) ∨ Q(x,x)))) es consecuencia &lt;br /&gt;
  lógica de ∀x. (P(x,x) ∨ ∀y. Q(x,y)).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  Nota: No usar ninguno de los métodos automáticos: simp, simp_all, &lt;br /&gt;
  auto, blast, force, fast, arith o metis&lt;br /&gt;
  --------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
(* Demostración declarativa. *)&lt;br /&gt;
lemma &lt;br /&gt;
  assumes &amp;quot;∀x. (P(x,x) ∨ (∀y. Q(x,y)))&amp;quot;&lt;br /&gt;
  shows &amp;quot;∀x. (∃y. (P(x,y) ∨ Q(x,x)))&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  fix a&lt;br /&gt;
  have &amp;quot;P(a,a) ∨ (∀y. Q(a,y))&amp;quot; using assms by (rule allE)&lt;br /&gt;
  then show &amp;quot;∃y. (P(a,y) ∨ Q(a,a))&amp;quot; &lt;br /&gt;
  proof&lt;br /&gt;
    assume &amp;quot;P(a,a)&amp;quot;&lt;br /&gt;
    then have &amp;quot;P(a,a) ∨ Q(a,a)&amp;quot; by (rule disjI1)&lt;br /&gt;
    then show &amp;quot;∃y. (P(a,y) ∨ Q(a,a))&amp;quot; by (rule exI)&lt;br /&gt;
  next&lt;br /&gt;
    assume &amp;quot;∀y. Q(a,y)&amp;quot;&lt;br /&gt;
    then have &amp;quot;Q(a,a)&amp;quot; by (rule allE) &lt;br /&gt;
    then have &amp;quot;P(a,a) ∨ Q(a,a)&amp;quot; by (rule disjI2)&lt;br /&gt;
    then show &amp;quot;∃y. (P(a,y) ∨ Q(a,a))&amp;quot; by (rule exI)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* Demostración aplicativa. *)&lt;br /&gt;
lemma &amp;quot;⟦∀x. (P(x,x) ∨ (∀y. Q(x,y)))⟧ ⟹ ∀x. (∃y. (P(x,y) ∨ Q(x,x)))&amp;quot;&lt;br /&gt;
  apply (rule allI)&lt;br /&gt;
  apply (erule_tac x = x in  allE)&lt;br /&gt;
  apply (erule disjE)&lt;br /&gt;
   apply (rule_tac x = x in exI)&lt;br /&gt;
   apply (rule disjI1, simp)&lt;br /&gt;
  apply (erule_tac x = x in  allE)&lt;br /&gt;
   apply (rule_tac x = x in exI)&lt;br /&gt;
  apply (rule disjI2, simp)&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
text ‹-----------------------------------------------------------------&lt;br /&gt;
  Ejercicio 3 (2.5 puntos) Consideremos el árbol binario&lt;br /&gt;
  definido por&lt;br /&gt;
     datatype &amp;#039;a arbol = H  &lt;br /&gt;
                       | N &amp;quot;&amp;#039;a&amp;quot; &amp;quot;&amp;#039;a arbol&amp;quot; &amp;quot;&amp;#039;a arbol&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
  Por ejemplo, el árbol&lt;br /&gt;
          e&lt;br /&gt;
         / \&lt;br /&gt;
        /   \&lt;br /&gt;
       c     g&lt;br /&gt;
      / \   / \&lt;br /&gt;
             &lt;br /&gt;
  se representa por &amp;quot;N e (N c H H) (N g H H)&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
  Se define las funciones&lt;br /&gt;
    fun nNodos :: &amp;quot;&amp;#039;a arbol ⇒ nat&amp;quot; where&lt;br /&gt;
      &amp;quot;nNodos H         = 0&amp;quot;&lt;br /&gt;
    | &amp;quot;nNodos (N x i d) = 1 + nNodos i + nNodos d&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    fun nNodosAaux :: &amp;quot;&amp;#039;a arbol ⇒ nat ⇒ nat&amp;quot; where&lt;br /&gt;
      &amp;quot;nNodosAaux H         n = n&amp;quot;&lt;br /&gt;
    | &amp;quot;nNodosAaux (N x i d) n = 1 + nNodosAaux i (nNodosAaux d n)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    definition nNodosA :: &amp;quot;&amp;#039;a arbol ⇒ nat&amp;quot; where&lt;br /&gt;
      &amp;quot;nNodosA a ≡ nNodosAaux a 0&amp;quot;&lt;br /&gt;
  tales que&lt;br /&gt;
  + (nNodos a) es el número de nodos del árbol a. Por ejemplo, &lt;br /&gt;
       nNodos (N e (N c H H) (N g H H)) = 3&lt;br /&gt;
  + (nNodosAA a) es el número de nodos del árbol a, calculado &lt;br /&gt;
    con la función auxiliar nNodosAaux que usa un acumulador. Por &lt;br /&gt;
    ejemplo, &lt;br /&gt;
       nNodosA (N e (N c H H) (N g H H)) = 3&lt;br /&gt;
 &lt;br /&gt;
  Demostrar estructuradamente (es decir, mediante una demostración &lt;br /&gt;
  declarativa) que las funciones nNodos y nNodosA son equivalentes; &lt;br /&gt;
  es decir,&lt;br /&gt;
     nNodosA a = nNodos a&lt;br /&gt;
&lt;br /&gt;
  Notas: &lt;br /&gt;
  1. Los únicos métodos que se pueden usar son induct, (simp only: ...)&lt;br /&gt;
     y this.&lt;br /&gt;
  2. En las demostraciones por introducción del cuantificador universal&lt;br /&gt;
     hay que explicitar el tipo de las variables introducidas con fix.&lt;br /&gt;
     Por ejemplo, en lugar de   &lt;br /&gt;
          fix x t n&lt;br /&gt;
     hay que escribir&lt;br /&gt;
          fix x :: &amp;#039;a and t :: &amp;quot;&amp;#039;a arbol&amp;quot; and and n :: nat&lt;br /&gt;
  -------------------------------------------------------------------›&lt;br /&gt;
&lt;br /&gt;
datatype &amp;#039;a arbol = H  &lt;br /&gt;
                  | N &amp;quot;&amp;#039;a&amp;quot; &amp;quot;&amp;#039;a arbol&amp;quot; &amp;quot;&amp;#039;a arbol&amp;quot;&lt;br /&gt;
&lt;br /&gt;
fun nNodos :: &amp;quot;&amp;#039;a arbol ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;nNodos H         = 0&amp;quot;&lt;br /&gt;
| &amp;quot;nNodos (N x i d) = 1 + nNodos i + nNodos d&amp;quot;&lt;br /&gt;
&lt;br /&gt;
fun nNodosAaux :: &amp;quot;&amp;#039;a arbol ⇒ nat ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;nNodosAaux H         n = n&amp;quot;&lt;br /&gt;
| &amp;quot;nNodosAaux (N x i d) n = 1 + nNodosAaux i (nNodosAaux d n)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
definition nNodosA :: &amp;quot;&amp;#039;a arbol ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;nNodosA a ≡ nNodosAaux a 0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;nNodos (N e (N c H H) (N g H H)) = 3&amp;quot;&lt;br /&gt;
value &amp;quot;nNodosA (N e (N c H H) (N g H H)) = 3&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* Demostración declarativa. *)&lt;br /&gt;
lemma nNodosA:&lt;br /&gt;
  &amp;quot;nNodosAaux a n = (nNodos a) + n&amp;quot;&lt;br /&gt;
proof (induct a arbitrary: n)&lt;br /&gt;
  fix n&lt;br /&gt;
  have &amp;quot;nNodosAaux H n = n&amp;quot; by (simp only: nNodosAaux.simps(1))&lt;br /&gt;
  also have &amp;quot;… = nNodos H + n&amp;quot; by (simp only: nNodos.simps(1))&lt;br /&gt;
  finally show &amp;quot;nNodosAaux H n = nNodos H + n&amp;quot; by this&lt;br /&gt;
next&lt;br /&gt;
  fix x :: &amp;#039;a and &lt;br /&gt;
      i :: &amp;quot;&amp;#039;a arbol&amp;quot; and&lt;br /&gt;
      d :: &amp;quot;&amp;#039;a arbol&amp;quot; and&lt;br /&gt;
      n :: nat&lt;br /&gt;
  assume HI1: &amp;quot;⋀n. nNodosAaux i n = nNodos i + n&amp;quot;&lt;br /&gt;
     and HI2: &amp;quot;⋀n. nNodosAaux d n = nNodos d + n&amp;quot;&lt;br /&gt;
  have &amp;quot;nNodosAaux (N x i d) n = 1 + nNodosAaux i (nNodosAaux d n)&amp;quot; &lt;br /&gt;
    by (simp only: nNodosAaux.simps(2))&lt;br /&gt;
  also have &amp;quot;… = 1 + nNodosAaux i (nNodos d + n)&amp;quot; &lt;br /&gt;
    by (simp only: HI2)&lt;br /&gt;
  also have &amp;quot;… = 1 + nNodos i + (nNodos d + n)&amp;quot; &lt;br /&gt;
    by (simp only: HI1)&lt;br /&gt;
  also have &amp;quot;… = nNodos (N x i d) + n&amp;quot; &lt;br /&gt;
    by (simp only: nNodos.simps(2))&lt;br /&gt;
  finally show &amp;quot;nNodosAaux (N x i d) n = nNodos (N x i d) + n&amp;quot;  &lt;br /&gt;
    by this&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* Demostración aplicativa del lema anterior *)&lt;br /&gt;
lemma &amp;quot;nNodosAaux a n = (nNodos a) + n&amp;quot;&lt;br /&gt;
  apply (induct a arbitrary: n)&lt;br /&gt;
   apply (simp only: nNodosAaux.simps(1))&lt;br /&gt;
   apply (simp only: nNodos.simps(1))&lt;br /&gt;
  apply (simp only: nNodosAaux.simps(2))&lt;br /&gt;
  apply (simp only: nNodos.simps(2))&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;nNodosA a = nNodos a&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;nNodosA a = nNodosAaux a 0&amp;quot; by (simp only: nNodosA_def)&lt;br /&gt;
  also have &amp;quot;… = (nNodos a)&amp;quot; by (simp only: nNodosA)&lt;br /&gt;
  finally show &amp;quot;nNodosA a = nNodos a&amp;quot; by this&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text ‹--------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. (2.5 puntos) Demostrar que si en un grupo se cumple la siguente&lt;br /&gt;
  propiedad cancelativa &lt;br /&gt;
     ∀x. ∀y. ∀z. x ⋅ y = z ⋅ x ⟶ y = z&lt;br /&gt;
  entonces el grupo es abeliano.&lt;br /&gt;
&lt;br /&gt;
  Nota: No usar ninguno de los métodos automáticos: auto, blast, force,&lt;br /&gt;
  fast, arith o metis &lt;br /&gt;
&lt;br /&gt;
  Nota: Los únicos métodos que se pueden usar son (simp only: ...) o &lt;br /&gt;
  rule.&lt;br /&gt;
  ------------------------------------------------------------------›&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 neutro_d:   &amp;quot;x ⋅ 𝟭 = x&amp;quot;&lt;br /&gt;
      and inverso_i:  &amp;quot;x^ ⋅ x = 𝟭&amp;quot;&lt;br /&gt;
&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 one (sin espacio entre ellos).&lt;br /&gt;
   * El inverso de x es x^ y se escribe pulsando 2 veces en ^. *)&lt;br /&gt;
&lt;br /&gt;
context grupo&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
(* Demostración declarativa. *)&lt;br /&gt;
lemma&lt;br /&gt;
  assumes &amp;quot;∀x. ∀y. ∀z. x ⋅ y = z ⋅ x ⟶ y = z&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∀x. ∀y. x ⋅ y = y ⋅ x&amp;quot;&lt;br /&gt;
proof (rule allI)+&lt;br /&gt;
  fix a b&lt;br /&gt;
  have &amp;quot;b ⋅ (a ⋅ b) = (b ⋅ a) ⋅ b ⟶ a ⋅ b = b ⋅ a&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;∀y. ∀z. b ⋅ y = z ⋅ b ⟶ y = z&amp;quot; using assms by (rule allE)&lt;br /&gt;
    then have &amp;quot;∀z. b ⋅ (a ⋅ b) = z ⋅ b ⟶ a ⋅ b = z&amp;quot; by (rule allE)&lt;br /&gt;
    then show &amp;quot;b ⋅ (a ⋅ b) = (b ⋅ a) ⋅ b ⟶ a ⋅ b = b ⋅ a&amp;quot;  by (rule allE)&lt;br /&gt;
  qed&lt;br /&gt;
  moreover&lt;br /&gt;
  have &amp;quot;b ⋅ (a ⋅ b) = (b ⋅ a) ⋅ b&amp;quot;  by (simp only: asociativa) &lt;br /&gt;
  ultimately show &amp;quot;a ⋅ b = b ⋅ a&amp;quot; by (rule mp)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* Demostración aplicativa. *)&lt;br /&gt;
lemma&lt;br /&gt;
   &amp;quot;⟦∀x. ∀y. ∀z. x ⋅ y = z ⋅ x ⟶ y = z⟧ ⟹&lt;br /&gt;
    ∀x. ∀y. x ⋅ y = y ⋅ x&amp;quot;&lt;br /&gt;
  apply (rule allI)+&lt;br /&gt;
  apply (erule_tac x = y in allE)&lt;br /&gt;
  apply (erule_tac x = &amp;quot;x ⋅ y&amp;quot; in allE)&lt;br /&gt;
  apply (erule_tac x = &amp;quot;y ⋅ x&amp;quot; in allE)&lt;br /&gt;
  apply (erule mp)&lt;br /&gt;
  apply (simp add: asociativa)&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
end&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>