<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="es">
	<id>https://www.glc.us.es/~jalonso/RA2016/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Jalonso</id>
	<title>Razonamiento automático (2016-17) - Contribuciones del usuario [es]</title>
	<link rel="self" type="application/atom+xml" href="https://www.glc.us.es/~jalonso/RA2016/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Jalonso"/>
	<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2016/index.php/Especial:Contribuciones/Jalonso"/>
	<updated>2026-07-17T11:34:46Z</updated>
	<subtitle>Contribuciones del usuario</subtitle>
	<generator>MediaWiki 1.31.14</generator>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2016/index.php?title=Documentaci%C3%B3n&amp;diff=1489</id>
		<title>Documentación</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2016/index.php?title=Documentaci%C3%B3n&amp;diff=1489"/>
		<updated>2022-02-08T17:23:10Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;En esta página se recogen en enlaces que sirven de documentación al curso de demostración asistida por ordenador (DAO). Los enlaces están actualizados en el [https://www.glc.us.es/~jalonso/RA2019/index.php/Documentaci%C3%B3n curso 2019-20].&lt;br /&gt;
&lt;br /&gt;
== Visiones generales de la DAO ==&lt;br /&gt;
&lt;br /&gt;
# J.A. Alonso. [http://goo.gl/NWk7b Razonamiento formalizado: Del sueño a la realidad de las pruebas]. &amp;#039;&amp;#039;Vestigium&amp;#039;&amp;#039;, 26 de diciembre de 2012.&lt;br /&gt;
# J. Avigad. [http://www.andrew.cmu.edu/user/avigad/Talks/icerm.pdf Interactive theorem proving, automated reasoning, and mathematical computation]. ICERM, 14 de diciembre de 2012. &lt;br /&gt;
# M. Davis. [http://www.cs.nyu.edu/cs/faculty/davism/early.ps The early history of automated deduction].&lt;br /&gt;
# J.P. Delahaye [http://interstices.info/jcms/int_63417/du-reve-a-la-realite-des-preuves Du rêve à la réalité des preuves]. &amp;#039;&amp;#039;Interstices&amp;#039;&amp;#039;, 8 de julio de 2012.&lt;br /&gt;
# J. Germoni [http://images.math.cnrs.fr/Coq-et-caracteres.html Coq et caractères: Preuve formelle du théorème de Feit et Thompson]. &amp;#039;&amp;#039;Images des Mathématiques&amp;#039;&amp;#039;, CNRS, 23 de noviembre de 2012. &lt;br /&gt;
# H. Geuvers [http://www.ias.ac.in/sadhana/Pdf2009Feb/3.pdf Proof assistants: History, ideas and future]. &amp;#039;&amp;#039;Sadhana&amp;#039;&amp;#039;, Vol. 34-1, pp. 3-25, février 2009.&lt;br /&gt;
# G. Gonthier [http://www.ams.org/notices/200811/tx081101382p.pdf The four-color theorem]. &amp;#039;&amp;#039;Notices of the AMS&amp;#039;&amp;#039;, Vol. 55, n° 11, pp. 1382-1393, 2008.&lt;br /&gt;
# T. Hales. [http://www.ams.org/notices/200811/tx081101370p.pdf Formal proof]. &amp;#039;&amp;#039;Notices of AMS&amp;#039;&amp;#039;, Vol. 55, N. 11 (2008) pp. 1370-1380.&lt;br /&gt;
# J. Harrison. [http://www.cl.cam.ac.uk/~jrh13/papers/ab.html A short survey of automated reasoning]. &amp;#039;&amp;#039;Lecture Notes in Computer Science&amp;#039;&amp;#039;, Vol. 4545, pp. 334-349, 2007.&lt;br /&gt;
# J. Harrison. [http://www.ams.org/notices/200811/tx081101395p.pdf Formal proof: Theory and practice]. &amp;#039;&amp;#039;Notices of the AMS&amp;#039;&amp;#039;, Vol. 55, N. 11 (2008) p.1395-1406. &lt;br /&gt;
# G. Kolata. [http://www.nytimes.com/library/cyber/week/1210math.html Computer math proof shows reasoning power]. &amp;#039;&amp;#039;The New York Times&amp;#039;&amp;#039;, 10 de diciembre de 1996.&lt;br /&gt;
# D. MacKenzie [https://backspaces.net/temp/Spring2010Seminar/18%20unconventional%20essays%20on%20the%20nature%20of%20mathematics.pdf#page=147 Computers and the sociology of mathematical proof].&lt;br /&gt;
# G. Sutcliffe. [http://tptp.org/OverviewOfATP.html What is automated theorem proving?].&lt;br /&gt;
# F. Wiedijk [http://www.cs.ru.nl/~freek/100/ Formalizing the «top 100» of mathematical theorems].&lt;br /&gt;
# F. Wiedijk [http://www.ams.org/notices/200811/tx081101408p.pdf Formal proof - Getting started]. &amp;#039;&amp;#039;Notices of the AMS&amp;#039;&amp;#039;, Vol. 55, n° 11, pp. 1408-1414, 2008.&lt;br /&gt;
# F. Wiedijk, [https://www.cs.ru.nl/F.Wiedijk/pubs/qed2.pdf The QED manifesto revisited]. &amp;#039;&amp;#039;Studies in Logic, Grammar and Rhetoric&amp;#039;&amp;#039;, Vol. 10(23), pp. 121-133, 2007.&lt;br /&gt;
&lt;br /&gt;
== Referencias sobre Isabelle/HOL ==&lt;br /&gt;
# B. Grechuk [https://web.cs.wpi.edu/~dd/resources_isabelle/isabelle_primer_mathematicians.pdf Isabelle primer for mathematicians].&lt;br /&gt;
# T. Nipkow [https://isabelle.in.tum.de/doc/prog-prove.pdf Programming and proving in Isabelle/HOL]. &lt;br /&gt;
# T. Nipkow, M. Wenzel y L.C. Paulson [https://isabelle.in.tum.de/website-Isabelle2009/dist/Isabelle/doc/tutorial.pdf A proof assistant for higher-order logic]. &lt;br /&gt;
# [http://www.cl.cam.ac.uk/research/hvg/Isabelle/dist/library/HOL/HOL/document.pdf Isabelle/HOL — Higher-Order Logic]. &lt;br /&gt;
# [http://www.cl.cam.ac.uk/research/hvg/Isabelle/documentation.html Tutorials and manuals for Isabelle].&lt;br /&gt;
&lt;br /&gt;
== Lecturas complementarias ==&lt;br /&gt;
=== Programación funcional ===&lt;br /&gt;
# J.A. Alonso [http://www.cs.us.es/~jalonso/cursos/i1m-12/temas/2012-13-IM-temas-PF.pdf  Temas de &amp;quot;Programación funcional&amp;quot;]. Publicaciones del Grupo de Lógica Computacional. Universidad de Sevilla, 2012.&lt;br /&gt;
# J.A. Alonso y M.J. Hidalgo [http://www.cs.us.es/~jalonso/publicaciones/Piensa_en_Haskell.pdf Piensa en Haskell (Ejercicios de programación funcional con Haskell)]. Publicaciones del Grupo de Lógica Computacional. Universidad de Sevilla, 2012.&lt;br /&gt;
# G. Hutton [http://goo.gl/pKqG Programming in Haskell]. Cambridge University Press, 2007. &lt;br /&gt;
# M. Lipovača [http://aprendehaskell.es ¡Aprende Haskell por el bien de todos!].&lt;br /&gt;
&lt;br /&gt;
=== Lógica computacional ===&lt;br /&gt;
# J.A. Alonso [http://www.cs.us.es/~jalonso/cursos/li-12/temas/temas-LI-2012-13.pdf Temas de &amp;quot;Lógica informática&amp;quot; (2012-13)]. Publicaciones del Grupo de Lógica Computacional. Universidad de Sevilla, 2012.&lt;br /&gt;
# R. Bornat [http://bit.ly/oithic Proof and disproof in formal logic: an introduction for programmers]. Oxford University Press, 2005.&lt;br /&gt;
# K. Broda, S. Eisenbach, H. Khoshnevisan y S. Vickers [https://www.doc.ic.ac.uk/~susan/firstyearbook.pdf Reasoned programming]. Imperial College, 1994.&lt;br /&gt;
# K. Doets y J. van Eijck [https://books.google.es/books?id=YCC6lwEACAAJ&amp;amp;dq=The+Haskell+Road+to+Logic,+Maths+and+Programming&amp;amp;hl=es&amp;amp;sa=X&amp;amp;redir_esc=y The Haskell Road to Logic, Maths and Programming].&lt;br /&gt;
# M. Huth y M. Ryan [http://goo.gl/TMqOo Logic in computer science: Modelling and reasoning about systems]. Cambridge University Press, 2004. (Incluye el [http://www.cs.bham.ac.uk/research/lics/tutor/index.html tutor en la Red]).&lt;br /&gt;
&lt;br /&gt;
== Cursos relacionados ==&lt;br /&gt;
=== Cursos con Isabelle/HOL ===&lt;br /&gt;
# Clemens Ballarin. [http://cl-informatik.uibk.ac.at/teaching/ss08/atp/introduction.php Automatic Deduction]. (Univ de Innsbruck, 2008).&lt;br /&gt;
# Clemens Ballarin y Gerwin Klein [http://isabelle.in.tum.de/coursematerial/IJCAR04 Introduction to the Isabelle Proof Assistant]. (en el IJCAR-2004).&lt;br /&gt;
# Clemens Ballarin y Tjark Weber. [http://cl-informatik.uibk.ac.at/teaching/ws06/atp/introduction.php Automated Theorem Proving in Isabelle/HOL]. (Univ. de Innsbruck, 2006-07).&lt;br /&gt;
# A.D. Brucker, D. Basin, J.G. Smaus y B. Wolff. [http://archiv.infsec.ethz.ch/education/permanent/csmr.html Computer-supported Modeling and Reasoning]. (ETH Zurich, 2011).&lt;br /&gt;
# Mads Dam. [http://www.csc.kth.se/utbildning/kth/kurser/DD2453/aform07/ Advanced formal methods]. (KTH Royal Institute of Technology, 2007).&lt;br /&gt;
# Jacques Fleuriot y Paul Jackson. [http://www.inf.ed.ac.uk/teaching/courses/ar/slides/ Automated reasoning]. (Univ. de Edimburgo, 2012-13).&lt;br /&gt;
# Thomas Genet [http://www.irisa.fr/celtique/genet/ACF Software formal analysis and design]. (Univ. de Rennes)&lt;br /&gt;
# Gerwin Klein. [http://www.cse.unsw.edu.au/~kleing/teaching/thprv-04 Theorem Proving - Principles, Techniques, Applications]. (NICTA, 2004).&lt;br /&gt;
# Gerwin Klein. [http://www.cse.unsw.edu.au/~cs4161/index.html Advanced Topics in Software Verification]. (NICTA, 2012).&lt;br /&gt;
# Joao Marcos. [http://www.dimap.ufrn.br/~jmarcos/courses/LC/Ementa.htm Lógica computacional: Demonstração assistida e semi-automática de teoremas].(UFRN, 2000).&lt;br /&gt;
# Tobias Nipkow. [https://www21.in.tum.de/teaching/semantics/WS1920/ Semantics of programming languages]. (Univ. de Munich, 2012-13).&lt;br /&gt;
# Tobias Nipkow [http://isabelle.in.tum.de/coursematerial/PSV2009-1 Theorem Proving with Isabelle/HOL An Intensive Course]. &lt;br /&gt;
# Larry Paulson. [http://www.cl.cam.ac.uk/teaching/0910/L21/ Interactive Formal Verification]. (Univ. de Cambridge, 2009-10).&lt;br /&gt;
# Jan-Georg Smaus. [http://www.informatik.uni-freiburg.de/~ki/teaching/ws0910/csmr/lecture.html Computer-supported modeling and reasoning]. (Univ. de Feiburgo, 2009).&lt;br /&gt;
# Christian Sternagel [http://cl-informatik.uibk.ac.at/teaching/ss11/eve/content.php Experiments in Verification – Introduction to Isabelle/HOL]. (Univ. de Innsbruck, 2011-12).&lt;br /&gt;
# Tjark Weber. [http://www.cl.cam.ac.uk/teaching/1011/L21/ Interactive Formal Verification]. (Univ. de Cambridge, 2010-11).&lt;br /&gt;
&lt;br /&gt;
=== Otros cursos ===&lt;br /&gt;
# José A. Alonso [http://www.cs.us.es/~jalonso/cursos/li-12/ Lógica informática] (Univ. de Sevilla, 2012-13).&lt;br /&gt;
# Yves Bertot, Pierre Casteran, Benjamin Gregoire, Pierre Letouzey y Assia Mahboubi [http://www.di.ens.fr/~zappa/teaching/coq/ecole11 Modelling and verifying algorithms in Coq: an introduction]. (INRIA Paris-Rocquencourt, 14-18 noviembre 2011).&lt;br /&gt;
# Pierre Castéran [http://www.labri.fr/perso/casteran/FM/Logique/index.html Logic (Master In Verification)] (Univ. de Burdeos, 2011-12).&lt;br /&gt;
# Ian Hodkinson [http://www.doc.ic.ac.uk/~imh/teaching/140_logic/logic.html Logic] (Imperial College, Londres, 2010-11).&lt;br /&gt;
# Peter Lucas [http://www.cs.ru.nl/~peterl/teaching/KeR/ Knowledge Representation and Reasoning] (Radboud University # egen, 2011-12).&lt;br /&gt;
# Larry Paulson [http://www.cl.cam.ac.uk/Teaching/current/LogicProof/ Logic and Proof] (Univ. de Cambridge, 2011-12).&lt;br /&gt;
# Riccardo Pucella [http://www.ccs.neu.edu/home/riccardo/courses/csu290-sp09/index.html Logic and Computation] (Northeastern University, 2009). Curso con ACL2.&lt;br /&gt;
&lt;br /&gt;
== Bibliotecas de ejemplos de verificación ==&lt;br /&gt;
# [http://afp.sourceforge.net Archive of Formal Proofs].&lt;br /&gt;
# [http://www.cs.ru.nl/~freek/100 Formalizing 100 Theorems].&lt;br /&gt;
# [http://toccata.lri.fr/gallery Gallery of verified programs].&lt;/div&gt;</summary>
		<author><name>Jalonso</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2016/index.php?title=Documentaci%C3%B3n&amp;diff=1488</id>
		<title>Documentación</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2016/index.php?title=Documentaci%C3%B3n&amp;diff=1488"/>
		<updated>2022-02-08T12:54:08Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;En esta página se recogen en enlaces que sirven de documentación al curso de demostración asistida por ordenador (DAO).&lt;br /&gt;
&lt;br /&gt;
== Visiones generales de la DAO ==&lt;br /&gt;
&lt;br /&gt;
# J.A. Alonso. [http://goo.gl/NWk7b Razonamiento formalizado: Del sueño a la realidad de las pruebas]. &amp;#039;&amp;#039;Vestigium&amp;#039;&amp;#039;, 26 de diciembre de 2012.&lt;br /&gt;
# J. Avigad. [http://www.andrew.cmu.edu/user/avigad/Talks/icerm.pdf Interactive theorem proving, automated reasoning, and mathematical computation]. ICERM, 14 de diciembre de 2012. &lt;br /&gt;
# M. Davis. [http://www.cs.nyu.edu/cs/faculty/davism/early.ps The early history of automated deduction].&lt;br /&gt;
# J.P. Delahaye [http://interstices.info/jcms/int_63417/du-reve-a-la-realite-des-preuves Du rêve à la réalité des preuves]. &amp;#039;&amp;#039;Interstices&amp;#039;&amp;#039;, 8 de julio de 2012.&lt;br /&gt;
# J. Germoni [http://images.math.cnrs.fr/Coq-et-caracteres.html Coq et caractères: Preuve formelle du théorème de Feit et Thompson]. &amp;#039;&amp;#039;Images des Mathématiques&amp;#039;&amp;#039;, CNRS, 23 de noviembre de 2012. &lt;br /&gt;
# H. Geuvers [http://www.ias.ac.in/sadhana/Pdf2009Feb/3.pdf Proof assistants: History, ideas and future]. &amp;#039;&amp;#039;Sadhana&amp;#039;&amp;#039;, Vol. 34-1, pp. 3-25, février 2009.&lt;br /&gt;
# G. Gonthier [http://www.ams.org/notices/200811/tx081101382p.pdf The four-color theorem]. &amp;#039;&amp;#039;Notices of the AMS&amp;#039;&amp;#039;, Vol. 55, n° 11, pp. 1382-1393, 2008.&lt;br /&gt;
# T. Hales. [http://www.ams.org/notices/200811/tx081101370p.pdf Formal proof]. &amp;#039;&amp;#039;Notices of AMS&amp;#039;&amp;#039;, Vol. 55, N. 11 (2008) pp. 1370-1380.&lt;br /&gt;
# J. Harrison. [http://www.cl.cam.ac.uk/~jrh13/papers/ab.html A short survey of automated reasoning]. &amp;#039;&amp;#039;Lecture Notes in Computer Science&amp;#039;&amp;#039;, Vol. 4545, pp. 334-349, 2007.&lt;br /&gt;
# J. Harrison. [http://www.ams.org/notices/200811/tx081101395p.pdf Formal proof: Theory and practice]. &amp;#039;&amp;#039;Notices of the AMS&amp;#039;&amp;#039;, Vol. 55, N. 11 (2008) p.1395-1406. &lt;br /&gt;
# G. Kolata. [http://www.nytimes.com/library/cyber/week/1210math.html Computer math proof shows reasoning power]. &amp;#039;&amp;#039;The New York Times&amp;#039;&amp;#039;, 10 de diciembre de 1996.&lt;br /&gt;
# D. MacKenzie [https://backspaces.net/temp/Spring2010Seminar/18%20unconventional%20essays%20on%20the%20nature%20of%20mathematics.pdf#page=147 Computers and the sociology of mathematical proof].&lt;br /&gt;
# G. Sutcliffe. [http://tptp.org/OverviewOfATP.html What is automated theorem proving?].&lt;br /&gt;
# F. Wiedijk [http://www.cs.ru.nl/~freek/100/ Formalizing the «top 100» of mathematical theorems].&lt;br /&gt;
# F. Wiedijk [http://www.ams.org/notices/200811/tx081101408p.pdf Formal proof - Getting started]. &amp;#039;&amp;#039;Notices of the AMS&amp;#039;&amp;#039;, Vol. 55, n° 11, pp. 1408-1414, 2008.&lt;br /&gt;
# F. Wiedijk, [https://www.cs.ru.nl/F.Wiedijk/pubs/qed2.pdf The QED manifesto revisited]. &amp;#039;&amp;#039;Studies in Logic, Grammar and Rhetoric&amp;#039;&amp;#039;, Vol. 10(23), pp. 121-133, 2007.&lt;br /&gt;
&lt;br /&gt;
== Referencias sobre Isabelle/HOL ==&lt;br /&gt;
# B. Grechuk [https://web.cs.wpi.edu/~dd/resources_isabelle/isabelle_primer_mathematicians.pdf Isabelle primer for mathematicians].&lt;br /&gt;
# T. Nipkow [https://isabelle.in.tum.de/doc/prog-prove.pdf Programming and proving in Isabelle/HOL]. &lt;br /&gt;
# T. Nipkow, M. Wenzel y L.C. Paulson [https://isabelle.in.tum.de/website-Isabelle2009/dist/Isabelle/doc/tutorial.pdf A proof assistant for higher-order logic]. &lt;br /&gt;
# [http://www.cl.cam.ac.uk/research/hvg/Isabelle/dist/library/HOL/HOL/document.pdf Isabelle/HOL — Higher-Order Logic]. &lt;br /&gt;
# [http://www.cl.cam.ac.uk/research/hvg/Isabelle/documentation.html Tutorials and manuals for Isabelle].&lt;br /&gt;
&lt;br /&gt;
== Lecturas complementarias ==&lt;br /&gt;
=== Programación funcional ===&lt;br /&gt;
# J.A. Alonso [http://www.cs.us.es/~jalonso/cursos/i1m-12/temas/2012-13-IM-temas-PF.pdf  Temas de &amp;quot;Programación funcional&amp;quot;]. Publicaciones del Grupo de Lógica Computacional. Universidad de Sevilla, 2012.&lt;br /&gt;
# J.A. Alonso y M.J. Hidalgo [http://www.cs.us.es/~jalonso/publicaciones/Piensa_en_Haskell.pdf Piensa en Haskell (Ejercicios de programación funcional con Haskell)]. Publicaciones del Grupo de Lógica Computacional. Universidad de Sevilla, 2012.&lt;br /&gt;
# G. Hutton [http://goo.gl/pKqG Programming in Haskell]. Cambridge University Press, 2007. &lt;br /&gt;
# M. Lipovača [http://aprendehaskell.es ¡Aprende Haskell por el bien de todos!].&lt;br /&gt;
&lt;br /&gt;
=== Lógica computacional ===&lt;br /&gt;
# J.A. Alonso [http://www.cs.us.es/~jalonso/cursos/li-12/temas/temas-LI-2012-13.pdf Temas de &amp;quot;Lógica informática&amp;quot; (2012-13)]. Publicaciones del Grupo de Lógica Computacional. Universidad de Sevilla, 2012.&lt;br /&gt;
# R. Bornat [http://bit.ly/oithic Proof and disproof in formal logic: an introduction for programmers]. Oxford University Press, 2005.&lt;br /&gt;
# K. Broda, S. Eisenbach, H. Khoshnevisan y S. Vickers [https://www.doc.ic.ac.uk/~susan/firstyearbook.pdf Reasoned programming]. Imperial College, 1994.&lt;br /&gt;
# K. Doets y J. van Eijck [https://books.google.es/books?id=YCC6lwEACAAJ&amp;amp;dq=The+Haskell+Road+to+Logic,+Maths+and+Programming&amp;amp;hl=es&amp;amp;sa=X&amp;amp;redir_esc=y The Haskell Road to Logic, Maths and Programming].&lt;br /&gt;
# M. Huth y M. Ryan [http://goo.gl/TMqOo Logic in computer science: Modelling and reasoning about systems]. Cambridge University Press, 2004. (Incluye el [http://www.cs.bham.ac.uk/research/lics/tutor/index.html tutor en la Red]).&lt;br /&gt;
&lt;br /&gt;
== Cursos relacionados ==&lt;br /&gt;
=== Cursos con Isabelle/HOL ===&lt;br /&gt;
# Clemens Ballarin. [http://cl-informatik.uibk.ac.at/teaching/ss08/atp/introduction.php Automatic Deduction]. (Univ de Innsbruck, 2008).&lt;br /&gt;
# Clemens Ballarin y Gerwin Klein [http://isabelle.in.tum.de/coursematerial/IJCAR04 Introduction to the Isabelle Proof Assistant]. (en el IJCAR-2004).&lt;br /&gt;
# Clemens Ballarin y Tjark Weber. [http://cl-informatik.uibk.ac.at/teaching/ws06/atp/introduction.php Automated Theorem Proving in Isabelle/HOL]. (Univ. de Innsbruck, 2006-07).&lt;br /&gt;
# A.D. Brucker, D. Basin, J.G. Smaus y B. Wolff. [http://archiv.infsec.ethz.ch/education/permanent/csmr.html Computer-supported Modeling and Reasoning]. (ETH Zurich, 2011).&lt;br /&gt;
# Mads Dam. [http://www.csc.kth.se/utbildning/kth/kurser/DD2453/aform07/ Advanced formal methods]. (KTH Royal Institute of Technology, 2007).&lt;br /&gt;
# Jacques Fleuriot y Paul Jackson. [http://www.inf.ed.ac.uk/teaching/courses/ar/slides/ Automated reasoning]. (Univ. de Edimburgo, 2012-13).&lt;br /&gt;
# Thomas Genet [http://www.irisa.fr/celtique/genet/ACF Software formal analysis and design]. (Univ. de Rennes)&lt;br /&gt;
# Gerwin Klein. [http://www.cse.unsw.edu.au/~kleing/teaching/thprv-04 Theorem Proving - Principles, Techniques, Applications]. (NICTA, 2004).&lt;br /&gt;
# Gerwin Klein. [http://www.cse.unsw.edu.au/~cs4161/index.html Advanced Topics in Software Verification]. (NICTA, 2012).&lt;br /&gt;
# Joao Marcos. [http://www.dimap.ufrn.br/~jmarcos/courses/LC/Ementa.htm Lógica computacional: Demonstração assistida e semi-automática de teoremas].(UFRN, 2000).&lt;br /&gt;
# Tobias Nipkow. [https://www21.in.tum.de/teaching/semantics/WS1920/ Semantics of programming languages]. (Univ. de Munich, 2012-13).&lt;br /&gt;
# Tobias Nipkow [http://isabelle.in.tum.de/coursematerial/PSV2009-1 Theorem Proving with Isabelle/HOL An Intensive Course]. &lt;br /&gt;
# Larry Paulson. [http://www.cl.cam.ac.uk/teaching/0910/L21/ Interactive Formal Verification]. (Univ. de Cambridge, 2009-10).&lt;br /&gt;
# Jan-Georg Smaus. [http://www.informatik.uni-freiburg.de/~ki/teaching/ws0910/csmr/lecture.html Computer-supported modeling and reasoning]. (Univ. de Feiburgo, 2009).&lt;br /&gt;
# Christian Sternagel [http://cl-informatik.uibk.ac.at/teaching/ss11/eve/content.php Experiments in Verification – Introduction to Isabelle/HOL]. (Univ. de Innsbruck, 2011-12).&lt;br /&gt;
# Tjark Weber. [http://www.cl.cam.ac.uk/teaching/1011/L21/ Interactive Formal Verification]. (Univ. de Cambridge, 2010-11).&lt;br /&gt;
&lt;br /&gt;
=== Otros cursos ===&lt;br /&gt;
# José A. Alonso [http://www.cs.us.es/~jalonso/cursos/li-12/ Lógica informática] (Univ. de Sevilla, 2012-13).&lt;br /&gt;
# Yves Bertot, Pierre Casteran, Benjamin Gregoire, Pierre Letouzey y Assia Mahboubi [http://www.di.ens.fr/~zappa/teaching/coq/ecole11 Modelling and verifying algorithms in Coq: an introduction]. (INRIA Paris-Rocquencourt, 14-18 noviembre 2011).&lt;br /&gt;
# Pierre Castéran [http://www.labri.fr/perso/casteran/FM/Logique/index.html Logic (Master In Verification)] (Univ. de Burdeos, 2011-12).&lt;br /&gt;
# Ian Hodkinson [http://www.doc.ic.ac.uk/~imh/teaching/140_logic/logic.html Logic] (Imperial College, Londres, 2010-11).&lt;br /&gt;
# Peter Lucas [http://www.cs.ru.nl/~peterl/teaching/KeR/ Knowledge Representation and Reasoning] (Radboud University # egen, 2011-12).&lt;br /&gt;
# Larry Paulson [http://www.cl.cam.ac.uk/Teaching/current/LogicProof/ Logic and Proof] (Univ. de Cambridge, 2011-12).&lt;br /&gt;
# Riccardo Pucella [http://www.ccs.neu.edu/home/riccardo/courses/csu290-sp09/index.html Logic and Computation] (Northeastern University, 2009). Curso con ACL2.&lt;br /&gt;
&lt;br /&gt;
== Bibliotecas de ejemplos de verificación ==&lt;br /&gt;
# [http://afp.sourceforge.net Archive of Formal Proofs].&lt;br /&gt;
# [http://www.cs.ru.nl/~freek/100 Formalizing 100 Theorems].&lt;br /&gt;
# [http://toccata.lri.fr/gallery Gallery of verified programs].&lt;/div&gt;</summary>
		<author><name>Jalonso</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2016/index.php?title=Temas&amp;diff=1448</id>
		<title>Temas</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2016/index.php?title=Temas&amp;diff=1448"/>
		<updated>2017-02-08T18:41:19Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Temas de &amp;#039;&amp;#039;Razonamiento automático (2016-17)&amp;#039;&amp;#039; ==&lt;br /&gt;
&lt;br /&gt;
* [[Tema 1: Programación funcional en Isabelle]].&lt;br /&gt;
* Tema 2: Razonamiento sobre programas:&lt;br /&gt;
** [http://www.cs.us.es/~jalonso/cursos/i1m-16/temas/tema-8.pdf Tema 2a: Razonamiento sobre programas Haskell]&lt;br /&gt;
** [[Tema 2b: Razonamiento automático sobre programas en Isabelle/HOL]].&lt;br /&gt;
* [[Tema 3: Razonamiento estructurado sobre programas en Isabelle/HOL]].&lt;br /&gt;
* [[Tema 4: Razonamiento por casos y por inducción]].&lt;br /&gt;
* [[Tema 5: Razonamiento sobre árboles y bosques]].&lt;br /&gt;
* Tema 6: Verificación de algoritmos de ordenación:&lt;br /&gt;
** [[Tema 6a: Verificación de la ordenación por inserción]].&lt;br /&gt;
** [[Tema 6b: Verificación de la ordenación por mezcla]].&lt;br /&gt;
* [[Tema 7: Caso de estudio: Compilación de expresiones]].&lt;br /&gt;
* Tema 8: Deducción natural proposicional:&lt;br /&gt;
** [http://www.cs.us.es/~jalonso/cursos/li/temas/tema-2.pdf Tema 8a: Deducción natural proposicional].&lt;br /&gt;
** [[Tema 8b: Deducción natural proposicional con Isabelle/HOL]].&lt;br /&gt;
* Tema 9: Deducción natural de primer orden:&lt;br /&gt;
** [http://www.cs.us.es/~jalonso/cursos/li/temas/tema-8.pdf Tema 9a: Deducción natural en lógica de primer orden].&lt;br /&gt;
** [[Tema 9b: Deducción natural en lógica de primer orden con Isabelle/HOL]]&lt;br /&gt;
* [[Tema 10: Conjuntos, funciones y relaciones]].&lt;br /&gt;
* [http://www.cs.us.es/~jalonso/cursos/dao-12/temas/tema-1.pdf Tema 11: Panorama de la demostración asistida por ordenador].&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
* [[Tema 10: Conjuntos definidos inductivamente]].&lt;br /&gt;
* [[Tema 11: Gramáticas libre de contexto]].&lt;br /&gt;
* Tema 12: Misceláneas:&lt;br /&gt;
** [[Tema 12a: Razonamiento modular (Teoría de grupos)]].&lt;br /&gt;
** [[Tema 12b: Razonamiento modular]].&lt;br /&gt;
** [[Tema 12c: Automatización]].&lt;br /&gt;
** [[Tema 12d: Pasos elementales]].&lt;br /&gt;
** [[Tema 12e: Sudoku]].&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jalonso</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2016/index.php?title=Tema_10:_Conjuntos,_funciones_y_relaciones&amp;diff=1447</id>
		<title>Tema 10: Conjuntos, funciones y relaciones</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2016/index.php?title=Tema_10:_Conjuntos,_funciones_y_relaciones&amp;diff=1447"/>
		<updated>2017-02-02T14:39:59Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
chapter {* Tema 10: Conjuntos, funciones y relaciones *}&lt;br /&gt;
&lt;br /&gt;
theory T10_Conjuntos_funciones_y_relaciones&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
section {* Conjuntos *}&lt;br /&gt;
&lt;br /&gt;
subsection {* Operaciones con conjuntos *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Nota. La teoría elemental de conjuntos es HOL/Set.thy.&lt;br /&gt;
&lt;br /&gt;
  Nota. En un conjunto todos los elemento son del mismo tipo (por&lt;br /&gt;
  ejemplo, del tipo τ) y el conjunto tiene tipo (en el ejemplo, &amp;quot;τ set&amp;quot;). &lt;br /&gt;
&lt;br /&gt;
  Reglas de la intersección:&lt;br /&gt;
  · IntI:  ⟦c ∈ A; c ∈ B⟧ ⟹ c ∈ A ∩ B&lt;br /&gt;
  · IntD1: c ∈ A ∩ B ⟹ c ∈ A&lt;br /&gt;
  · IntD2: c ∈ A ∩ B ⟹ c ∈ B&lt;br /&gt;
&lt;br /&gt;
  Nota. Propiedades del complementario:&lt;br /&gt;
  · Compl_iff: (c ∈ - A) = (c ∉ A)&lt;br /&gt;
  · Compl_Un:  - (A ∪ B) = - A ∩ - B&lt;br /&gt;
&lt;br /&gt;
  Nota. El conjunto vacío se representa por {} y el universal por UNIV. &lt;br /&gt;
&lt;br /&gt;
  Nota. Propiedades de la diferencia y del complementario:&lt;br /&gt;
  · Diff_disjoint:   A ∩ (B - A) = {}&lt;br /&gt;
  · Compl_partition: A ∪ - A = UNIV&lt;br /&gt;
&lt;br /&gt;
  Nota. Reglas de la relación de subconjunto:&lt;br /&gt;
  · subsetI: (⋀x. x ∈ A ⟹ x ∈ B) ⟹ A ⊆ B&lt;br /&gt;
  · subsetD: ⟦A ⊆ B; c ∈ A⟧ ⟹ c ∈ B   &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Ejemplo: A ∪ B ⊆ C syss A ⊆ C ∧ B ⊆ C.   &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;(A ∪ B ⊆ C) = (A ⊆ C ∧ B ⊆ C)&amp;quot;&lt;br /&gt;
by blast&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Ejemplo: A ⊆ -B syss B ⊆ -A.   &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;(A ⊆ -B) = (B ⊆ -A)&amp;quot;&lt;br /&gt;
by blast&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Principio de extensionalidad de conjuntos:&lt;br /&gt;
  · set_eqI: (⋀x. (x ∈ A) = (x ∈ B)) ⟹ A = B&lt;br /&gt;
&lt;br /&gt;
  Reglas de la igualdad de conjuntos:&lt;br /&gt;
  · equalityI:  ⟦A ⊆ B; B ⊆ A⟧ ⟹ A = B&lt;br /&gt;
  · equalityD1: A = B ⟹ A ⊆ B&lt;br /&gt;
  · equalityD2: A = B ⟹ B ⊆ A &lt;br /&gt;
  · equalityE:  ⟦A = B; ⟦A ⊆ B; B ⊆ A⟧ ⟹ P⟧ ⟹ P   &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Lema. [Analogía entre intersección y conjunción]&lt;br /&gt;
  &amp;quot;x ∈ A ∩ B&amp;quot; syss &amp;quot;x ∈ A&amp;quot; y &amp;quot;x ∈ B&amp;quot;. &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;(x ∈ A ∩ B) = (x ∈ A ∧ x ∈ B)&amp;quot; &lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Lema. [Analogía entre unión y disyunción]&lt;br /&gt;
  x ∈ A ∪ B syss x ∈ A ó x ∈ B.   &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;(x ∈ A ∪ B) = (x ∈ A ∨ x ∈ B)&amp;quot; &lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Lema. [Analogía entre subconjunto e implicación]&lt;br /&gt;
  A ⊆ B syss para todo x, si x ∈ A entonces x ∈ B.   &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;(A ⊆ B) = (∀ x. x ∈ A ⟶ x ∈ B)&amp;quot; &lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Lema. [Analogía entre complementario y negación]&lt;br /&gt;
  x pertenece al complementario de A syss x no pertenece a A.   &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;(x ∈ -A) = (x ∉ A)&amp;quot; &lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
subsection {* Notación de conjuntos finitos *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Nota. La teoría de conjuntos finitos es HOL/Finite_Set.thy.&lt;br /&gt;
&lt;br /&gt;
  Nota. Los conjuntos finitos se definen por inducción a partir de las&lt;br /&gt;
  siguientes reglas inductivas:&lt;br /&gt;
  · El conjunto vacío es un conjunto finito.&lt;br /&gt;
    · emptyI: &amp;quot;finite {}&amp;quot;&lt;br /&gt;
  · Si se le añade un elemento a un conjunto finito se obtiene otro&lt;br /&gt;
    conjunto finito. &lt;br /&gt;
    · insertI: &amp;quot;finite A ⟹ finite (insert a A)&amp;quot; &lt;br /&gt;
&lt;br /&gt;
  A continuación se muestran ejemplos de conjuntos finitos.   &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &lt;br /&gt;
  &amp;quot;insert 2 {} = {2} ∧&lt;br /&gt;
   insert 3 {2} = {2,3} ∧&lt;br /&gt;
   insert 2 {2,3} = {2,3} ∧&lt;br /&gt;
   {2,3} = {3,2,3,2,2}&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Nota. Los conjuntos finitos se representan con la notación conjuntista&lt;br /&gt;
  habitual: los elementos entre llaves y separados por comas. &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Ejemplo: {a,b} ∪ {c,d} = {a,b,c,d}   &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;{a,b} ∪ {c,d} = {a,b,c,d}&amp;quot; &lt;br /&gt;
by blast&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Ejemplo de conjetura falsa y su refutación. &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;{a,b} ∩ {b,c} = {b}&amp;quot; &lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Ejemplo con la conjetura corregida.   &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;{a,b} ∩ {b,c} = (if a = c then {a,b} else {b})&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Sumas de conjuntos finitos:&lt;br /&gt;
  · ∑A es la suma de los elementos del conjunto finito A. Por ejemplo, &lt;br /&gt;
      value &amp;quot;∑{1,2,3}::int&amp;quot; -- &amp;quot;= 6&amp;quot;&lt;br /&gt;
  · (setsum f A) es la suma de la aplicación de f a los elementos del&lt;br /&gt;
    conjunto finito A,  Por ejemplo,&lt;br /&gt;
       value &amp;quot;setsum (λx. x*x) {1,2,3}::int&amp;quot; -- &amp;quot;= 14&amp;quot;&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Ejemplos de definiciones recursivas sobre conjuntos finitos: &lt;br /&gt;
  Sea A un conjunto finito de números naturales.&lt;br /&gt;
  · sumaConj A es la suma de los elementos A.&lt;br /&gt;
  · sumaCuadradosConj A es la suma de los cuadrados de los elementos A. &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
definition sumaConj :: &amp;quot;nat set ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;sumaConj S ≡ ∑S&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;sumaConj {2,5,3} = 10&amp;quot;&lt;br /&gt;
&lt;br /&gt;
definition sumaCuadradosConj :: &amp;quot;nat set ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;sumaCuadradosConj S ≡ setsum (λx. x*x) S&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;sumaCuadradosConj {2,5,3} = 38&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Nota. Para simplificar lo que sigue, declaramos las anteriores&lt;br /&gt;
  definiciones como reglas de simplificación.   &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
declare sumaConj_def[simp]&lt;br /&gt;
declare sumaCuadradosConj_def[simp]&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Ejemplos de evaluación de las anteriores definiciones recursivas.   &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &lt;br /&gt;
  &amp;quot;sumaConj {1,2,3,4} = 10 ∧&lt;br /&gt;
   sumaCuadradosConj {1,2,3,4} = 30&amp;quot;&lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Inducción sobre conjuntos finitos: Para demostrar que todos los&lt;br /&gt;
  conjuntos finitos tienen una propiedad P basta probar que&lt;br /&gt;
  · El conjunto vacío tiene la propiedad P.&lt;br /&gt;
  · Si a un conjunto finito que tiene la propiedad P se le añade un&lt;br /&gt;
    nuevo elemento, el conjunto obtenido sigue teniendo la propiedad P. &lt;br /&gt;
  En forma de regla&lt;br /&gt;
  · finite_induct: ⟦finite F; &lt;br /&gt;
                    P {}; &lt;br /&gt;
                    ⋀x F. ⟦finite F; x ∉ F; P F⟧ ⟹ P ({x} ∪ F)⟧ &lt;br /&gt;
                   ⟹ P F   &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Ejemplo de inducción sobre conjuntos finitos: Sea S un conjunto finito&lt;br /&gt;
  de números naturales. Entonces todos los elementos de S son menores o&lt;br /&gt;
  iguales que la suma de los elementos de S. &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma &amp;quot;finite S ⟹ ∀x∈S. x ≤ sumaConj S&amp;quot;&lt;br /&gt;
by (induct rule: finite_induct) auto&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma sumaConj_acota: &lt;br /&gt;
  &amp;quot;finite S ⟹ ∀x∈S. x ≤ sumaConj S&amp;quot;&lt;br /&gt;
proof (induct rule: finite_induct)&lt;br /&gt;
  show &amp;quot;∀x ∈ {}. x ≤ sumaConj {}&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x and F&lt;br /&gt;
  assume fF: &amp;quot;finite F&amp;quot; &lt;br /&gt;
     and xF: &amp;quot;x ∉ F&amp;quot; &lt;br /&gt;
     and HI: &amp;quot;∀ x∈F. x ≤ sumaConj F&amp;quot;&lt;br /&gt;
  show &amp;quot;∀y ∈ insert x F. y ≤ sumaConj (insert x F)&amp;quot;&lt;br /&gt;
  proof &lt;br /&gt;
    fix y &lt;br /&gt;
    assume &amp;quot;y ∈ insert x F&amp;quot;&lt;br /&gt;
    show &amp;quot;y ≤ sumaConj (insert x F)&amp;quot;&lt;br /&gt;
    proof (cases &amp;quot;y = x&amp;quot;)&lt;br /&gt;
      assume &amp;quot;y = x&amp;quot;&lt;br /&gt;
      hence &amp;quot;y ≤ x + (sumaConj F)&amp;quot; by simp&lt;br /&gt;
      also have &amp;quot;… = sumaConj (insert x F)&amp;quot; using fF xF by simp&lt;br /&gt;
      finally show ?thesis .&lt;br /&gt;
    next&lt;br /&gt;
      assume &amp;quot;y ≠ x&amp;quot;&lt;br /&gt;
      hence &amp;quot;y ∈ F&amp;quot; using `y ∈ insert x F` by simp&lt;br /&gt;
      hence &amp;quot;y ≤ sumaConj F&amp;quot; using HI by blast&lt;br /&gt;
      also have &amp;quot;… ≤ x + (sumaConj F)&amp;quot; by simp&lt;br /&gt;
      also have &amp;quot;… = sumaConj (insert x F)&amp;quot; using fF xF by simp&lt;br /&gt;
      finally show ?thesis .&lt;br /&gt;
    qed&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
subsection {* Definiciones por comprensión *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  El conjunto de los elementos que cumple la propiedad P se representa&lt;br /&gt;
  por {x. P}. &lt;br /&gt;
&lt;br /&gt;
  Reglas de comprensión (relación entre colección y pertenencia):&lt;br /&gt;
  · mem_Collect_eq: (a ∈ {x. P x}) = P a&lt;br /&gt;
  · Collect_mem_eq: {x. x ∈ A} = A   &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Ejemplo de comprensión: {x. P x ∨ x ∈ A} = {x. P x} ∪ A   &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;{x. P x ∨ x ∈ A} = {x. P x} ∪ A&amp;quot;&lt;br /&gt;
by blast&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Ejemplo de comprensión: {x. P x ⟶ Q x} = -{x. P x} ∪ {x. Q x}   &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;{x. P x ⟶ Q x} = -{x. P x} ∪ {x. Q x}&amp;quot;&lt;br /&gt;
by blast&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Ejemplo con la sintaxis general de comprensión.   &lt;br /&gt;
     {p*q | p q. p ∈ prime ∧ q ∈ prime} = &lt;br /&gt;
     {z. ∃p q. z = p*q ∧ p ∈ prime ∧ q ∈ prime}   &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &lt;br /&gt;
  &amp;quot;{p*q | p q. p ∈ prime ∧ q ∈ prime} = &lt;br /&gt;
   {z. ∃p q. z = p*q ∧ p ∈ prime ∧ q ∈ prime}&amp;quot;&lt;br /&gt;
by blast&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
   En HOL, la notación conjuntista es azúcar sintáctica:&lt;br /&gt;
   · x ∈ A  es equivalente a A(x).&lt;br /&gt;
   · {x. P} es equivalente a λx. P.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Ejemplo de definición por comprensión: El conjunto de los pares es el&lt;br /&gt;
  de los números n para los que existe un m tal que n = 2*m.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
definition Pares :: &amp;quot;nat set&amp;quot; where&lt;br /&gt;
  &amp;quot;Pares ≡ {n. ∃m. n = 2*m }&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Ejemplo. Los números 2 y 34 son pares.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &lt;br /&gt;
  &amp;quot;2 ∈ Pares ∧&lt;br /&gt;
   34 ∈ Pares&amp;quot; &lt;br /&gt;
by (simp add: Pares_def)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Definición. El conjunto de los impares es el de los números n para los&lt;br /&gt;
  que existe un m tal que n = 2*m + 1.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
definition Impares :: &amp;quot;nat set&amp;quot; where&lt;br /&gt;
  &amp;quot;Impares ≡ {n. ∃m. n = 2*m + 1}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Ejemplo con las reglas de intersección y comprensión: El conjunto de&lt;br /&gt;
  los pares es disjunto con el de los impares. &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración detallada es&amp;quot;&lt;br /&gt;
lemma &amp;quot;x ∉ (Pares ∩ Impares)&amp;quot;&lt;br /&gt;
proof &lt;br /&gt;
  fix x assume S: &amp;quot;x ∈ (Pares ∩ Impares)&amp;quot;&lt;br /&gt;
  hence &amp;quot;x ∈ Pares&amp;quot; by (rule IntD1)&lt;br /&gt;
  hence &amp;quot;∃m. x = 2 * m&amp;quot; by (simp only: Pares_def mem_Collect_eq)&lt;br /&gt;
  then obtain p where p: &amp;quot;x = 2 * p&amp;quot; .. &lt;br /&gt;
  from S have &amp;quot;x ∈ Impares&amp;quot; by (rule IntD2)&lt;br /&gt;
  hence &amp;quot;∃ m. x = 2 * m + 1&amp;quot; by (simp only: Impares_def mem_Collect_eq)&lt;br /&gt;
  then obtain q where q: &amp;quot;x = 2 * q + 1&amp;quot; .. &lt;br /&gt;
  from p and q show &amp;quot;False&amp;quot; by arith&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma &amp;quot;x ∉ (Pares ∩ Impares)&amp;quot;&lt;br /&gt;
proof &lt;br /&gt;
  fix x assume S: &amp;quot;x ∈ (Pares ∩ Impares)&amp;quot;&lt;br /&gt;
  hence &amp;quot;x ∈ Pares&amp;quot; ..&lt;br /&gt;
  hence &amp;quot;∃m. x = 2 * m&amp;quot; by (simp only: Pares_def mem_Collect_eq)&lt;br /&gt;
  then obtain p where p: &amp;quot;x = 2 * p&amp;quot; .. &lt;br /&gt;
  from S have &amp;quot;x ∈ Impares&amp;quot; ..&lt;br /&gt;
  hence &amp;quot;∃ m. x = 2 * m + 1&amp;quot; by (simp only: Impares_def mem_Collect_eq)&lt;br /&gt;
  then obtain q where q: &amp;quot;x = 2 * q + 1&amp;quot; .. &lt;br /&gt;
  from p and q show &amp;quot;False&amp;quot; by arith&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma &amp;quot;x ∉ (Pares ∩ Impares)&amp;quot;&lt;br /&gt;
by (auto simp add: Pares_def Impares_def, arith)&lt;br /&gt;
&lt;br /&gt;
subsection {* Cuantificadores acotados *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Reglas de cuantificador universal acotado (&amp;quot;bounded&amp;quot;):&lt;br /&gt;
  · ballI: (⋀x. x ∈ A ⟹ P x) ⟹ ∀x∈A. P x&lt;br /&gt;
  · bspec: ⟦∀x∈A. P x; x ∈ A⟧ ⟹ P x&lt;br /&gt;
&lt;br /&gt;
  Reglas de cuantificador existencial acotado (&amp;quot;bounded&amp;quot;):&lt;br /&gt;
  · bexI: ⟦P x; x ∈ A⟧ ⟹ ∃x∈A. P x&lt;br /&gt;
  · bexE: ⟦∃x∈A. P x; ⋀x. ⟦x ∈ A; P x⟧ ⟹ Q⟧ ⟹ Q&lt;br /&gt;
&lt;br /&gt;
  Reglas de la unión indexada:&lt;br /&gt;
  · UN_iff: (b ∈ (⋃x∈A. B x)) = (∃x∈A. b ∈ B x)&lt;br /&gt;
  · UN_I:   ⟦a ∈ A; b ∈ B a⟧ ⟹ b ∈ (⋃x∈A. B x)&lt;br /&gt;
  · UN_E:   ⟦b ∈ (⋃x∈A. B x); ⋀x. ⟦x ∈ A; b ∈ B x⟧ ⟹ R⟧ ⟹ R&lt;br /&gt;
&lt;br /&gt;
  Reglas de la unión de una familia:&lt;br /&gt;
  · Union_def: ⋃S = (⋃x∈S. x)&lt;br /&gt;
  · Union_iff: (A ∈ ⋃C) = (∃X∈C. A ∈ X)&lt;br /&gt;
&lt;br /&gt;
  Reglas de la intersección indexada:&lt;br /&gt;
  · INT_iff: (b ∈ (⋂x∈A. B x)) = (∀x∈A. b ∈ B x)&lt;br /&gt;
  · INT_I:   (⋀x. x ∈ A ⟹ b ∈ B x) ⟹ b ∈ (⋂x∈A. B x)&lt;br /&gt;
  · INT_E:   ⟦b ∈ (⋂x∈A. B x); b ∈ B a ⟹ R; a ∉ A ⟹ R⟧ ⟹ R&lt;br /&gt;
&lt;br /&gt;
  Reglas de la intersección de una familia:&lt;br /&gt;
  · Inter_def: ⋂S = (⋂x∈S. x)&lt;br /&gt;
  · Inter_iff: (A ∈ ⋂C) = (∀X∈C. A ∈ X)&lt;br /&gt;
&lt;br /&gt;
  Abreviaturas:&lt;br /&gt;
  · &amp;quot;Collect P&amp;quot; es lo mismo que &amp;quot;{x. P}&amp;quot;.&lt;br /&gt;
  · &amp;quot;All P&amp;quot;     es lo mismo que &amp;quot;∀x. P x&amp;quot;.&lt;br /&gt;
  · &amp;quot;Ex P&amp;quot;      es lo mismo que &amp;quot;∃x. P x&amp;quot;.&lt;br /&gt;
  · &amp;quot;Ball A P&amp;quot;  es lo mismo que &amp;quot;∀x∈A. P x&amp;quot;.&lt;br /&gt;
  · &amp;quot;Bex A P&amp;quot;   es lo mismo que &amp;quot;∃x∈A. P x&amp;quot;.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
subsection {* Conjuntos finitos y cardinalidad *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  El número de elementos de un conjunto finito A es el cardinal de A y&lt;br /&gt;
  se representa por &amp;quot;card A&amp;quot;.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Ejemplos de cardinales de conjuntos finitos.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &lt;br /&gt;
  &amp;quot;card {} = 0 ∧&lt;br /&gt;
   card {4} = 1 ∧&lt;br /&gt;
   card {4,1} = 2 ∧&lt;br /&gt;
   x ≠ y ⟹ card {x,y} = 2&amp;quot; &lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Propiedades de cardinales:&lt;br /&gt;
  · Cardinal de la unión de conjuntos finitos:&lt;br /&gt;
    card_Un_Int: ⟦finite A; finite B⟧ &lt;br /&gt;
                 ⟹ card A + card B = card (A ∪ B) + card (A ∩ B)&amp;quot; &lt;br /&gt;
  · Cardinal del conjunto potencia: &lt;br /&gt;
    card_Pow: finite A ⟹ card (Pow A) = 2 ^ card A&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
section {* Funciones *}&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  La teoría de funciones es HOL/Fun.thy. &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
subsection {* Nociones básicas de funciones *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Principio de extensionalidad para funciones:&lt;br /&gt;
  · ext: (⋀x. f x = g x) ⟹ f = g&lt;br /&gt;
&lt;br /&gt;
  Actualización de funciones  &lt;br /&gt;
  · fun_upd_apply: (f(x := y)) z = (if z = x then y else f z)&lt;br /&gt;
  · fun_upd_upd:   f(x := y, x := z) = f(x := z)&lt;br /&gt;
&lt;br /&gt;
  Función identidad&lt;br /&gt;
  · id_def: id ≡ λx. x&lt;br /&gt;
&lt;br /&gt;
  Composición de funciones:&lt;br /&gt;
  · o_def: f ∘ g = (λx. f (g x))&lt;br /&gt;
&lt;br /&gt;
  Asociatividad de la composición:&lt;br /&gt;
  · o_assoc: f ∘ (g ∘ h) = (f ∘ g) ∘ h&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
subsection {* Funciones inyectivas, suprayectivas y biyectivas *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Función inyectiva sobre A:&lt;br /&gt;
  · inj_on_def: inj_on f A ≡ ∀x∈A. ∀y∈A. f x = f y ⟶ x = y&lt;br /&gt;
&lt;br /&gt;
  Nota. &amp;quot;inj f&amp;quot; es una abreviatura de &amp;quot;inj_on f UNIV&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
  Función suprayectiva:&lt;br /&gt;
  · surj_def: surj f ≡ ∀y. ∃x. y = f x&lt;br /&gt;
&lt;br /&gt;
  Función biyectiva:&lt;br /&gt;
  · bij_def: bij f ≡ inj f ∧ surj f&lt;br /&gt;
&lt;br /&gt;
  Propiedades de las funciones inversas:&lt;br /&gt;
  · inv_f_f:      inj f  ⟹ inv f (f x) = x&lt;br /&gt;
  · surj_f_inv_f: surj f ⟹ f (inv f y) = y&lt;br /&gt;
  · inv_inv_eq:   bij f  ⟹ inv (inv f) = f&lt;br /&gt;
&lt;br /&gt;
  Igualdad de funciones (por extensionalidad):&lt;br /&gt;
  · fun_eq_iff: (f = g) = (∀x. f x = g x)&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Ejemplo de lema de demostración de propiedades de funciones: Una&lt;br /&gt;
  función inyectiva puede cancelarse en el lado izquierdo de la&lt;br /&gt;
  composición de funciones. &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración detallada es&amp;quot;&lt;br /&gt;
lemma &lt;br /&gt;
  assumes &amp;quot;inj f&amp;quot;&lt;br /&gt;
  shows &amp;quot;(f ∘ g = f ∘ h) = (g = h)&amp;quot;&lt;br /&gt;
proof &lt;br /&gt;
  assume &amp;quot;f ∘ g = f ∘ h&amp;quot;&lt;br /&gt;
  show &amp;quot;g = h&amp;quot;&lt;br /&gt;
  proof&lt;br /&gt;
    fix x&lt;br /&gt;
    have &amp;quot;(f ∘ g)(x) = (f ∘ h)(x)&amp;quot; using `f ∘ g = f ∘ h` by simp&lt;br /&gt;
    hence &amp;quot;f(g(x)) = f(h(x))&amp;quot; by simp&lt;br /&gt;
    then show &amp;quot;g(x) = h(x)&amp;quot; using `inj f` by (simp add:inj_on_def)&lt;br /&gt;
  qed&lt;br /&gt;
next&lt;br /&gt;
  assume &amp;quot;g = h&amp;quot;&lt;br /&gt;
  show &amp;quot;f ∘ g = f ∘ h&amp;quot;&lt;br /&gt;
  proof&lt;br /&gt;
    fix x&lt;br /&gt;
    have &amp;quot;(f ∘ g) x = f(g(x))&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;… = f(h(x))&amp;quot; using `g = h` by simp&lt;br /&gt;
    also have &amp;quot;… = (f ∘ h) x&amp;quot; by simp&lt;br /&gt;
    finally show &amp;quot;(f ∘ g) x = (f ∘ h) x&amp;quot; by simp&lt;br /&gt;
  qed&lt;br /&gt;
qed&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;inj f&amp;quot;&lt;br /&gt;
  shows &amp;quot;(f ∘ g = f ∘ h) = (g = h)&amp;quot;&lt;br /&gt;
proof &lt;br /&gt;
  assume &amp;quot;f ∘ g = f ∘ h&amp;quot; &lt;br /&gt;
  thus &amp;quot;g = h&amp;quot; using `inj f` by (simp add: inj_on_def fun_eq_iff) &lt;br /&gt;
next&lt;br /&gt;
  assume &amp;quot;g = h&amp;quot; &lt;br /&gt;
  thus &amp;quot;f ∘ g = f ∘ h&amp;quot; by auto&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma &lt;br /&gt;
  assumes &amp;quot;inj f&amp;quot;&lt;br /&gt;
  shows &amp;quot;(f ∘ g = f ∘ h) = (g = h)&amp;quot;&lt;br /&gt;
using assms&lt;br /&gt;
by (auto simp add: inj_on_def fun_eq_iff) &lt;br /&gt;
&lt;br /&gt;
subsubsection {* Función imagen *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Imagen de un conjunto mediante una función:&lt;br /&gt;
  · image_def: f ` A = {y. (∃x∈A. y = f x)}&lt;br /&gt;
&lt;br /&gt;
  Propiedades de la imagen:&lt;br /&gt;
  · image_compose: (f ∘ g)`r = f`g`r&lt;br /&gt;
  · image_Un:      f`(A ∪ B) = f`A ∪ f`B &lt;br /&gt;
  · image_Int:     inj f ⟹ f`(A ∩ B) = f`A ∩ f`B&amp;quot; &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Ejemplo de demostración de propiedades de la imagen:&lt;br /&gt;
     f`A ∪ g`A = (⋃x∈A. {f x, g x})&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;f`A ∪ g`A = (⋃x∈A. {f x, g x})&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Ejemplo de demostración de propiedades de la imagen:&lt;br /&gt;
     f`{(x,y). P x y} = {f(x,y) | x y. P x y}&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;f`{(x,y). P x y} = {f(x,y) | x y. P x y}&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  El rango de una función (&amp;quot;range f&amp;quot;) es la imagen del universo &lt;br /&gt;
  (&amp;quot;f`UNIV&amp;quot;). &lt;br /&gt;
&lt;br /&gt;
  Imagen inversa de un conjunto:&lt;br /&gt;
  · vimage_def: f -` B ≡ {x. f x ∈ B}&lt;br /&gt;
&lt;br /&gt;
  Propiedad de la imagen inversa de un conjunto:&lt;br /&gt;
  · vimage_Compl: f -` (-A) = -(f -` A)&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
section {* Relaciones *}&lt;br /&gt;
&lt;br /&gt;
subsection {* Relaciones básicas *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  La teoría de relaciones es HOL/Relation.thy.&lt;br /&gt;
&lt;br /&gt;
  Las relaciones son conjuntos de pares.&lt;br /&gt;
&lt;br /&gt;
  Relación identidad:&lt;br /&gt;
  · Id_def: Id ≡ {p. ∃x. p = (x,x)}&lt;br /&gt;
&lt;br /&gt;
  Composición de relaciones:&lt;br /&gt;
  · rel_comp_def: r O s ≡ {(x,z). ∃y. (x, y) ∈ r ∧ (y, z) ∈ s}&lt;br /&gt;
&lt;br /&gt;
  Propiedades:&lt;br /&gt;
  · R_O_Id:        R O Id = R&lt;br /&gt;
  · rel_comp_mono: ⟦r&amp;#039; ⊆ r; s&amp;#039; ⊆ s⟧ ⟹ (r&amp;#039; O s&amp;#039;) ⊆ (r O s)&lt;br /&gt;
&lt;br /&gt;
  Imagen inversa de una relación:&lt;br /&gt;
  · converse_iff: ((a,b) ∈ r^-1) = ((b,a) ∈ r)&lt;br /&gt;
&lt;br /&gt;
  Propiedad de la imagen inversa de una relación:&lt;br /&gt;
  · converse_rel_comp: (r O s)^-1 = s^-1 O r^-1&lt;br /&gt;
&lt;br /&gt;
  Imagen de un conjunto mediante una relación:&lt;br /&gt;
  · Image_iff: (b ∈ r``A) = (∃x:A. (x, b) ∈ r)&lt;br /&gt;
&lt;br /&gt;
  Dominio de una relación:&lt;br /&gt;
  · Domain_iff: (a ∈ Domain r) = (∃y. (a, y) ∈ r)&lt;br /&gt;
&lt;br /&gt;
  Rango de una relación:&lt;br /&gt;
  · Range_iff: (a ∈ Range r) = (∃y. (y,a) ∈ r)&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>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2016/index.php?title=Sistemas&amp;diff=1378</id>
		<title>Sistemas</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2016/index.php?title=Sistemas&amp;diff=1378"/>
		<updated>2017-01-26T14:12:08Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: /* Sistemas utilizados en Razonamiento automático (2016-17) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Sistemas utilizados en &amp;#039;&amp;#039;Razonamiento automático (2016-17)&amp;#039;&amp;#039; ==&lt;br /&gt;
&lt;br /&gt;
En esta página se irá escribiendo enlaces a los sistemas utilizados en el curso&lt;br /&gt;
# [http://www.cl.cam.ac.uk/research/hvg/Isabelle/index.html Isabelle/HOL].&lt;br /&gt;
# [http://www.glc.us.es/apli2 APLI2 (APLIcación de Ayuda Para Lógica Informática)].&lt;/div&gt;</summary>
		<author><name>Jalonso</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2016/index.php?title=Relaci%C3%B3n_10&amp;diff=1374</id>
		<title>Relación 10</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2016/index.php?title=Relaci%C3%B3n_10&amp;diff=1374"/>
		<updated>2017-01-26T07:29:51Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: Página creada con &amp;#039;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt; chapter {* R10: Formalización y argumentación con Isabelle/HOL *}  theory R10_Formalizacion_y_argmentacion imports Main  begin  text {*   ----------------...&amp;#039;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
chapter {* R10: Formalización y argumentación con Isabelle/HOL *}&lt;br /&gt;
&lt;br /&gt;
theory R10_Formalizacion_y_argmentacion&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  El objetivo de esta es relación formalizar y demostrar la corrección&lt;br /&gt;
  de los argumentos automáticamente y detalladamente usando sólo las reglas&lt;br /&gt;
  básicas de deducción natural. &lt;br /&gt;
&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;
&lt;br /&gt;
  · allI:       ⟦∀x. P x; P x ⟹ R⟧ ⟹ R&lt;br /&gt;
  · allE:       (⋀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⟧ ⟹ a: = 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;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Se usarán las reglas notnotI, mt, no_ex y no_para_todo que demostramos&lt;br /&gt;
  a 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;
lemma no_ex: &amp;quot;¬(∃x. P(x)) ⟹ ∀x. ¬P(x)&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
lemma no_para_todo: &amp;quot;¬(∀x. P(x)) ⟹ ∃x. ¬P(x)&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. Formalizar, y demostrar la corrección, del siguiente&lt;br /&gt;
  argumento &lt;br /&gt;
     Si la válvula está abierta o la monitorización está preparada,&lt;br /&gt;
     entonces se envía una señal de reconocimiento y un mensaje de&lt;br /&gt;
     funcionamiento al controlador del ordenador. Si se envía un mensaje &lt;br /&gt;
     de funcionamiento al controlador del ordenador o el sistema está en &lt;br /&gt;
     estado normal, entonces se aceptan las órdenes del operador. Por lo&lt;br /&gt;
     tanto, si la válvula está abierta, entonces se aceptan las órdenes&lt;br /&gt;
     del operador. &lt;br /&gt;
  Usar A : La válvula está abierta.&lt;br /&gt;
       P : La monitorización está preparada.&lt;br /&gt;
       R : Envía una señal de reconocimiento.&lt;br /&gt;
       F : Envía un mensaje de funcionamiento.&lt;br /&gt;
       N : El sistema está en estado normal.&lt;br /&gt;
       O : Se aceptan órdenes del operador.&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Formalizar, y decidir la corrección, del siguiente&lt;br /&gt;
  argumento &lt;br /&gt;
     Hay estudiantes inteligentes y hay estudiantes trabajadores. Por&lt;br /&gt;
     tanto, hay estudiantes inteligentes y trabajadores.&lt;br /&gt;
  Usar I(x) para x es inteligente&lt;br /&gt;
       T(x) para x es trabajador&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. Formalizar, y decidir la corrección, del siguiente&lt;br /&gt;
  argumento &lt;br /&gt;
     Los hermanos tienen el mismo padre. Juan es hermano de Luis. Carlos&lt;br /&gt;
     es padre de Luis. Por tanto, Carlos es padre de Juan.&lt;br /&gt;
  Usar H(x,y) para x es hermano de y&lt;br /&gt;
       P(x,y) para x es padre de y&lt;br /&gt;
       j      para Juan&lt;br /&gt;
       l      para Luis&lt;br /&gt;
       c      para Carlos&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Formalizar, y decidir la corrección, del siguiente&lt;br /&gt;
  argumento &lt;br /&gt;
     Los aficionados al fútbol aplauden a cualquier futbolista&lt;br /&gt;
     extranjero. Juanito no aplaude a futbolistas extranjeros. Por&lt;br /&gt;
     tanto, si hay algún futbolista extranjero nacionalizado español,&lt;br /&gt;
     Juanito no es aficionado al fútbol.&lt;br /&gt;
  Usar Af(x)   para x es aficicionado al fútbol&lt;br /&gt;
       Ap(x,y) para x aplaude a y&lt;br /&gt;
       E(x)    para x es un futbolista extranjero&lt;br /&gt;
       N(x)    para x es un futbolista nacionalizado español&lt;br /&gt;
       j       para Juanito&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. Formalizar, y decidir la corrección, del siguiente&lt;br /&gt;
  argumento &lt;br /&gt;
     El esposo de la hermana de Toni es Roberto. La hermana de Toni es&lt;br /&gt;
     María. Por tanto, el esposo de María es Roberto. &lt;br /&gt;
  Usar e(x) para el esposo de x&lt;br /&gt;
       h    para la hermana de Toni&lt;br /&gt;
       m    para María&lt;br /&gt;
       r    para Roberto&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>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2016/index.php?title=R10&amp;diff=1373</id>
		<title>R10</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2016/index.php?title=R10&amp;diff=1373"/>
		<updated>2017-01-26T07:29:30Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: Protegió «R10» ([edit=sysop] (indefinido) [move=sysop] (indefinido))&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
chapter {* R10: Formalización y argumentación con Isabelle/HOL *}&lt;br /&gt;
&lt;br /&gt;
theory R10_Formalizacion_y_argmentacion&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  El objetivo de esta es relación formalizar y demostrar la corrección&lt;br /&gt;
  de los argumentos automáticamente y detalladamente usando sólo las reglas&lt;br /&gt;
  básicas de deducción natural. &lt;br /&gt;
&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;
&lt;br /&gt;
  · allI:       ⟦∀x. P x; P x ⟹ R⟧ ⟹ R&lt;br /&gt;
  · allE:       (⋀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⟧ ⟹ a: = 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;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Se usarán las reglas notnotI, mt, no_ex y no_para_todo que demostramos&lt;br /&gt;
  a 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;
lemma no_ex: &amp;quot;¬(∃x. P(x)) ⟹ ∀x. ¬P(x)&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
lemma no_para_todo: &amp;quot;¬(∀x. P(x)) ⟹ ∃x. ¬P(x)&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. Formalizar, y demostrar la corrección, del siguiente&lt;br /&gt;
  argumento &lt;br /&gt;
     Si la válvula está abierta o la monitorización está preparada,&lt;br /&gt;
     entonces se envía una señal de reconocimiento y un mensaje de&lt;br /&gt;
     funcionamiento al controlador del ordenador. Si se envía un mensaje &lt;br /&gt;
     de funcionamiento al controlador del ordenador o el sistema está en &lt;br /&gt;
     estado normal, entonces se aceptan las órdenes del operador. Por lo&lt;br /&gt;
     tanto, si la válvula está abierta, entonces se aceptan las órdenes&lt;br /&gt;
     del operador. &lt;br /&gt;
  Usar A : La válvula está abierta.&lt;br /&gt;
       P : La monitorización está preparada.&lt;br /&gt;
       R : Envía una señal de reconocimiento.&lt;br /&gt;
       F : Envía un mensaje de funcionamiento.&lt;br /&gt;
       N : El sistema está en estado normal.&lt;br /&gt;
       O : Se aceptan órdenes del operador.&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Formalizar, y decidir la corrección, del siguiente&lt;br /&gt;
  argumento &lt;br /&gt;
     Hay estudiantes inteligentes y hay estudiantes trabajadores. Por&lt;br /&gt;
     tanto, hay estudiantes inteligentes y trabajadores.&lt;br /&gt;
  Usar I(x) para x es inteligente&lt;br /&gt;
       T(x) para x es trabajador&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. Formalizar, y decidir la corrección, del siguiente&lt;br /&gt;
  argumento &lt;br /&gt;
     Los hermanos tienen el mismo padre. Juan es hermano de Luis. Carlos&lt;br /&gt;
     es padre de Luis. Por tanto, Carlos es padre de Juan.&lt;br /&gt;
  Usar H(x,y) para x es hermano de y&lt;br /&gt;
       P(x,y) para x es padre de y&lt;br /&gt;
       j      para Juan&lt;br /&gt;
       l      para Luis&lt;br /&gt;
       c      para Carlos&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Formalizar, y decidir la corrección, del siguiente&lt;br /&gt;
  argumento &lt;br /&gt;
     Los aficionados al fútbol aplauden a cualquier futbolista&lt;br /&gt;
     extranjero. Juanito no aplaude a futbolistas extranjeros. Por&lt;br /&gt;
     tanto, si hay algún futbolista extranjero nacionalizado español,&lt;br /&gt;
     Juanito no es aficionado al fútbol.&lt;br /&gt;
  Usar Af(x)   para x es aficicionado al fútbol&lt;br /&gt;
       Ap(x,y) para x aplaude a y&lt;br /&gt;
       E(x)    para x es un futbolista extranjero&lt;br /&gt;
       N(x)    para x es un futbolista nacionalizado español&lt;br /&gt;
       j       para Juanito&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. Formalizar, y decidir la corrección, del siguiente&lt;br /&gt;
  argumento &lt;br /&gt;
     El esposo de la hermana de Toni es Roberto. La hermana de Toni es&lt;br /&gt;
     María. Por tanto, el esposo de María es Roberto. &lt;br /&gt;
  Usar e(x) para el esposo de x&lt;br /&gt;
       h    para la hermana de Toni&lt;br /&gt;
       m    para María&lt;br /&gt;
       r    para Roberto&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>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2016/index.php?title=R10&amp;diff=1372</id>
		<title>R10</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2016/index.php?title=R10&amp;diff=1372"/>
		<updated>2017-01-26T07:29:12Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: Página creada con &amp;#039;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt; chapter {* R10: Formalización y argumentación con Isabelle/HOL *}  theory R10_Formalizacion_y_argmentacion imports Main  begin  text {*   ----------------...&amp;#039;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
chapter {* R10: Formalización y argumentación con Isabelle/HOL *}&lt;br /&gt;
&lt;br /&gt;
theory R10_Formalizacion_y_argmentacion&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  El objetivo de esta es relación formalizar y demostrar la corrección&lt;br /&gt;
  de los argumentos automáticamente y detalladamente usando sólo las reglas&lt;br /&gt;
  básicas de deducción natural. &lt;br /&gt;
&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;
&lt;br /&gt;
  · allI:       ⟦∀x. P x; P x ⟹ R⟧ ⟹ R&lt;br /&gt;
  · allE:       (⋀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⟧ ⟹ a: = 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;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Se usarán las reglas notnotI, mt, no_ex y no_para_todo que demostramos&lt;br /&gt;
  a 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;
lemma no_ex: &amp;quot;¬(∃x. P(x)) ⟹ ∀x. ¬P(x)&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
lemma no_para_todo: &amp;quot;¬(∀x. P(x)) ⟹ ∃x. ¬P(x)&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. Formalizar, y demostrar la corrección, del siguiente&lt;br /&gt;
  argumento &lt;br /&gt;
     Si la válvula está abierta o la monitorización está preparada,&lt;br /&gt;
     entonces se envía una señal de reconocimiento y un mensaje de&lt;br /&gt;
     funcionamiento al controlador del ordenador. Si se envía un mensaje &lt;br /&gt;
     de funcionamiento al controlador del ordenador o el sistema está en &lt;br /&gt;
     estado normal, entonces se aceptan las órdenes del operador. Por lo&lt;br /&gt;
     tanto, si la válvula está abierta, entonces se aceptan las órdenes&lt;br /&gt;
     del operador. &lt;br /&gt;
  Usar A : La válvula está abierta.&lt;br /&gt;
       P : La monitorización está preparada.&lt;br /&gt;
       R : Envía una señal de reconocimiento.&lt;br /&gt;
       F : Envía un mensaje de funcionamiento.&lt;br /&gt;
       N : El sistema está en estado normal.&lt;br /&gt;
       O : Se aceptan órdenes del operador.&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Formalizar, y decidir la corrección, del siguiente&lt;br /&gt;
  argumento &lt;br /&gt;
     Hay estudiantes inteligentes y hay estudiantes trabajadores. Por&lt;br /&gt;
     tanto, hay estudiantes inteligentes y trabajadores.&lt;br /&gt;
  Usar I(x) para x es inteligente&lt;br /&gt;
       T(x) para x es trabajador&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. Formalizar, y decidir la corrección, del siguiente&lt;br /&gt;
  argumento &lt;br /&gt;
     Los hermanos tienen el mismo padre. Juan es hermano de Luis. Carlos&lt;br /&gt;
     es padre de Luis. Por tanto, Carlos es padre de Juan.&lt;br /&gt;
  Usar H(x,y) para x es hermano de y&lt;br /&gt;
       P(x,y) para x es padre de y&lt;br /&gt;
       j      para Juan&lt;br /&gt;
       l      para Luis&lt;br /&gt;
       c      para Carlos&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Formalizar, y decidir la corrección, del siguiente&lt;br /&gt;
  argumento &lt;br /&gt;
     Los aficionados al fútbol aplauden a cualquier futbolista&lt;br /&gt;
     extranjero. Juanito no aplaude a futbolistas extranjeros. Por&lt;br /&gt;
     tanto, si hay algún futbolista extranjero nacionalizado español,&lt;br /&gt;
     Juanito no es aficionado al fútbol.&lt;br /&gt;
  Usar Af(x)   para x es aficicionado al fútbol&lt;br /&gt;
       Ap(x,y) para x aplaude a y&lt;br /&gt;
       E(x)    para x es un futbolista extranjero&lt;br /&gt;
       N(x)    para x es un futbolista nacionalizado español&lt;br /&gt;
       j       para Juanito&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. Formalizar, y decidir la corrección, del siguiente&lt;br /&gt;
  argumento &lt;br /&gt;
     El esposo de la hermana de Toni es Roberto. La hermana de Toni es&lt;br /&gt;
     María. Por tanto, el esposo de María es Roberto. &lt;br /&gt;
  Usar e(x) para el esposo de x&lt;br /&gt;
       h    para la hermana de Toni&lt;br /&gt;
       m    para María&lt;br /&gt;
       r    para Roberto&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>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2016/index.php?title=Ejercicios&amp;diff=1371</id>
		<title>Ejercicios</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2016/index.php?title=Ejercicios&amp;diff=1371"/>
		<updated>2017-01-26T07:28:12Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Relaciones de ejercicios ==&lt;br /&gt;
&lt;br /&gt;
=== Relaciones de ejercicios propuestos ===&lt;br /&gt;
&lt;br /&gt;
En esta sección se publicarán las relaciones de ejercicios. Las soluciones se escriben de forma colaborativa por los alumnos del curso y no deben tomarse como definitivas.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 1&amp;#039;&amp;#039;&amp;#039;: Programación funcional en Isabelle/HOL. ([[R1 |Enunciado]] y [[Relación 1 | Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 2&amp;#039;&amp;#039;&amp;#039;: Razonamiento automático sobre programas en Isabelle/HOL. ([[R2 |Enunciado]] y [[Relación 2 | Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 3&amp;#039;&amp;#039;&amp;#039;: Razonamiento estructurado sobre programas en Isabelle/HOL. ([[R3 |Enunciado]] y [[Relación 3 | Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 4&amp;#039;&amp;#039;&amp;#039;: Cuantificadores sobre listas. ([[R4 |Enunciado]] y [[Relación 4 | Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 5&amp;#039;&amp;#039;&amp;#039;: Eliminación de duplicados. ([[R5 |Enunciado]] y [[Relación 5 | Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 6&amp;#039;&amp;#039;&amp;#039;: Recorridos de árboles. ([[R6 |Enunciado]] y [[Relación 6 | Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 7&amp;#039;&amp;#039;&amp;#039;: Árboles binarios completos. ([[R7 |Enunciado]] y [[Relación 7 | Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 8&amp;#039;&amp;#039;&amp;#039;: Deducción natural proposicional en Isabelle/HOL. ([[R8 |Enunciado]] y [[Relación 8 | Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 9&amp;#039;&amp;#039;&amp;#039;: Deducción natural LPO en Isabelle/HOL. ([[R9 |Enunciado]] y [[Relación 9 | Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 10&amp;#039;&amp;#039;&amp;#039;: Formalización y argumentación en Isabelle/HOL. ([[R10 |Enunciado]] y [[Relación 10 | Solución colaborativa]]).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 11&amp;#039;&amp;#039;&amp;#039;: Plegados de listas y de árboles. ([[R11 |Enunciado]] y [[Relación 11 | Solución colaborativa]]).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Soluciones en GitHub ===&lt;br /&gt;
&lt;br /&gt;
Los siguientes repositorios de GitHub también contienen soluciones de alumnos del curso: [https://github.com/MULCIA/RAIsabelleHOL serrodcal].&lt;/div&gt;</summary>
		<author><name>Jalonso</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2016/index.php?title=Tema_10:_Conjuntos,_funciones_y_relaciones&amp;diff=1369</id>
		<title>Tema 10: Conjuntos, funciones y relaciones</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2016/index.php?title=Tema_10:_Conjuntos,_funciones_y_relaciones&amp;diff=1369"/>
		<updated>2017-01-26T07:05:44Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: Protegió «Tema 10: Conjuntos, funciones y relaciones» ([edit=sysop] (indefinido) [move=sysop] (indefinido))&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
chapter {* Tema 10: Conjuntos, funciones y relaciones *}&lt;br /&gt;
&lt;br /&gt;
theory T10_Conjuntos_funciones_y_relaciones&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
section {* Conjuntos *}&lt;br /&gt;
&lt;br /&gt;
subsection {* Operaciones con conjuntos *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Nota. La teoría elemental de conjuntos es HOL/Set.thy.&lt;br /&gt;
&lt;br /&gt;
  Nota. En un conjunto todos los elemento son del mismo tipo (por&lt;br /&gt;
  ejemplo, del tipo τ) y el conjunto tiene tipo (en el ejemplo, &amp;quot;τ set&amp;quot;). &lt;br /&gt;
&lt;br /&gt;
  Reglas de la intersección:&lt;br /&gt;
  · IntI:  ⟦c ∈ A; c ∈ B⟧ ⟹ c ∈ A ∩ B&lt;br /&gt;
  · IntD1: c ∈ A ∩ B ⟹ c ∈ A&lt;br /&gt;
  · IntD2: c ∈ A ∩ B ⟹ c ∈ B&lt;br /&gt;
&lt;br /&gt;
  Nota. Propiedades del complementario:&lt;br /&gt;
  · Compl_iff: (c ∈ - A) = (c ∉ A)&lt;br /&gt;
  · Compl_Un:  - (A ∪ B) = - A ∩ - B&lt;br /&gt;
&lt;br /&gt;
  Nota. El conjunto vacío se representa por {} y el universal por UNIV. &lt;br /&gt;
&lt;br /&gt;
  Nota. Propiedades de la diferencia y del complementario:&lt;br /&gt;
  · Diff_disjoint:   A ∩ (B - A) = {}&lt;br /&gt;
  · Compl_partition: A ∪ - A = UNIV&lt;br /&gt;
&lt;br /&gt;
  Nota. Reglas de la relación de subconjunto:&lt;br /&gt;
  · subsetI: (⋀x. x ∈ A ⟹ x ∈ B) ⟹ A ⊆ B&lt;br /&gt;
  · subsetD: ⟦A ⊆ B; c ∈ A⟧ ⟹ c ∈ B   &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Ejemplo: A ∪ B ⊆ C syss A ⊆ C ∧ B ⊆ C.   &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;(A ∪ B ⊆ C) = (A ⊆ C ∧ B ⊆ C)&amp;quot;&lt;br /&gt;
by blast&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Ejemplo: A ⊆ -B syss B ⊆ -A.   &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;(A ⊆ -B) = (B ⊆ -A)&amp;quot;&lt;br /&gt;
by blast&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Principio de extensionalidad de conjuntos:&lt;br /&gt;
  · set_eqI: (⋀x. (x ∈ A) = (x ∈ B)) ⟹ A = B&lt;br /&gt;
&lt;br /&gt;
  Reglas de la igualdad de conjuntos:&lt;br /&gt;
  · equalityI:  ⟦A ⊆ B; B ⊆ A⟧ ⟹ A = B&lt;br /&gt;
  · equalityD1: A = B ⟹ A ⊆ B&lt;br /&gt;
  · equalityD2: A = B ⟹ B ⊆ A &lt;br /&gt;
  · equalityE:  ⟦A = B; ⟦A ⊆ B; B ⊆ A⟧ ⟹ P⟧ ⟹ P   &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Lema. [Analogía entre intersección y conjunción]&lt;br /&gt;
  &amp;quot;x ∈ A ∩ B&amp;quot; syss &amp;quot;x ∈ A&amp;quot; y &amp;quot;x ∈ B&amp;quot;. &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;(x ∈ A ∩ B) = (x ∈ A ∧ x ∈ B)&amp;quot; &lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Lema. [Analogía entre unión y disyunción]&lt;br /&gt;
  x ∈ A ∪ B syss x ∈ A ó x ∈ B.   &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;(x ∈ A ∪ B) = (x ∈ A ∨ x ∈ B)&amp;quot; &lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Lema. [Analogía entre subconjunto e implicación]&lt;br /&gt;
  A ⊆ B syss para todo x, si x ∈ A entonces x ∈ B.   &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;(A ⊆ B) = (∀ x. x ∈ A ⟶ x ∈ B)&amp;quot; &lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Lema. [Analogía entre complementario y negación]&lt;br /&gt;
  x pertenece al complementario de A syss x no pertenece a A.   &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;(x ∈ -A) = (x ∉ A)&amp;quot; &lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
subsection {* Notación de conjuntos finitos *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Nota. La teoría de conjuntos finitos es HOL/Finite_Set.thy.&lt;br /&gt;
&lt;br /&gt;
  Nota. Los conjuntos finitos se definen por inducción a partir de las&lt;br /&gt;
  siguientes reglas inductivas:&lt;br /&gt;
  · El conjunto vacío es un conjunto finito.&lt;br /&gt;
    · emptyI: &amp;quot;finite {}&amp;quot;&lt;br /&gt;
  · Si se le añade un elemento a un conjunto finito se obtiene otro&lt;br /&gt;
    conjunto finito. &lt;br /&gt;
    · insertI: &amp;quot;finite A ⟹ finite (insert a A)&amp;quot; &lt;br /&gt;
&lt;br /&gt;
  A continuación se muestran ejemplos de conjuntos finitos.   &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &lt;br /&gt;
  &amp;quot;insert 2 {} = {2} ∧&lt;br /&gt;
   insert 3 {2} = {2,3} ∧&lt;br /&gt;
   insert 2 {2,3} = {2,3} ∧&lt;br /&gt;
   {2,3} = {3,2,3,2,2}&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Nota. Los conjuntos finitos se representan con la notación conjuntista&lt;br /&gt;
  habitual: los elementos entre llaves y separados por comas. &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Ejemplo: {a,b} ∪ {c,d} = {a,b,c,d}   &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;{a,b} ∪ {c,d} = {a,b,c,d}&amp;quot; &lt;br /&gt;
by blast&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Ejemplo de conjetura falsa y su refutación. &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;{a,b} ∩ {b,c} = {b}&amp;quot; &lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Ejemplo con la conjetura corregida.   &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;{a,b} ∩ {b,c} = (if a = c then {a,b} else {b})&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Sumas de conjuntos finitos:&lt;br /&gt;
  · ∑A es la suma de los elementos del conjunto finito A. Por ejemplo, &lt;br /&gt;
      value &amp;quot;∑{1,2,3}::int&amp;quot; -- &amp;quot;= 6&amp;quot;&lt;br /&gt;
  · (setsum f A) es la suma de la aplicación de f a los elementos del&lt;br /&gt;
    conjunto finito A,  Por ejemplo,&lt;br /&gt;
       value &amp;quot;setsum (λx. x*x) {1,2,3}::int&amp;quot; -- &amp;quot;= 14&amp;quot;&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Ejemplos de definiciones recursivas sobre conjuntos finitos: &lt;br /&gt;
  Sea A un conjunto finito de números naturales.&lt;br /&gt;
  · sumaConj A es la suma de los elementos A.&lt;br /&gt;
  · sumaCuadradosConj A es la suma de los cuadrados de los elementos A. &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
definition sumaConj :: &amp;quot;nat set ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;sumaConj S ≡ ∑S&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;sumaConj {2,5,3} = 10&amp;quot;&lt;br /&gt;
&lt;br /&gt;
definition sumaCuadradosConj :: &amp;quot;nat set ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;sumaCuadradosConj S ≡ setsum (λx. x*x) S&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;sumaCuadradosConj {2,5,3} = 38&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Nota. Para simplificar lo que sigue, declaramos las anteriores&lt;br /&gt;
  definiciones como reglas de simplificación.   &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
declare sumaConj_def[simp]&lt;br /&gt;
declare sumaCuadradosConj_def[simp]&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Ejemplos de evaluación de las anteriores definiciones recursivas.   &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &lt;br /&gt;
  &amp;quot;sumaConj {1,2,3,4} = 10 ∧&lt;br /&gt;
   sumaCuadradosConj {1,2,3,4} = 30&amp;quot;&lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Inducción sobre conjuntos finitos: Para demostrar que todos los&lt;br /&gt;
  conjuntos finitos tienen una propiedad P basta probar que&lt;br /&gt;
  · El conjunto vacío tiene la propiedad P.&lt;br /&gt;
  · Si a un conjunto finito que tiene la propiedad P se le añade un&lt;br /&gt;
    nuevo elemento, el conjunto obtenido sigue teniendo la propiedad P. &lt;br /&gt;
  En forma de regla&lt;br /&gt;
  · finite_induct: ⟦finite F; &lt;br /&gt;
                    P {}; &lt;br /&gt;
                    ⋀x F. ⟦finite F; x ∉ F; P F⟧ ⟹ P ({x} ∪ F)⟧ &lt;br /&gt;
                   ⟹ P F   &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Ejemplo de inducción sobre conjuntos finitos: Sea S un conjunto finito&lt;br /&gt;
  de números naturales. Entonces todos los elementos de S son menores o&lt;br /&gt;
  iguales que la suma de los elementos de S. &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma &amp;quot;finite S ⟹ ∀x∈S. x ≤ sumaConj S&amp;quot;&lt;br /&gt;
by (induct rule: finite_induct) auto&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma sumaConj_acota: &lt;br /&gt;
  &amp;quot;finite S ⟹ ∀x∈S. x ≤ sumaConj S&amp;quot;&lt;br /&gt;
proof (induct rule: finite_induct)&lt;br /&gt;
  show &amp;quot;∀x ∈ {}. x ≤ sumaConj {}&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x and F&lt;br /&gt;
  assume fF: &amp;quot;finite F&amp;quot; &lt;br /&gt;
     and xF: &amp;quot;x ∉ F&amp;quot; &lt;br /&gt;
     and HI: &amp;quot;∀ x∈F. x ≤ sumaConj F&amp;quot;&lt;br /&gt;
  show &amp;quot;∀y ∈ insert x F. y ≤ sumaConj (insert x F)&amp;quot;&lt;br /&gt;
  proof &lt;br /&gt;
    fix y &lt;br /&gt;
    assume &amp;quot;y ∈ insert x F&amp;quot;&lt;br /&gt;
    show &amp;quot;y ≤ sumaConj (insert x F)&amp;quot;&lt;br /&gt;
    proof (cases &amp;quot;y = x&amp;quot;)&lt;br /&gt;
      assume &amp;quot;y = x&amp;quot;&lt;br /&gt;
      hence &amp;quot;y ≤ x + (sumaConj F)&amp;quot; by simp&lt;br /&gt;
      also have &amp;quot;… = sumaConj (insert x F)&amp;quot; using fF xF by simp&lt;br /&gt;
      finally show ?thesis .&lt;br /&gt;
    next&lt;br /&gt;
      assume &amp;quot;y ≠ x&amp;quot;&lt;br /&gt;
      hence &amp;quot;y ∈ F&amp;quot; using `y ∈ insert x F` by simp&lt;br /&gt;
      hence &amp;quot;y ≤ sumaConj F&amp;quot; using HI by blast&lt;br /&gt;
      also have &amp;quot;… ≤ x + (sumaConj F)&amp;quot; by simp&lt;br /&gt;
      also have &amp;quot;… = sumaConj (insert x F)&amp;quot; using fF xF by simp&lt;br /&gt;
      finally show ?thesis .&lt;br /&gt;
    qed&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
subsection {* Definiciones por comprensión *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  El conjunto de los elementos que cumple la propiedad P se representa&lt;br /&gt;
  por {x. P}. &lt;br /&gt;
&lt;br /&gt;
  Reglas de comprensión (relación entre colección y pertenencia):&lt;br /&gt;
  · mem_Collect_eq: (a ∈ {x. P x}) = P a&lt;br /&gt;
  · Collect_mem_eq: {x. x ∈ A} = A   &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Ejemplo de comprensión: {x. P x ∨ x ∈ A} = {x. P x} ∪ A   &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;{x. P x ∨ x ∈ A} = {x. P x} ∪ A&amp;quot;&lt;br /&gt;
by blast&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Ejemplo de comprensión: {x. P x ⟶ Q x} = -{x. P x} ∪ {x. Q x}   &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;{x. P x ⟶ Q x} = -{x. P x} ∪ {x. Q x}&amp;quot;&lt;br /&gt;
by blast&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Ejemplo con la sintaxis general de comprensión.   &lt;br /&gt;
     {p*q | p q. p ∈ prime ∧ q ∈ prime} = &lt;br /&gt;
     {z. ∃p q. z = p*q ∧ p ∈ prime ∧ q ∈ prime}   &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &lt;br /&gt;
  &amp;quot;{p*q | p q. p ∈ prime ∧ q ∈ prime} = &lt;br /&gt;
   {z. ∃p q. z = p*q ∧ p ∈ prime ∧ q ∈ prime}&amp;quot;&lt;br /&gt;
by blast&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
   En HOL, la notación conjuntista es azúcar sintáctica:&lt;br /&gt;
   · x ∈ A  es equivalente a A(x).&lt;br /&gt;
   · {x. P} es equivalente a λx. P.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Ejemplo de definición por comprensión: El conjunto de los pares es el&lt;br /&gt;
  de los números n para los que existe un m tal que n = 2*m.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
definition Pares :: &amp;quot;nat set&amp;quot; where&lt;br /&gt;
  &amp;quot;Pares ≡ {n. ∃m. n = 2*m }&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Ejemplo. Los números 2 y 34 son pares.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &lt;br /&gt;
  &amp;quot;2 ∈ Pares ∧&lt;br /&gt;
   34 ∈ Pares&amp;quot; &lt;br /&gt;
by (simp add: Pares_def)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Definición. El conjunto de los impares es el de los números n para los&lt;br /&gt;
  que existe un m tal que n = 2*m + 1.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
definition Impares :: &amp;quot;nat set&amp;quot; where&lt;br /&gt;
  &amp;quot;Impares ≡ {n. ∃m. n = 2*m + 1}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Ejemplo con las reglas de intersección y comprensión: El conjunto de&lt;br /&gt;
  los pares es disjunto con el de los impares. &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración detallada es&amp;quot;&lt;br /&gt;
lemma &amp;quot;x ∉ (Pares ∩ Impares)&amp;quot;&lt;br /&gt;
proof &lt;br /&gt;
  fix x assume S: &amp;quot;x ∈ (Pares ∩ Impares)&amp;quot;&lt;br /&gt;
  hence &amp;quot;x ∈ Pares&amp;quot; by (rule IntD1)&lt;br /&gt;
  hence &amp;quot;∃m. x = 2 * m&amp;quot; by (simp only: Pares_def mem_Collect_eq)&lt;br /&gt;
  then obtain p where p: &amp;quot;x = 2 * p&amp;quot; .. &lt;br /&gt;
  from S have &amp;quot;x ∈ Impares&amp;quot; by (rule IntD2)&lt;br /&gt;
  hence &amp;quot;∃ m. x = 2 * m + 1&amp;quot; by (simp only: Impares_def mem_Collect_eq)&lt;br /&gt;
  then obtain q where q: &amp;quot;x = 2 * q + 1&amp;quot; .. &lt;br /&gt;
  from p and q show &amp;quot;False&amp;quot; by arith&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma &amp;quot;x ∉ (Pares ∩ Impares)&amp;quot;&lt;br /&gt;
proof &lt;br /&gt;
  fix x assume S: &amp;quot;x ∈ (Pares ∩ Impares)&amp;quot;&lt;br /&gt;
  hence &amp;quot;x ∈ Pares&amp;quot; ..&lt;br /&gt;
  hence &amp;quot;∃m. x = 2 * m&amp;quot; by (simp only: Pares_def mem_Collect_eq)&lt;br /&gt;
  then obtain p where p: &amp;quot;x = 2 * p&amp;quot; .. &lt;br /&gt;
  from S have &amp;quot;x ∈ Impares&amp;quot; ..&lt;br /&gt;
  hence &amp;quot;∃ m. x = 2 * m + 1&amp;quot; by (simp only: Impares_def mem_Collect_eq)&lt;br /&gt;
  then obtain q where q: &amp;quot;x = 2 * q + 1&amp;quot; .. &lt;br /&gt;
  from p and q show &amp;quot;False&amp;quot; by arith&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma &amp;quot;x ∉ (Pares ∩ Impares)&amp;quot;&lt;br /&gt;
by (auto simp add: Pares_def Impares_def, arith)&lt;br /&gt;
&lt;br /&gt;
subsection {* Cuantificadores acotados *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Reglas de cuantificador universal acotado (&amp;quot;bounded&amp;quot;):&lt;br /&gt;
  · ballI: (⋀x. x ∈ A ⟹ P x) ⟹ ∀x∈A. P x&lt;br /&gt;
  · bspec: ⟦∀x∈A. P x; x ∈ A⟧ ⟹ P x&lt;br /&gt;
&lt;br /&gt;
  Reglas de cuantificador existencial acotado (&amp;quot;bounded&amp;quot;):&lt;br /&gt;
  · bexI: ⟦P x; x ∈ A⟧ ⟹ ∃x∈A. P x&lt;br /&gt;
  · bexE: ⟦∃x∈A. P x; ⋀x. ⟦x ∈ A; P x⟧ ⟹ Q⟧ ⟹ Q&lt;br /&gt;
&lt;br /&gt;
  Reglas de la unión indexada:&lt;br /&gt;
  · UN_iff: (b ∈ (⋃x∈A. B x)) = (∃x∈A. b ∈ B x)&lt;br /&gt;
  · UN_I:   ⟦a ∈ A; b ∈ B a⟧ ⟹ b ∈ (⋃x∈A. B x)&lt;br /&gt;
  · UN_E:   ⟦b ∈ (⋃x∈A. B x); ⋀x. ⟦x ∈ A; b ∈ B x⟧ ⟹ R⟧ ⟹ R&lt;br /&gt;
&lt;br /&gt;
  Reglas de la unión de una familia:&lt;br /&gt;
  · Union_def: ⋃S = (⋃x∈S. x)&lt;br /&gt;
  · Union_iff: (A ∈ ⋃C) = (∃X∈C. A ∈ X)&lt;br /&gt;
&lt;br /&gt;
  Reglas de la intersección indexada:&lt;br /&gt;
  · INT_iff: (b ∈ (⋂x∈A. B x)) = (∀x∈A. b ∈ B x)&lt;br /&gt;
  · INT_I:   (⋀x. x ∈ A ⟹ b ∈ B x) ⟹ b ∈ (⋂x∈A. B x)&lt;br /&gt;
  · INT_E:   ⟦b ∈ (⋂x∈A. B x); b ∈ B a ⟹ R; a ∉ A ⟹ R⟧ ⟹ R&lt;br /&gt;
&lt;br /&gt;
  Reglas de la intersección de una familia:&lt;br /&gt;
  · Inter_def: ⋂S = (⋂x∈S. x)&lt;br /&gt;
  · Inter_iff: (A ∈ ⋂C) = (∀X∈C. A ∈ X)&lt;br /&gt;
&lt;br /&gt;
  Abreviaturas:&lt;br /&gt;
  · &amp;quot;Collect P&amp;quot; es lo mismo que &amp;quot;{x. P}&amp;quot;.&lt;br /&gt;
  · &amp;quot;All P&amp;quot;     es lo mismo que &amp;quot;∀x. P x&amp;quot;.&lt;br /&gt;
  · &amp;quot;Ex P&amp;quot;      es lo mismo que &amp;quot;∃x. P x&amp;quot;.&lt;br /&gt;
  · &amp;quot;Ball A P&amp;quot;  es lo mismo que &amp;quot;∀x∈A. P x&amp;quot;.&lt;br /&gt;
  · &amp;quot;Bex A P&amp;quot;   es lo mismo que &amp;quot;∃x∈A. P x&amp;quot;.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
subsection {* Conjuntos finitos y cardinalidad *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  El número de elementos de un conjunto finito A es el cardinal de A y&lt;br /&gt;
  se representa por &amp;quot;card A&amp;quot;.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Ejemplos de cardinales de conjuntos finitos.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &lt;br /&gt;
  &amp;quot;card {} = 0 ∧&lt;br /&gt;
   card {4} = 1 ∧&lt;br /&gt;
   card {4,1} = 2 ∧&lt;br /&gt;
   x ≠ y ⟹ card {x,y} = 2&amp;quot; &lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Propiedades de cardinales:&lt;br /&gt;
  · Cardinal de la unión de conjuntos finitos:&lt;br /&gt;
    card_Un_Int: ⟦finite A; finite B⟧ &lt;br /&gt;
                 ⟹ card A + card B = card (A ∪ B) + card (A ∩ B)&amp;quot; &lt;br /&gt;
  · Cardinal del conjunto potencia: &lt;br /&gt;
    card_Pow: finite A ⟹ card (Pow A) = 2 ^ card A&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
section {* Funciones *}&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  La teoría de funciones es HOL/Fun.thy. &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
subsection {* Nociones básicas de funciones *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Principio de extensionalidad para funciones:&lt;br /&gt;
  · ext: (⋀x. f x = g x) ⟹ f = g&lt;br /&gt;
&lt;br /&gt;
  Actualización de funciones  &lt;br /&gt;
  · fun_upd_apply: (f(x := y)) z = (if z = x then y else f z)&lt;br /&gt;
  · fun_upd_upd:   f(x := y, x := z) = f(x := z)&lt;br /&gt;
&lt;br /&gt;
  Función identidad&lt;br /&gt;
  · id_def: id ≡ λx. x&lt;br /&gt;
&lt;br /&gt;
  Composición de funciones:&lt;br /&gt;
  · o_def: f ∘ g = (λx. f (g x))&lt;br /&gt;
&lt;br /&gt;
  Asociatividad de la composición:&lt;br /&gt;
  · o_assoc: f ∘ (g ∘ h) = (f ∘ g) ∘ h&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
subsection {* Funciones inyectivas, suprayectivas y biyectivas *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Función inyectiva sobre A:&lt;br /&gt;
  · inj_on_def: inj_on f A ≡ ∀x∈A. ∀y∈A. f x = f y ⟶ x = y&lt;br /&gt;
&lt;br /&gt;
  Nota. &amp;quot;inj f&amp;quot; es una abreviatura de &amp;quot;inj_on f UNIV&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
  Función suprayectiva:&lt;br /&gt;
  · surj_def: surj f ≡ ∀y. ∃x. y = f x&lt;br /&gt;
&lt;br /&gt;
  Función biyectiva:&lt;br /&gt;
  · bij_def: bij f ≡ inj f ∧ surj f&lt;br /&gt;
&lt;br /&gt;
  Propiedades de las funciones inversas:&lt;br /&gt;
  · inv_f_f:      inj f  ⟹ inv f (f x) = x&lt;br /&gt;
  · surj_f_inv_f: surj f ⟹ f (inv f y) = y&lt;br /&gt;
  · inv_inv_eq:   bij f  ⟹ inv (inv f) = f&lt;br /&gt;
&lt;br /&gt;
  Igualdad de funciones (por extensionalidad):&lt;br /&gt;
  · fun_eq_iff: (f = g) = (∀x. f x = g x)&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Ejemplo de lema de demostración de propiedades de funciones: Una&lt;br /&gt;
  función inyectiva puede cancelarse en el lado izquierdo de la&lt;br /&gt;
  composición de funciones. &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración detallada es&amp;quot;&lt;br /&gt;
lemma &lt;br /&gt;
  assumes &amp;quot;inj f&amp;quot;&lt;br /&gt;
  shows &amp;quot;(f ∘ g = f ∘ h) = (g = h)&amp;quot;&lt;br /&gt;
proof &lt;br /&gt;
  assume &amp;quot;f ∘ g = f ∘ h&amp;quot;&lt;br /&gt;
  show &amp;quot;g = h&amp;quot;&lt;br /&gt;
  proof&lt;br /&gt;
    fix x&lt;br /&gt;
    have &amp;quot;(f ∘ g)(x) = (f ∘ h)(x)&amp;quot; using `f ∘ g = f ∘ h` by simp&lt;br /&gt;
    hence &amp;quot;f(g(x)) = f(h(x))&amp;quot; by simp&lt;br /&gt;
    then show &amp;quot;g(x) = h(x)&amp;quot; using `inj f` by (simp add:inj_on_def)&lt;br /&gt;
  qed&lt;br /&gt;
next&lt;br /&gt;
  assume &amp;quot;g = h&amp;quot;&lt;br /&gt;
  show &amp;quot;f ∘ g = f ∘ h&amp;quot;&lt;br /&gt;
  proof&lt;br /&gt;
    fix x&lt;br /&gt;
    have &amp;quot;(f ∘ g) x = f(g(x))&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;… = f(h(x))&amp;quot; using `g = h` by simp&lt;br /&gt;
    also have &amp;quot;… = (f ∘ h) x&amp;quot; by simp&lt;br /&gt;
    finally show &amp;quot;(f ∘ g) x = (f ∘ h) x&amp;quot; by simp&lt;br /&gt;
  qed&lt;br /&gt;
qed&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;inj f&amp;quot;&lt;br /&gt;
  shows &amp;quot;(f ∘ g = f ∘ h) = (g = h)&amp;quot;&lt;br /&gt;
proof &lt;br /&gt;
  assume &amp;quot;f ∘ g = f ∘ h&amp;quot; &lt;br /&gt;
  thus &amp;quot;g = h&amp;quot; using `inj f` by (simp add: inj_on_def fun_eq_iff) &lt;br /&gt;
next&lt;br /&gt;
  assume &amp;quot;g = h&amp;quot; &lt;br /&gt;
  thus &amp;quot;f ∘ g = f ∘ h&amp;quot; by auto&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma &lt;br /&gt;
  assumes &amp;quot;inj f&amp;quot;&lt;br /&gt;
  shows &amp;quot;(f ∘ g = f ∘ h) = (g = h)&amp;quot;&lt;br /&gt;
using assms&lt;br /&gt;
by (auto simp add: inj_on_def fun_eq_iff) &lt;br /&gt;
&lt;br /&gt;
subsubsection {* Función imagen *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Imagen de un conjunto mediante una función:&lt;br /&gt;
  · image_def: f ` A = {y. (∃x∈A. y = f x)}&lt;br /&gt;
&lt;br /&gt;
  Propiedades de la imagen:&lt;br /&gt;
  · image_compose: (f ∘ g)`r = f`g`r&lt;br /&gt;
  · image_Un:      f`(A ∪ B) = f`A ∪ f`B &lt;br /&gt;
  · image_Int:     inj f ⟹ f`(A ∩ B) = f`A ∩ f`B&amp;quot; &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Ejemplo de demostración de propiedades de la imagen:&lt;br /&gt;
     f`A ∪ g`A = (⋃x∈A. {f x, g x})&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;f`A ∪ g`A = (⋃x∈A. {f x, g x})&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Ejemplo de demostración de propiedades de la imagen:&lt;br /&gt;
     f`{(x,y). P x y} = {f(x,y) | x y. P x y}&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;f`{(x,y). P x y} = {f(x,y) | x y. P x y}&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  El rango de una función (&amp;quot;range f&amp;quot;) es la imagen del universo &lt;br /&gt;
  (&amp;quot;f`UNIV&amp;quot;). &lt;br /&gt;
&lt;br /&gt;
  Imagen inversa de un conjunto:&lt;br /&gt;
  · vimage_def: f -` B ≡ {x. f x ∈ B}&lt;br /&gt;
&lt;br /&gt;
  Propiedad de la imagen inversa de un conjunto:&lt;br /&gt;
  · vimage_Compl: f -` (-A) = -(f -` A)&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
section {* Relaciones *}&lt;br /&gt;
&lt;br /&gt;
subsection {* Relaciones básicas *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  La teoría de relaciones es HOL/Relation.thy.&lt;br /&gt;
&lt;br /&gt;
  Las relaciones son conjuntos de pares.&lt;br /&gt;
&lt;br /&gt;
  Relación identidad:&lt;br /&gt;
  · Id_def: Id ≡ {p. ∃x. p = (x,x)}&lt;br /&gt;
&lt;br /&gt;
  Composición de relaciones:&lt;br /&gt;
  · rel_comp_def: r O s ≡ {(x,z). ∃y. (x, y) ∈ r ∧ (y, z) ∈ s}&lt;br /&gt;
&lt;br /&gt;
  Propiedades:&lt;br /&gt;
  · R_O_Id:        R O Id = R&lt;br /&gt;
  · rel_comp_mono: ⟦r&amp;#039; ⊆ r; s&amp;#039; ⊆ s⟧ ⟹ (r&amp;#039; O s&amp;#039;) ⊆ (r O s)&lt;br /&gt;
&lt;br /&gt;
  Imagen inversa de una relación:&lt;br /&gt;
  · converse_iff: ((a,b) ∈ r^-1) = ((b,a) ∈ r)&lt;br /&gt;
&lt;br /&gt;
  Propiedad de la imagen inversa de una relación:&lt;br /&gt;
  · converse_rel_comp: (r O s)^-1 = s^-1 O r^-1&lt;br /&gt;
&lt;br /&gt;
  Imagen de un conjunto mediante una relación:&lt;br /&gt;
  · Image_iff: (b ∈ r``A) = (∃x:A. (x, b) ∈ r)&lt;br /&gt;
&lt;br /&gt;
  Dominio de una relación:&lt;br /&gt;
  · Domain_iff: (a ∈ Domain r) = (∃y. (a, y) ∈ r)&lt;br /&gt;
&lt;br /&gt;
  Rango de una relación:&lt;br /&gt;
  · Range_iff: (a ∈ Range r) = (∃y. (y,a) ∈ r)&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
subsection {* Clausura reflexiva y transitiva *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  La teoría de la clausura reflexiva y transitiva de una relación es&lt;br /&gt;
  HOL/Transitive_Closure.thy.&lt;br /&gt;
&lt;br /&gt;
  Potencias de relaciones:&lt;br /&gt;
  · R ^^ 0 = Id&lt;br /&gt;
  · R ^^ (Suc n) = (R ^^ n) O R&lt;br /&gt;
  &lt;br /&gt;
  La clausura reflexiva y transitiva de la relación r es la menor&lt;br /&gt;
  solución de la ecuación: &lt;br /&gt;
  · rtrancl_unfold: r^* = Id ∪ (r^* O r)&lt;br /&gt;
  &lt;br /&gt;
  Propiedades básicas de la clausura reflexiva y transitiva:&lt;br /&gt;
  · rtrancl_refl:   (a,a) ∈ r^*&lt;br /&gt;
  · r_into_rtrancl: p ∈ r ⟹ p ∈ r^*&lt;br /&gt;
  · rtrancl_trans:  ⟦(a,b) ∈ r^*; (b,c) ∈ r^*⟧ ⟹ (a,c) ∈ r^*&lt;br /&gt;
  &lt;br /&gt;
  Inducción sobre la clausura reflexiva y transitiva&lt;br /&gt;
  · rtrancl_induct: ⟦(a,b) ∈ r^*; &lt;br /&gt;
                     P b; &lt;br /&gt;
                     ⋀y z. ⟦(y,z) ∈ r; (z,b) ∈ r^*; P z⟧ ⟹ P y⟧&lt;br /&gt;
                    ⟹ P a&lt;br /&gt;
  &lt;br /&gt;
  Idempotencia de la clausura reflexiva y transitiva:&lt;br /&gt;
  · rtrancl_idemp: (r^*)^* = r^*&lt;br /&gt;
  &lt;br /&gt;
  Reglas de introducción de la clausura transitiva:&lt;br /&gt;
  · r_into_trancl&amp;#039;: p ∈ r ⟹ p ∈ r^+&lt;br /&gt;
  · trancl_trans:   ⟦(a,b) ∈ r^+; (b,c) ∈ r^+⟧ ⟹ (a,c) ∈ r^+&lt;br /&gt;
&lt;br /&gt;
  Ejemplo de propiedad:&lt;br /&gt;
  · trancl_converse: (r¯)^+ = (r^+)¯&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
subsection {* Una demostración elemental *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Se desea demostrar que la clausura reflexiva y transitiva conmuta con&lt;br /&gt;
  la inversa (cl_rtrans_inversa). &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
theorem &amp;quot;(r¯)⇧* = (r⇧*)¯&amp;quot; &lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* Para demostrarlo introducimos dos lemas auxiliares: &lt;br /&gt;
  cl_rtrans_inversaD y cl_rtrans_inversaI.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración detallada del primer lema es&amp;quot;&lt;br /&gt;
lemma cl_rtrans_inversaD: &lt;br /&gt;
  &amp;quot;(x,y) ∈ (r¯)⇧* ⟹ (y,x) ∈ r⇧*&amp;quot;&lt;br /&gt;
proof (induct rule:rtrancl_induct)&lt;br /&gt;
  show &amp;quot;(x,x) ∈ r⇧*&amp;quot; by (rule rtrancl_refl) &lt;br /&gt;
next&lt;br /&gt;
  fix y z&lt;br /&gt;
  assume &amp;quot;(x,y) ∈ (r¯)⇧*&amp;quot; and &amp;quot;(y,z) ∈ r¯&amp;quot; and &amp;quot;(y,x) ∈ r⇧*&amp;quot;&lt;br /&gt;
  show &amp;quot;(z,x) ∈ r⇧*&amp;quot;&lt;br /&gt;
  proof (rule rtrancl_trans)&lt;br /&gt;
    show &amp;quot;(z,y) ∈ r⇧*&amp;quot; using `(y,z) ∈ r¯` by simp&lt;br /&gt;
  next&lt;br /&gt;
    show &amp;quot;(y,x) ∈ r⇧*&amp;quot; using `(y,x) ∈ r⇧*` by simp&lt;br /&gt;
  qed   &lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática del primer lema es&amp;quot;&lt;br /&gt;
lemma  cl_rtrans_inversaD2: &lt;br /&gt;
  &amp;quot;(x,y) ∈ (r¯)⇧* ⟹ (y,x) ∈ r⇧*&amp;quot;&lt;br /&gt;
by (induct rule: rtrancl_induct) &lt;br /&gt;
   (auto simp add: rtrancl_trans)&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración detallada del segundo lema es&amp;quot;&lt;br /&gt;
lemma cl_rtrans_inversaI: &lt;br /&gt;
  &amp;quot;(y,x) ∈ r⇧* ⟹ (x,y) ∈ (r¯)⇧*&amp;quot;&lt;br /&gt;
proof (induct rule: rtrancl_induct)&lt;br /&gt;
  show &amp;quot;(y,y) ∈ (r¯)⇧*&amp;quot; by (rule rtrancl_refl) &lt;br /&gt;
next&lt;br /&gt;
  fix u z&lt;br /&gt;
  assume &amp;quot;(y,u) ∈ r⇧*&amp;quot; and &amp;quot;(u,z) ∈ r&amp;quot; and &amp;quot;(u,y) ∈ (r¯)⇧*&amp;quot;&lt;br /&gt;
  show &amp;quot;(z,y) ∈ (r¯)⇧*&amp;quot;&lt;br /&gt;
  proof (rule rtrancl_trans)&lt;br /&gt;
    show &amp;quot;(z,u) ∈ (r¯)⇧*&amp;quot; using `(u,z) ∈ r` by auto&lt;br /&gt;
  next&lt;br /&gt;
    show &amp;quot;(u,y) ∈ (r¯)⇧*&amp;quot; using `(u,y) ∈ (r¯)⇧*` by simp&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración detalla del teorema es&amp;quot;&lt;br /&gt;
theorem cl_rtrans_inversa: &lt;br /&gt;
  &amp;quot;(r¯)⇧* = (r⇧*)¯&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  show &amp;quot;(r¯)⇧* ⊆ (r⇧*)¯&amp;quot; by (auto simp add:cl_rtrans_inversaD)&lt;br /&gt;
next&lt;br /&gt;
  show &amp;quot;(r⇧*)¯ ⊆ (r¯)⇧*&amp;quot; by (auto simp add:cl_rtrans_inversaI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática del teorema es&amp;quot;&lt;br /&gt;
theorem &amp;quot;(r¯)⇧* = (r⇧*)¯&amp;quot;&lt;br /&gt;
by (auto intro: cl_rtrans_inversaI dest: cl_rtrans_inversaD)&lt;br /&gt;
&lt;br /&gt;
section {* Relaciones bien fundamentadas e inducción *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  La teoría de las relaciones bien fundamentadas es &lt;br /&gt;
  HOL/Wellfounded_Relations.thy.&lt;br /&gt;
&lt;br /&gt;
  La relación-objeto &amp;quot;less_than&amp;quot; es el orden de los naturales definido &lt;br /&gt;
  por&lt;br /&gt;
  · less_than = pred_nat^+&lt;br /&gt;
  donde pred_nat está definida por &lt;br /&gt;
  · pred_nat = {(m, n). n = Suc m}&lt;br /&gt;
&lt;br /&gt;
  La caracterización de less_than es&lt;br /&gt;
  · less_than_iff: ((x,y) ∈ less_than) = (x &amp;lt; y)&lt;br /&gt;
&lt;br /&gt;
  La relación less_than está bien fundamentada&lt;br /&gt;
  · wf_less_than:  wf less_than&lt;br /&gt;
&lt;br /&gt;
  Notas sobre medidas:&lt;br /&gt;
  · Imagen inversa de una relación mediante una función:&lt;br /&gt;
    · inv_image_def: inv_image r f ≡ {(x,y). (f x,f y) ∈ r}&lt;br /&gt;
  · Conservación de la buena fundamentación:&lt;br /&gt;
    · wf_inv_image: wf r ⟹ wf (inv_image r f)&lt;br /&gt;
  · Definición de la medida:&lt;br /&gt;
    · measure_def: measure ≡ inv_image less_than&lt;br /&gt;
  · Buena fundamentación de la medida:&lt;br /&gt;
    · wf_measure: wf (measure f)&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Notas sobre el producto lexicográfico:&lt;br /&gt;
  · Definición del producto lexicográfico (lex_prod_def):&lt;br /&gt;
    ra &amp;lt;*lex*&amp;gt; rb ≡ {((a,b),(a&amp;#039;,b&amp;#039;)). &lt;br /&gt;
                      (a,a&amp;#039;) ∈ ra ∨ (a = a&amp;#039; ∧ (b,b&amp;#039;) ∈ rb)}&lt;br /&gt;
  · Conservación de la buena fundamentación:&lt;br /&gt;
    · wf_lex_prod: ⟦wf ra; wf rb⟧ ⟹ wf (ra &amp;lt;*lex*&amp;gt; rb)&lt;br /&gt;
&lt;br /&gt;
  El orden de multiconjuntos está en la teoría HOL/Library/Multiset.thy.&lt;br /&gt;
&lt;br /&gt;
  Inducción sobre relaciones bien fundamentadas:&lt;br /&gt;
  · wf_induct: ⟦wf r; ⋀x. (⋀y. (y,x) ∈ r ⟹ P y) ⟹ P x⟧ ⟹ P a&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
section {* Puntos fijos *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  La teoría de los puntos fijos se aplican a las funciones monótonas.&lt;br /&gt;
&lt;br /&gt;
  Las funciones monótonas está definida (en Orderings.thy) por&lt;br /&gt;
  · mono_def: mono f ≡ ∀A B. A ≤ B ⟶ f A ≤ f B &lt;br /&gt;
&lt;br /&gt;
  Las reglas de introducción y eliminación de la monotonicidad son:&lt;br /&gt;
  . monoI: (⋀A B. A ≤ B ⟹ f A ≤ f B) ⟹ mono f&lt;br /&gt;
  · monoD: ⟦mono f ⟹ A ≤ B⟧ ⟹ f A ≤ f B&lt;br /&gt;
&lt;br /&gt;
  El menor punto fijo de un operador está definido en la teoría&lt;br /&gt;
  Inductive.thy, para los retículos completos, por&lt;br /&gt;
  · lfp_def: lfp f = Inf {u. f u ≤ u}&lt;br /&gt;
&lt;br /&gt;
  El menor punto fijo de una función monótona es un punto fijo:&lt;br /&gt;
  · lfp_unfold: mono f ⟹ lfp f = f (lfp f)&lt;br /&gt;
&lt;br /&gt;
  La regla de inducción del menor punto fijo es&lt;br /&gt;
  · lfp_induct_set: ⟦ a ∈ lfp(f);&lt;br /&gt;
                     mono(f); &lt;br /&gt;
                     ⋀x. ⟦ x ∈ f(lfp(f) ⋂ {x. P(x)}) ⟧ ⟹ P(x) ⟧&lt;br /&gt;
                    ⟹ P(a)&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  El mayor punto fijo de un operador está definido en la teoría&lt;br /&gt;
  Inductive.thy, para los retículos completos, por&lt;br /&gt;
  · gfp_def: gfp f = Sup {u. u ≤ f u}&lt;br /&gt;
&lt;br /&gt;
  El menor punto fijo de una función monótona es un punto fijo:&lt;br /&gt;
  · gfp_unfold: mono f ⟹ gfp f = f (gfp f)&lt;br /&gt;
&lt;br /&gt;
  La regla de inducción del menor punto fijo es&lt;br /&gt;
  · coinduct_set: ⟦ mono(f);  &lt;br /&gt;
                   a ∈ X;  &lt;br /&gt;
                   X ⊆ f(X ⋃ gfp(f)) ⟧ &lt;br /&gt;
                  ⟹ a ∈ gfp(f)&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>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2016/index.php?title=Tema_10:_Conjuntos,_funciones_y_relaciones&amp;diff=1368</id>
		<title>Tema 10: Conjuntos, funciones y relaciones</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2016/index.php?title=Tema_10:_Conjuntos,_funciones_y_relaciones&amp;diff=1368"/>
		<updated>2017-01-26T07:05:27Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: Página creada con &amp;#039;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt; chapter {* Tema 10: Conjuntos, funciones y relaciones *}  theory T10_Conjuntos_funciones_y_relaciones imports Main  begin  section {* Conjuntos *}  subsecti...&amp;#039;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
chapter {* Tema 10: Conjuntos, funciones y relaciones *}&lt;br /&gt;
&lt;br /&gt;
theory T10_Conjuntos_funciones_y_relaciones&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
section {* Conjuntos *}&lt;br /&gt;
&lt;br /&gt;
subsection {* Operaciones con conjuntos *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Nota. La teoría elemental de conjuntos es HOL/Set.thy.&lt;br /&gt;
&lt;br /&gt;
  Nota. En un conjunto todos los elemento son del mismo tipo (por&lt;br /&gt;
  ejemplo, del tipo τ) y el conjunto tiene tipo (en el ejemplo, &amp;quot;τ set&amp;quot;). &lt;br /&gt;
&lt;br /&gt;
  Reglas de la intersección:&lt;br /&gt;
  · IntI:  ⟦c ∈ A; c ∈ B⟧ ⟹ c ∈ A ∩ B&lt;br /&gt;
  · IntD1: c ∈ A ∩ B ⟹ c ∈ A&lt;br /&gt;
  · IntD2: c ∈ A ∩ B ⟹ c ∈ B&lt;br /&gt;
&lt;br /&gt;
  Nota. Propiedades del complementario:&lt;br /&gt;
  · Compl_iff: (c ∈ - A) = (c ∉ A)&lt;br /&gt;
  · Compl_Un:  - (A ∪ B) = - A ∩ - B&lt;br /&gt;
&lt;br /&gt;
  Nota. El conjunto vacío se representa por {} y el universal por UNIV. &lt;br /&gt;
&lt;br /&gt;
  Nota. Propiedades de la diferencia y del complementario:&lt;br /&gt;
  · Diff_disjoint:   A ∩ (B - A) = {}&lt;br /&gt;
  · Compl_partition: A ∪ - A = UNIV&lt;br /&gt;
&lt;br /&gt;
  Nota. Reglas de la relación de subconjunto:&lt;br /&gt;
  · subsetI: (⋀x. x ∈ A ⟹ x ∈ B) ⟹ A ⊆ B&lt;br /&gt;
  · subsetD: ⟦A ⊆ B; c ∈ A⟧ ⟹ c ∈ B   &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Ejemplo: A ∪ B ⊆ C syss A ⊆ C ∧ B ⊆ C.   &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;(A ∪ B ⊆ C) = (A ⊆ C ∧ B ⊆ C)&amp;quot;&lt;br /&gt;
by blast&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Ejemplo: A ⊆ -B syss B ⊆ -A.   &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;(A ⊆ -B) = (B ⊆ -A)&amp;quot;&lt;br /&gt;
by blast&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Principio de extensionalidad de conjuntos:&lt;br /&gt;
  · set_eqI: (⋀x. (x ∈ A) = (x ∈ B)) ⟹ A = B&lt;br /&gt;
&lt;br /&gt;
  Reglas de la igualdad de conjuntos:&lt;br /&gt;
  · equalityI:  ⟦A ⊆ B; B ⊆ A⟧ ⟹ A = B&lt;br /&gt;
  · equalityD1: A = B ⟹ A ⊆ B&lt;br /&gt;
  · equalityD2: A = B ⟹ B ⊆ A &lt;br /&gt;
  · equalityE:  ⟦A = B; ⟦A ⊆ B; B ⊆ A⟧ ⟹ P⟧ ⟹ P   &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Lema. [Analogía entre intersección y conjunción]&lt;br /&gt;
  &amp;quot;x ∈ A ∩ B&amp;quot; syss &amp;quot;x ∈ A&amp;quot; y &amp;quot;x ∈ B&amp;quot;. &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;(x ∈ A ∩ B) = (x ∈ A ∧ x ∈ B)&amp;quot; &lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Lema. [Analogía entre unión y disyunción]&lt;br /&gt;
  x ∈ A ∪ B syss x ∈ A ó x ∈ B.   &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;(x ∈ A ∪ B) = (x ∈ A ∨ x ∈ B)&amp;quot; &lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Lema. [Analogía entre subconjunto e implicación]&lt;br /&gt;
  A ⊆ B syss para todo x, si x ∈ A entonces x ∈ B.   &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;(A ⊆ B) = (∀ x. x ∈ A ⟶ x ∈ B)&amp;quot; &lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Lema. [Analogía entre complementario y negación]&lt;br /&gt;
  x pertenece al complementario de A syss x no pertenece a A.   &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;(x ∈ -A) = (x ∉ A)&amp;quot; &lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
subsection {* Notación de conjuntos finitos *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Nota. La teoría de conjuntos finitos es HOL/Finite_Set.thy.&lt;br /&gt;
&lt;br /&gt;
  Nota. Los conjuntos finitos se definen por inducción a partir de las&lt;br /&gt;
  siguientes reglas inductivas:&lt;br /&gt;
  · El conjunto vacío es un conjunto finito.&lt;br /&gt;
    · emptyI: &amp;quot;finite {}&amp;quot;&lt;br /&gt;
  · Si se le añade un elemento a un conjunto finito se obtiene otro&lt;br /&gt;
    conjunto finito. &lt;br /&gt;
    · insertI: &amp;quot;finite A ⟹ finite (insert a A)&amp;quot; &lt;br /&gt;
&lt;br /&gt;
  A continuación se muestran ejemplos de conjuntos finitos.   &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &lt;br /&gt;
  &amp;quot;insert 2 {} = {2} ∧&lt;br /&gt;
   insert 3 {2} = {2,3} ∧&lt;br /&gt;
   insert 2 {2,3} = {2,3} ∧&lt;br /&gt;
   {2,3} = {3,2,3,2,2}&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Nota. Los conjuntos finitos se representan con la notación conjuntista&lt;br /&gt;
  habitual: los elementos entre llaves y separados por comas. &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Ejemplo: {a,b} ∪ {c,d} = {a,b,c,d}   &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;{a,b} ∪ {c,d} = {a,b,c,d}&amp;quot; &lt;br /&gt;
by blast&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Ejemplo de conjetura falsa y su refutación. &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;{a,b} ∩ {b,c} = {b}&amp;quot; &lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Ejemplo con la conjetura corregida.   &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;{a,b} ∩ {b,c} = (if a = c then {a,b} else {b})&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Sumas de conjuntos finitos:&lt;br /&gt;
  · ∑A es la suma de los elementos del conjunto finito A. Por ejemplo, &lt;br /&gt;
      value &amp;quot;∑{1,2,3}::int&amp;quot; -- &amp;quot;= 6&amp;quot;&lt;br /&gt;
  · (setsum f A) es la suma de la aplicación de f a los elementos del&lt;br /&gt;
    conjunto finito A,  Por ejemplo,&lt;br /&gt;
       value &amp;quot;setsum (λx. x*x) {1,2,3}::int&amp;quot; -- &amp;quot;= 14&amp;quot;&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Ejemplos de definiciones recursivas sobre conjuntos finitos: &lt;br /&gt;
  Sea A un conjunto finito de números naturales.&lt;br /&gt;
  · sumaConj A es la suma de los elementos A.&lt;br /&gt;
  · sumaCuadradosConj A es la suma de los cuadrados de los elementos A. &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
definition sumaConj :: &amp;quot;nat set ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;sumaConj S ≡ ∑S&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;sumaConj {2,5,3} = 10&amp;quot;&lt;br /&gt;
&lt;br /&gt;
definition sumaCuadradosConj :: &amp;quot;nat set ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;sumaCuadradosConj S ≡ setsum (λx. x*x) S&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;sumaCuadradosConj {2,5,3} = 38&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Nota. Para simplificar lo que sigue, declaramos las anteriores&lt;br /&gt;
  definiciones como reglas de simplificación.   &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
declare sumaConj_def[simp]&lt;br /&gt;
declare sumaCuadradosConj_def[simp]&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Ejemplos de evaluación de las anteriores definiciones recursivas.   &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &lt;br /&gt;
  &amp;quot;sumaConj {1,2,3,4} = 10 ∧&lt;br /&gt;
   sumaCuadradosConj {1,2,3,4} = 30&amp;quot;&lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Inducción sobre conjuntos finitos: Para demostrar que todos los&lt;br /&gt;
  conjuntos finitos tienen una propiedad P basta probar que&lt;br /&gt;
  · El conjunto vacío tiene la propiedad P.&lt;br /&gt;
  · Si a un conjunto finito que tiene la propiedad P se le añade un&lt;br /&gt;
    nuevo elemento, el conjunto obtenido sigue teniendo la propiedad P. &lt;br /&gt;
  En forma de regla&lt;br /&gt;
  · finite_induct: ⟦finite F; &lt;br /&gt;
                    P {}; &lt;br /&gt;
                    ⋀x F. ⟦finite F; x ∉ F; P F⟧ ⟹ P ({x} ∪ F)⟧ &lt;br /&gt;
                   ⟹ P F   &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Ejemplo de inducción sobre conjuntos finitos: Sea S un conjunto finito&lt;br /&gt;
  de números naturales. Entonces todos los elementos de S son menores o&lt;br /&gt;
  iguales que la suma de los elementos de S. &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma &amp;quot;finite S ⟹ ∀x∈S. x ≤ sumaConj S&amp;quot;&lt;br /&gt;
by (induct rule: finite_induct) auto&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma sumaConj_acota: &lt;br /&gt;
  &amp;quot;finite S ⟹ ∀x∈S. x ≤ sumaConj S&amp;quot;&lt;br /&gt;
proof (induct rule: finite_induct)&lt;br /&gt;
  show &amp;quot;∀x ∈ {}. x ≤ sumaConj {}&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x and F&lt;br /&gt;
  assume fF: &amp;quot;finite F&amp;quot; &lt;br /&gt;
     and xF: &amp;quot;x ∉ F&amp;quot; &lt;br /&gt;
     and HI: &amp;quot;∀ x∈F. x ≤ sumaConj F&amp;quot;&lt;br /&gt;
  show &amp;quot;∀y ∈ insert x F. y ≤ sumaConj (insert x F)&amp;quot;&lt;br /&gt;
  proof &lt;br /&gt;
    fix y &lt;br /&gt;
    assume &amp;quot;y ∈ insert x F&amp;quot;&lt;br /&gt;
    show &amp;quot;y ≤ sumaConj (insert x F)&amp;quot;&lt;br /&gt;
    proof (cases &amp;quot;y = x&amp;quot;)&lt;br /&gt;
      assume &amp;quot;y = x&amp;quot;&lt;br /&gt;
      hence &amp;quot;y ≤ x + (sumaConj F)&amp;quot; by simp&lt;br /&gt;
      also have &amp;quot;… = sumaConj (insert x F)&amp;quot; using fF xF by simp&lt;br /&gt;
      finally show ?thesis .&lt;br /&gt;
    next&lt;br /&gt;
      assume &amp;quot;y ≠ x&amp;quot;&lt;br /&gt;
      hence &amp;quot;y ∈ F&amp;quot; using `y ∈ insert x F` by simp&lt;br /&gt;
      hence &amp;quot;y ≤ sumaConj F&amp;quot; using HI by blast&lt;br /&gt;
      also have &amp;quot;… ≤ x + (sumaConj F)&amp;quot; by simp&lt;br /&gt;
      also have &amp;quot;… = sumaConj (insert x F)&amp;quot; using fF xF by simp&lt;br /&gt;
      finally show ?thesis .&lt;br /&gt;
    qed&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
subsection {* Definiciones por comprensión *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  El conjunto de los elementos que cumple la propiedad P se representa&lt;br /&gt;
  por {x. P}. &lt;br /&gt;
&lt;br /&gt;
  Reglas de comprensión (relación entre colección y pertenencia):&lt;br /&gt;
  · mem_Collect_eq: (a ∈ {x. P x}) = P a&lt;br /&gt;
  · Collect_mem_eq: {x. x ∈ A} = A   &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Ejemplo de comprensión: {x. P x ∨ x ∈ A} = {x. P x} ∪ A   &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;{x. P x ∨ x ∈ A} = {x. P x} ∪ A&amp;quot;&lt;br /&gt;
by blast&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Ejemplo de comprensión: {x. P x ⟶ Q x} = -{x. P x} ∪ {x. Q x}   &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;{x. P x ⟶ Q x} = -{x. P x} ∪ {x. Q x}&amp;quot;&lt;br /&gt;
by blast&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Ejemplo con la sintaxis general de comprensión.   &lt;br /&gt;
     {p*q | p q. p ∈ prime ∧ q ∈ prime} = &lt;br /&gt;
     {z. ∃p q. z = p*q ∧ p ∈ prime ∧ q ∈ prime}   &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &lt;br /&gt;
  &amp;quot;{p*q | p q. p ∈ prime ∧ q ∈ prime} = &lt;br /&gt;
   {z. ∃p q. z = p*q ∧ p ∈ prime ∧ q ∈ prime}&amp;quot;&lt;br /&gt;
by blast&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
   En HOL, la notación conjuntista es azúcar sintáctica:&lt;br /&gt;
   · x ∈ A  es equivalente a A(x).&lt;br /&gt;
   · {x. P} es equivalente a λx. P.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Ejemplo de definición por comprensión: El conjunto de los pares es el&lt;br /&gt;
  de los números n para los que existe un m tal que n = 2*m.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
definition Pares :: &amp;quot;nat set&amp;quot; where&lt;br /&gt;
  &amp;quot;Pares ≡ {n. ∃m. n = 2*m }&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Ejemplo. Los números 2 y 34 son pares.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &lt;br /&gt;
  &amp;quot;2 ∈ Pares ∧&lt;br /&gt;
   34 ∈ Pares&amp;quot; &lt;br /&gt;
by (simp add: Pares_def)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Definición. El conjunto de los impares es el de los números n para los&lt;br /&gt;
  que existe un m tal que n = 2*m + 1.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
definition Impares :: &amp;quot;nat set&amp;quot; where&lt;br /&gt;
  &amp;quot;Impares ≡ {n. ∃m. n = 2*m + 1}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Ejemplo con las reglas de intersección y comprensión: El conjunto de&lt;br /&gt;
  los pares es disjunto con el de los impares. &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración detallada es&amp;quot;&lt;br /&gt;
lemma &amp;quot;x ∉ (Pares ∩ Impares)&amp;quot;&lt;br /&gt;
proof &lt;br /&gt;
  fix x assume S: &amp;quot;x ∈ (Pares ∩ Impares)&amp;quot;&lt;br /&gt;
  hence &amp;quot;x ∈ Pares&amp;quot; by (rule IntD1)&lt;br /&gt;
  hence &amp;quot;∃m. x = 2 * m&amp;quot; by (simp only: Pares_def mem_Collect_eq)&lt;br /&gt;
  then obtain p where p: &amp;quot;x = 2 * p&amp;quot; .. &lt;br /&gt;
  from S have &amp;quot;x ∈ Impares&amp;quot; by (rule IntD2)&lt;br /&gt;
  hence &amp;quot;∃ m. x = 2 * m + 1&amp;quot; by (simp only: Impares_def mem_Collect_eq)&lt;br /&gt;
  then obtain q where q: &amp;quot;x = 2 * q + 1&amp;quot; .. &lt;br /&gt;
  from p and q show &amp;quot;False&amp;quot; by arith&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma &amp;quot;x ∉ (Pares ∩ Impares)&amp;quot;&lt;br /&gt;
proof &lt;br /&gt;
  fix x assume S: &amp;quot;x ∈ (Pares ∩ Impares)&amp;quot;&lt;br /&gt;
  hence &amp;quot;x ∈ Pares&amp;quot; ..&lt;br /&gt;
  hence &amp;quot;∃m. x = 2 * m&amp;quot; by (simp only: Pares_def mem_Collect_eq)&lt;br /&gt;
  then obtain p where p: &amp;quot;x = 2 * p&amp;quot; .. &lt;br /&gt;
  from S have &amp;quot;x ∈ Impares&amp;quot; ..&lt;br /&gt;
  hence &amp;quot;∃ m. x = 2 * m + 1&amp;quot; by (simp only: Impares_def mem_Collect_eq)&lt;br /&gt;
  then obtain q where q: &amp;quot;x = 2 * q + 1&amp;quot; .. &lt;br /&gt;
  from p and q show &amp;quot;False&amp;quot; by arith&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma &amp;quot;x ∉ (Pares ∩ Impares)&amp;quot;&lt;br /&gt;
by (auto simp add: Pares_def Impares_def, arith)&lt;br /&gt;
&lt;br /&gt;
subsection {* Cuantificadores acotados *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Reglas de cuantificador universal acotado (&amp;quot;bounded&amp;quot;):&lt;br /&gt;
  · ballI: (⋀x. x ∈ A ⟹ P x) ⟹ ∀x∈A. P x&lt;br /&gt;
  · bspec: ⟦∀x∈A. P x; x ∈ A⟧ ⟹ P x&lt;br /&gt;
&lt;br /&gt;
  Reglas de cuantificador existencial acotado (&amp;quot;bounded&amp;quot;):&lt;br /&gt;
  · bexI: ⟦P x; x ∈ A⟧ ⟹ ∃x∈A. P x&lt;br /&gt;
  · bexE: ⟦∃x∈A. P x; ⋀x. ⟦x ∈ A; P x⟧ ⟹ Q⟧ ⟹ Q&lt;br /&gt;
&lt;br /&gt;
  Reglas de la unión indexada:&lt;br /&gt;
  · UN_iff: (b ∈ (⋃x∈A. B x)) = (∃x∈A. b ∈ B x)&lt;br /&gt;
  · UN_I:   ⟦a ∈ A; b ∈ B a⟧ ⟹ b ∈ (⋃x∈A. B x)&lt;br /&gt;
  · UN_E:   ⟦b ∈ (⋃x∈A. B x); ⋀x. ⟦x ∈ A; b ∈ B x⟧ ⟹ R⟧ ⟹ R&lt;br /&gt;
&lt;br /&gt;
  Reglas de la unión de una familia:&lt;br /&gt;
  · Union_def: ⋃S = (⋃x∈S. x)&lt;br /&gt;
  · Union_iff: (A ∈ ⋃C) = (∃X∈C. A ∈ X)&lt;br /&gt;
&lt;br /&gt;
  Reglas de la intersección indexada:&lt;br /&gt;
  · INT_iff: (b ∈ (⋂x∈A. B x)) = (∀x∈A. b ∈ B x)&lt;br /&gt;
  · INT_I:   (⋀x. x ∈ A ⟹ b ∈ B x) ⟹ b ∈ (⋂x∈A. B x)&lt;br /&gt;
  · INT_E:   ⟦b ∈ (⋂x∈A. B x); b ∈ B a ⟹ R; a ∉ A ⟹ R⟧ ⟹ R&lt;br /&gt;
&lt;br /&gt;
  Reglas de la intersección de una familia:&lt;br /&gt;
  · Inter_def: ⋂S = (⋂x∈S. x)&lt;br /&gt;
  · Inter_iff: (A ∈ ⋂C) = (∀X∈C. A ∈ X)&lt;br /&gt;
&lt;br /&gt;
  Abreviaturas:&lt;br /&gt;
  · &amp;quot;Collect P&amp;quot; es lo mismo que &amp;quot;{x. P}&amp;quot;.&lt;br /&gt;
  · &amp;quot;All P&amp;quot;     es lo mismo que &amp;quot;∀x. P x&amp;quot;.&lt;br /&gt;
  · &amp;quot;Ex P&amp;quot;      es lo mismo que &amp;quot;∃x. P x&amp;quot;.&lt;br /&gt;
  · &amp;quot;Ball A P&amp;quot;  es lo mismo que &amp;quot;∀x∈A. P x&amp;quot;.&lt;br /&gt;
  · &amp;quot;Bex A P&amp;quot;   es lo mismo que &amp;quot;∃x∈A. P x&amp;quot;.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
subsection {* Conjuntos finitos y cardinalidad *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  El número de elementos de un conjunto finito A es el cardinal de A y&lt;br /&gt;
  se representa por &amp;quot;card A&amp;quot;.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Ejemplos de cardinales de conjuntos finitos.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &lt;br /&gt;
  &amp;quot;card {} = 0 ∧&lt;br /&gt;
   card {4} = 1 ∧&lt;br /&gt;
   card {4,1} = 2 ∧&lt;br /&gt;
   x ≠ y ⟹ card {x,y} = 2&amp;quot; &lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Propiedades de cardinales:&lt;br /&gt;
  · Cardinal de la unión de conjuntos finitos:&lt;br /&gt;
    card_Un_Int: ⟦finite A; finite B⟧ &lt;br /&gt;
                 ⟹ card A + card B = card (A ∪ B) + card (A ∩ B)&amp;quot; &lt;br /&gt;
  · Cardinal del conjunto potencia: &lt;br /&gt;
    card_Pow: finite A ⟹ card (Pow A) = 2 ^ card A&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
section {* Funciones *}&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  La teoría de funciones es HOL/Fun.thy. &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
subsection {* Nociones básicas de funciones *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Principio de extensionalidad para funciones:&lt;br /&gt;
  · ext: (⋀x. f x = g x) ⟹ f = g&lt;br /&gt;
&lt;br /&gt;
  Actualización de funciones  &lt;br /&gt;
  · fun_upd_apply: (f(x := y)) z = (if z = x then y else f z)&lt;br /&gt;
  · fun_upd_upd:   f(x := y, x := z) = f(x := z)&lt;br /&gt;
&lt;br /&gt;
  Función identidad&lt;br /&gt;
  · id_def: id ≡ λx. x&lt;br /&gt;
&lt;br /&gt;
  Composición de funciones:&lt;br /&gt;
  · o_def: f ∘ g = (λx. f (g x))&lt;br /&gt;
&lt;br /&gt;
  Asociatividad de la composición:&lt;br /&gt;
  · o_assoc: f ∘ (g ∘ h) = (f ∘ g) ∘ h&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
subsection {* Funciones inyectivas, suprayectivas y biyectivas *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Función inyectiva sobre A:&lt;br /&gt;
  · inj_on_def: inj_on f A ≡ ∀x∈A. ∀y∈A. f x = f y ⟶ x = y&lt;br /&gt;
&lt;br /&gt;
  Nota. &amp;quot;inj f&amp;quot; es una abreviatura de &amp;quot;inj_on f UNIV&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
  Función suprayectiva:&lt;br /&gt;
  · surj_def: surj f ≡ ∀y. ∃x. y = f x&lt;br /&gt;
&lt;br /&gt;
  Función biyectiva:&lt;br /&gt;
  · bij_def: bij f ≡ inj f ∧ surj f&lt;br /&gt;
&lt;br /&gt;
  Propiedades de las funciones inversas:&lt;br /&gt;
  · inv_f_f:      inj f  ⟹ inv f (f x) = x&lt;br /&gt;
  · surj_f_inv_f: surj f ⟹ f (inv f y) = y&lt;br /&gt;
  · inv_inv_eq:   bij f  ⟹ inv (inv f) = f&lt;br /&gt;
&lt;br /&gt;
  Igualdad de funciones (por extensionalidad):&lt;br /&gt;
  · fun_eq_iff: (f = g) = (∀x. f x = g x)&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Ejemplo de lema de demostración de propiedades de funciones: Una&lt;br /&gt;
  función inyectiva puede cancelarse en el lado izquierdo de la&lt;br /&gt;
  composición de funciones. &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración detallada es&amp;quot;&lt;br /&gt;
lemma &lt;br /&gt;
  assumes &amp;quot;inj f&amp;quot;&lt;br /&gt;
  shows &amp;quot;(f ∘ g = f ∘ h) = (g = h)&amp;quot;&lt;br /&gt;
proof &lt;br /&gt;
  assume &amp;quot;f ∘ g = f ∘ h&amp;quot;&lt;br /&gt;
  show &amp;quot;g = h&amp;quot;&lt;br /&gt;
  proof&lt;br /&gt;
    fix x&lt;br /&gt;
    have &amp;quot;(f ∘ g)(x) = (f ∘ h)(x)&amp;quot; using `f ∘ g = f ∘ h` by simp&lt;br /&gt;
    hence &amp;quot;f(g(x)) = f(h(x))&amp;quot; by simp&lt;br /&gt;
    then show &amp;quot;g(x) = h(x)&amp;quot; using `inj f` by (simp add:inj_on_def)&lt;br /&gt;
  qed&lt;br /&gt;
next&lt;br /&gt;
  assume &amp;quot;g = h&amp;quot;&lt;br /&gt;
  show &amp;quot;f ∘ g = f ∘ h&amp;quot;&lt;br /&gt;
  proof&lt;br /&gt;
    fix x&lt;br /&gt;
    have &amp;quot;(f ∘ g) x = f(g(x))&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;… = f(h(x))&amp;quot; using `g = h` by simp&lt;br /&gt;
    also have &amp;quot;… = (f ∘ h) x&amp;quot; by simp&lt;br /&gt;
    finally show &amp;quot;(f ∘ g) x = (f ∘ h) x&amp;quot; by simp&lt;br /&gt;
  qed&lt;br /&gt;
qed&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;inj f&amp;quot;&lt;br /&gt;
  shows &amp;quot;(f ∘ g = f ∘ h) = (g = h)&amp;quot;&lt;br /&gt;
proof &lt;br /&gt;
  assume &amp;quot;f ∘ g = f ∘ h&amp;quot; &lt;br /&gt;
  thus &amp;quot;g = h&amp;quot; using `inj f` by (simp add: inj_on_def fun_eq_iff) &lt;br /&gt;
next&lt;br /&gt;
  assume &amp;quot;g = h&amp;quot; &lt;br /&gt;
  thus &amp;quot;f ∘ g = f ∘ h&amp;quot; by auto&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma &lt;br /&gt;
  assumes &amp;quot;inj f&amp;quot;&lt;br /&gt;
  shows &amp;quot;(f ∘ g = f ∘ h) = (g = h)&amp;quot;&lt;br /&gt;
using assms&lt;br /&gt;
by (auto simp add: inj_on_def fun_eq_iff) &lt;br /&gt;
&lt;br /&gt;
subsubsection {* Función imagen *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Imagen de un conjunto mediante una función:&lt;br /&gt;
  · image_def: f ` A = {y. (∃x∈A. y = f x)}&lt;br /&gt;
&lt;br /&gt;
  Propiedades de la imagen:&lt;br /&gt;
  · image_compose: (f ∘ g)`r = f`g`r&lt;br /&gt;
  · image_Un:      f`(A ∪ B) = f`A ∪ f`B &lt;br /&gt;
  · image_Int:     inj f ⟹ f`(A ∩ B) = f`A ∩ f`B&amp;quot; &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Ejemplo de demostración de propiedades de la imagen:&lt;br /&gt;
     f`A ∪ g`A = (⋃x∈A. {f x, g x})&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;f`A ∪ g`A = (⋃x∈A. {f x, g x})&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Ejemplo de demostración de propiedades de la imagen:&lt;br /&gt;
     f`{(x,y). P x y} = {f(x,y) | x y. P x y}&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;f`{(x,y). P x y} = {f(x,y) | x y. P x y}&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  El rango de una función (&amp;quot;range f&amp;quot;) es la imagen del universo &lt;br /&gt;
  (&amp;quot;f`UNIV&amp;quot;). &lt;br /&gt;
&lt;br /&gt;
  Imagen inversa de un conjunto:&lt;br /&gt;
  · vimage_def: f -` B ≡ {x. f x ∈ B}&lt;br /&gt;
&lt;br /&gt;
  Propiedad de la imagen inversa de un conjunto:&lt;br /&gt;
  · vimage_Compl: f -` (-A) = -(f -` A)&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
section {* Relaciones *}&lt;br /&gt;
&lt;br /&gt;
subsection {* Relaciones básicas *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  La teoría de relaciones es HOL/Relation.thy.&lt;br /&gt;
&lt;br /&gt;
  Las relaciones son conjuntos de pares.&lt;br /&gt;
&lt;br /&gt;
  Relación identidad:&lt;br /&gt;
  · Id_def: Id ≡ {p. ∃x. p = (x,x)}&lt;br /&gt;
&lt;br /&gt;
  Composición de relaciones:&lt;br /&gt;
  · rel_comp_def: r O s ≡ {(x,z). ∃y. (x, y) ∈ r ∧ (y, z) ∈ s}&lt;br /&gt;
&lt;br /&gt;
  Propiedades:&lt;br /&gt;
  · R_O_Id:        R O Id = R&lt;br /&gt;
  · rel_comp_mono: ⟦r&amp;#039; ⊆ r; s&amp;#039; ⊆ s⟧ ⟹ (r&amp;#039; O s&amp;#039;) ⊆ (r O s)&lt;br /&gt;
&lt;br /&gt;
  Imagen inversa de una relación:&lt;br /&gt;
  · converse_iff: ((a,b) ∈ r^-1) = ((b,a) ∈ r)&lt;br /&gt;
&lt;br /&gt;
  Propiedad de la imagen inversa de una relación:&lt;br /&gt;
  · converse_rel_comp: (r O s)^-1 = s^-1 O r^-1&lt;br /&gt;
&lt;br /&gt;
  Imagen de un conjunto mediante una relación:&lt;br /&gt;
  · Image_iff: (b ∈ r``A) = (∃x:A. (x, b) ∈ r)&lt;br /&gt;
&lt;br /&gt;
  Dominio de una relación:&lt;br /&gt;
  · Domain_iff: (a ∈ Domain r) = (∃y. (a, y) ∈ r)&lt;br /&gt;
&lt;br /&gt;
  Rango de una relación:&lt;br /&gt;
  · Range_iff: (a ∈ Range r) = (∃y. (y,a) ∈ r)&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
subsection {* Clausura reflexiva y transitiva *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  La teoría de la clausura reflexiva y transitiva de una relación es&lt;br /&gt;
  HOL/Transitive_Closure.thy.&lt;br /&gt;
&lt;br /&gt;
  Potencias de relaciones:&lt;br /&gt;
  · R ^^ 0 = Id&lt;br /&gt;
  · R ^^ (Suc n) = (R ^^ n) O R&lt;br /&gt;
  &lt;br /&gt;
  La clausura reflexiva y transitiva de la relación r es la menor&lt;br /&gt;
  solución de la ecuación: &lt;br /&gt;
  · rtrancl_unfold: r^* = Id ∪ (r^* O r)&lt;br /&gt;
  &lt;br /&gt;
  Propiedades básicas de la clausura reflexiva y transitiva:&lt;br /&gt;
  · rtrancl_refl:   (a,a) ∈ r^*&lt;br /&gt;
  · r_into_rtrancl: p ∈ r ⟹ p ∈ r^*&lt;br /&gt;
  · rtrancl_trans:  ⟦(a,b) ∈ r^*; (b,c) ∈ r^*⟧ ⟹ (a,c) ∈ r^*&lt;br /&gt;
  &lt;br /&gt;
  Inducción sobre la clausura reflexiva y transitiva&lt;br /&gt;
  · rtrancl_induct: ⟦(a,b) ∈ r^*; &lt;br /&gt;
                     P b; &lt;br /&gt;
                     ⋀y z. ⟦(y,z) ∈ r; (z,b) ∈ r^*; P z⟧ ⟹ P y⟧&lt;br /&gt;
                    ⟹ P a&lt;br /&gt;
  &lt;br /&gt;
  Idempotencia de la clausura reflexiva y transitiva:&lt;br /&gt;
  · rtrancl_idemp: (r^*)^* = r^*&lt;br /&gt;
  &lt;br /&gt;
  Reglas de introducción de la clausura transitiva:&lt;br /&gt;
  · r_into_trancl&amp;#039;: p ∈ r ⟹ p ∈ r^+&lt;br /&gt;
  · trancl_trans:   ⟦(a,b) ∈ r^+; (b,c) ∈ r^+⟧ ⟹ (a,c) ∈ r^+&lt;br /&gt;
&lt;br /&gt;
  Ejemplo de propiedad:&lt;br /&gt;
  · trancl_converse: (r¯)^+ = (r^+)¯&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
subsection {* Una demostración elemental *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Se desea demostrar que la clausura reflexiva y transitiva conmuta con&lt;br /&gt;
  la inversa (cl_rtrans_inversa). &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
theorem &amp;quot;(r¯)⇧* = (r⇧*)¯&amp;quot; &lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* Para demostrarlo introducimos dos lemas auxiliares: &lt;br /&gt;
  cl_rtrans_inversaD y cl_rtrans_inversaI.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración detallada del primer lema es&amp;quot;&lt;br /&gt;
lemma cl_rtrans_inversaD: &lt;br /&gt;
  &amp;quot;(x,y) ∈ (r¯)⇧* ⟹ (y,x) ∈ r⇧*&amp;quot;&lt;br /&gt;
proof (induct rule:rtrancl_induct)&lt;br /&gt;
  show &amp;quot;(x,x) ∈ r⇧*&amp;quot; by (rule rtrancl_refl) &lt;br /&gt;
next&lt;br /&gt;
  fix y z&lt;br /&gt;
  assume &amp;quot;(x,y) ∈ (r¯)⇧*&amp;quot; and &amp;quot;(y,z) ∈ r¯&amp;quot; and &amp;quot;(y,x) ∈ r⇧*&amp;quot;&lt;br /&gt;
  show &amp;quot;(z,x) ∈ r⇧*&amp;quot;&lt;br /&gt;
  proof (rule rtrancl_trans)&lt;br /&gt;
    show &amp;quot;(z,y) ∈ r⇧*&amp;quot; using `(y,z) ∈ r¯` by simp&lt;br /&gt;
  next&lt;br /&gt;
    show &amp;quot;(y,x) ∈ r⇧*&amp;quot; using `(y,x) ∈ r⇧*` by simp&lt;br /&gt;
  qed   &lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática del primer lema es&amp;quot;&lt;br /&gt;
lemma  cl_rtrans_inversaD2: &lt;br /&gt;
  &amp;quot;(x,y) ∈ (r¯)⇧* ⟹ (y,x) ∈ r⇧*&amp;quot;&lt;br /&gt;
by (induct rule: rtrancl_induct) &lt;br /&gt;
   (auto simp add: rtrancl_trans)&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración detallada del segundo lema es&amp;quot;&lt;br /&gt;
lemma cl_rtrans_inversaI: &lt;br /&gt;
  &amp;quot;(y,x) ∈ r⇧* ⟹ (x,y) ∈ (r¯)⇧*&amp;quot;&lt;br /&gt;
proof (induct rule: rtrancl_induct)&lt;br /&gt;
  show &amp;quot;(y,y) ∈ (r¯)⇧*&amp;quot; by (rule rtrancl_refl) &lt;br /&gt;
next&lt;br /&gt;
  fix u z&lt;br /&gt;
  assume &amp;quot;(y,u) ∈ r⇧*&amp;quot; and &amp;quot;(u,z) ∈ r&amp;quot; and &amp;quot;(u,y) ∈ (r¯)⇧*&amp;quot;&lt;br /&gt;
  show &amp;quot;(z,y) ∈ (r¯)⇧*&amp;quot;&lt;br /&gt;
  proof (rule rtrancl_trans)&lt;br /&gt;
    show &amp;quot;(z,u) ∈ (r¯)⇧*&amp;quot; using `(u,z) ∈ r` by auto&lt;br /&gt;
  next&lt;br /&gt;
    show &amp;quot;(u,y) ∈ (r¯)⇧*&amp;quot; using `(u,y) ∈ (r¯)⇧*` by simp&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración detalla del teorema es&amp;quot;&lt;br /&gt;
theorem cl_rtrans_inversa: &lt;br /&gt;
  &amp;quot;(r¯)⇧* = (r⇧*)¯&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  show &amp;quot;(r¯)⇧* ⊆ (r⇧*)¯&amp;quot; by (auto simp add:cl_rtrans_inversaD)&lt;br /&gt;
next&lt;br /&gt;
  show &amp;quot;(r⇧*)¯ ⊆ (r¯)⇧*&amp;quot; by (auto simp add:cl_rtrans_inversaI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática del teorema es&amp;quot;&lt;br /&gt;
theorem &amp;quot;(r¯)⇧* = (r⇧*)¯&amp;quot;&lt;br /&gt;
by (auto intro: cl_rtrans_inversaI dest: cl_rtrans_inversaD)&lt;br /&gt;
&lt;br /&gt;
section {* Relaciones bien fundamentadas e inducción *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  La teoría de las relaciones bien fundamentadas es &lt;br /&gt;
  HOL/Wellfounded_Relations.thy.&lt;br /&gt;
&lt;br /&gt;
  La relación-objeto &amp;quot;less_than&amp;quot; es el orden de los naturales definido &lt;br /&gt;
  por&lt;br /&gt;
  · less_than = pred_nat^+&lt;br /&gt;
  donde pred_nat está definida por &lt;br /&gt;
  · pred_nat = {(m, n). n = Suc m}&lt;br /&gt;
&lt;br /&gt;
  La caracterización de less_than es&lt;br /&gt;
  · less_than_iff: ((x,y) ∈ less_than) = (x &amp;lt; y)&lt;br /&gt;
&lt;br /&gt;
  La relación less_than está bien fundamentada&lt;br /&gt;
  · wf_less_than:  wf less_than&lt;br /&gt;
&lt;br /&gt;
  Notas sobre medidas:&lt;br /&gt;
  · Imagen inversa de una relación mediante una función:&lt;br /&gt;
    · inv_image_def: inv_image r f ≡ {(x,y). (f x,f y) ∈ r}&lt;br /&gt;
  · Conservación de la buena fundamentación:&lt;br /&gt;
    · wf_inv_image: wf r ⟹ wf (inv_image r f)&lt;br /&gt;
  · Definición de la medida:&lt;br /&gt;
    · measure_def: measure ≡ inv_image less_than&lt;br /&gt;
  · Buena fundamentación de la medida:&lt;br /&gt;
    · wf_measure: wf (measure f)&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Notas sobre el producto lexicográfico:&lt;br /&gt;
  · Definición del producto lexicográfico (lex_prod_def):&lt;br /&gt;
    ra &amp;lt;*lex*&amp;gt; rb ≡ {((a,b),(a&amp;#039;,b&amp;#039;)). &lt;br /&gt;
                      (a,a&amp;#039;) ∈ ra ∨ (a = a&amp;#039; ∧ (b,b&amp;#039;) ∈ rb)}&lt;br /&gt;
  · Conservación de la buena fundamentación:&lt;br /&gt;
    · wf_lex_prod: ⟦wf ra; wf rb⟧ ⟹ wf (ra &amp;lt;*lex*&amp;gt; rb)&lt;br /&gt;
&lt;br /&gt;
  El orden de multiconjuntos está en la teoría HOL/Library/Multiset.thy.&lt;br /&gt;
&lt;br /&gt;
  Inducción sobre relaciones bien fundamentadas:&lt;br /&gt;
  · wf_induct: ⟦wf r; ⋀x. (⋀y. (y,x) ∈ r ⟹ P y) ⟹ P x⟧ ⟹ P a&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
section {* Puntos fijos *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  La teoría de los puntos fijos se aplican a las funciones monótonas.&lt;br /&gt;
&lt;br /&gt;
  Las funciones monótonas está definida (en Orderings.thy) por&lt;br /&gt;
  · mono_def: mono f ≡ ∀A B. A ≤ B ⟶ f A ≤ f B &lt;br /&gt;
&lt;br /&gt;
  Las reglas de introducción y eliminación de la monotonicidad son:&lt;br /&gt;
  . monoI: (⋀A B. A ≤ B ⟹ f A ≤ f B) ⟹ mono f&lt;br /&gt;
  · monoD: ⟦mono f ⟹ A ≤ B⟧ ⟹ f A ≤ f B&lt;br /&gt;
&lt;br /&gt;
  El menor punto fijo de un operador está definido en la teoría&lt;br /&gt;
  Inductive.thy, para los retículos completos, por&lt;br /&gt;
  · lfp_def: lfp f = Inf {u. f u ≤ u}&lt;br /&gt;
&lt;br /&gt;
  El menor punto fijo de una función monótona es un punto fijo:&lt;br /&gt;
  · lfp_unfold: mono f ⟹ lfp f = f (lfp f)&lt;br /&gt;
&lt;br /&gt;
  La regla de inducción del menor punto fijo es&lt;br /&gt;
  · lfp_induct_set: ⟦ a ∈ lfp(f);&lt;br /&gt;
                     mono(f); &lt;br /&gt;
                     ⋀x. ⟦ x ∈ f(lfp(f) ⋂ {x. P(x)}) ⟧ ⟹ P(x) ⟧&lt;br /&gt;
                    ⟹ P(a)&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  El mayor punto fijo de un operador está definido en la teoría&lt;br /&gt;
  Inductive.thy, para los retículos completos, por&lt;br /&gt;
  · gfp_def: gfp f = Sup {u. u ≤ f u}&lt;br /&gt;
&lt;br /&gt;
  El menor punto fijo de una función monótona es un punto fijo:&lt;br /&gt;
  · gfp_unfold: mono f ⟹ gfp f = f (gfp f)&lt;br /&gt;
&lt;br /&gt;
  La regla de inducción del menor punto fijo es&lt;br /&gt;
  · coinduct_set: ⟦ mono(f);  &lt;br /&gt;
                   a ∈ X;  &lt;br /&gt;
                   X ⊆ f(X ⋃ gfp(f)) ⟧ &lt;br /&gt;
                  ⟹ a ∈ gfp(f)&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>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2016/index.php?title=Temas&amp;diff=1367</id>
		<title>Temas</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2016/index.php?title=Temas&amp;diff=1367"/>
		<updated>2017-01-26T06:10:13Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Temas de &amp;#039;&amp;#039;Razonamiento automático (2016-17)&amp;#039;&amp;#039; ==&lt;br /&gt;
&lt;br /&gt;
* [[Tema 1: Programación funcional en Isabelle]].&lt;br /&gt;
* Tema 2: Razonamiento sobre programas:&lt;br /&gt;
** [http://www.cs.us.es/~jalonso/cursos/i1m-16/temas/tema-8.pdf Tema 2a: Razonamiento sobre programas Haskell]&lt;br /&gt;
** [[Tema 2b: Razonamiento automático sobre programas en Isabelle/HOL]].&lt;br /&gt;
* [[Tema 3: Razonamiento estructurado sobre programas en Isabelle/HOL]].&lt;br /&gt;
* [[Tema 4: Razonamiento por casos y por inducción]].&lt;br /&gt;
* [[Tema 5: Razonamiento sobre árboles y bosques]].&lt;br /&gt;
* Tema 6: Verificación de algoritmos de ordenación:&lt;br /&gt;
** [[Tema 6a: Verificación de la ordenación por inserción]].&lt;br /&gt;
** [[Tema 6b: Verificación de la ordenación por mezcla]].&lt;br /&gt;
* [[Tema 7: Caso de estudio: Compilación de expresiones]].&lt;br /&gt;
* Tema 8: Deducción natural proposicional:&lt;br /&gt;
** [http://www.cs.us.es/~jalonso/cursos/li/temas/tema-2.pdf Tema 8a: Deducción natural proposicional].&lt;br /&gt;
** [[Tema 8b: Deducción natural proposicional con Isabelle/HOL]].&lt;br /&gt;
* Tema 9: Deducción natural de primer orden:&lt;br /&gt;
** [http://www.cs.us.es/~jalonso/cursos/li/temas/tema-8.pdf Tema 9a: Deducción natural en lógica de primer orden].&lt;br /&gt;
** [[Tema 9b: Deducción natural en lógica de primer orden con Isabelle/HOL]]&lt;br /&gt;
* [[Tema 10: Conjuntos, funciones y relaciones]].&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
* [[Tema 10: Conjuntos definidos inductivamente]].&lt;br /&gt;
* [[Tema 11: Gramáticas libre de contexto]].&lt;br /&gt;
* Tema 12: Misceláneas:&lt;br /&gt;
** [[Tema 12a: Razonamiento modular (Teoría de grupos)]].&lt;br /&gt;
** [[Tema 12b: Razonamiento modular]].&lt;br /&gt;
** [[Tema 12c: Automatización]].&lt;br /&gt;
** [[Tema 12d: Pasos elementales]].&lt;br /&gt;
** [[Tema 12e: Sudoku]].&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jalonso</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2016/index.php?title=Relaci%C3%B3n_9&amp;diff=1366</id>
		<title>Relación 9</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2016/index.php?title=Relaci%C3%B3n_9&amp;diff=1366"/>
		<updated>2017-01-26T05:52:25Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: Desprotegió «Relación 9»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
chapter {* R9: Deducción natural LPO en Isabelle/HOL *}&lt;br /&gt;
&lt;br /&gt;
theory R9_Deduccion_natural_LPO&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Demostrar o refutar los siguientes lemas usando sólo las reglas&lt;br /&gt;
  básicas de deducción natural de la lógica proposicional, de los&lt;br /&gt;
  cuantificadores 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;
&lt;br /&gt;
  · allI:       ⟦∀x. P x; P x ⟹ R⟧ ⟹ R&lt;br /&gt;
  · allE:       (⋀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⟧ ⟹ a: = 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;
&lt;br /&gt;
text {*&lt;br /&gt;
  Se usarán las reglas notnotI, mt y not_ex que demostramos a 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;
lemma no_ex: &amp;quot;¬(∃x. P(x)) ⟹ ∀x. ¬P(x)&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. Demostrar&lt;br /&gt;
       P a ⟶ (∃x. Q x) ⊢ ∃x. P a ⟶ Q x &lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_1: &lt;br /&gt;
  fixes P Q :: &amp;quot;&amp;#039;b ⇒ bool&amp;quot; &lt;br /&gt;
  assumes &amp;quot;P a ⟶ (∃x. Q x)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∃x. P a ⟶ Q x&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
(* migtermor ferrenseg juacabsou josgarsan *)&lt;br /&gt;
lemma ejercicio_1: &lt;br /&gt;
  fixes P Q :: &amp;quot;&amp;#039;b ⇒ bool&amp;quot; &lt;br /&gt;
  assumes &amp;quot;P a ⟶ (∃x. Q x)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∃x. P a ⟶ Q x&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
 { assume 1: &amp;quot;P a&amp;quot;&lt;br /&gt;
   have 2: &amp;quot;∃x. Q x&amp;quot; using assms 1 by (rule mp)} &lt;br /&gt;
 then obtain b where 3: &amp;quot;Q b&amp;quot; by (rule exE)          &lt;br /&gt;
   (* No sé por qué salta un aviso aquí. Aún así, sin esto no se&lt;br /&gt;
      finaliza correctamente la demostración, y con ello sí. *) &lt;br /&gt;
 then have 4: &amp;quot;(P a) ⟶ (Q b)&amp;quot; by (rule impI)&lt;br /&gt;
 then show 5: &amp;quot;∃x. P a ⟶ Q x&amp;quot; by (rule exI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* ivamenjim bowma *)&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_1_1:  &lt;br /&gt;
  assumes 1: &amp;quot;P a ⟶ (∃x. Q x)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∃x. P a ⟶ Q x&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
   {assume 2: &amp;quot;P a&amp;quot;&lt;br /&gt;
    have 3: &amp;quot;(∃x. Q x)&amp;quot; using 1 2 by (rule mp)&lt;br /&gt;
    obtain b where 4: &amp;quot;Q b&amp;quot; using 3 by (rule exE)&lt;br /&gt;
    then have 5: &amp;quot;P a ⟶ Q b&amp;quot; by (rule impI)&lt;br /&gt;
    then have 6: &amp;quot;∃x. P a ⟶ Q x&amp;quot; by (rule exI)}&lt;br /&gt;
   then show &amp;quot;∃x. P a ⟶ Q x&amp;quot; by simp&lt;br /&gt;
qed  &lt;br /&gt;
&lt;br /&gt;
(* crigomgom *)&lt;br /&gt;
lemma ejercicio_1_2: &lt;br /&gt;
  assumes 0: &amp;quot;P a ⟶ (∃x. Q x)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∃x. P a ⟶ Q x&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;¬(P a) ∨ P a&amp;quot; by (rule excluded_middle)&lt;br /&gt;
  then show &amp;quot;∃x. P a ⟶ Q x&amp;quot;&lt;br /&gt;
  proof (rule disjE)&lt;br /&gt;
    assume 1 : &amp;quot;¬(P a)&amp;quot;&lt;br /&gt;
    {assume 2 : &amp;quot;P a&amp;quot;&lt;br /&gt;
     have  &amp;quot;Q b&amp;quot; using 1 2 by (rule notE)}&lt;br /&gt;
     then have &amp;quot;P a ⟶ Q b&amp;quot; by (rule impI)&lt;br /&gt;
     then show &amp;quot;∃x. P a ⟶ Q x&amp;quot; by (rule exI)&lt;br /&gt;
  next&lt;br /&gt;
    assume 3 : &amp;quot;P a&amp;quot;&lt;br /&gt;
    have  &amp;quot;∃x. Q x&amp;quot; using 0 3 by (rule mp)&lt;br /&gt;
    then obtain b where &amp;quot;Q b&amp;quot;  by (rule exE)&lt;br /&gt;
    then have  &amp;quot;P a ⟶ Q b&amp;quot; by (rule impI)&lt;br /&gt;
    then show  &amp;quot;∃x. P a ⟶ Q x&amp;quot; by (rule exI)&lt;br /&gt;
  qed&lt;br /&gt;
qed &lt;br /&gt;
&lt;br /&gt;
(* fracorjim1 *)&lt;br /&gt;
(* Entre corchetes se demuestra que efectivamente existe un caso *)&lt;br /&gt;
lemma ejercicio_1_3: &lt;br /&gt;
  fixes P Q :: &amp;quot;&amp;#039;b ⇒ bool&amp;quot; &lt;br /&gt;
  assumes &amp;quot;P a ⟶ (∃x. Q x)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∃x. P a ⟶ Q x&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
	{	&lt;br /&gt;
		assume &amp;quot;P a&amp;quot;&lt;br /&gt;
		with assms have &amp;quot;∃x. Q x&amp;quot; by (rule mp)&lt;br /&gt;
		then obtain x where &amp;quot;Q x&amp;quot; by (rule exE)&lt;br /&gt;
		hence &amp;quot;P a ⟶ Q x&amp;quot; by (rule impI)&lt;br /&gt;
		hence &amp;quot;∃x. P a ⟶ Q x&amp;quot; by (rule exI) &lt;br /&gt;
	}&lt;br /&gt;
  thus ?thesis by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* Comentario: Usa simp *)&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Demostrar&lt;br /&gt;
       {∀x y z. R x y ∧ R y z ⟶ R x z, &lt;br /&gt;
        ∀x. ¬(R x x)}&lt;br /&gt;
       ⊢ ∀x y. R x y ⟶ ¬(R y x)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* migtermor ferrenseg ivamenjim marcarmor13 serrodcal juacabsou&lt;br /&gt;
   marpoldia1 crigomgom bowma josgarsan *) &lt;br /&gt;
lemma ejercicio_2: &lt;br /&gt;
  fixes R :: &amp;quot;&amp;#039;b ⇒ &amp;#039;b ⇒ bool&amp;quot; &lt;br /&gt;
  assumes 1: &amp;quot;∀x y z. R x y ∧ R y z ⟶ R x z&amp;quot;&lt;br /&gt;
  assumes 2: &amp;quot;∀x. ¬(R x x)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∀x y. R x y ⟶ ¬(R y x)&amp;quot;&lt;br /&gt;
proof (rule allI)&lt;br /&gt;
fix x&lt;br /&gt;
show &amp;quot;∀y. R x y ⟶ ¬(R y x)&amp;quot; &lt;br /&gt;
 proof (rule allI) &lt;br /&gt;
  fix y&lt;br /&gt;
  {assume 3: &amp;quot;R x y&amp;quot;&lt;br /&gt;
   {assume 4: &amp;quot;R y x&amp;quot;&lt;br /&gt;
    have 5: &amp;quot;R x y ∧ R y x&amp;quot; using 3 4 by (rule conjI)&lt;br /&gt;
    also have 6: &amp;quot;∀ z1 z2. R x z1 ∧ R z1 z2 ⟶ R x z2&amp;quot; using 1 by (rule allE)&lt;br /&gt;
    then have 7: &amp;quot;∀ z. R x y ∧ R y z ⟶ R x z&amp;quot; by (rule allE)&lt;br /&gt;
    then have 8: &amp;quot;R x y ∧ R y x ⟶ R x x&amp;quot; by (rule allE)&lt;br /&gt;
    then have 9: &amp;quot;R x x&amp;quot; using 5 by (rule mp)&lt;br /&gt;
    have 10: &amp;quot;¬(R x x)&amp;quot; using 2 by (rule allE)&lt;br /&gt;
    then have 11: &amp;quot;False&amp;quot; using 9 by (rule notE)}&lt;br /&gt;
  then have 12: &amp;quot;¬ (R y x)&amp;quot; by (rule notI)}&lt;br /&gt;
  thus &amp;quot;R x y ⟶ ¬(R y x)&amp;quot; by (rule impI)&lt;br /&gt;
 qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* ivamenjim *)&lt;br /&gt;
(* Semejante al anterior, pero indicando que se pruebe por la regla&lt;br /&gt;
  correspondiente *) &lt;br /&gt;
lemma ejercicio_2_1: &lt;br /&gt;
  assumes 1: &amp;quot;∀x y z. R x y ∧ R y z ⟶ R x z&amp;quot;&lt;br /&gt;
  assumes 2: &amp;quot;∀x. ¬(R x x)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∀x y. R x y ⟶ ¬(R y x)&amp;quot;&lt;br /&gt;
proof (rule allI)&lt;br /&gt;
fix x&lt;br /&gt;
show &amp;quot;∀y. R x y ⟶ ¬(R y x)&amp;quot; &lt;br /&gt;
 proof (rule allI) &lt;br /&gt;
  fix y&lt;br /&gt;
  {assume 3: &amp;quot;R x y&amp;quot;&lt;br /&gt;
   {assume 4: &amp;quot;R y x&amp;quot;&lt;br /&gt;
    have 5: &amp;quot;R x y ∧ R y x&amp;quot; using 3 4 ..&lt;br /&gt;
    have 6: &amp;quot;∀ y z. R x y ∧ R y z ⟶ R x z&amp;quot; using 1 ..&lt;br /&gt;
    then have 7: &amp;quot;∀ z. R x y ∧ R y z ⟶ R x z&amp;quot; ..&lt;br /&gt;
    then have 8: &amp;quot;R x y ∧ R y x ⟶ R x x&amp;quot; ..&lt;br /&gt;
    then have 9: &amp;quot;R x x&amp;quot; using 5 ..&lt;br /&gt;
    have 10: &amp;quot;¬(R x x)&amp;quot; using 2 ..&lt;br /&gt;
    then have 11: &amp;quot;False&amp;quot; using 9 ..}&lt;br /&gt;
  then have 12: &amp;quot;¬ (R y x)&amp;quot; ..}&lt;br /&gt;
  thus &amp;quot;R x y ⟶ ¬(R y x)&amp;quot; ..&lt;br /&gt;
 qed&lt;br /&gt;
qed &lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. Demostrar o refutar&lt;br /&gt;
       (∀x. ∃y. P x y) ⟶ (∃y. ∀x. P x y)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* ivamenjim ferrenseg paupeddeg serrodcal juacabsou marpoldia1&lt;br /&gt;
   crigomgom bowma josgarsan *) &lt;br /&gt;
lemma ejercicio_3: &lt;br /&gt;
  assumes &amp;quot;(∀x. ∃y. P x y)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;(∃y. ∀x. P x y)&amp;quot;&lt;br /&gt;
  quickcheck&lt;br /&gt;
oops  &lt;br /&gt;
&lt;br /&gt;
(* Y se encuentra el contraejemplo: P = (λx. undefined)(a1 := {a2}, a2 := {a1}) *)&lt;br /&gt;
&lt;br /&gt;
(* migtermor *)&lt;br /&gt;
fun P :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;P x y = (x=y)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio3:&lt;br /&gt;
 &amp;quot;(∀x. ∃y. P x y) ⟶ (∃y. ∀x. P x y)&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
(* dancorgar *)&lt;br /&gt;
lemma ejercicio_3_3:&lt;br /&gt;
  shows   &amp;quot;(∀x. ∃y. P x y) ⟶ (∃y. ∀x. P x y)&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Demostrar o refutar&lt;br /&gt;
     {∀x. P a x x, &lt;br /&gt;
      ∀x y z. P x y z ⟶ P (f x) y (f z)⟧&lt;br /&gt;
     ⊢ ∃z. P (f a) z (f (f a))&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* ferrenseg ivamenjim *)&lt;br /&gt;
lemma ejercicio_4:&lt;br /&gt;
  fixes P :: &amp;quot;&amp;#039;b ⇒ &amp;#039;b ⇒ &amp;#039;b ⇒ bool&amp;quot; &lt;br /&gt;
  assumes 1: &amp;quot;∀x. P a x x&amp;quot; and &lt;br /&gt;
          2: &amp;quot;∀x y z. P x y z ⟶ P (f x) y (f z)&amp;quot;&lt;br /&gt;
  shows &amp;quot;∃z. P (f a) z (f (f a))&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have 4:&amp;quot;P a (f a) (f a)&amp;quot; using 1 ..&lt;br /&gt;
  also have 5:&amp;quot;∀y z. P a y z ⟶ P (f a) y (f z)&amp;quot; using 2 ..&lt;br /&gt;
  then have 6:&amp;quot;∀z. P a (f a) z ⟶ P (f a) (f a) (f z)&amp;quot; ..&lt;br /&gt;
  then have 7:&amp;quot;P a (f a) (f a) ⟶ P (f a) (f a) (f (f a))&amp;quot; ..&lt;br /&gt;
  also have 8:&amp;quot;P (f a) (f a) (f (f a))&amp;quot; using 7 4 by (rule mp)&lt;br /&gt;
  then show &amp;quot;∃z. P (f a) z (f (f a))&amp;quot; ..&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* migtermor serrodcal crigomgom*)&lt;br /&gt;
lemma ejercicio_4_2: &lt;br /&gt;
  fixes P :: &amp;quot;&amp;#039;b ⇒ &amp;#039;b ⇒ &amp;#039;b ⇒ bool&amp;quot; &lt;br /&gt;
  assumes 1: &amp;quot;∀x. P a x x&amp;quot;&lt;br /&gt;
  assumes 2: &amp;quot;∀x y z.  P x y z ⟶ P (f x) y (f z)&amp;quot;&lt;br /&gt;
  shows   &amp;quot; ∃z. P (f a) z (f (f a))&amp;quot;&lt;br /&gt;
proof (rule exI)&lt;br /&gt;
 have 3: &amp;quot;P a (f a) (f a)&amp;quot; using 1 by (rule allE)&lt;br /&gt;
 have 4: &amp;quot;∀y z.  P a y z ⟶ P (f a) y (f z)&amp;quot; using 2 by (rule allE)&lt;br /&gt;
 then have 5: &amp;quot;∀z.  P a (f a) z ⟶ P (f a) (f a) (f z)&amp;quot; by (rule allE)&lt;br /&gt;
 then have 6: &amp;quot;P a (f a) (f a) ⟶ P (f a) (f a) (f (f a))&amp;quot; by (rule allE)&lt;br /&gt;
 then show &amp;quot;P (f a) (f a) (f (f a))&amp;quot; using 3 by (rule mp)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* paupeddeg juacabsou marpoldia1 bowma *)&lt;br /&gt;
lemma ejercicio_4_3:&lt;br /&gt;
  fixes P :: &amp;quot;&amp;#039;b ⇒ &amp;#039;b ⇒ &amp;#039;b ⇒ bool&amp;quot; &lt;br /&gt;
  assumes &amp;quot; ∀x. P a x x &amp;quot; &lt;br /&gt;
          &amp;quot; ∀x y z. P x y z ⟶ P (f x) y (f z)&amp;quot;&lt;br /&gt;
  shows &amp;quot;∃z. P (f a) z (f (f a))&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  have &amp;quot;∀ y z. P a y z ⟶ P (f a) y (f z)&amp;quot; using assms(2) by (rule allE)&lt;br /&gt;
  hence &amp;quot;∀z. P a (f a) z ⟶ P (f a) (f a) (f z)&amp;quot;  by (rule allE)&lt;br /&gt;
  hence &amp;quot;P a (f a) (f a) ⟶ P (f a) (f a) (f (f a))&amp;quot;  by (rule allE)&lt;br /&gt;
  have &amp;quot;P a (f a) (f a)&amp;quot; using assms(1) by (rule allE)&lt;br /&gt;
  show &amp;quot;P (f a) (f a) (f (f a))&amp;quot; &lt;br /&gt;
    using `P a (f a) (f a) ⟶ P (f a) (f a) (f (f a))` `P a (f a) (f a)`  &lt;br /&gt;
    by (rule mp)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. Demostrar o refutar&lt;br /&gt;
     {∀y. Q a y, &lt;br /&gt;
      ∀x y. Q x y ⟶ Q (s x) (s y)} &lt;br /&gt;
     ⊢ ∃z. Qa z ∧ Q z (s (s a))&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* ferrenseg ivamenjim *)&lt;br /&gt;
lemma ejercicio_5:&lt;br /&gt;
  assumes 1: &amp;quot;∀y. Q a y&amp;quot; and &lt;br /&gt;
          2: &amp;quot;∀x y. Q x y ⟶ Q (s x) (s y)&amp;quot;&lt;br /&gt;
  shows &amp;quot;∃z. Q a z ∧ Q z (s (s a))&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  have 3:&amp;quot;Q a (s a)&amp;quot; using 1 ..&lt;br /&gt;
  also have 4:&amp;quot;∀y. Q a y ⟶ Q (s a) (s y)&amp;quot; using 2 ..&lt;br /&gt;
  then have 5:&amp;quot;Q a (s a) ⟶ Q (s a) (s (s a))&amp;quot; ..&lt;br /&gt;
  then have 6:&amp;quot;Q (s a) (s (s a))&amp;quot; using 3 by (rule mp)&lt;br /&gt;
  show &amp;quot;Q a (s a) ∧ Q (s a) (s (s a))&amp;quot; using 3 6 by (rule conjI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* migtermor *)&lt;br /&gt;
lemma ejercicio_5_2: &lt;br /&gt;
  fixes P :: &amp;quot;&amp;#039;b ⇒ &amp;#039;b ⇒ bool&amp;quot; &lt;br /&gt;
  assumes 1: &amp;quot;∀y. Q a y&amp;quot;&lt;br /&gt;
  assumes 2: &amp;quot;∀x y. Q x y ⟶ Q (s x) (s y)&amp;quot;&lt;br /&gt;
  shows   &amp;quot; ∃z. Q a z ∧ Q z (s (s a))&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
 have 3: &amp;quot;Q a (s a)&amp;quot; using 1 by (rule allE)&lt;br /&gt;
 have 4: &amp;quot;∀y. Q a y ⟶ Q (s a) (s y)&amp;quot; using 2 by (rule allE)&lt;br /&gt;
 then have 5: &amp;quot;Q a (s a) ⟶ Q (s a) (s (s a))&amp;quot; by (rule allE)&lt;br /&gt;
 then have 6: &amp;quot;Q (s a) (s (s a))&amp;quot; using 3 by (rule mp)&lt;br /&gt;
 have &amp;quot;Q a (s a) ∧ Q (s a) (s (s a))&amp;quot; using 3 6 by (rule conjI)&lt;br /&gt;
 then show &amp;quot;∃z. Q a z ∧ Q z (s (s a))&amp;quot; by (rule exI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* paupeddeg serrodcal juacabsou marpoldia1 crigomgom bowma *)&lt;br /&gt;
lemma ejercicio_5_3:&lt;br /&gt;
  assumes &amp;quot;∀y. Q a y&amp;quot; &lt;br /&gt;
          &amp;quot;∀x y. Q x y ⟶ Q (s x) (s y)&amp;quot;&lt;br /&gt;
  shows &amp;quot;∃z. Q a z ∧ Q z (s (s a))&amp;quot;&lt;br /&gt;
proof &lt;br /&gt;
 have &amp;quot;∀y. Q a y ⟶ Q (s a) (s y)&amp;quot; using assms(2) by (rule allE)&lt;br /&gt;
 hence &amp;quot;Q a (s a) ⟶ Q (s a) (s (s a))&amp;quot; by (rule allE)&lt;br /&gt;
 have &amp;quot;Q a (s a)&amp;quot; using assms(1) by (rule allE)&lt;br /&gt;
 have &amp;quot;Q (s a) (s (s a))&amp;quot; using `Q a (s a) ⟶ Q (s a) (s (s a))` `Q a (s a)` by (rule mp)&lt;br /&gt;
 show &amp;quot;Q a (s a) ∧ Q (s a) (s (s a))&amp;quot; &lt;br /&gt;
   using `Q a (s a)` `Q (s a) (s (s a))` by (rule conjI)&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>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2016/index.php?title=Relaci%C3%B3n_9&amp;diff=1365</id>
		<title>Relación 9</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2016/index.php?title=Relaci%C3%B3n_9&amp;diff=1365"/>
		<updated>2017-01-25T19:21:55Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
chapter {* R9: Deducción natural LPO en Isabelle/HOL *}&lt;br /&gt;
&lt;br /&gt;
theory R9_Deduccion_natural_LPO&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Demostrar o refutar los siguientes lemas usando sólo las reglas&lt;br /&gt;
  básicas de deducción natural de la lógica proposicional, de los&lt;br /&gt;
  cuantificadores 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;
&lt;br /&gt;
  · allI:       ⟦∀x. P x; P x ⟹ R⟧ ⟹ R&lt;br /&gt;
  · allE:       (⋀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⟧ ⟹ a: = 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;
&lt;br /&gt;
text {*&lt;br /&gt;
  Se usarán las reglas notnotI, mt y not_ex que demostramos a 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;
lemma no_ex: &amp;quot;¬(∃x. P(x)) ⟹ ∀x. ¬P(x)&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. Demostrar&lt;br /&gt;
       P a ⟶ (∃x. Q x) ⊢ ∃x. P a ⟶ Q x &lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_1: &lt;br /&gt;
  fixes P Q :: &amp;quot;&amp;#039;b ⇒ bool&amp;quot; &lt;br /&gt;
  assumes &amp;quot;P a ⟶ (∃x. Q x)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∃x. P a ⟶ Q x&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
(* migtermor ferrenseg juacabsou josgarsan *)&lt;br /&gt;
lemma ejercicio_1: &lt;br /&gt;
  fixes P Q :: &amp;quot;&amp;#039;b ⇒ bool&amp;quot; &lt;br /&gt;
  assumes &amp;quot;P a ⟶ (∃x. Q x)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∃x. P a ⟶ Q x&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
 { assume 1: &amp;quot;P a&amp;quot;&lt;br /&gt;
   have 2: &amp;quot;∃x. Q x&amp;quot; using assms 1 by (rule mp)} &lt;br /&gt;
 then obtain b where 3: &amp;quot;Q b&amp;quot; by (rule exE)          &lt;br /&gt;
   (* No sé por qué salta un aviso aquí. Aún así, sin esto no se&lt;br /&gt;
      finaliza correctamente la demostración, y con ello sí. *) &lt;br /&gt;
 then have 4: &amp;quot;(P a) ⟶ (Q b)&amp;quot; by (rule impI)&lt;br /&gt;
 then show 5: &amp;quot;∃x. P a ⟶ Q x&amp;quot; by (rule exI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* ivamenjim bowma *)&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_1_1:  &lt;br /&gt;
  assumes 1: &amp;quot;P a ⟶ (∃x. Q x)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∃x. P a ⟶ Q x&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
   {assume 2: &amp;quot;P a&amp;quot;&lt;br /&gt;
    have 3: &amp;quot;(∃x. Q x)&amp;quot; using 1 2 by (rule mp)&lt;br /&gt;
    obtain b where 4: &amp;quot;Q b&amp;quot; using 3 by (rule exE)&lt;br /&gt;
    then have 5: &amp;quot;P a ⟶ Q b&amp;quot; by (rule impI)&lt;br /&gt;
    then have 6: &amp;quot;∃x. P a ⟶ Q x&amp;quot; by (rule exI)}&lt;br /&gt;
   then show &amp;quot;∃x. P a ⟶ Q x&amp;quot; by simp&lt;br /&gt;
qed  &lt;br /&gt;
&lt;br /&gt;
(* crigomgom *)&lt;br /&gt;
lemma ejercicio_1_2: &lt;br /&gt;
  assumes 0: &amp;quot;P a ⟶ (∃x. Q x)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∃x. P a ⟶ Q x&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;¬(P a) ∨ P a&amp;quot; by (rule excluded_middle)&lt;br /&gt;
  then show &amp;quot;∃x. P a ⟶ Q x&amp;quot;&lt;br /&gt;
  proof (rule disjE)&lt;br /&gt;
    assume 1 : &amp;quot;¬(P a)&amp;quot;&lt;br /&gt;
    {assume 2 : &amp;quot;P a&amp;quot;&lt;br /&gt;
     have  &amp;quot;Q b&amp;quot; using 1 2 by (rule notE)}&lt;br /&gt;
     then have &amp;quot;P a ⟶ Q b&amp;quot; by (rule impI)&lt;br /&gt;
     then show &amp;quot;∃x. P a ⟶ Q x&amp;quot; by (rule exI)&lt;br /&gt;
  next&lt;br /&gt;
    assume 3 : &amp;quot;P a&amp;quot;&lt;br /&gt;
    have  &amp;quot;∃x. Q x&amp;quot; using 0 3 by (rule mp)&lt;br /&gt;
    then obtain b where &amp;quot;Q b&amp;quot;  by (rule exE)&lt;br /&gt;
    then have  &amp;quot;P a ⟶ Q b&amp;quot; by (rule impI)&lt;br /&gt;
    then show  &amp;quot;∃x. P a ⟶ Q x&amp;quot; by (rule exI)&lt;br /&gt;
  qed&lt;br /&gt;
qed &lt;br /&gt;
&lt;br /&gt;
(* fracorjim1 *)&lt;br /&gt;
(* Entre corchetes se demuestra que efectivamente existe un caso *)&lt;br /&gt;
lemma ejercicio_1_3: &lt;br /&gt;
  fixes P Q :: &amp;quot;&amp;#039;b ⇒ bool&amp;quot; &lt;br /&gt;
  assumes &amp;quot;P a ⟶ (∃x. Q x)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∃x. P a ⟶ Q x&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
	{	&lt;br /&gt;
		assume &amp;quot;P a&amp;quot;&lt;br /&gt;
		with assms have &amp;quot;∃x. Q x&amp;quot; by (rule mp)&lt;br /&gt;
		then obtain x where &amp;quot;Q x&amp;quot; by (rule exE)&lt;br /&gt;
		hence &amp;quot;P a ⟶ Q x&amp;quot; by (rule impI)&lt;br /&gt;
		hence &amp;quot;∃x. P a ⟶ Q x&amp;quot; by (rule exI) &lt;br /&gt;
	}&lt;br /&gt;
  thus ?thesis by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* Comentario: Usa simp *)&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Demostrar&lt;br /&gt;
       {∀x y z. R x y ∧ R y z ⟶ R x z, &lt;br /&gt;
        ∀x. ¬(R x x)}&lt;br /&gt;
       ⊢ ∀x y. R x y ⟶ ¬(R y x)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* migtermor ferrenseg ivamenjim marcarmor13 serrodcal juacabsou&lt;br /&gt;
   marpoldia1 crigomgom bowma josgarsan *) &lt;br /&gt;
lemma ejercicio_2: &lt;br /&gt;
  fixes R :: &amp;quot;&amp;#039;b ⇒ &amp;#039;b ⇒ bool&amp;quot; &lt;br /&gt;
  assumes 1: &amp;quot;∀x y z. R x y ∧ R y z ⟶ R x z&amp;quot;&lt;br /&gt;
  assumes 2: &amp;quot;∀x. ¬(R x x)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∀x y. R x y ⟶ ¬(R y x)&amp;quot;&lt;br /&gt;
proof (rule allI)&lt;br /&gt;
fix x&lt;br /&gt;
show &amp;quot;∀y. R x y ⟶ ¬(R y x)&amp;quot; &lt;br /&gt;
 proof (rule allI) &lt;br /&gt;
  fix y&lt;br /&gt;
  {assume 3: &amp;quot;R x y&amp;quot;&lt;br /&gt;
   {assume 4: &amp;quot;R y x&amp;quot;&lt;br /&gt;
    have 5: &amp;quot;R x y ∧ R y x&amp;quot; using 3 4 by (rule conjI)&lt;br /&gt;
    also have 6: &amp;quot;∀ z1 z2. R x z1 ∧ R z1 z2 ⟶ R x z2&amp;quot; using 1 by (rule allE)&lt;br /&gt;
    then have 7: &amp;quot;∀ z. R x y ∧ R y z ⟶ R x z&amp;quot; by (rule allE)&lt;br /&gt;
    then have 8: &amp;quot;R x y ∧ R y x ⟶ R x x&amp;quot; by (rule allE)&lt;br /&gt;
    then have 9: &amp;quot;R x x&amp;quot; using 5 by (rule mp)&lt;br /&gt;
    have 10: &amp;quot;¬(R x x)&amp;quot; using 2 by (rule allE)&lt;br /&gt;
    then have 11: &amp;quot;False&amp;quot; using 9 by (rule notE)}&lt;br /&gt;
  then have 12: &amp;quot;¬ (R y x)&amp;quot; by (rule notI)}&lt;br /&gt;
  thus &amp;quot;R x y ⟶ ¬(R y x)&amp;quot; by (rule impI)&lt;br /&gt;
 qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* ivamenjim *)&lt;br /&gt;
(* Semejante al anterior, pero indicando que se pruebe por la regla&lt;br /&gt;
  correspondiente *) &lt;br /&gt;
lemma ejercicio_2_1: &lt;br /&gt;
  assumes 1: &amp;quot;∀x y z. R x y ∧ R y z ⟶ R x z&amp;quot;&lt;br /&gt;
  assumes 2: &amp;quot;∀x. ¬(R x x)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∀x y. R x y ⟶ ¬(R y x)&amp;quot;&lt;br /&gt;
proof (rule allI)&lt;br /&gt;
fix x&lt;br /&gt;
show &amp;quot;∀y. R x y ⟶ ¬(R y x)&amp;quot; &lt;br /&gt;
 proof (rule allI) &lt;br /&gt;
  fix y&lt;br /&gt;
  {assume 3: &amp;quot;R x y&amp;quot;&lt;br /&gt;
   {assume 4: &amp;quot;R y x&amp;quot;&lt;br /&gt;
    have 5: &amp;quot;R x y ∧ R y x&amp;quot; using 3 4 ..&lt;br /&gt;
    have 6: &amp;quot;∀ y z. R x y ∧ R y z ⟶ R x z&amp;quot; using 1 ..&lt;br /&gt;
    then have 7: &amp;quot;∀ z. R x y ∧ R y z ⟶ R x z&amp;quot; ..&lt;br /&gt;
    then have 8: &amp;quot;R x y ∧ R y x ⟶ R x x&amp;quot; ..&lt;br /&gt;
    then have 9: &amp;quot;R x x&amp;quot; using 5 ..&lt;br /&gt;
    have 10: &amp;quot;¬(R x x)&amp;quot; using 2 ..&lt;br /&gt;
    then have 11: &amp;quot;False&amp;quot; using 9 ..}&lt;br /&gt;
  then have 12: &amp;quot;¬ (R y x)&amp;quot; ..}&lt;br /&gt;
  thus &amp;quot;R x y ⟶ ¬(R y x)&amp;quot; ..&lt;br /&gt;
 qed&lt;br /&gt;
qed &lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. Demostrar o refutar&lt;br /&gt;
       (∀x. ∃y. P x y) ⟶ (∃y. ∀x. P x y)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* ivamenjim ferrenseg paupeddeg serrodcal juacabsou marpoldia1&lt;br /&gt;
   crigomgom bowma josgarsan *) &lt;br /&gt;
lemma ejercicio_3: &lt;br /&gt;
  assumes &amp;quot;(∀x. ∃y. P x y)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;(∃y. ∀x. P x y)&amp;quot;&lt;br /&gt;
  quickcheck&lt;br /&gt;
oops  &lt;br /&gt;
&lt;br /&gt;
(* Y se encuentra el contraejemplo: P = (λx. undefined)(a1 := {a2}, a2 := {a1}) *)&lt;br /&gt;
&lt;br /&gt;
(* migtermor *)&lt;br /&gt;
fun P :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;P x y = (x=y)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio3:&lt;br /&gt;
 &amp;quot;(∀x. ∃y. P x y) ⟶ (∃y. ∀x. P x y)&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
(* dancorgar *)&lt;br /&gt;
lemma ejercicio_3_3:&lt;br /&gt;
  shows   &amp;quot;(∀x. ∃y. P x y) ⟶ (∃y. ∀x. P x y)&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Demostrar o refutar&lt;br /&gt;
     {∀x. P a x x, &lt;br /&gt;
      ∀x y z. P x y z ⟶ P (f x) y (f z)⟧&lt;br /&gt;
     ⊢ ∃z. P (f a) z (f (f a))&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* ferrenseg ivamenjim *)&lt;br /&gt;
lemma ejercicio_4:&lt;br /&gt;
  fixes P :: &amp;quot;&amp;#039;b ⇒ &amp;#039;b ⇒ &amp;#039;b ⇒ bool&amp;quot; &lt;br /&gt;
  assumes 1: &amp;quot;∀x. P a x x&amp;quot; and &lt;br /&gt;
          2: &amp;quot;∀x y z. P x y z ⟶ P (f x) y (f z)&amp;quot;&lt;br /&gt;
  shows &amp;quot;∃z. P (f a) z (f (f a))&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have 4:&amp;quot;P a (f a) (f a)&amp;quot; using 1 ..&lt;br /&gt;
  also have 5:&amp;quot;∀y z. P a y z ⟶ P (f a) y (f z)&amp;quot; using 2 ..&lt;br /&gt;
  then have 6:&amp;quot;∀z. P a (f a) z ⟶ P (f a) (f a) (f z)&amp;quot; ..&lt;br /&gt;
  then have 7:&amp;quot;P a (f a) (f a) ⟶ P (f a) (f a) (f (f a))&amp;quot; ..&lt;br /&gt;
  also have 8:&amp;quot;P (f a) (f a) (f (f a))&amp;quot; using 7 4 by (rule mp)&lt;br /&gt;
  then show &amp;quot;∃z. P (f a) z (f (f a))&amp;quot; ..&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* migtermor serrodcal crigomgom*)&lt;br /&gt;
lemma ejercicio_4_2: &lt;br /&gt;
  fixes P :: &amp;quot;&amp;#039;b ⇒ &amp;#039;b ⇒ &amp;#039;b ⇒ bool&amp;quot; &lt;br /&gt;
  assumes 1: &amp;quot;∀x. P a x x&amp;quot;&lt;br /&gt;
  assumes 2: &amp;quot;∀x y z.  P x y z ⟶ P (f x) y (f z)&amp;quot;&lt;br /&gt;
  shows   &amp;quot; ∃z. P (f a) z (f (f a))&amp;quot;&lt;br /&gt;
proof (rule exI)&lt;br /&gt;
 have 3: &amp;quot;P a (f a) (f a)&amp;quot; using 1 by (rule allE)&lt;br /&gt;
 have 4: &amp;quot;∀y z.  P a y z ⟶ P (f a) y (f z)&amp;quot; using 2 by (rule allE)&lt;br /&gt;
 then have 5: &amp;quot;∀z.  P a (f a) z ⟶ P (f a) (f a) (f z)&amp;quot; by (rule allE)&lt;br /&gt;
 then have 6: &amp;quot;P a (f a) (f a) ⟶ P (f a) (f a) (f (f a))&amp;quot; by (rule allE)&lt;br /&gt;
 then show &amp;quot;P (f a) (f a) (f (f a))&amp;quot; using 3 by (rule mp)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* paupeddeg juacabsou marpoldia1 bowma *)&lt;br /&gt;
lemma ejercicio_4_3:&lt;br /&gt;
  fixes P :: &amp;quot;&amp;#039;b ⇒ &amp;#039;b ⇒ &amp;#039;b ⇒ bool&amp;quot; &lt;br /&gt;
  assumes &amp;quot; ∀x. P a x x &amp;quot; &lt;br /&gt;
          &amp;quot; ∀x y z. P x y z ⟶ P (f x) y (f z)&amp;quot;&lt;br /&gt;
  shows &amp;quot;∃z. P (f a) z (f (f a))&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  have &amp;quot;∀ y z. P a y z ⟶ P (f a) y (f z)&amp;quot; using assms(2) by (rule allE)&lt;br /&gt;
  hence &amp;quot;∀z. P a (f a) z ⟶ P (f a) (f a) (f z)&amp;quot;  by (rule allE)&lt;br /&gt;
  hence &amp;quot;P a (f a) (f a) ⟶ P (f a) (f a) (f (f a))&amp;quot;  by (rule allE)&lt;br /&gt;
  have &amp;quot;P a (f a) (f a)&amp;quot; using assms(1) by (rule allE)&lt;br /&gt;
  show &amp;quot;P (f a) (f a) (f (f a))&amp;quot; &lt;br /&gt;
    using `P a (f a) (f a) ⟶ P (f a) (f a) (f (f a))` `P a (f a) (f a)`  &lt;br /&gt;
    by (rule mp)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. Demostrar o refutar&lt;br /&gt;
     {∀y. Q a y, &lt;br /&gt;
      ∀x y. Q x y ⟶ Q (s x) (s y)} &lt;br /&gt;
     ⊢ ∃z. Qa z ∧ Q z (s (s a))&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* ferrenseg ivamenjim *)&lt;br /&gt;
lemma ejercicio_5:&lt;br /&gt;
  assumes 1: &amp;quot;∀y. Q a y&amp;quot; and &lt;br /&gt;
          2: &amp;quot;∀x y. Q x y ⟶ Q (s x) (s y)&amp;quot;&lt;br /&gt;
  shows &amp;quot;∃z. Q a z ∧ Q z (s (s a))&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  have 3:&amp;quot;Q a (s a)&amp;quot; using 1 ..&lt;br /&gt;
  also have 4:&amp;quot;∀y. Q a y ⟶ Q (s a) (s y)&amp;quot; using 2 ..&lt;br /&gt;
  then have 5:&amp;quot;Q a (s a) ⟶ Q (s a) (s (s a))&amp;quot; ..&lt;br /&gt;
  then have 6:&amp;quot;Q (s a) (s (s a))&amp;quot; using 3 by (rule mp)&lt;br /&gt;
  show &amp;quot;Q a (s a) ∧ Q (s a) (s (s a))&amp;quot; using 3 6 by (rule conjI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* migtermor *)&lt;br /&gt;
lemma ejercicio_5_2: &lt;br /&gt;
  fixes P :: &amp;quot;&amp;#039;b ⇒ &amp;#039;b ⇒ bool&amp;quot; &lt;br /&gt;
  assumes 1: &amp;quot;∀y. Q a y&amp;quot;&lt;br /&gt;
  assumes 2: &amp;quot;∀x y. Q x y ⟶ Q (s x) (s y)&amp;quot;&lt;br /&gt;
  shows   &amp;quot; ∃z. Q a z ∧ Q z (s (s a))&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
 have 3: &amp;quot;Q a (s a)&amp;quot; using 1 by (rule allE)&lt;br /&gt;
 have 4: &amp;quot;∀y. Q a y ⟶ Q (s a) (s y)&amp;quot; using 2 by (rule allE)&lt;br /&gt;
 then have 5: &amp;quot;Q a (s a) ⟶ Q (s a) (s (s a))&amp;quot; by (rule allE)&lt;br /&gt;
 then have 6: &amp;quot;Q (s a) (s (s a))&amp;quot; using 3 by (rule mp)&lt;br /&gt;
 have &amp;quot;Q a (s a) ∧ Q (s a) (s (s a))&amp;quot; using 3 6 by (rule conjI)&lt;br /&gt;
 then show &amp;quot;∃z. Q a z ∧ Q z (s (s a))&amp;quot; by (rule exI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* paupeddeg serrodcal juacabsou marpoldia1 crigomgom bowma *)&lt;br /&gt;
lemma ejercicio_5_3:&lt;br /&gt;
  assumes &amp;quot;∀y. Q a y&amp;quot; &lt;br /&gt;
          &amp;quot;∀x y. Q x y ⟶ Q (s x) (s y)&amp;quot;&lt;br /&gt;
  shows &amp;quot;∃z. Q a z ∧ Q z (s (s a))&amp;quot;&lt;br /&gt;
proof &lt;br /&gt;
 have &amp;quot;∀y. Q a y ⟶ Q (s a) (s y)&amp;quot; using assms(2) by (rule allE)&lt;br /&gt;
 hence &amp;quot;Q a (s a) ⟶ Q (s a) (s (s a))&amp;quot; by (rule allE)&lt;br /&gt;
 have &amp;quot;Q a (s a)&amp;quot; using assms(1) by (rule allE)&lt;br /&gt;
 have &amp;quot;Q (s a) (s (s a))&amp;quot; using `Q a (s a) ⟶ Q (s a) (s (s a))` `Q a (s a)` by (rule mp)&lt;br /&gt;
 show &amp;quot;Q a (s a) ∧ Q (s a) (s (s a))&amp;quot; &lt;br /&gt;
   using `Q a (s a)` `Q (s a) (s (s a))` by (rule conjI)&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>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2016/index.php?title=Relaci%C3%B3n_9&amp;diff=1364</id>
		<title>Relación 9</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2016/index.php?title=Relaci%C3%B3n_9&amp;diff=1364"/>
		<updated>2017-01-25T19:02:47Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: Protegió «Relación 9» ([edit=sysop] (indefinido) [move=sysop] (indefinido))&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
chapter {* R9: Deducción natural LPO en Isabelle/HOL *}&lt;br /&gt;
&lt;br /&gt;
theory R9_Deduccion_natural_LPO&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Demostrar o refutar los siguientes lemas usando sólo las reglas&lt;br /&gt;
  básicas de deducción natural de la lógica proposicional, de los&lt;br /&gt;
  cuantificadores 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;
&lt;br /&gt;
  · allI:       ⟦∀x. P x; P x ⟹ R⟧ ⟹ R&lt;br /&gt;
  · allE:       (⋀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⟧ ⟹ a: = 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;
&lt;br /&gt;
text {*&lt;br /&gt;
  Se usarán las reglas notnotI, mt y not_ex que demostramos a 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;
lemma no_ex: &amp;quot;¬(∃x. P(x)) ⟹ ∀x. ¬P(x)&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. Demostrar&lt;br /&gt;
       P a ⟶ (∃x. Q x) ⊢ ∃x. P a ⟶ Q x &lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_1: &lt;br /&gt;
  fixes P Q :: &amp;quot;&amp;#039;b ⇒ bool&amp;quot; &lt;br /&gt;
  assumes &amp;quot;P a ⟶ (∃x. Q x)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∃x. P a ⟶ Q x&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
(* migtermor ferrenseg juacabsou josgarsan*)&lt;br /&gt;
lemma ejercicio_1: &lt;br /&gt;
  fixes P Q :: &amp;quot;&amp;#039;b ⇒ bool&amp;quot; &lt;br /&gt;
  assumes &amp;quot;P a ⟶ (∃x. Q x)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∃x. P a ⟶ Q x&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
 {assume 1: &amp;quot;P a&amp;quot;&lt;br /&gt;
 have 2: &amp;quot;∃x. Q x&amp;quot; using assms 1 by (rule mp)}&lt;br /&gt;
 then obtain b where 3: &amp;quot;Q b&amp;quot; by (rule exE)          &lt;br /&gt;
(* No sé por qué salta un aviso aquí. Aún así, sin esto no se finaliza correctamente la demostración, y con ello sí. *)&lt;br /&gt;
 then have 4: &amp;quot;(P a) ⟶ (Q b)&amp;quot; by (rule impI)&lt;br /&gt;
 then show 5: &amp;quot;∃x. P a ⟶ Q x&amp;quot; by (rule exI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* ivamenjim bowma *)&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_1_1:  &lt;br /&gt;
  assumes 1: &amp;quot;P a ⟶ (∃x. Q x)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∃x. P a ⟶ Q x&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
   {assume 2: &amp;quot;P a&amp;quot;&lt;br /&gt;
   have 3: &amp;quot;(∃x. Q x)&amp;quot; using 1 2 by (rule mp)&lt;br /&gt;
   obtain b where 4: &amp;quot;Q b&amp;quot; using 3 by (rule exE)&lt;br /&gt;
   then have 5: &amp;quot;P a ⟶ Q b&amp;quot; by (rule impI)&lt;br /&gt;
   then have 6: &amp;quot;∃x. P a ⟶ Q x&amp;quot; by (rule exI)}&lt;br /&gt;
   then show &amp;quot;∃x. P a ⟶ Q x&amp;quot; by simp&lt;br /&gt;
qed  &lt;br /&gt;
&lt;br /&gt;
(* crigomgom *)&lt;br /&gt;
lemma ejercicio_1_2: &lt;br /&gt;
  assumes 0: &amp;quot;P a ⟶ (∃x. Q x)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∃x. P a ⟶ Q x&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;¬(P a) ∨ P a&amp;quot; by (rule excluded_middle)&lt;br /&gt;
  then show &amp;quot;∃x. P a ⟶ Q x&amp;quot;&lt;br /&gt;
  proof (rule disjE)&lt;br /&gt;
    assume 1 : &amp;quot;¬(P a)&amp;quot;&lt;br /&gt;
    {assume 2 : &amp;quot;P a&amp;quot;&lt;br /&gt;
     have  &amp;quot;Q b&amp;quot; using 1 2 by (rule notE)}&lt;br /&gt;
     then have &amp;quot;P a ⟶ Q b&amp;quot; by (rule impI)&lt;br /&gt;
     then show &amp;quot;∃x. P a ⟶ Q x&amp;quot; by (rule exI)&lt;br /&gt;
  next&lt;br /&gt;
    assume 3 : &amp;quot;P a&amp;quot;&lt;br /&gt;
    have  &amp;quot;∃x. Q x&amp;quot; using 0 3 by (rule mp)&lt;br /&gt;
    then obtain b where &amp;quot;Q b&amp;quot;  by (rule exE)&lt;br /&gt;
    then have  &amp;quot;P a ⟶ Q b&amp;quot; by (rule impI)&lt;br /&gt;
    then show  &amp;quot;∃x. P a ⟶ Q x&amp;quot; by (rule exI)&lt;br /&gt;
  qed&lt;br /&gt;
qed &lt;br /&gt;
&lt;br /&gt;
(* fracorjim1 *)&lt;br /&gt;
(* Entre corchetes se demuestra que efectivamente existe un caso *)&lt;br /&gt;
lemma ejercicio_1_3: &lt;br /&gt;
  fixes P Q :: &amp;quot;&amp;#039;b ⇒ bool&amp;quot; &lt;br /&gt;
  assumes &amp;quot;P a ⟶ (∃x. Q x)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∃x. P a ⟶ Q x&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
	{	&lt;br /&gt;
		assume &amp;quot;P a&amp;quot;&lt;br /&gt;
		with assms have &amp;quot;∃x. Q x&amp;quot; by (rule mp)&lt;br /&gt;
		then obtain x where &amp;quot;Q x&amp;quot; by (rule exE)&lt;br /&gt;
		hence &amp;quot;P a ⟶ Q x&amp;quot; by (rule impI)&lt;br /&gt;
		hence &amp;quot;∃x. P a ⟶ Q x&amp;quot; by (rule exI) &lt;br /&gt;
	}&lt;br /&gt;
  thus ?thesis by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Demostrar&lt;br /&gt;
       {∀x y z. R x y ∧ R y z ⟶ R x z, &lt;br /&gt;
        ∀x. ¬(R x x)}&lt;br /&gt;
       ⊢ ∀x y. R x y ⟶ ¬(R y x)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* migtermor ferrenseg ivamenjim marcarmor13 serrodcal juacabsou marpoldia1 crigomgom bowma josgarsan*)&lt;br /&gt;
lemma ejercicio_2: &lt;br /&gt;
  fixes R :: &amp;quot;&amp;#039;b ⇒ &amp;#039;b ⇒ bool&amp;quot; &lt;br /&gt;
  assumes 1: &amp;quot;∀x y z. R x y ∧ R y z ⟶ R x z&amp;quot;&lt;br /&gt;
  assumes 2: &amp;quot;∀x. ¬(R x x)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∀x y. R x y ⟶ ¬(R y x)&amp;quot;&lt;br /&gt;
proof (rule allI)&lt;br /&gt;
fix x&lt;br /&gt;
show &amp;quot;∀y. R x y ⟶ ¬(R y x)&amp;quot; &lt;br /&gt;
 proof (rule allI) &lt;br /&gt;
  fix y&lt;br /&gt;
  {assume 3: &amp;quot;R x y&amp;quot;&lt;br /&gt;
   {assume 4: &amp;quot;R y x&amp;quot;&lt;br /&gt;
    have 5: &amp;quot;R x y ∧ R y x&amp;quot; using 3 4 by (rule conjI)&lt;br /&gt;
    also have 6: &amp;quot;∀ z1 z2. R x z1 ∧ R z1 z2 ⟶ R x z2&amp;quot; using 1 by (rule allE)&lt;br /&gt;
    then have 7: &amp;quot;∀ z. R x y ∧ R y z ⟶ R x z&amp;quot; by (rule allE)&lt;br /&gt;
    then have 8: &amp;quot;R x y ∧ R y x ⟶ R x x&amp;quot; by (rule allE)&lt;br /&gt;
    then have 9: &amp;quot;R x x&amp;quot; using 5 by (rule mp)&lt;br /&gt;
    have 10: &amp;quot;¬(R x x)&amp;quot; using 2 by (rule allE)&lt;br /&gt;
    then have 11: &amp;quot;False&amp;quot; using 9 by (rule notE)}&lt;br /&gt;
  then have 12: &amp;quot;¬ (R y x)&amp;quot; by (rule notI)}&lt;br /&gt;
  thus &amp;quot;R x y ⟶ ¬(R y x)&amp;quot; by (rule impI)&lt;br /&gt;
 qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* ivamenjim *)&lt;br /&gt;
(* Semejante al anterior, pero indicando que se pruebe por la regla correspondiente *)&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_2_1: &lt;br /&gt;
  assumes 1: &amp;quot;∀x y z. R x y ∧ R y z ⟶ R x z&amp;quot;&lt;br /&gt;
  assumes 2: &amp;quot;∀x. ¬(R x x)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∀x y. R x y ⟶ ¬(R y x)&amp;quot;&lt;br /&gt;
proof (rule allI)&lt;br /&gt;
fix x&lt;br /&gt;
show &amp;quot;∀y. R x y ⟶ ¬(R y x)&amp;quot; &lt;br /&gt;
 proof (rule allI) &lt;br /&gt;
  fix y&lt;br /&gt;
  {assume 3: &amp;quot;R x y&amp;quot;&lt;br /&gt;
   {assume 4: &amp;quot;R y x&amp;quot;&lt;br /&gt;
    have 5: &amp;quot;R x y ∧ R y x&amp;quot; using 3 4 ..&lt;br /&gt;
    have 6: &amp;quot;∀ y z. R x y ∧ R y z ⟶ R x z&amp;quot; using 1 ..&lt;br /&gt;
    then have 7: &amp;quot;∀ z. R x y ∧ R y z ⟶ R x z&amp;quot; ..&lt;br /&gt;
    then have 8: &amp;quot;R x y ∧ R y x ⟶ R x x&amp;quot; ..&lt;br /&gt;
    then have 9: &amp;quot;R x x&amp;quot; using 5 ..&lt;br /&gt;
    have 10: &amp;quot;¬(R x x)&amp;quot; using 2 ..&lt;br /&gt;
    then have 11: &amp;quot;False&amp;quot; using 9 ..}&lt;br /&gt;
  then have 12: &amp;quot;¬ (R y x)&amp;quot; ..}&lt;br /&gt;
  thus &amp;quot;R x y ⟶ ¬(R y x)&amp;quot; ..&lt;br /&gt;
 qed&lt;br /&gt;
qed &lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. Demostrar o refutar&lt;br /&gt;
       (∀x. ∃y. P x y) ⟶ (∃y. ∀x. P x y)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* ivamenjim ferrenseg paupeddeg serrodcal juacabsou marpoldia1 crigomgom bowma josgarsan*)&lt;br /&gt;
lemma ejercicio_3: &lt;br /&gt;
  assumes &amp;quot;(∀x. ∃y. P x y)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;(∃y. ∀x. P x y)&amp;quot;&lt;br /&gt;
  quickcheck&lt;br /&gt;
oops  &lt;br /&gt;
&lt;br /&gt;
(* Y se encuentra el contraejemplo: P = (λx. undefined)(a1 := {a2}, a2 := {a1}) *)&lt;br /&gt;
&lt;br /&gt;
(* migtermor *)&lt;br /&gt;
fun P :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;P x y = (x=y)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio3:&lt;br /&gt;
 &amp;quot;(∀x. ∃y. P x y) ⟶ (∃y. ∀x. P x y)&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
(* dancorgar *)&lt;br /&gt;
lemma ejercicio_3_3:&lt;br /&gt;
  shows   &amp;quot;(∀x. ∃y. P x y) ⟶ (∃y. ∀x. P x y)&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Demostrar o refutar&lt;br /&gt;
     {∀x. P a x x, &lt;br /&gt;
      ∀x y z. P x y z ⟶ P (f x) y (f z)⟧&lt;br /&gt;
     ⊢ ∃z. P (f a) z (f (f a))&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* ferrenseg ivamenjim *)&lt;br /&gt;
lemma ejercicio_4:&lt;br /&gt;
  assumes 1:&amp;quot;∀x. P a x x&amp;quot; and 2:&amp;quot;∀x y z. P x y z ⟶ P (f x) y (f z)&amp;quot;&lt;br /&gt;
  shows &amp;quot;∃z. P (f a) z (f (f a))&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have 4:&amp;quot;P a (f a) (f a)&amp;quot; using 1 ..&lt;br /&gt;
  also have 5:&amp;quot;∀y z. P a y z ⟶ P (f a) y (f z)&amp;quot; using 2 ..&lt;br /&gt;
  then have 6:&amp;quot;∀z. P a (f a) z ⟶ P (f a) (f a) (f z)&amp;quot; ..&lt;br /&gt;
  then have 7:&amp;quot;P a (f a) (f a) ⟶ P (f a) (f a) (f (f a))&amp;quot; ..&lt;br /&gt;
  also have 8:&amp;quot;P (f a) (f a) (f (f a))&amp;quot; using 7 4 by (rule mp)&lt;br /&gt;
  then show &amp;quot;∃z. P (f a) z (f (f a))&amp;quot; ..&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* migtermor serrodcal crigomgom*)&lt;br /&gt;
lemma ejercicio_4_2: &lt;br /&gt;
  fixes P :: &amp;quot;&amp;#039;b ⇒ &amp;#039;b ⇒ &amp;#039;b ⇒ bool&amp;quot; &lt;br /&gt;
  assumes 1: &amp;quot;∀x. P a x x&amp;quot;&lt;br /&gt;
  assumes 2: &amp;quot;∀x y z.  P x y z ⟶ P (f x) y (f z)&amp;quot;&lt;br /&gt;
  shows   &amp;quot; ∃z. P (f a) z (f (f a))&amp;quot;&lt;br /&gt;
proof (rule exI)&lt;br /&gt;
 have 3: &amp;quot;P a (f a) (f a)&amp;quot; using 1 by (rule allE)&lt;br /&gt;
 have 4: &amp;quot;∀y z.  P a y z ⟶ P (f a) y (f z)&amp;quot; using 2 by (rule allE)&lt;br /&gt;
 then have 5: &amp;quot;∀z.  P a (f a) z ⟶ P (f a) (f a) (f z)&amp;quot; by (rule allE)&lt;br /&gt;
 then have 6: &amp;quot;P a (f a) (f a) ⟶ P (f a) (f a) (f (f a))&amp;quot; by (rule allE)&lt;br /&gt;
 then show &amp;quot;P (f a) (f a) (f (f a))&amp;quot; using 3 by (rule mp)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* paupeddeg juacabsou marpoldia1 bowma *)&lt;br /&gt;
lemma ejercicio_4_3:&lt;br /&gt;
  assumes &amp;quot; ∀x. P a x x &amp;quot; &lt;br /&gt;
          &amp;quot; ∀x y z. P x y z ⟶ P (f x) y (f z)&amp;quot;&lt;br /&gt;
  shows &amp;quot;∃z. P (f a) z (f (f a))&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  have &amp;quot;∀ y z. P a y z ⟶ P (f a) y (f z)&amp;quot; using assms(2) by (rule allE)&lt;br /&gt;
  hence &amp;quot;∀z. P a (f a) z ⟶ P (f a) (f a) (f z)&amp;quot;  by (rule allE)&lt;br /&gt;
  hence &amp;quot;P a (f a) (f a) ⟶ P (f a) (f a) (f (f a))&amp;quot;  by (rule allE)&lt;br /&gt;
  have &amp;quot;P a (f a) (f a)&amp;quot; using assms(1) by (rule allE)&lt;br /&gt;
  show &amp;quot;P (f a) (f a) (f (f a))&amp;quot; using `P a (f a) (f a) ⟶ P (f a) (f a) (f (f a))` `P a (f a) (f a)`  by (rule mp)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. Demostrar o refutar&lt;br /&gt;
     {∀y. Q a y, &lt;br /&gt;
      ∀x y. Q x y ⟶ Q (s x) (s y)} &lt;br /&gt;
     ⊢ ∃z. Qa z ∧ Q z (s (s a))&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* ferrenseg ivamenjim *)&lt;br /&gt;
lemma ejercicio_5:&lt;br /&gt;
  assumes 1:&amp;quot;∀y. Q a y&amp;quot; and 2:&amp;quot;∀x y. Q x y ⟶ Q (s x) (s y)&amp;quot;&lt;br /&gt;
  shows &amp;quot;∃z. Q a z ∧ Q z (s (s a))&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  have 3:&amp;quot;Q a (s a)&amp;quot; using 1 ..&lt;br /&gt;
  also have 4:&amp;quot;∀y. Q a y ⟶ Q (s a) (s y)&amp;quot; using 2 ..&lt;br /&gt;
  then have 5:&amp;quot;Q a (s a) ⟶ Q (s a) (s (s a))&amp;quot; ..&lt;br /&gt;
  then have 6:&amp;quot;Q (s a) (s (s a))&amp;quot; using 3 by (rule mp)&lt;br /&gt;
  show &amp;quot;Q a (s a) ∧ Q (s a) (s (s a))&amp;quot; using 3 6 by (rule conjI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* migtermor *)&lt;br /&gt;
lemma ejercicio_5_2: &lt;br /&gt;
  fixes P :: &amp;quot;&amp;#039;b ⇒ &amp;#039;b ⇒ bool&amp;quot; &lt;br /&gt;
  assumes 1: &amp;quot;∀y. Q a y&amp;quot;&lt;br /&gt;
  assumes 2: &amp;quot;∀x y. Q x y ⟶ Q (s x) (s y)&amp;quot;&lt;br /&gt;
  shows   &amp;quot; ∃z. Q a z ∧ Q z (s (s a))&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
 have 3: &amp;quot;Q a (s a)&amp;quot; using 1 by (rule allE)&lt;br /&gt;
 have 4: &amp;quot;∀y. Q a y ⟶ Q (s a) (s y)&amp;quot; using 2 by (rule allE)&lt;br /&gt;
 then have 5: &amp;quot;Q a (s a) ⟶ Q (s a) (s (s a))&amp;quot; by (rule allE)&lt;br /&gt;
 then have 6: &amp;quot;Q (s a) (s (s a))&amp;quot; using 3 by (rule mp)&lt;br /&gt;
 have &amp;quot;Q a (s a) ∧ Q (s a) (s (s a))&amp;quot; using 3 6 by (rule conjI)&lt;br /&gt;
 then show &amp;quot;∃z. Q a z ∧ Q z (s (s a))&amp;quot; by (rule exI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* paupeddeg serrodcal juacabsou marpoldia1 crigomgom bowma *)&lt;br /&gt;
lemma ejercicio_5_3:&lt;br /&gt;
  assumes &amp;quot;∀y. Q a y&amp;quot; &lt;br /&gt;
          &amp;quot;∀x y. Q x y ⟶ Q (s x) (s y)&amp;quot;&lt;br /&gt;
  shows &amp;quot;∃z. Q a z ∧ Q z (s (s a))&amp;quot;&lt;br /&gt;
proof &lt;br /&gt;
have &amp;quot;∀y. Q a y ⟶ Q (s a) (s y)&amp;quot; using assms(2) by (rule allE)&lt;br /&gt;
hence &amp;quot;Q a (s a) ⟶ Q (s a) (s (s a))&amp;quot; by (rule allE)&lt;br /&gt;
have &amp;quot;Q a (s a)&amp;quot; using assms(1) by (rule allE)&lt;br /&gt;
have &amp;quot;Q (s a) (s (s a))&amp;quot; using `Q a (s a) ⟶ Q (s a) (s (s a))` `Q a (s a)` by (rule mp)&lt;br /&gt;
show &amp;quot;Q a (s a) ∧ Q (s a) (s (s a))&amp;quot; using `Q a (s a)` `Q (s a) (s (s a))` by (rule conjI)&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>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2016/index.php?title=Relaci%C3%B3n_9&amp;diff=1329</id>
		<title>Relación 9</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2016/index.php?title=Relaci%C3%B3n_9&amp;diff=1329"/>
		<updated>2017-01-19T12:07:56Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: Página creada con &amp;#039;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt; chapter {* R9: Deducción natural LPO en Isabelle/HOL *}  theory R9_Deduccion_natural_LPO imports Main  begin  text {*   Demostrar o refutar los siguientes ...&amp;#039;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
chapter {* R9: Deducción natural LPO en Isabelle/HOL *}&lt;br /&gt;
&lt;br /&gt;
theory R9_Deduccion_natural_LPO&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Demostrar o refutar los siguientes lemas usando sólo las reglas&lt;br /&gt;
  básicas de deducción natural de la lógica proposicional, de los&lt;br /&gt;
  cuantificadores 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;
&lt;br /&gt;
  · allI:       ⟦∀x. P x; P x ⟹ R⟧ ⟹ R&lt;br /&gt;
  · allE:       (⋀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⟧ ⟹ a: = 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;
&lt;br /&gt;
text {*&lt;br /&gt;
  Se usarán las reglas notnotI, mt y not_ex que demostramos a 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;
lemma no_ex: &amp;quot;¬(∃x. P(x)) ⟹ ∀x. ¬P(x)&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. Demostrar&lt;br /&gt;
       P a ⟶ (∃x. Q x) ⊢ ∃x. P a ⟶ Q x &lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_1: &lt;br /&gt;
  fixes P Q :: &amp;quot;&amp;#039;b ⇒ bool&amp;quot; &lt;br /&gt;
  assumes &amp;quot;P a ⟶ (∃x. Q x)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∃x. P a ⟶ Q x&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
  &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Demostrar&lt;br /&gt;
       {∀x y z. R x y ∧ R y z ⟶ R x z, &lt;br /&gt;
        ∀x. ¬(R x x)}&lt;br /&gt;
       ⊢ ∀x y. R x y ⟶ ¬(R y x)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. Demostrar o refutar&lt;br /&gt;
       (∀x. ∃y. P x y) ⟶ (∃y. ∀x. P x y)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Demostrar o refutar&lt;br /&gt;
     {∀x. P a x x, &lt;br /&gt;
      ∀x y z. P x y z ⟶ P (f x) y (f z)⟧&lt;br /&gt;
     ⊢ ∃z. P (f a) z (f (f a))&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. Demostrar o refutar&lt;br /&gt;
     {∀y. Q a y, &lt;br /&gt;
      ∀x y. Q x y ⟶ Q (s x) (s y)} &lt;br /&gt;
     ⊢ ∃z. Qa z ∧ Q z (s (s a))&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>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2016/index.php?title=R9&amp;diff=1328</id>
		<title>R9</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2016/index.php?title=R9&amp;diff=1328"/>
		<updated>2017-01-19T12:07:37Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: Protegió «R9» ([edit=sysop] (indefinido) [move=sysop] (indefinido))&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
chapter {* R9: Deducción natural LPO en Isabelle/HOL *}&lt;br /&gt;
&lt;br /&gt;
theory R9_Deduccion_natural_LPO&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Demostrar o refutar los siguientes lemas usando sólo las reglas&lt;br /&gt;
  básicas de deducción natural de la lógica proposicional, de los&lt;br /&gt;
  cuantificadores 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;
&lt;br /&gt;
  · allI:       ⟦∀x. P x; P x ⟹ R⟧ ⟹ R&lt;br /&gt;
  · allE:       (⋀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⟧ ⟹ a: = 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;
&lt;br /&gt;
text {*&lt;br /&gt;
  Se usarán las reglas notnotI, mt y not_ex que demostramos a 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;
lemma no_ex: &amp;quot;¬(∃x. P(x)) ⟹ ∀x. ¬P(x)&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. Demostrar&lt;br /&gt;
       P a ⟶ (∃x. Q x) ⊢ ∃x. P a ⟶ Q x &lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_1: &lt;br /&gt;
  fixes P Q :: &amp;quot;&amp;#039;b ⇒ bool&amp;quot; &lt;br /&gt;
  assumes &amp;quot;P a ⟶ (∃x. Q x)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∃x. P a ⟶ Q x&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
  &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Demostrar&lt;br /&gt;
       {∀x y z. R x y ∧ R y z ⟶ R x z, &lt;br /&gt;
        ∀x. ¬(R x x)}&lt;br /&gt;
       ⊢ ∀x y. R x y ⟶ ¬(R y x)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. Demostrar o refutar&lt;br /&gt;
       (∀x. ∃y. P x y) ⟶ (∃y. ∀x. P x y)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Demostrar o refutar&lt;br /&gt;
     {∀x. P a x x, &lt;br /&gt;
      ∀x y z. P x y z ⟶ P (f x) y (f z)⟧&lt;br /&gt;
     ⊢ ∃z. P (f a) z (f (f a))&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. Demostrar o refutar&lt;br /&gt;
     {∀y. Q a y, &lt;br /&gt;
      ∀x y. Q x y ⟶ Q (s x) (s y)} &lt;br /&gt;
     ⊢ ∃z. Qa z ∧ Q z (s (s a))&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>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2016/index.php?title=R9&amp;diff=1327</id>
		<title>R9</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2016/index.php?title=R9&amp;diff=1327"/>
		<updated>2017-01-19T12:07:19Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: Página creada con &amp;#039;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt; chapter {* R9: Deducción natural LPO en Isabelle/HOL *}  theory R9_Deduccion_natural_LPO imports Main  begin  text {*   Demostrar o refutar los siguientes ...&amp;#039;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
chapter {* R9: Deducción natural LPO en Isabelle/HOL *}&lt;br /&gt;
&lt;br /&gt;
theory R9_Deduccion_natural_LPO&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Demostrar o refutar los siguientes lemas usando sólo las reglas&lt;br /&gt;
  básicas de deducción natural de la lógica proposicional, de los&lt;br /&gt;
  cuantificadores 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;
&lt;br /&gt;
  · allI:       ⟦∀x. P x; P x ⟹ R⟧ ⟹ R&lt;br /&gt;
  · allE:       (⋀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⟧ ⟹ a: = 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;
&lt;br /&gt;
text {*&lt;br /&gt;
  Se usarán las reglas notnotI, mt y not_ex que demostramos a 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;
lemma no_ex: &amp;quot;¬(∃x. P(x)) ⟹ ∀x. ¬P(x)&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. Demostrar&lt;br /&gt;
       P a ⟶ (∃x. Q x) ⊢ ∃x. P a ⟶ Q x &lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_1: &lt;br /&gt;
  fixes P Q :: &amp;quot;&amp;#039;b ⇒ bool&amp;quot; &lt;br /&gt;
  assumes &amp;quot;P a ⟶ (∃x. Q x)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∃x. P a ⟶ Q x&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
  &lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Demostrar&lt;br /&gt;
       {∀x y z. R x y ∧ R y z ⟶ R x z, &lt;br /&gt;
        ∀x. ¬(R x x)}&lt;br /&gt;
       ⊢ ∀x y. R x y ⟶ ¬(R y x)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. Demostrar o refutar&lt;br /&gt;
       (∀x. ∃y. P x y) ⟶ (∃y. ∀x. P x y)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Demostrar o refutar&lt;br /&gt;
     {∀x. P a x x, &lt;br /&gt;
      ∀x y z. P x y z ⟶ P (f x) y (f z)⟧&lt;br /&gt;
     ⊢ ∃z. P (f a) z (f (f a))&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. Demostrar o refutar&lt;br /&gt;
     {∀y. Q a y, &lt;br /&gt;
      ∀x y. Q x y ⟶ Q (s x) (s y)} &lt;br /&gt;
     ⊢ ∃z. Qa z ∧ Q z (s (s a))&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>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2016/index.php?title=Ejercicios&amp;diff=1326</id>
		<title>Ejercicios</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2016/index.php?title=Ejercicios&amp;diff=1326"/>
		<updated>2017-01-19T12:06:23Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Relaciones de ejercicios ==&lt;br /&gt;
&lt;br /&gt;
=== Relaciones de ejercicios propuestos ===&lt;br /&gt;
&lt;br /&gt;
En esta sección se publicarán las relaciones de ejercicios. Las soluciones se escriben de forma colaborativa por los alumnos del curso y no deben tomarse como definitivas.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 1&amp;#039;&amp;#039;&amp;#039;: Programación funcional en Isabelle/HOL. ([[R1 |Enunciado]] y [[Relación 1 | Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 2&amp;#039;&amp;#039;&amp;#039;: Razonamiento automático sobre programas en Isabelle/HOL. ([[R2 |Enunciado]] y [[Relación 2 | Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 3&amp;#039;&amp;#039;&amp;#039;: Razonamiento estructurado sobre programas en Isabelle/HOL. ([[R3 |Enunciado]] y [[Relación 3 | Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 4&amp;#039;&amp;#039;&amp;#039;: Cuantificadores sobre listas. ([[R4 |Enunciado]] y [[Relación 4 | Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 5&amp;#039;&amp;#039;&amp;#039;: Eliminación de duplicados. ([[R5 |Enunciado]] y [[Relación 5 | Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 6&amp;#039;&amp;#039;&amp;#039;: Recorridos de árboles. ([[R6 |Enunciado]] y [[Relación 6 | Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 7&amp;#039;&amp;#039;&amp;#039;: Árboles binarios completos. ([[R7 |Enunciado]] y [[Relación 7 | Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 8&amp;#039;&amp;#039;&amp;#039;: Deducción natural proposicional en Isabelle/HOL. ([[R8 |Enunciado]] y [[Relación 8 | Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 9&amp;#039;&amp;#039;&amp;#039;: Deducción natural LPO en Isabelle/HOL. ([[R9 |Enunciado]] y [[Relación 9 | Solución colaborativa]]).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 10&amp;#039;&amp;#039;&amp;#039;: Formalización y argumentación en Isabelle/HOL. ([[R10 |Enunciado]] y [[Relación 10 | Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 11&amp;#039;&amp;#039;&amp;#039;: Plegados de listas y de árboles. ([[R11 |Enunciado]] y [[Relación 11 | Solución colaborativa]]).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Soluciones en GitHub ===&lt;br /&gt;
&lt;br /&gt;
Los siguientes repositorios de GitHub también contienen soluciones de alumnos del curso: [https://github.com/MULCIA/RAIsabelleHOL serrodcal].&lt;/div&gt;</summary>
		<author><name>Jalonso</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2016/index.php?title=Relaci%C3%B3n_8&amp;diff=1325</id>
		<title>Relación 8</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2016/index.php?title=Relaci%C3%B3n_8&amp;diff=1325"/>
		<updated>2017-01-19T11:14:52Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
chapter {* R8: Deducción natural proposicional en Isabelle/HOL *}&lt;br /&gt;
&lt;br /&gt;
theory R8_Deduccion_natural_proposicional&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Demostrar o refutar los siguientes lemas usando sólo las reglas&lt;br /&gt;
  básicas de deducción natural de la lógica proposicional, de los&lt;br /&gt;
  cuantificadores 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;
&lt;br /&gt;
  · allI:       ⟦∀x. P x; P x ⟹ R⟧ ⟹ R&lt;br /&gt;
  · allE:       (⋀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⟧ ⟹ a: = 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;
&lt;br /&gt;
text {*&lt;br /&gt;
  Se usarán las reglas notnotI, mt y not_ex que demostramos a 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;
lemma no_ex: &amp;quot;¬(∃x. P(x)) ⟹ ∀x. ¬P(x)&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. Demostrar&lt;br /&gt;
     ¬q ⟶ ¬p ⊢ p ⟶ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* marcarmor13 *)&lt;br /&gt;
--&amp;quot;usando un supuesto ¬¬p&amp;quot;&lt;br /&gt;
lemma ejercicio_1:&lt;br /&gt;
 assumes 1: &amp;quot;¬q ⟶ ¬p&amp;quot; and &lt;br /&gt;
         2: &amp;quot;¬¬p&amp;quot;  &lt;br /&gt;
 shows &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
 have 3: &amp;quot;¬¬q&amp;quot; using 1 2  by (rule mt)&lt;br /&gt;
 have 4: &amp;quot;q&amp;quot; using 3 by (rule  notnotD)&lt;br /&gt;
 show &amp;quot;p ⟶ q&amp;quot; using 4 by (rule impI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* pablucoto jeamacpov migtermor *)&lt;br /&gt;
lemma ejercicio_1_2:&lt;br /&gt;
  assumes &amp;quot;¬q ⟶ ¬p&amp;quot; &lt;br /&gt;
  shows &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  {assume &amp;quot;p&amp;quot;&lt;br /&gt;
   hence &amp;quot;¬¬p&amp;quot; by (rule notnotI)&lt;br /&gt;
   with `¬q ⟶ ¬p` have &amp;quot;¬¬q&amp;quot; by (rule mt)  &lt;br /&gt;
   hence &amp;quot;q&amp;quot; by (rule notnotD)}&lt;br /&gt;
   then show &amp;quot;p ⟶ q&amp;quot; by (rule impI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* ivamenjim serrodcal anaprarod marpoldia1 manmorjim1 crigomgom juancabsou ferrenseg fraortmoy rubgonmar *)&lt;br /&gt;
lemma ejercicio_1_3:&lt;br /&gt;
  assumes 1: &amp;quot;¬q ⟶ ¬p&amp;quot; &lt;br /&gt;
  shows      &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  {assume 2:&amp;quot;p&amp;quot;&lt;br /&gt;
   then have 3: &amp;quot;¬¬p&amp;quot; by (rule notnotI)&lt;br /&gt;
   have 4: &amp;quot;¬¬q&amp;quot; using 1 3 by (rule mt)&lt;br /&gt;
   then have 5: &amp;quot;q&amp;quot; by (rule notnotD)}&lt;br /&gt;
  thus &amp;quot;p ⟶ q&amp;quot; by (rule impI)&lt;br /&gt;
qed   &lt;br /&gt;
&lt;br /&gt;
(* bowma *)&lt;br /&gt;
lemma ejercicio_1_4:&lt;br /&gt;
 assumes &amp;quot;¬q ⟶ ¬p&amp;quot;&lt;br /&gt;
 shows &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
 {assume &amp;quot;p&amp;quot;&lt;br /&gt;
  hence &amp;quot;¬¬p&amp;quot; by (rule notnotI)&lt;br /&gt;
  with assms have &amp;quot;¬¬q&amp;quot; by (rule mt)&lt;br /&gt;
  then have &amp;quot;q&amp;quot; by (rule notnotD)}&lt;br /&gt;
  thus &amp;quot;p ⟶ q&amp;quot; by (rule impI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* bowma danrodcha paupeddeg pabrodmac fracorjim1 *)&lt;br /&gt;
lemma ejercicio_1_5:&lt;br /&gt;
 assumes &amp;quot;¬q ⟶ ¬p&amp;quot;&lt;br /&gt;
 shows &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
proof &lt;br /&gt;
 assume &amp;quot;p&amp;quot;&lt;br /&gt;
 hence &amp;quot;¬¬p&amp;quot; by (rule notnotI)&lt;br /&gt;
 with assms have &amp;quot;¬¬q&amp;quot; by (rule mt)&lt;br /&gt;
 thus &amp;quot;q&amp;quot; by (rule notnotD)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* josgarsan *)&lt;br /&gt;
lemma ejercicio_1_6:&lt;br /&gt;
 assumes 1: &amp;quot;¬q ⟶ ¬p&amp;quot;&lt;br /&gt;
 shows &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
proof (cases)&lt;br /&gt;
assume &amp;quot;p&amp;quot;&lt;br /&gt;
 then show &amp;quot;p⟶q&amp;quot; using 1 by simp &lt;br /&gt;
next&lt;br /&gt;
 assume &amp;quot;¬p&amp;quot;&lt;br /&gt;
 then show &amp;quot;p⟶q&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* dancorgar *)&lt;br /&gt;
lemma ejercicio_1_7:&lt;br /&gt;
  assumes &amp;quot;¬q ⟶ ¬p&amp;quot;&lt;br /&gt;
  shows &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
proof-&lt;br /&gt;
  {assume &amp;quot;p&amp;quot;&lt;br /&gt;
   assume &amp;quot;¬q&amp;quot;&lt;br /&gt;
   have &amp;quot;¬p&amp;quot; using assms(1) `¬q` by (rule mp)}&lt;br /&gt;
  thus &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
  apply simp&lt;br /&gt;
  apply (rule ccontr)&lt;br /&gt;
  apply simp&lt;br /&gt;
  done&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Demostrar&lt;br /&gt;
     ¬(¬p ∧ ¬q) ⊢ p ∨ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* marcarmor13 *)&lt;br /&gt;
-- &amp;quot;usando un supuesto ¬p ∧ ¬q&amp;quot;&lt;br /&gt;
lemma ejercicio_2:&lt;br /&gt;
  assumes 1: &amp;quot;¬(¬p ∧ ¬q)&amp;quot; and&lt;br /&gt;
          2: &amp;quot;¬p ∧ ¬q&amp;quot;       &lt;br /&gt;
  shows &amp;quot;p ∨ q&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have 3: &amp;quot;p&amp;quot; using 1 2 by (rule notE)&lt;br /&gt;
  show &amp;quot;p ∨ q&amp;quot; using 3 by (rule disjI1)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* Comentario: No se corresponde con el enunciado. *)&lt;br /&gt;
&lt;br /&gt;
(* ivamenjim serrodcal marpoldia1 *)&lt;br /&gt;
lemma ejercicio_2_2:&lt;br /&gt;
  assumes 1: &amp;quot;¬(¬p ∧ ¬q)&amp;quot;&lt;br /&gt;
  shows      &amp;quot;p ∨ q&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
   { assume 2: &amp;quot;(¬p ∧ ¬q)&amp;quot;&lt;br /&gt;
     have &amp;quot;p&amp;quot; using 1 2 by (rule notE)&lt;br /&gt;
     then have &amp;quot;p ∨ q&amp;quot; by (rule disjI1)}&lt;br /&gt;
   thus &amp;quot;p ∨ q&amp;quot; by auto&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* Comentario: Usa auto. *)&lt;br /&gt;
&lt;br /&gt;
(* pablucoto jeamacpov *)&lt;br /&gt;
lemma aux_ejercicio2:&lt;br /&gt;
  assumes &amp;quot;¬(p ∨ q)&amp;quot;&lt;br /&gt;
  shows &amp;quot;¬p ∧ ¬q&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  { assume &amp;quot;p&amp;quot;&lt;br /&gt;
    hence &amp;quot;p ∨ q&amp;quot; by  (rule disjI1)  &lt;br /&gt;
    with  `¬(p ∨ q)` have &amp;quot;False&amp;quot; by (rule notE)}&lt;br /&gt;
  then show &amp;quot;¬p&amp;quot; ..&lt;br /&gt;
next&lt;br /&gt;
  { assume &amp;quot;q&amp;quot;&lt;br /&gt;
    hence &amp;quot;p ∨ q&amp;quot; by (rule disjI2)&lt;br /&gt;
    with  `¬(p ∨ q)` have &amp;quot;False&amp;quot; by (rule notE)}&lt;br /&gt;
  then show &amp;quot;¬q&amp;quot; ..&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_2_3:&lt;br /&gt;
  assumes &amp;quot;¬(¬p ∧ ¬q)&amp;quot;&lt;br /&gt;
  shows &amp;quot;p ∨ q&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  { assume 2: &amp;quot;¬(p ∨ q)&amp;quot;  &lt;br /&gt;
    hence &amp;quot;¬p ∧ ¬q&amp;quot; by (rule  aux_ejercicio2)&lt;br /&gt;
    with  `¬(¬p ∧ ¬q)` have &amp;quot;False&amp;quot; ..}&lt;br /&gt;
  then show &amp;quot;p ∨ q&amp;quot; by (rule ccontr)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* danrodcha bowma *)&lt;br /&gt;
lemma ej_2:&lt;br /&gt;
  assumes &amp;quot;¬(¬p ∧ ¬q)&amp;quot;&lt;br /&gt;
  shows &amp;quot;p ∨ q&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;¬p ∨ p&amp;quot; by (rule excluded_middle)&lt;br /&gt;
  thus &amp;quot;p ∨ q&amp;quot;&lt;br /&gt;
  proof (rule disjE)&lt;br /&gt;
    { assume &amp;quot;¬p&amp;quot;&lt;br /&gt;
      have &amp;quot;¬q ∨ q&amp;quot; by (rule excluded_middle)&lt;br /&gt;
      thus &amp;quot;p ∨ q&amp;quot;&lt;br /&gt;
      proof (rule disjE)&lt;br /&gt;
      { assume &amp;quot;¬q&amp;quot;&lt;br /&gt;
        with `¬p` have &amp;quot;¬p ∧ ¬q&amp;quot; by (rule conjI)&lt;br /&gt;
        with assms show &amp;quot;p ∨ q&amp;quot; by (rule notE)}&lt;br /&gt;
      next&lt;br /&gt;
      { assume &amp;quot;q&amp;quot;&lt;br /&gt;
        then show &amp;quot;p ∨ q&amp;quot; by (rule disjI2)}&lt;br /&gt;
      qed}&lt;br /&gt;
    next&lt;br /&gt;
    { assume &amp;quot;p&amp;quot;&lt;br /&gt;
      thus &amp;quot;p ∨ q&amp;quot; by (rule disjI1)}&lt;br /&gt;
    qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* anaprarod crigomgom juancabsou ferrenseg fraortmoy fracorjim1 rubgonmar *)&lt;br /&gt;
(* Igual que el anterior pero con etiquetas *)&lt;br /&gt;
lemma ejercicio_2_4:&lt;br /&gt;
  assumes 0:  &amp;quot;¬(¬p ∧ ¬q)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;p ∨ q&amp;quot;&lt;br /&gt;
proof-&lt;br /&gt;
  have &amp;quot;¬p ∨ p&amp;quot; by (rule excluded_middle)&lt;br /&gt;
  thus &amp;quot;p ∨ q&amp;quot;&lt;br /&gt;
  proof (rule disjE)&lt;br /&gt;
    { assume 1: &amp;quot;¬p&amp;quot; &lt;br /&gt;
      have &amp;quot;¬q ∨ q&amp;quot; by (rule excluded_middle)&lt;br /&gt;
      thus &amp;quot;p ∨ q&amp;quot;&lt;br /&gt;
      proof (rule disjE)&lt;br /&gt;
        { assume 2: &amp;quot;¬q&amp;quot;&lt;br /&gt;
          have 3: &amp;quot;(¬p ∧ ¬q)&amp;quot; using 1 2 by (rule conjI)&lt;br /&gt;
          have &amp;quot;p ∨ q&amp;quot; using 0 3 by (rule notE)&lt;br /&gt;
          thus &amp;quot;p ∨ q&amp;quot; by this}&lt;br /&gt;
        next&lt;br /&gt;
        { assume 4: &amp;quot;q&amp;quot;&lt;br /&gt;
          have &amp;quot;p ∨ q&amp;quot; using 4 by (rule disjI2)&lt;br /&gt;
          thus &amp;quot;p ∨ q&amp;quot; by this}&lt;br /&gt;
        qed}&lt;br /&gt;
    next&lt;br /&gt;
    { assume 5: &amp;quot;p&amp;quot;&lt;br /&gt;
      have &amp;quot;p ∨ q&amp;quot; using 5 by (rule disjI1)&lt;br /&gt;
      thus &amp;quot;p ∨ q&amp;quot; by this}&lt;br /&gt;
   qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* migtermor *)&lt;br /&gt;
lemma lem:&lt;br /&gt;
 shows &amp;quot;p ∨ ¬p&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
 {assume 1: &amp;quot;¬(p∨¬p)&amp;quot;&lt;br /&gt;
  {assume 2: &amp;quot;p&amp;quot;&lt;br /&gt;
   then have 3: &amp;quot;p∨¬p&amp;quot; by (rule disjI1)&lt;br /&gt;
   also have 4: &amp;quot;False&amp;quot; using 1 3 by (rule notE)}&lt;br /&gt;
  then have 5: &amp;quot;¬p&amp;quot; by (rule notI)&lt;br /&gt;
  then have 6: &amp;quot;p∨¬p&amp;quot; by (rule disjI2)&lt;br /&gt;
  also have 7: &amp;quot;False&amp;quot; using 1 6 by (rule notE)}&lt;br /&gt;
 thus &amp;quot;p∨¬p&amp;quot; by (rule ccontr)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_2_5:&lt;br /&gt;
 assumes 1: &amp;quot;¬(¬p∧¬q)&amp;quot;&lt;br /&gt;
 shows &amp;quot;p∨q&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
 have 2: &amp;quot;p∨¬p&amp;quot; by (rule lem)&lt;br /&gt;
 moreover&lt;br /&gt;
 {assume 3: p &lt;br /&gt;
  then have 4: &amp;quot;p∨q&amp;quot; by (rule disjI1)}&lt;br /&gt;
 moreover&lt;br /&gt;
 {assume 6: &amp;quot;¬p&amp;quot;&lt;br /&gt;
  {assume 7: &amp;quot;¬q&amp;quot;&lt;br /&gt;
   also have 8: &amp;quot;¬p∧¬q&amp;quot; using 6 7 by (rule conjI)&lt;br /&gt;
   have 9: &amp;quot;False&amp;quot; using 1 8 by (rule notE)}&lt;br /&gt;
  then have 10: &amp;quot;q&amp;quot; by (rule ccontr)&lt;br /&gt;
  then have 11: &amp;quot;p∨q&amp;quot; by (rule disjI2)}&lt;br /&gt;
 ultimately show &amp;quot;p∨q&amp;quot; by (rule disjE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* paupeddeg pabrodmac *)&lt;br /&gt;
lemma aux1:&lt;br /&gt;
  assumes &amp;quot;¬(p ∧ q)&amp;quot;&lt;br /&gt;
  shows &amp;quot;¬p ∨ ¬q&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;¬p ∨ p&amp;quot; by (rule excluded_middle)&lt;br /&gt;
  thus &amp;quot;¬p ∨ ¬q&amp;quot;&lt;br /&gt;
  proof&lt;br /&gt;
    {assume &amp;quot;¬p&amp;quot;&lt;br /&gt;
    thus &amp;quot;¬p ∨ ¬q&amp;quot; by (rule disjI1)}&lt;br /&gt;
    next&lt;br /&gt;
    {assume &amp;quot;p&amp;quot;&lt;br /&gt;
      have &amp;quot;¬q&amp;quot;&lt;br /&gt;
      proof&lt;br /&gt;
      {assume &amp;quot;q&amp;quot;&lt;br /&gt;
      have &amp;quot;(p ∧ q)&amp;quot; using `p` `q`  by (rule conjI)&lt;br /&gt;
      show &amp;quot;False&amp;quot;  using `¬(p ∧ q)` `p ∧ q` by (rule notE)}&lt;br /&gt;
      qed&lt;br /&gt;
      thus &amp;quot;¬p ∨ ¬q&amp;quot; by (rule disjI2)}&lt;br /&gt;
      qed&lt;br /&gt;
qed&lt;br /&gt;
  &lt;br /&gt;
lemma ejercicio_2_5b:&lt;br /&gt;
  assumes &amp;quot;¬(¬p ∧ ¬q)&amp;quot;&lt;br /&gt;
  shows &amp;quot;p ∨ q&amp;quot; &lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;¬¬p ∨ ¬¬q&amp;quot; using assms  by (rule aux1)&lt;br /&gt;
  moreover&lt;br /&gt;
  {assume &amp;quot;¬¬p&amp;quot;&lt;br /&gt;
    hence &amp;quot;p&amp;quot; by (rule notnotD)&lt;br /&gt;
    hence &amp;quot;p ∨ q&amp;quot; by (rule disjI1) }&lt;br /&gt;
  moreover&lt;br /&gt;
  {assume &amp;quot;¬¬q&amp;quot;&lt;br /&gt;
    hence &amp;quot;q&amp;quot; by (rule notnotD)&lt;br /&gt;
    hence &amp;quot;p ∨ q&amp;quot; by (rule disjI2) }&lt;br /&gt;
  ultimately show &amp;quot;p ∨ q&amp;quot; by (rule disjE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* pabrodmac *)&lt;br /&gt;
lemma ejercicio_2_6:&lt;br /&gt;
 assumes &amp;quot;¬(¬p ∧ ¬q)&amp;quot;&lt;br /&gt;
 shows &amp;quot;p ∨ q&amp;quot;     &lt;br /&gt;
proof -&lt;br /&gt;
have &amp;quot;¬¬p ∨ ¬¬q&amp;quot; using assms by (rule Meson.not_conjD)&lt;br /&gt;
  moreover&lt;br /&gt;
  { assume &amp;quot;¬¬p&amp;quot;&lt;br /&gt;
    hence &amp;quot;p&amp;quot; by (rule notnotD)&lt;br /&gt;
    hence &amp;quot;p ∨ q&amp;quot; by (rule disjI1) }&lt;br /&gt;
  moreover&lt;br /&gt;
  { assume &amp;quot;¬¬q&amp;quot;&lt;br /&gt;
    then have &amp;quot;q&amp;quot; by (rule notnotD)&lt;br /&gt;
    hence &amp;quot;p ∨ q&amp;quot; by (rule disjI2) }&lt;br /&gt;
  ultimately show &amp;quot;p ∨ q&amp;quot; by (rule disjE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* dancorgar *)&lt;br /&gt;
lemma ejercicio_2_7:&lt;br /&gt;
  assumes &amp;quot;¬(¬p ∧ ¬q)&amp;quot;&lt;br /&gt;
  shows &amp;quot;p ∨ q&amp;quot;&lt;br /&gt;
proof-&lt;br /&gt;
  {assume &amp;quot;(¬p ∧ ¬q)&amp;quot;&lt;br /&gt;
   have &amp;quot;p&amp;quot; using assms `(¬p ∧ ¬q)` by (rule notE)&lt;br /&gt;
   then have &amp;quot;p ∨ q&amp;quot;  by (rule disjI1)}&lt;br /&gt;
  then show &amp;quot;p ∨ q&amp;quot;&lt;br /&gt;
  apply simp&lt;br /&gt;
  apply (rule ccontr)&lt;br /&gt;
  apply simp&lt;br /&gt;
  done&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* josgarsan *)&lt;br /&gt;
lemma ejercicio_2_8:&lt;br /&gt;
 assumes 1: &amp;quot; ¬(¬p ∧ ¬q)&amp;quot;&lt;br /&gt;
 shows &amp;quot;p ∨ q&amp;quot;&lt;br /&gt;
proof (cases)&lt;br /&gt;
 assume &amp;quot;p&amp;quot;&lt;br /&gt;
 then show &amp;quot;p ∨ q&amp;quot; using disjI1 by simp&lt;br /&gt;
next&lt;br /&gt;
 assume &amp;quot;¬p&amp;quot;&lt;br /&gt;
 then have &amp;quot;q&amp;quot; using 1 conjunct2 by simp&lt;br /&gt;
 then show &amp;quot;p ∨ q&amp;quot; using disjI2 by simp&lt;br /&gt;
qed   &lt;br /&gt;
&lt;br /&gt;
(* Comentario: Uso de simp. *)&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. Demostrar&lt;br /&gt;
     ¬(¬p ∨ ¬q) ⊢ p ∧ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* marcarmor13 serrodcal marpoldia1 *)&lt;br /&gt;
--&amp;quot;usando un supuesto ¬p ∨ ¬q&amp;quot;&lt;br /&gt;
lemma ejercicio_3:&lt;br /&gt;
  assumes 1: &amp;quot;¬(¬p ∨ ¬q)&amp;quot; and&lt;br /&gt;
          2:&amp;quot;¬p ∨ ¬q&amp;quot;       &lt;br /&gt;
  shows &amp;quot;p ∧ q&amp;quot;&lt;br /&gt;
proof-&lt;br /&gt;
  have 3: &amp;quot;p&amp;quot;using 1 2 by (rule notE)&lt;br /&gt;
  have 4: &amp;quot;q&amp;quot;using 1 2 by (rule notE)&lt;br /&gt;
  show &amp;quot;p ∧ q&amp;quot; using 3 4 by (rule conjI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* Comentario: Uso de la negación de la hipótesis. *)&lt;br /&gt;
&lt;br /&gt;
(* pablucoto jeamacpov *)&lt;br /&gt;
lemma ejercicio_3_2:  &lt;br /&gt;
  assumes &amp;quot;¬(¬p ∨ ¬q)&amp;quot;&lt;br /&gt;
  shows &amp;quot;p ∧ q&amp;quot;&lt;br /&gt;
proof  &lt;br /&gt;
  have &amp;quot;¬¬p ∧ ¬¬q&amp;quot; using assms(1) by (rule  aux_ejercicio2)  &lt;br /&gt;
  hence &amp;quot;¬¬p&amp;quot;  by (rule conjunct1)&lt;br /&gt;
  show &amp;quot;p&amp;quot; using `¬¬p` by (rule notnotD)&lt;br /&gt;
next &lt;br /&gt;
  have &amp;quot;¬¬p ∧ ¬¬q&amp;quot; using assms(1) by (rule  aux_ejercicio2)  &lt;br /&gt;
  have &amp;quot;¬¬q&amp;quot; using `¬¬p ∧ ¬¬q`  by (rule conjunct2) &lt;br /&gt;
  show &amp;quot;q&amp;quot; using `¬¬q` by (rule notnotD)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* ivamenjim *)&lt;br /&gt;
lemma aux: &amp;quot;¬(p ∨ q) ⟹ ¬p ∧ ¬q&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_3_3:&lt;br /&gt;
  assumes 1: &amp;quot;¬(¬p ∨ ¬q)&amp;quot;&lt;br /&gt;
  shows &amp;quot;p ∧ q&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  have 2: &amp;quot;¬¬p ∧ ¬¬q&amp;quot; using 1 by (rule aux)&lt;br /&gt;
  have 3: &amp;quot;¬¬p&amp;quot; using 2 ..&lt;br /&gt;
  have 4: &amp;quot;¬¬q&amp;quot; using 2 ..&lt;br /&gt;
  show &amp;quot;p&amp;quot; using 3 by (rule notnotD)&lt;br /&gt;
  show &amp;quot;q&amp;quot; using 4 by (rule notnotD)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* Comentario: Uso de auxiliar con auto. *)&lt;br /&gt;
&lt;br /&gt;
(* danrodcha migtermor bowma *)&lt;br /&gt;
lemma ej_3:&lt;br /&gt;
  assumes &amp;quot;¬(¬p ∨ ¬q)&amp;quot;&lt;br /&gt;
  shows &amp;quot;p ∧ q&amp;quot;&lt;br /&gt;
  proof (rule conjI)&lt;br /&gt;
  { assume &amp;quot;¬p&amp;quot;&lt;br /&gt;
    hence &amp;quot;¬p ∨ ¬q&amp;quot; by (rule disjI1)&lt;br /&gt;
    with assms have False by (rule notE)}&lt;br /&gt;
  then show &amp;quot;p&amp;quot; by (rule ccontr)&lt;br /&gt;
  { assume &amp;quot;¬q&amp;quot;&lt;br /&gt;
    hence &amp;quot;¬p ∨ ¬q&amp;quot; by (rule disjI2)&lt;br /&gt;
    with assms have False by (rule notE)}&lt;br /&gt;
  then show &amp;quot;q&amp;quot; by (rule ccontr)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* anaprarod crigomgom juancabsou ferrenseg fraortmoy fracorjim1 rubgonmar *)&lt;br /&gt;
(* Igual que el anterior pero con etiquetas *)&lt;br /&gt;
lemma ejercicio_3_4:&lt;br /&gt;
  assumes &amp;quot;¬(¬p ∨ ¬q)&amp;quot;&lt;br /&gt;
  shows &amp;quot;p ∧ q&amp;quot;&lt;br /&gt;
proof (rule conjI)  &lt;br /&gt;
  {assume 1: &amp;quot;¬p&amp;quot;&lt;br /&gt;
    hence 2: &amp;quot;¬p ∨ ¬q&amp;quot; by (rule disjI1)&lt;br /&gt;
    have &amp;quot;False&amp;quot; using assms 2 by (rule notE)}&lt;br /&gt;
  thus 3: &amp;quot;p&amp;quot; by (rule ccontr)&lt;br /&gt;
  {assume 4: &amp;quot;¬q&amp;quot;&lt;br /&gt;
    hence 5: &amp;quot;¬p ∨ ¬q&amp;quot; by (rule disjI2)&lt;br /&gt;
    have &amp;quot;False&amp;quot; using assms 5 by (rule notE)}&lt;br /&gt;
  thus 6: &amp;quot;q&amp;quot; by (rule ccontr)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* paupeddeg pabrodmac *)&lt;br /&gt;
lemma aux2:&lt;br /&gt;
  assumes &amp;quot;¬(p ∨ q)&amp;quot;&lt;br /&gt;
  shows &amp;quot;¬p ∧ ¬q&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;¬p ∨ p&amp;quot; by (rule excluded_middle)&lt;br /&gt;
  thus &amp;quot;¬p ∧ ¬q&amp;quot;&lt;br /&gt;
  proof&lt;br /&gt;
    {assume &amp;quot;¬p&amp;quot; &lt;br /&gt;
      have &amp;quot;¬q ∨ q&amp;quot; by (rule excluded_middle)&lt;br /&gt;
      thus &amp;quot;¬p ∧ ¬q&amp;quot;&lt;br /&gt;
      proof&lt;br /&gt;
        {assume &amp;quot;¬q&amp;quot;&lt;br /&gt;
          show &amp;quot;¬p ∧ ¬q&amp;quot; using `¬p` `¬q` by (rule conjI)}  &lt;br /&gt;
        {assume &amp;quot;q&amp;quot;&lt;br /&gt;
           hence &amp;quot;(p ∨ q)&amp;quot;  by (rule disjI2)&lt;br /&gt;
           have &amp;quot;False&amp;quot;  using `¬(p ∨ q)` `p ∨ q` by (rule notE)&lt;br /&gt;
           thus &amp;quot;¬p ∧ ¬q&amp;quot; by (rule FalseE) }&lt;br /&gt;
         qed}&lt;br /&gt;
    {assume &amp;quot;p&amp;quot;&lt;br /&gt;
        hence &amp;quot;(p ∨ q)&amp;quot;  by (rule disjI1)&lt;br /&gt;
        have &amp;quot;False&amp;quot;  using `¬(p ∨ q)` `p ∨ q` by (rule notE) &lt;br /&gt;
        thus &amp;quot;¬p ∧ ¬q&amp;quot; by (rule FalseE) }&lt;br /&gt;
qed&lt;br /&gt;
qed&lt;br /&gt;
      &lt;br /&gt;
lemma ejercicio_3_5:&lt;br /&gt;
  assumes  &amp;quot;¬(¬p ∨ ¬q)&amp;quot;&lt;br /&gt;
  shows &amp;quot;p ∧ q&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;¬¬p ∧ ¬¬q&amp;quot; using assms by (rule aux2)&lt;br /&gt;
  hence &amp;quot;¬¬p&amp;quot; by (rule conjunct1)&lt;br /&gt;
  hence &amp;quot;p&amp;quot; by (rule notnotD)&lt;br /&gt;
  have &amp;quot;¬¬q&amp;quot; using `¬¬p ∧ ¬¬q` by (rule conjunct2)&lt;br /&gt;
  hence &amp;quot;q&amp;quot; by (rule notnotD) &lt;br /&gt;
  show  &amp;quot;p ∧ q&amp;quot; using  `p` `q` by (rule conjI) &lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* pabrodmac *)&lt;br /&gt;
lemma ejercicio_3_6:&lt;br /&gt;
  assumes &amp;quot;¬(¬p ∨ ¬q)&amp;quot;&lt;br /&gt;
  shows &amp;quot;p ∧ q&amp;quot; &lt;br /&gt;
proof &lt;br /&gt;
  have &amp;quot;¬¬p ∧ ¬¬q&amp;quot; using assms by (rule Meson.not_disjD)&lt;br /&gt;
  hence &amp;quot;¬¬p&amp;quot;  by (rule conjunct1)&lt;br /&gt;
  show &amp;quot;p&amp;quot; using `¬¬p` by (rule notnotD)&lt;br /&gt;
next&lt;br /&gt;
  have &amp;quot;¬¬p ∧ ¬¬q&amp;quot; using assms by (rule Meson.not_disjD)&lt;br /&gt;
  hence &amp;quot;¬¬q&amp;quot;  by (rule conjunct2)&lt;br /&gt;
  show &amp;quot;q&amp;quot; using `¬¬q` by (rule notnotD)&lt;br /&gt;
qed   &lt;br /&gt;
&lt;br /&gt;
(* pabrodmac *)&lt;br /&gt;
lemma ejercicio_3_7:&lt;br /&gt;
  assumes &amp;quot;¬(¬p ∨ ¬q)&amp;quot;&lt;br /&gt;
  shows &amp;quot;p ∧ q&amp;quot; &lt;br /&gt;
proof &lt;br /&gt;
  have &amp;quot;¬¬p ∧ ¬¬q&amp;quot; using assms by (rule Meson.not_disjD)&lt;br /&gt;
  have &amp;quot;¬¬p&amp;quot; using `¬¬p ∧ ¬¬q`  by (rule conjunct1)&lt;br /&gt;
  have &amp;quot;¬¬q&amp;quot; using `¬¬p ∧ ¬¬q`  by (rule conjunct2)&lt;br /&gt;
  show &amp;quot;p&amp;quot; using `¬¬p` by (rule notnotD)&lt;br /&gt;
  show &amp;quot;q&amp;quot; using `¬¬q` by (rule notnotD)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* dancorgar *)&lt;br /&gt;
lemma ejercicio_3_8:&lt;br /&gt;
  assumes &amp;quot;¬(¬p ∨ ¬q)&amp;quot;&lt;br /&gt;
  shows &amp;quot;p ∧ q&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  {assume &amp;quot;(¬p ∨ ¬q)&amp;quot;&lt;br /&gt;
   have &amp;quot;p&amp;quot; using assms `(¬p ∨ ¬q)` by (rule notE)&lt;br /&gt;
   have &amp;quot;q&amp;quot; using assms `(¬p ∨ ¬q)` by (rule notE)&lt;br /&gt;
   have &amp;quot;p ∧ q&amp;quot; using `p` `q`  by (rule conjI)}&lt;br /&gt;
  then show &amp;quot;p ∧ q&amp;quot;&lt;br /&gt;
  apply simp&lt;br /&gt;
  apply (rule ccontr)&lt;br /&gt;
  apply simp&lt;br /&gt;
  done&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* josgarsan *)&lt;br /&gt;
lemma ejercicio_3_9:&lt;br /&gt;
  assumes 1: &amp;quot;¬(¬p ∨ ¬q)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;p ∧ q&amp;quot;&lt;br /&gt;
proof (rule ccontr)&lt;br /&gt;
  assume &amp;quot;¬(p ∧ q)&amp;quot;&lt;br /&gt;
  then show False using 1 by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* Comentario: Uso de simp. *)&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Demostrar&lt;br /&gt;
     ¬(p ∧ q) ⊢ ¬p ∨ ¬q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* marcarmor13 serrodcal *)&lt;br /&gt;
--&amp;quot;usando un supuesto p ∧ q&amp;quot;&lt;br /&gt;
lemma ejercicio_4_1:&lt;br /&gt;
  assumes 1: &amp;quot; ¬(p ∧ q)&amp;quot; and&lt;br /&gt;
          2: &amp;quot;p ∧ q&amp;quot;       &lt;br /&gt;
  shows &amp;quot;¬p ∨ ¬q&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have 3: &amp;quot;¬p&amp;quot;using 1 2 by (rule notE)&lt;br /&gt;
  show &amp;quot;¬p ∨ ¬q&amp;quot; using 3  by (rule disjI1)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* Comentario: Uso de la negación de la hipótesis.*)&lt;br /&gt;
&lt;br /&gt;
(* ivamenjim marpoldia1 ferrenseg fraortmoy rubgonmar *)&lt;br /&gt;
lemma ejercicio_4_2:&lt;br /&gt;
  assumes 1: &amp;quot;¬(p ∧ q)&amp;quot;&lt;br /&gt;
  shows      &amp;quot;¬p ∨ ¬q&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
   {assume 2:&amp;quot;(p ∧ q)&amp;quot;&lt;br /&gt;
   have &amp;quot;¬p&amp;quot; using 1 2 by (rule notE)&lt;br /&gt;
   then have &amp;quot;¬p ∨ ¬q&amp;quot; by (rule disjI1)}&lt;br /&gt;
   thus &amp;quot;¬p ∨ ¬q&amp;quot; by auto&lt;br /&gt;
qed  &lt;br /&gt;
&lt;br /&gt;
(* Comentario: Uso de auto. *)&lt;br /&gt;
&lt;br /&gt;
(* pablucoto jeamacpov crigomgom juancabsou *)&lt;br /&gt;
lemma ejercicio_4_3:&lt;br /&gt;
  assumes  &amp;quot; ¬(p ∧ q)&amp;quot;&lt;br /&gt;
  shows    &amp;quot; ¬p ∨ ¬q&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
 { assume 2: &amp;quot;¬(¬p ∨ ¬q)&amp;quot;&lt;br /&gt;
   hence &amp;quot;p ∧ q&amp;quot; by (rule ejercicio_3_2)  &lt;br /&gt;
   with assms(1) have  &amp;quot;False&amp;quot; .. } &lt;br /&gt;
 then show &amp;quot; ¬p ∨ ¬q&amp;quot; by (rule ccontr)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(*danrodcha anaprarod bowma *)&lt;br /&gt;
lemma ej_4:&lt;br /&gt;
  assumes &amp;quot;¬(p ∧ q)&amp;quot;&lt;br /&gt;
  shows &amp;quot;¬p ∨ ¬q&amp;quot;&lt;br /&gt;
  proof (rule ccontr)&lt;br /&gt;
    assume &amp;quot;¬ (¬ p ∨ ¬ q)&amp;quot;&lt;br /&gt;
    hence &amp;quot;p ∧ q&amp;quot; by (rule ej_3)&lt;br /&gt;
    with assms show False  by (rule notE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* anaprarod *)&lt;br /&gt;
(* sin usar el ejercicio anterior *)&lt;br /&gt;
lemma ejercicio_4_4: &lt;br /&gt;
  assumes &amp;quot;¬(p ∧ q)&amp;quot;&lt;br /&gt;
  shows &amp;quot;¬p ∨ ¬q&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;¬p ∨ p&amp;quot; by (rule excluded_middle)&lt;br /&gt;
  thus &amp;quot;¬p ∨ ¬q&amp;quot;&lt;br /&gt;
  proof (rule disjE)&lt;br /&gt;
    {assume &amp;quot;¬p&amp;quot;&lt;br /&gt;
      thus &amp;quot;¬p ∨ ¬q&amp;quot; by (rule disjI1)}&lt;br /&gt;
    next&lt;br /&gt;
    {assume 1:&amp;quot;p&amp;quot;&lt;br /&gt;
      have &amp;quot;¬q ∨ q&amp;quot; by (rule excluded_middle)&lt;br /&gt;
      thus &amp;quot;¬p ∨ ¬q&amp;quot;&lt;br /&gt;
      proof (rule disjE)&lt;br /&gt;
        {assume &amp;quot;¬q&amp;quot;&lt;br /&gt;
          thus &amp;quot;¬p ∨ ¬q&amp;quot; by (rule disjI2)}&lt;br /&gt;
        next&lt;br /&gt;
        {assume 2:&amp;quot;q&amp;quot;&lt;br /&gt;
          have 3:&amp;quot;p ∧ q&amp;quot; using 1 2 by (rule conjI)&lt;br /&gt;
          have &amp;quot;¬p ∨ ¬q&amp;quot; using assms 3 by (rule notE)&lt;br /&gt;
          thus &amp;quot;¬p ∨ ¬q&amp;quot; by this}&lt;br /&gt;
      qed}&lt;br /&gt;
   qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* migtermor *)&lt;br /&gt;
lemma ejercicio_4_5:&lt;br /&gt;
 assumes 1: &amp;quot;¬(p∧q)&amp;quot;&lt;br /&gt;
 shows &amp;quot;¬p∨¬q&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
 have 2: &amp;quot;p∨¬p&amp;quot; by (rule lem)&lt;br /&gt;
 moreover&lt;br /&gt;
 {assume 3: &amp;quot;p&amp;quot; &lt;br /&gt;
  {assume 4: &amp;quot;q&amp;quot;&lt;br /&gt;
   also have 5: &amp;quot;p∧q&amp;quot; using 3 4 by (rule conjI)&lt;br /&gt;
   have 6: &amp;quot;False&amp;quot; using assms 5 by (rule notE)}&lt;br /&gt;
  then have 7: &amp;quot;¬q&amp;quot; by (rule notI)&lt;br /&gt;
  then have 8: &amp;quot;¬p∨¬q&amp;quot; by (rule disjI2)}&lt;br /&gt;
 moreover&lt;br /&gt;
 {assume 9: &amp;quot;¬p&amp;quot;&lt;br /&gt;
  then have &amp;quot;¬p∨¬q&amp;quot; by (rule disjI1)}&lt;br /&gt;
 ultimately show &amp;quot;¬p∨¬q&amp;quot; by (rule disjE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* paupeddeg pabrodmac*)&lt;br /&gt;
lemma ejercicio_4_6:&lt;br /&gt;
  assumes &amp;quot;¬(p ∧ q)&amp;quot;&lt;br /&gt;
  shows &amp;quot;¬p ∨ ¬q&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;¬p ∨ p&amp;quot; by (rule excluded_middle)&lt;br /&gt;
  thus &amp;quot;¬p ∨ ¬q&amp;quot;&lt;br /&gt;
  proof&lt;br /&gt;
    { assume &amp;quot;¬p&amp;quot;&lt;br /&gt;
     thus &amp;quot;¬p ∨ ¬q&amp;quot; by (rule disjI1)}&lt;br /&gt;
  next&lt;br /&gt;
    { assume &amp;quot;p&amp;quot;&lt;br /&gt;
      have &amp;quot;¬q&amp;quot;&lt;br /&gt;
      proof&lt;br /&gt;
      { assume &amp;quot;q&amp;quot;&lt;br /&gt;
        have &amp;quot;(p ∧ q)&amp;quot; using `p` `q`  by (rule conjI)&lt;br /&gt;
        show &amp;quot;False&amp;quot;  using `¬(p ∧ q)` `p ∧ q` by (rule notE)}&lt;br /&gt;
      qed&lt;br /&gt;
      thus &amp;quot;¬p ∨ ¬q&amp;quot; by (rule disjI2)}&lt;br /&gt;
      qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* pabrodmac*)&lt;br /&gt;
lemma ejercicio_4_7:&lt;br /&gt;
  assumes &amp;quot;¬(p ∧ q)&amp;quot;&lt;br /&gt;
  shows &amp;quot;¬p ∨ ¬q&amp;quot; &lt;br /&gt;
proof -&lt;br /&gt;
  show &amp;quot;¬p ∨ ¬q&amp;quot; using assms by (rule Meson.not_conjD)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* dancorgar *)&lt;br /&gt;
lemma ejercicio_4_8:&lt;br /&gt;
  assumes &amp;quot;¬(p ∧ q)&amp;quot;&lt;br /&gt;
  shows &amp;quot;¬p ∨ ¬q&amp;quot;&lt;br /&gt;
proof-&lt;br /&gt;
  {assume &amp;quot;(p ∧ q)&amp;quot;&lt;br /&gt;
   have &amp;quot;¬p&amp;quot; using assms `(p ∧ q)` by (rule notE)&lt;br /&gt;
   then have &amp;quot;¬p ∨ ¬q&amp;quot;  by (rule disjI1)}&lt;br /&gt;
  then show &amp;quot;¬p ∨ ¬q&amp;quot;&lt;br /&gt;
  apply simp&lt;br /&gt;
  apply (rule ccontr)&lt;br /&gt;
  apply simp&lt;br /&gt;
  done&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* josgarsan *)&lt;br /&gt;
lemma ejercicio_4:&lt;br /&gt;
  assumes 1: &amp;quot;¬(p ∧ q)&amp;quot;&lt;br /&gt;
  shows &amp;quot;¬p ∨ ¬q&amp;quot;&lt;br /&gt;
proof (rule ccontr)&lt;br /&gt;
  assume &amp;quot;¬(¬ p ∨ ¬ q)&amp;quot;&lt;br /&gt;
  then show False using 1 by simp&lt;br /&gt;
qed   &lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. Demostrar&lt;br /&gt;
     ⊢ (p ⟶ q) ∨ (q ⟶ p)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* marcarmor13 jeamacpov serrodcal juancabsou *)&lt;br /&gt;
--&amp;quot;usando un supuesto q&amp;quot;&lt;br /&gt;
lemma ejercicio_5_1:&lt;br /&gt;
  assumes 1: &amp;quot;q&amp;quot; &lt;br /&gt;
  shows &amp;quot;(p ⟶ q) ∨ (q ⟶ p)&amp;quot;&lt;br /&gt;
proof-&lt;br /&gt;
  have 2: &amp;quot;p ⟶ q&amp;quot; using 1 by (rule impI)&lt;br /&gt;
  show &amp;quot;(p ⟶ q) ∨ (q ⟶ p)&amp;quot; using 2  by (rule disjI1)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* Comentario: Hipótesis extra.*)&lt;br /&gt;
&lt;br /&gt;
(* ivamenjim marpoldia1 ferrenseg fraortmoy rubgonmar *)&lt;br /&gt;
lemma ejercicio_5_2:&lt;br /&gt;
  shows &amp;quot;(p ⟶ q) ∨ (q ⟶ p)&amp;quot;     &lt;br /&gt;
proof -&lt;br /&gt;
  {assume 1:&amp;quot;q&amp;quot;&lt;br /&gt;
   have &amp;quot;(p ⟶ q)&amp;quot; using 1 by (rule impI)&lt;br /&gt;
   then have &amp;quot;(p ⟶ q) ∨ (q ⟶ p)&amp;quot; by (rule disjI1)}&lt;br /&gt;
   thus &amp;quot;(p ⟶ q) ∨ (q ⟶ p)&amp;quot; by auto&lt;br /&gt;
qed  &lt;br /&gt;
&lt;br /&gt;
(* Comentario: Uso de auto. *)&lt;br /&gt;
&lt;br /&gt;
(* danrodcha pablucoto *)&lt;br /&gt;
lemma ej_5:&lt;br /&gt;
  shows &amp;quot;(p ⟶ q) ∨ (q ⟶ p)&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;¬p ∨ p&amp;quot; by (rule excluded_middle)&lt;br /&gt;
  thus &amp;quot;(p ⟶ q) ∨ (q ⟶ p)&amp;quot;&lt;br /&gt;
  proof (rule disjE)&lt;br /&gt;
    { assume &amp;quot;¬p&amp;quot; &lt;br /&gt;
      have &amp;quot;¬q ∨ q&amp;quot; by (rule excluded_middle)&lt;br /&gt;
      thus &amp;quot;(p ⟶ q) ∨ (q ⟶ p)&amp;quot;&lt;br /&gt;
      proof (rule disjE)&lt;br /&gt;
      {assume &amp;quot;¬q&amp;quot;&lt;br /&gt;
        hence &amp;quot;¬p ⟶ ¬q&amp;quot; by (rule impI)&lt;br /&gt;
         { assume &amp;quot;q&amp;quot;&lt;br /&gt;
           hence &amp;quot;¬¬q&amp;quot; by (rule notnotI)&lt;br /&gt;
           with `¬p ⟶ ¬q` have &amp;quot;¬¬p&amp;quot; by (rule mt) &lt;br /&gt;
           hence &amp;quot;p&amp;quot; by (rule notnotD)}&lt;br /&gt;
         hence &amp;quot;q ⟶ p&amp;quot; by (rule impI)&lt;br /&gt;
         thus &amp;quot;(p ⟶ q) ∨ (q ⟶ p)&amp;quot; by (rule disjI2)}&lt;br /&gt;
      next&lt;br /&gt;
      {assume &amp;quot;q&amp;quot;&lt;br /&gt;
        hence &amp;quot;(p ⟶ q)&amp;quot; by (rule impI)&lt;br /&gt;
        thus &amp;quot;(p ⟶ q) ∨ (q ⟶ p)&amp;quot; by (rule disjI1)}&lt;br /&gt;
      qed}&lt;br /&gt;
    next&lt;br /&gt;
    {assume &amp;quot;p&amp;quot;&lt;br /&gt;
     hence &amp;quot;q ⟶ p&amp;quot; by (rule impI)&lt;br /&gt;
     thus &amp;quot;(p ⟶ q) ∨ (q ⟶ p)&amp;quot; by (rule disjI2)}&lt;br /&gt;
    qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* anaprarod *)&lt;br /&gt;
(* Muy parecida a la anterior pero con algunas etiquetas&lt;br /&gt;
   y con algunas implicaciones más detalladas *)&lt;br /&gt;
lemma ejercicio_5_3:&lt;br /&gt;
  shows &amp;quot;(p ⟶ q) ∨ (q ⟶ p)&amp;quot;&lt;br /&gt;
proof-&lt;br /&gt;
  have &amp;quot;¬p ∨ p&amp;quot; by (rule excluded_middle)&lt;br /&gt;
  thus &amp;quot;(p ⟶ q) ∨ (q ⟶ p)&amp;quot;&lt;br /&gt;
  proof (rule disjE)&lt;br /&gt;
    {assume &amp;quot;¬p&amp;quot;&lt;br /&gt;
      have &amp;quot;¬q ∨ q&amp;quot; by (rule excluded_middle)&lt;br /&gt;
      thus &amp;quot;(p ⟶ q) ∨ (q ⟶ p)&amp;quot;&lt;br /&gt;
      proof (rule disjE)&lt;br /&gt;
        {assume  &amp;quot;¬q&amp;quot;&lt;br /&gt;
          hence 1: &amp;quot;¬p ⟶ ¬q&amp;quot; by (rule impI) &lt;br /&gt;
          {assume &amp;quot;q&amp;quot;&lt;br /&gt;
            hence 2: &amp;quot;¬¬q&amp;quot; by (rule notnotI)&lt;br /&gt;
            have &amp;quot;¬¬p&amp;quot; using 1 2 by (rule mt)&lt;br /&gt;
            hence &amp;quot;p&amp;quot; by (rule notnotD)}&lt;br /&gt;
          hence &amp;quot;q ⟶ p&amp;quot; by (rule impI)&lt;br /&gt;
          thus &amp;quot;(p ⟶ q) ∨ (q ⟶ p)&amp;quot; by (rule disjI2)}&lt;br /&gt;
        next&lt;br /&gt;
        {assume 3: &amp;quot;q&amp;quot;&lt;br /&gt;
          {assume &amp;quot;p&amp;quot;&lt;br /&gt;
            have &amp;quot;q&amp;quot; using 3 by this}&lt;br /&gt;
          hence &amp;quot;p ⟶ q&amp;quot; by (rule impI)&lt;br /&gt;
          thus &amp;quot;(p ⟶ q) ∨ (q ⟶ p)&amp;quot; by (rule disjI1)}&lt;br /&gt;
        qed}&lt;br /&gt;
    next&lt;br /&gt;
    {assume 4: &amp;quot;p&amp;quot;&lt;br /&gt;
      {assume &amp;quot;q&amp;quot;&lt;br /&gt;
        have &amp;quot;p&amp;quot; using 4 by this}&lt;br /&gt;
      hence &amp;quot;q ⟶ p&amp;quot; by (rule impI)&lt;br /&gt;
      thus &amp;quot;(p ⟶ q) ∨ (q ⟶ p)&amp;quot; by (rule disjI2)}&lt;br /&gt;
    qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* migtermor *)&lt;br /&gt;
lemma ejercicio_5_4:             &lt;br /&gt;
  shows &amp;quot;(p ⟶ q) ∨ (q ⟶ p)&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
 have 1: &amp;quot;q∨¬q&amp;quot; by (rule lem)&lt;br /&gt;
 moreover &lt;br /&gt;
 {assume 2: &amp;quot;q&amp;quot;   &lt;br /&gt;
  have 3: &amp;quot;p ⟶ q&amp;quot; using 2 by (rule impI)&lt;br /&gt;
  then have 4: &amp;quot;(p ⟶ q) ∨ (q ⟶ p)&amp;quot; by (rule disjI1)}&lt;br /&gt;
 moreover&lt;br /&gt;
 {assume 5: &amp;quot;¬q&amp;quot;   &lt;br /&gt;
  have 6: &amp;quot;¬p⟶¬q&amp;quot; using 5 by (rule impI)&lt;br /&gt;
  then have 7: &amp;quot;q⟶p&amp;quot; by (rule ejercicio_1_2)&lt;br /&gt;
  then have &amp;quot;(p ⟶ q) ∨ (q ⟶ p)&amp;quot; by (rule disjI2)}&lt;br /&gt;
 ultimately show &amp;quot;(p ⟶ q) ∨ (q ⟶ p)&amp;quot; by (rule disjE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* paupeddeg pabrodmac crigomgom bowma *)&lt;br /&gt;
lemma aux3:&lt;br /&gt;
  assumes &amp;quot;¬q ∨ p&amp;quot;&lt;br /&gt;
  shows &amp;quot;q ⟶ p&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
note `¬q ∨ p`&lt;br /&gt;
moreover&lt;br /&gt;
 {assume &amp;quot;¬q&amp;quot;&lt;br /&gt;
   have &amp;quot;q ⟶ p&amp;quot;&lt;br /&gt;
   proof&lt;br /&gt;
    assume &amp;quot;q&amp;quot; &lt;br /&gt;
    show &amp;quot;p&amp;quot; using `¬q``q`by (rule notE)&lt;br /&gt;
    qed} &lt;br /&gt;
moreover&lt;br /&gt;
 {assume &amp;quot;p&amp;quot;&lt;br /&gt;
   have &amp;quot;q ⟶ p&amp;quot;&lt;br /&gt;
   proof&lt;br /&gt;
    assume &amp;quot;q&amp;quot;&lt;br /&gt;
    show &amp;quot;p&amp;quot; using `p` by this&lt;br /&gt;
    qed}&lt;br /&gt;
ultimately show &amp;quot;q ⟶ p&amp;quot; by (rule disjE)&lt;br /&gt;
qed    &lt;br /&gt;
        &lt;br /&gt;
lemma ejercicio_5_5:&lt;br /&gt;
  shows &amp;quot;(p ⟶ q) ∨ (q ⟶ p)&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;¬p ∨ p&amp;quot; by (rule excluded_middle) &lt;br /&gt;
  thus &amp;quot;(p ⟶ q) ∨ (q ⟶ p)&amp;quot;&lt;br /&gt;
  proof&lt;br /&gt;
    {assume &amp;quot;¬p&amp;quot;&lt;br /&gt;
     hence &amp;quot;¬p ∨ q&amp;quot; by (rule disjI1)&lt;br /&gt;
     hence &amp;quot;p ⟶ q&amp;quot; by (rule aux3)&lt;br /&gt;
     thus &amp;quot;(p ⟶ q) ∨ (q ⟶ p)&amp;quot; by (rule disjI1)} &lt;br /&gt;
    {assume &amp;quot;p&amp;quot;&lt;br /&gt;
     hence &amp;quot;¬q ∨ p&amp;quot; by (rule disjI2)&lt;br /&gt;
     hence &amp;quot;q ⟶ p&amp;quot; by (rule aux3)&lt;br /&gt;
     thus &amp;quot;(p ⟶ q) ∨ (q ⟶ p)&amp;quot; by (rule disjI2)} &lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(*pabrodmac*)       &lt;br /&gt;
lemma ejercicio_5_6: &lt;br /&gt;
  &amp;quot;(p ⟶ q) ∨ (q ⟶ p)&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;¬(p ⟶ q) ∨ (p ⟶ q)&amp;quot; by (rule excluded_middle)&lt;br /&gt;
  thus &amp;quot;(p ⟶ q) ∨ (q ⟶ p)&amp;quot;&lt;br /&gt;
  proof &lt;br /&gt;
    { assume &amp;quot;¬(p ⟶ q)&amp;quot;&lt;br /&gt;
      hence &amp;quot;p ∧ ¬ q&amp;quot; by (rule Meson.not_impD)&lt;br /&gt;
      have &amp;quot;(q ⟶ p)&amp;quot;&lt;br /&gt;
      proof&lt;br /&gt;
      assume &amp;quot;q&amp;quot;&lt;br /&gt;
      show &amp;quot;p&amp;quot; using `p ∧ ¬ q` by (rule conjunct1)&lt;br /&gt;
      qed&lt;br /&gt;
      thus &amp;quot;(p ⟶ q) ∨ (q ⟶ p)&amp;quot; by (rule disjI2) }&lt;br /&gt;
  next&lt;br /&gt;
    { assume &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
     then show &amp;quot;(p ⟶ q) ∨ (q ⟶ p)&amp;quot;  by (rule disjI1) }&lt;br /&gt;
  qed&lt;br /&gt;
qed &lt;br /&gt;
&lt;br /&gt;
(* josgarsan *)&lt;br /&gt;
lemma ejercicio_5_7:&lt;br /&gt;
  shows &amp;quot;(p ⟶ q) ∨ (q ⟶ p)&amp;quot;&lt;br /&gt;
proof (cases)&lt;br /&gt;
  assume &amp;quot;p&amp;quot;&lt;br /&gt;
  then show &amp;quot;(p ⟶ q) ∨ (q ⟶ p)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  assume &amp;quot;¬p&amp;quot;&lt;br /&gt;
  then show &amp;quot;(p ⟶ q) ∨ (q ⟶ p)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* Comentario: Uso de simp. *)&lt;br /&gt;
&lt;br /&gt;
(* dancorgar *)&lt;br /&gt;
lemma ejercicio_5_8:&lt;br /&gt;
  shows &amp;quot;(p ⟶ q) ∨ (q ⟶ p)&amp;quot;&lt;br /&gt;
proof (cases)&lt;br /&gt;
  assume &amp;quot;p&amp;quot;&lt;br /&gt;
  have &amp;quot;(q ⟶ p)&amp;quot; using `p` by (rule impI)&lt;br /&gt;
  then show &amp;quot;(p ⟶ q) ∨ (q ⟶ p)&amp;quot; by (rule disjI2)&lt;br /&gt;
next&lt;br /&gt;
  assume &amp;quot;¬p&amp;quot;&lt;br /&gt;
  have &amp;quot;(p ⟶ q)&amp;quot; using `¬p` by simp&lt;br /&gt;
  then show &amp;quot;(p ⟶ q) ∨ (q ⟶ p)&amp;quot; by (rule disjI1)&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>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2016/index.php?title=Relaci%C3%B3n_8&amp;diff=1324</id>
		<title>Relación 8</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2016/index.php?title=Relaci%C3%B3n_8&amp;diff=1324"/>
		<updated>2017-01-19T10:27:27Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: Protegió «Relación 8» ([edit=sysop] (caduca el 10:27 20 ene 2017 (UTC)) [move=sysop] (caduca el 10:27 20 ene 2017 (UTC)))&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
chapter {* R8: Deducción natural proposicional en Isabelle/HOL *}&lt;br /&gt;
&lt;br /&gt;
theory R8_Deduccion_natural_proposicional&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Demostrar o refutar los siguientes lemas usando sólo las reglas&lt;br /&gt;
  básicas de deducción natural de la lógica proposicional, de los&lt;br /&gt;
  cuantificadores 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;
&lt;br /&gt;
  · allI:       ⟦∀x. P x; P x ⟹ R⟧ ⟹ R&lt;br /&gt;
  · allE:       (⋀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⟧ ⟹ a: = 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;
&lt;br /&gt;
text {*&lt;br /&gt;
  Se usarán las reglas notnotI, mt y not_ex que demostramos a 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;
lemma no_ex: &amp;quot;¬(∃x. P(x)) ⟹ ∀x. ¬P(x)&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. Demostrar&lt;br /&gt;
     ¬q ⟶ ¬p ⊢ p ⟶ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
(* marcarmor13 *)&lt;br /&gt;
--&amp;quot;usando un supuesto ¬¬p&amp;quot;&lt;br /&gt;
lemma ejercicio_1:&lt;br /&gt;
 assumes 1: &amp;quot;¬q ⟶ ¬p&amp;quot; and &lt;br /&gt;
         2: &amp;quot;¬¬p&amp;quot;  &lt;br /&gt;
shows &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
 have 3: &amp;quot;¬¬q&amp;quot; using 1 2  by (rule mt)&lt;br /&gt;
 have 4: &amp;quot;q&amp;quot; using 3 by (rule  notnotD)&lt;br /&gt;
 show &amp;quot;p ⟶ q&amp;quot; using 4 by (rule impI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* pablucoto jeamacpov migtermor *)&lt;br /&gt;
lemma ejercicio_1_2:&lt;br /&gt;
  assumes &amp;quot;¬q ⟶ ¬p&amp;quot; &lt;br /&gt;
  shows &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  {assume &amp;quot;p&amp;quot;&lt;br /&gt;
  hence &amp;quot;¬¬p&amp;quot; by (rule notnotI)&lt;br /&gt;
  with `¬q ⟶ ¬p` have &amp;quot;¬¬q&amp;quot; by (rule mt)  &lt;br /&gt;
  hence &amp;quot;q&amp;quot; by (rule notnotD)}&lt;br /&gt;
  then show &amp;quot;p ⟶ q&amp;quot; by (rule impI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* ivamenjim serrodcal anaprarod marpoldia1 manmorjim1 crigomgom juancabsou ferrenseg fraortmoy rubgonmar *)&lt;br /&gt;
lemma ejercicio_1_3:&lt;br /&gt;
  assumes 1: &amp;quot;¬q ⟶ ¬p&amp;quot; &lt;br /&gt;
  shows      &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  {assume 2:&amp;quot;p&amp;quot;&lt;br /&gt;
   then have 3: &amp;quot;¬¬p&amp;quot; by (rule notnotI)&lt;br /&gt;
   have 4: &amp;quot;¬¬q&amp;quot; using 1 3 by (rule mt)&lt;br /&gt;
   then have 5: &amp;quot;q&amp;quot; by (rule notnotD)}&lt;br /&gt;
  thus &amp;quot;p ⟶ q&amp;quot; by (rule impI)&lt;br /&gt;
qed   &lt;br /&gt;
&lt;br /&gt;
(* bowma *)&lt;br /&gt;
lemma ejercicio_1_4:&lt;br /&gt;
 assumes &amp;quot;¬q ⟶ ¬p&amp;quot;&lt;br /&gt;
 shows &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
{assume &amp;quot;p&amp;quot;&lt;br /&gt;
hence &amp;quot;¬¬p&amp;quot; by (rule notnotI)&lt;br /&gt;
with assms have &amp;quot;¬¬q&amp;quot; by (rule mt)&lt;br /&gt;
then have &amp;quot;q&amp;quot; by (rule notnotD)}&lt;br /&gt;
thus &amp;quot;p ⟶ q&amp;quot; by (rule impI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* bowma danrodcha paupeddeg pabrodmac fracorjim1 *)&lt;br /&gt;
&amp;quot;quita la limitación de -&amp;quot;&lt;br /&gt;
lemma ejercicio_1_5:&lt;br /&gt;
 assumes &amp;quot;¬q ⟶ ¬p&amp;quot;&lt;br /&gt;
 shows &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
proof &lt;br /&gt;
assume &amp;quot;p&amp;quot;&lt;br /&gt;
hence &amp;quot;¬¬p&amp;quot; by (rule notnotI)&lt;br /&gt;
with assms have &amp;quot;¬¬q&amp;quot; by (rule mt)&lt;br /&gt;
thus &amp;quot;q&amp;quot; by (rule notnotD)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* josgarsan *)&lt;br /&gt;
lemma ejercicio_1_6:&lt;br /&gt;
assumes 1: &amp;quot;¬q ⟶ ¬p&amp;quot;&lt;br /&gt;
shows &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
proof (cases)&lt;br /&gt;
assume &amp;quot;p&amp;quot;&lt;br /&gt;
then show &amp;quot;p⟶q&amp;quot; using 1 by simp &lt;br /&gt;
next&lt;br /&gt;
assume &amp;quot;¬p&amp;quot;&lt;br /&gt;
then show &amp;quot;p⟶q&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* dancorgar *)&lt;br /&gt;
lemma ejercicio_1_7:&lt;br /&gt;
  assumes &amp;quot;¬q ⟶ ¬p&amp;quot;&lt;br /&gt;
  shows &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
proof-&lt;br /&gt;
  {assume &amp;quot;p&amp;quot;&lt;br /&gt;
   assume &amp;quot;¬q&amp;quot;&lt;br /&gt;
   have &amp;quot;¬p&amp;quot; using assms(1) `¬q` by (rule mp)}&lt;br /&gt;
  thus &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
  apply simp&lt;br /&gt;
  apply (rule ccontr)&lt;br /&gt;
  apply simp&lt;br /&gt;
  done&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Demostrar&lt;br /&gt;
     ¬(¬p ∧ ¬q) ⊢ p ∨ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
(* marcarmor13 *)&lt;br /&gt;
--&amp;quot;usando un supuesto ¬p ∧ ¬q&amp;quot;&lt;br /&gt;
lemma ejercicio_2:&lt;br /&gt;
  assumes 1: &amp;quot;¬(¬p ∧ ¬q)&amp;quot; and&lt;br /&gt;
          2:&amp;quot;¬p ∧ ¬q&amp;quot;       &lt;br /&gt;
  shows &amp;quot;p ∨ q&amp;quot;&lt;br /&gt;
proof-&lt;br /&gt;
  have 3: &amp;quot;p&amp;quot;using 1 2 by (rule notE)&lt;br /&gt;
show &amp;quot;p ∨ q&amp;quot; using 3 by (rule disjI1)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* ivamenjim serrodcal marpoldia1 *)&lt;br /&gt;
lemma ejercicio_2_2:&lt;br /&gt;
  assumes 1: &amp;quot;¬(¬p ∧ ¬q)&amp;quot;&lt;br /&gt;
  shows      &amp;quot;p ∨ q&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
   {assume 2:&amp;quot;(¬p ∧ ¬q)&amp;quot;&lt;br /&gt;
   have &amp;quot;p&amp;quot; using 1 2 by (rule notE)&lt;br /&gt;
   then have &amp;quot;p ∨ q&amp;quot; by (rule disjI1)}&lt;br /&gt;
   thus &amp;quot;p ∨ q&amp;quot; by auto&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* pablucoto jeamacpov *)&lt;br /&gt;
&lt;br /&gt;
lemma aux_ejercicio2:&lt;br /&gt;
  assumes &amp;quot;¬(p ∨ q)&amp;quot;&lt;br /&gt;
  shows &amp;quot;¬p ∧ ¬q&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  {assume &amp;quot;p&amp;quot;&lt;br /&gt;
  hence &amp;quot;p ∨ q&amp;quot; by  (rule disjI1)  &lt;br /&gt;
  with  `¬(p ∨ q)` have &amp;quot;False&amp;quot; by (rule notE)}&lt;br /&gt;
  then show &amp;quot;¬p&amp;quot; ..&lt;br /&gt;
next&lt;br /&gt;
  {assume &amp;quot;q&amp;quot;&lt;br /&gt;
  hence &amp;quot;p ∨ q&amp;quot; by (rule disjI2)&lt;br /&gt;
  with  `¬(p ∨ q)` have &amp;quot;False&amp;quot; by (rule notE)}&lt;br /&gt;
  then show &amp;quot;¬q&amp;quot; ..&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
 lemma ejercicio_2_3:&lt;br /&gt;
  assumes &amp;quot;¬(¬p ∧ ¬q)&amp;quot;&lt;br /&gt;
  shows &amp;quot;p ∨ q&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  {assume 2:&amp;quot;¬(p ∨ q)&amp;quot;  &lt;br /&gt;
  hence &amp;quot;¬p ∧ ¬q&amp;quot; by (rule  aux_ejercicio2)&lt;br /&gt;
  with  `¬(¬p ∧ ¬q)` have &amp;quot;False&amp;quot; ..}&lt;br /&gt;
  then show &amp;quot;p ∨ q&amp;quot; by (rule ccontr)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* danrodcha bowma *)&lt;br /&gt;
lemma ej_2:&lt;br /&gt;
  assumes &amp;quot;¬(¬p ∧ ¬q)&amp;quot;&lt;br /&gt;
  shows &amp;quot;p ∨ q&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;¬p ∨ p&amp;quot; by (rule excluded_middle)&lt;br /&gt;
  thus &amp;quot;p ∨ q&amp;quot;&lt;br /&gt;
  proof (rule disjE)&lt;br /&gt;
    { assume &amp;quot;¬p&amp;quot;&lt;br /&gt;
      have &amp;quot;¬q ∨ q&amp;quot; by (rule excluded_middle)&lt;br /&gt;
      thus &amp;quot;p ∨ q&amp;quot;&lt;br /&gt;
      proof (rule disjE)&lt;br /&gt;
      { assume &amp;quot;¬q&amp;quot;&lt;br /&gt;
        with `¬p` have &amp;quot;¬p ∧ ¬q&amp;quot; by (rule conjI)&lt;br /&gt;
        with assms show &amp;quot;p ∨ q&amp;quot; by (rule notE)}&lt;br /&gt;
      next&lt;br /&gt;
      { assume &amp;quot;q&amp;quot;&lt;br /&gt;
        then show &amp;quot;p ∨ q&amp;quot; by (rule disjI2)}&lt;br /&gt;
      qed}&lt;br /&gt;
    next&lt;br /&gt;
    { assume &amp;quot;p&amp;quot;&lt;br /&gt;
      thus &amp;quot;p ∨ q&amp;quot; by (rule disjI1)}&lt;br /&gt;
    qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(* anaprarod crigomgom juancabsou ferrenseg fraortmoy fracorjim1 rubgonmar *)&lt;br /&gt;
(* Igual que el anterior pero con etiquetas *)&lt;br /&gt;
lemma ejercicio_2_4:&lt;br /&gt;
  assumes 0:  &amp;quot;¬(¬p ∧ ¬q)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;p ∨ q&amp;quot;&lt;br /&gt;
proof-&lt;br /&gt;
  have &amp;quot;¬p ∨ p&amp;quot; by (rule excluded_middle)&lt;br /&gt;
  thus &amp;quot;p ∨ q&amp;quot;&lt;br /&gt;
  proof (rule disjE)&lt;br /&gt;
    {assume 1: &amp;quot;¬p&amp;quot; &lt;br /&gt;
      have &amp;quot;¬q ∨ q&amp;quot; by (rule excluded_middle)&lt;br /&gt;
      thus &amp;quot;p ∨ q&amp;quot;&lt;br /&gt;
      proof (rule disjE)&lt;br /&gt;
        {assume 2: &amp;quot;¬q&amp;quot;&lt;br /&gt;
          have 3: &amp;quot;(¬p ∧ ¬q)&amp;quot; using 1 2 by (rule conjI)&lt;br /&gt;
          have &amp;quot;p ∨ q&amp;quot; using 0 3 by (rule notE)&lt;br /&gt;
          thus &amp;quot;p ∨ q&amp;quot; by this}&lt;br /&gt;
        next&lt;br /&gt;
        {assume 4: &amp;quot;q&amp;quot;&lt;br /&gt;
          have &amp;quot;p ∨ q&amp;quot; using 4 by (rule disjI2)&lt;br /&gt;
          thus &amp;quot;p ∨ q&amp;quot; by this}&lt;br /&gt;
        qed}&lt;br /&gt;
    next&lt;br /&gt;
    {assume 5: &amp;quot;p&amp;quot;&lt;br /&gt;
      have &amp;quot;p ∨ q&amp;quot; using 5 by (rule disjI1)&lt;br /&gt;
      thus &amp;quot;p ∨ q&amp;quot; by this}&lt;br /&gt;
   qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* migtermor *)&lt;br /&gt;
&lt;br /&gt;
lemma lem:&lt;br /&gt;
 shows &amp;quot;p∨¬p&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
 {assume 1: &amp;quot;¬(p∨¬p)&amp;quot;&lt;br /&gt;
  {assume 2: &amp;quot;p&amp;quot;&lt;br /&gt;
   then have 3: &amp;quot;p∨¬p&amp;quot; by (rule disjI1)&lt;br /&gt;
   also have 4: &amp;quot;False&amp;quot; using 1 3 by (rule notE)}&lt;br /&gt;
  then have 5: &amp;quot;¬p&amp;quot; by (rule notI)&lt;br /&gt;
  then have 6: &amp;quot;p∨¬p&amp;quot; by (rule disjI2)&lt;br /&gt;
  also have 7: &amp;quot;False&amp;quot; using 1 6 by (rule notE)}&lt;br /&gt;
 thus &amp;quot;p∨¬p&amp;quot; by (rule ccontr)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_2_5:&lt;br /&gt;
 assumes 1: &amp;quot;¬(¬p∧¬q)&amp;quot;&lt;br /&gt;
 shows &amp;quot;p∨q&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
 have 2: &amp;quot;p∨¬p&amp;quot; by (rule lem)&lt;br /&gt;
 moreover&lt;br /&gt;
 {assume 3: p &lt;br /&gt;
  then have 4: &amp;quot;p∨q&amp;quot; by (rule disjI1)}&lt;br /&gt;
 moreover&lt;br /&gt;
 {assume 6: &amp;quot;¬p&amp;quot;&lt;br /&gt;
  {assume 7: &amp;quot;¬q&amp;quot;&lt;br /&gt;
   also have 8: &amp;quot;¬p∧¬q&amp;quot; using 6 7 by (rule conjI)&lt;br /&gt;
   have 9: &amp;quot;False&amp;quot; using 1 8 by (rule notE)}&lt;br /&gt;
  then have 10: &amp;quot;q&amp;quot; by (rule ccontr)&lt;br /&gt;
  then have 11: &amp;quot;p∨q&amp;quot; by (rule disjI2)}&lt;br /&gt;
 ultimately show &amp;quot;p∨q&amp;quot; by (rule disjE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* paupeddeg pabrodmac *)&lt;br /&gt;
&lt;br /&gt;
lemma aux1:&lt;br /&gt;
  assumes &amp;quot;¬(p ∧ q)&amp;quot;&lt;br /&gt;
  shows &amp;quot;¬p ∨ ¬q&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;¬p ∨ p&amp;quot; by (rule excluded_middle)&lt;br /&gt;
  thus &amp;quot;¬p ∨ ¬q&amp;quot;&lt;br /&gt;
  proof&lt;br /&gt;
    {assume &amp;quot;¬p&amp;quot;&lt;br /&gt;
    thus &amp;quot;¬p ∨ ¬q&amp;quot; by (rule disjI1)}&lt;br /&gt;
    next&lt;br /&gt;
    {assume &amp;quot;p&amp;quot;&lt;br /&gt;
      have &amp;quot;¬q&amp;quot;&lt;br /&gt;
      proof&lt;br /&gt;
      {assume &amp;quot;q&amp;quot;&lt;br /&gt;
      have &amp;quot;(p ∧ q)&amp;quot; using `p` `q`  by (rule conjI)&lt;br /&gt;
      show &amp;quot;False&amp;quot;  using `¬(p ∧ q)` `p ∧ q` by (rule notE)}&lt;br /&gt;
      qed&lt;br /&gt;
      thus &amp;quot;¬p ∨ ¬q&amp;quot; by (rule disjI2)}&lt;br /&gt;
      qed&lt;br /&gt;
qed&lt;br /&gt;
  &lt;br /&gt;
lemma ejercicio_2_5:&lt;br /&gt;
  assumes &amp;quot;¬(¬p ∧ ¬q)&amp;quot;&lt;br /&gt;
  shows &amp;quot;p ∨ q&amp;quot; &lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;¬¬p ∨ ¬¬q&amp;quot; using assms  by (rule aux1)&lt;br /&gt;
  moreover&lt;br /&gt;
  {assume &amp;quot;¬¬p&amp;quot;&lt;br /&gt;
    hence &amp;quot;p&amp;quot; by (rule notnotD)&lt;br /&gt;
    hence &amp;quot;p ∨ q&amp;quot; by (rule disjI1) }&lt;br /&gt;
  moreover&lt;br /&gt;
  {assume &amp;quot;¬¬q&amp;quot;&lt;br /&gt;
    hence &amp;quot;q&amp;quot; by (rule notnotD)&lt;br /&gt;
    hence &amp;quot;p ∨ q&amp;quot; by (rule disjI2) }&lt;br /&gt;
  ultimately show &amp;quot;p ∨ q&amp;quot; by (rule disjE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(*pabrodmac*)&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_2_6:&lt;br /&gt;
assumes &amp;quot;¬(¬p ∧ ¬q)&amp;quot;&lt;br /&gt;
          &lt;br /&gt;
  shows &amp;quot;p ∨ q&amp;quot;     &lt;br /&gt;
proof -&lt;br /&gt;
have &amp;quot;¬¬p ∨ ¬¬q&amp;quot; using assms by (rule Meson.not_conjD)&lt;br /&gt;
  moreover&lt;br /&gt;
  { assume &amp;quot;¬¬p&amp;quot;&lt;br /&gt;
    hence &amp;quot;p&amp;quot; by (rule notnotD)&lt;br /&gt;
    hence &amp;quot;p ∨ q&amp;quot; by (rule disjI1) }&lt;br /&gt;
  moreover&lt;br /&gt;
  { assume &amp;quot;¬¬q&amp;quot;&lt;br /&gt;
    then have &amp;quot;q&amp;quot; by (rule notnotD)&lt;br /&gt;
    hence &amp;quot;p ∨ q&amp;quot; by (rule disjI2) }&lt;br /&gt;
  ultimately show &amp;quot;p ∨ q&amp;quot; by (rule disjE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* dancorgar *)&lt;br /&gt;
lemma ejercicio_2_7:&lt;br /&gt;
  assumes &amp;quot;¬(¬p ∧ ¬q)&amp;quot;&lt;br /&gt;
  shows &amp;quot;p ∨ q&amp;quot;&lt;br /&gt;
proof-&lt;br /&gt;
  {assume &amp;quot;(¬p ∧ ¬q)&amp;quot;&lt;br /&gt;
   have &amp;quot;p&amp;quot; using assms `(¬p ∧ ¬q)` by (rule notE)&lt;br /&gt;
   then have &amp;quot;p ∨ q&amp;quot;  by (rule disjI1)}&lt;br /&gt;
  then show &amp;quot;p ∨ q&amp;quot;&lt;br /&gt;
  apply simp&lt;br /&gt;
  apply (rule ccontr)&lt;br /&gt;
  apply simp&lt;br /&gt;
  done&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* josgarsan *)&lt;br /&gt;
lemma ejercicio_2_8:&lt;br /&gt;
assumes 1: &amp;quot; ¬(¬p ∧ ¬q)&amp;quot;&lt;br /&gt;
shows &amp;quot;p ∨ q&amp;quot;&lt;br /&gt;
proof (cases)&lt;br /&gt;
assume &amp;quot;p&amp;quot;&lt;br /&gt;
then show &amp;quot;p ∨ q&amp;quot; using disjI1 by simp&lt;br /&gt;
next&lt;br /&gt;
assume &amp;quot;¬p&amp;quot;&lt;br /&gt;
then have &amp;quot;q&amp;quot; using 1 conjunct2 by simp&lt;br /&gt;
then show &amp;quot;p ∨ q&amp;quot; using disjI2 by simp&lt;br /&gt;
qed   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. Demostrar&lt;br /&gt;
     ¬(¬p ∨ ¬q) ⊢ p ∧ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
(* marcarmor13 serrodcal marpoldia1 *)&lt;br /&gt;
--&amp;quot;usando un supuesto ¬p ∨ ¬q&amp;quot;&lt;br /&gt;
lemma ejercicio_3:&lt;br /&gt;
  assumes 1: &amp;quot;¬(¬p ∨ ¬q)&amp;quot; and&lt;br /&gt;
          2:&amp;quot;¬p ∨ ¬q&amp;quot;       &lt;br /&gt;
  shows &amp;quot;p ∧ q&amp;quot;&lt;br /&gt;
proof-&lt;br /&gt;
  have 3: &amp;quot;p&amp;quot;using 1 2 by (rule notE)&lt;br /&gt;
  have 4: &amp;quot;q&amp;quot;using 1 2 by (rule notE)&lt;br /&gt;
show &amp;quot;p ∧ q&amp;quot; using 3 4 by (rule conjI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* pablucoto jeamacpov *)&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_3_2:  &lt;br /&gt;
  assumes &amp;quot;¬(¬p ∨ ¬q)&amp;quot;&lt;br /&gt;
  shows &amp;quot;p ∧ q&amp;quot;&lt;br /&gt;
proof  &lt;br /&gt;
  have &amp;quot;¬¬p ∧ ¬¬q&amp;quot; using assms(1) by (rule  aux_ejercicio2)  &lt;br /&gt;
  hence &amp;quot;¬¬p&amp;quot;  by (rule conjunct1)&lt;br /&gt;
  show &amp;quot;p&amp;quot; using `¬¬p` by (rule notnotD)&lt;br /&gt;
next &lt;br /&gt;
  have &amp;quot;¬¬p ∧ ¬¬q&amp;quot; using assms(1) by (rule  aux_ejercicio2)  &lt;br /&gt;
  have &amp;quot;¬¬q&amp;quot; using `¬¬p ∧ ¬¬q`  by (rule conjunct2) &lt;br /&gt;
  show &amp;quot;q&amp;quot; using `¬¬q` by (rule notnotD)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* ivamenjim *)&lt;br /&gt;
lemma aux: &amp;quot;¬(p ∨ q) ⟹ ¬p ∧ ¬q&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_3_3:&lt;br /&gt;
  assumes 1: &amp;quot;¬(¬p ∨ ¬q)&amp;quot;&lt;br /&gt;
  shows &amp;quot;p ∧ q&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  have 2: &amp;quot;¬¬p ∧ ¬¬q&amp;quot; using 1 by (rule aux)&lt;br /&gt;
  have 3: &amp;quot;¬¬p&amp;quot; using 2 ..&lt;br /&gt;
  have 4: &amp;quot;¬¬q&amp;quot; using 2 ..&lt;br /&gt;
  show &amp;quot;p&amp;quot; using 3 by (rule notnotD)&lt;br /&gt;
  show &amp;quot;q&amp;quot; using 4 by (rule notnotD)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* danrodcha migtermor bowma *)&lt;br /&gt;
lemma ej_3:&lt;br /&gt;
  assumes &amp;quot;¬(¬p ∨ ¬q)&amp;quot;&lt;br /&gt;
  shows &amp;quot;p ∧ q&amp;quot;&lt;br /&gt;
  proof (rule conjI)&lt;br /&gt;
  { assume &amp;quot;¬p&amp;quot;&lt;br /&gt;
    hence &amp;quot;¬p ∨ ¬q&amp;quot; by (rule disjI1)&lt;br /&gt;
    with assms have False by (rule notE)}&lt;br /&gt;
  then show &amp;quot;p&amp;quot; by (rule ccontr)&lt;br /&gt;
  { assume &amp;quot;¬q&amp;quot;&lt;br /&gt;
    hence &amp;quot;¬p ∨ ¬q&amp;quot; by (rule disjI2)&lt;br /&gt;
    with assms have False by (rule notE)}&lt;br /&gt;
  then show &amp;quot;q&amp;quot; by (rule ccontr)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* anaprarod crigomgom juancabsou ferrenseg fraortmoy fracorjim1 rubgonmar *)&lt;br /&gt;
(* Igual que el anterior pero con etiquetas *)&lt;br /&gt;
lemma ejercicio_3_4:&lt;br /&gt;
  assumes &amp;quot;¬(¬p ∨ ¬q)&amp;quot;&lt;br /&gt;
  shows &amp;quot;p ∧ q&amp;quot;&lt;br /&gt;
proof (rule conjI)  &lt;br /&gt;
  {assume 1: &amp;quot;¬p&amp;quot;&lt;br /&gt;
    hence 2: &amp;quot;¬p ∨ ¬q&amp;quot; by (rule disjI1)&lt;br /&gt;
    have &amp;quot;False&amp;quot; using assms 2 by (rule notE)}&lt;br /&gt;
  thus 3: &amp;quot;p&amp;quot; by (rule ccontr)&lt;br /&gt;
  {assume 4: &amp;quot;¬q&amp;quot;&lt;br /&gt;
    hence 5: &amp;quot;¬p ∨ ¬q&amp;quot; by (rule disjI2)&lt;br /&gt;
    have &amp;quot;False&amp;quot; using assms 5 by (rule notE)}&lt;br /&gt;
  thus 6: &amp;quot;q&amp;quot; by (rule ccontr)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* paupeddeg pabrodmac *)&lt;br /&gt;
&lt;br /&gt;
lemma aux2:&lt;br /&gt;
  assumes &amp;quot;¬(p ∨ q)&amp;quot;&lt;br /&gt;
  shows &amp;quot;¬p ∧ ¬q&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;¬p ∨ p&amp;quot; by (rule excluded_middle)&lt;br /&gt;
  thus &amp;quot;¬p ∧ ¬q&amp;quot;&lt;br /&gt;
  proof&lt;br /&gt;
    {assume &amp;quot;¬p&amp;quot; &lt;br /&gt;
      have &amp;quot;¬q ∨ q&amp;quot; by (rule excluded_middle)&lt;br /&gt;
      thus &amp;quot;¬p ∧ ¬q&amp;quot;&lt;br /&gt;
      proof&lt;br /&gt;
        {assume &amp;quot;¬q&amp;quot;&lt;br /&gt;
          show &amp;quot;¬p ∧ ¬q&amp;quot; using `¬p` `¬q` by (rule conjI)}  &lt;br /&gt;
        {assume &amp;quot;q&amp;quot;&lt;br /&gt;
           hence &amp;quot;(p ∨ q)&amp;quot;  by (rule disjI2)&lt;br /&gt;
           have &amp;quot;False&amp;quot;  using `¬(p ∨ q)` `p ∨ q` by (rule notE)&lt;br /&gt;
           thus &amp;quot;¬p ∧ ¬q&amp;quot; by (rule FalseE) }&lt;br /&gt;
         qed}&lt;br /&gt;
    {assume &amp;quot;p&amp;quot;&lt;br /&gt;
        hence &amp;quot;(p ∨ q)&amp;quot;  by (rule disjI1)&lt;br /&gt;
        have &amp;quot;False&amp;quot;  using `¬(p ∨ q)` `p ∨ q` by (rule notE) &lt;br /&gt;
        thus &amp;quot;¬p ∧ ¬q&amp;quot; by (rule FalseE) }&lt;br /&gt;
qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
      &lt;br /&gt;
lemma ejercicio_3_5:&lt;br /&gt;
  assumes  &amp;quot;¬(¬p ∨ ¬q)&amp;quot;&lt;br /&gt;
  shows &amp;quot;p ∧ q&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;¬¬p ∧ ¬¬q&amp;quot; using assms by (rule aux2)&lt;br /&gt;
  hence &amp;quot;¬¬p&amp;quot; by (rule conjunct1)&lt;br /&gt;
  hence &amp;quot;p&amp;quot; by (rule notnotD)&lt;br /&gt;
  have &amp;quot;¬¬q&amp;quot; using `¬¬p ∧ ¬¬q` by (rule conjunct2)&lt;br /&gt;
  hence &amp;quot;q&amp;quot; by (rule notnotD) &lt;br /&gt;
  show  &amp;quot;p ∧ q&amp;quot; using  `p` `q` by (rule conjI) &lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* pabrodmac *)&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_3_6:&lt;br /&gt;
assumes &amp;quot;¬(¬p ∨ ¬q)&amp;quot;&lt;br /&gt;
          &lt;br /&gt;
  shows &amp;quot;p ∧ q&amp;quot; &lt;br /&gt;
proof &lt;br /&gt;
  have &amp;quot;¬¬p ∧ ¬¬q&amp;quot; using assms by (rule Meson.not_disjD)&lt;br /&gt;
  hence &amp;quot;¬¬p&amp;quot;  by (rule conjunct1)&lt;br /&gt;
  show &amp;quot;p&amp;quot; using `¬¬p` by (rule notnotD)&lt;br /&gt;
  next&lt;br /&gt;
  have &amp;quot;¬¬p ∧ ¬¬q&amp;quot; using assms by (rule Meson.not_disjD)&lt;br /&gt;
  hence &amp;quot;¬¬q&amp;quot;  by (rule conjunct2)&lt;br /&gt;
  show &amp;quot;q&amp;quot; using `¬¬q` by (rule notnotD)&lt;br /&gt;
qed   &lt;br /&gt;
&lt;br /&gt;
(* pabrodmac *)&lt;br /&gt;
lemma ejercicio_3_7:&lt;br /&gt;
assumes &amp;quot;¬(¬p ∨ ¬q)&amp;quot;&lt;br /&gt;
          &lt;br /&gt;
  shows &amp;quot;p ∧ q&amp;quot; &lt;br /&gt;
proof &lt;br /&gt;
  have &amp;quot;¬¬p ∧ ¬¬q&amp;quot; using assms by (rule Meson.not_disjD)&lt;br /&gt;
  have &amp;quot;¬¬p&amp;quot; using `¬¬p ∧ ¬¬q`  by (rule conjunct1)&lt;br /&gt;
  have &amp;quot;¬¬q&amp;quot; using `¬¬p ∧ ¬¬q`  by (rule conjunct2)&lt;br /&gt;
  show &amp;quot;p&amp;quot; using `¬¬p` by (rule notnotD)&lt;br /&gt;
  show &amp;quot;q&amp;quot; using `¬¬q` by (rule notnotD)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* dancorgar *)&lt;br /&gt;
lemma ejercicio_3_8:&lt;br /&gt;
  assumes &amp;quot;¬(¬p ∨ ¬q)&amp;quot;&lt;br /&gt;
  shows &amp;quot;p ∧ q&amp;quot;&lt;br /&gt;
proof-&lt;br /&gt;
  {assume &amp;quot;(¬p ∨ ¬q)&amp;quot;&lt;br /&gt;
   have &amp;quot;p&amp;quot; using assms `(¬p ∨ ¬q)` by (rule notE)&lt;br /&gt;
   have &amp;quot;q&amp;quot; using assms `(¬p ∨ ¬q)` by (rule notE)&lt;br /&gt;
   have &amp;quot;p ∧ q&amp;quot; using `p` `q`  by (rule conjI)}&lt;br /&gt;
  then show &amp;quot;p ∧ q&amp;quot;&lt;br /&gt;
  apply simp&lt;br /&gt;
  apply (rule ccontr)&lt;br /&gt;
  apply simp&lt;br /&gt;
  done&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* josgarsan *)&lt;br /&gt;
lemma ejercicio_3_9:&lt;br /&gt;
assumes 1: &amp;quot;¬(¬p ∨ ¬q)&amp;quot;&lt;br /&gt;
shows   &amp;quot;p ∧ q&amp;quot;&lt;br /&gt;
proof (rule ccontr)&lt;br /&gt;
assume &amp;quot;¬(p ∧ q)&amp;quot;&lt;br /&gt;
then show False using 1 by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Demostrar&lt;br /&gt;
     ¬(p ∧ q) ⊢ ¬p ∨ ¬q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
(* marcarmor13 serrodcal *)&lt;br /&gt;
--&amp;quot;usando un supuesto p ∧ q&amp;quot;&lt;br /&gt;
 lemma ejercicio_4_1:&lt;br /&gt;
  assumes 1: &amp;quot; ¬(p ∧ q)&amp;quot; and&lt;br /&gt;
          2:&amp;quot;p ∧ q&amp;quot;       &lt;br /&gt;
  shows &amp;quot;¬p ∨ ¬q&amp;quot;&lt;br /&gt;
proof-&lt;br /&gt;
  have 3: &amp;quot;¬p&amp;quot;using 1 2 by (rule notE)&lt;br /&gt;
show &amp;quot;¬p ∨ ¬q&amp;quot; using 3  by (rule disjI1)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* ivamenjim marpoldia1 ferrenseg fraortmoy rubgonmar *)&lt;br /&gt;
lemma ejercicio_4_2:&lt;br /&gt;
  assumes 1: &amp;quot;¬(p ∧ q)&amp;quot;&lt;br /&gt;
  shows      &amp;quot;¬p ∨ ¬q&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
   {assume 2:&amp;quot;(p ∧ q)&amp;quot;&lt;br /&gt;
   have &amp;quot;¬p&amp;quot; using 1 2 by (rule notE)&lt;br /&gt;
   then have &amp;quot;¬p ∨ ¬q&amp;quot; by (rule disjI1)}&lt;br /&gt;
   thus &amp;quot;¬p ∨ ¬q&amp;quot; by auto&lt;br /&gt;
qed  &lt;br /&gt;
&lt;br /&gt;
( * pablucoto jeamacpov crigomgom juancabsou *)&lt;br /&gt;
lemma ejercicio_4_3:&lt;br /&gt;
  assumes  &amp;quot; ¬(p ∧ q)&amp;quot;&lt;br /&gt;
  shows    &amp;quot; ¬p ∨ ¬q&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
{ assume 2: &amp;quot;¬(¬p ∨ ¬q)&amp;quot;&lt;br /&gt;
 hence &amp;quot;p ∧ q&amp;quot; by (rule ejercicio_3_2)  &lt;br /&gt;
 with assms(1) have  &amp;quot;False&amp;quot; .. } &lt;br /&gt;
 then show &amp;quot; ¬p ∨ ¬q&amp;quot; by (rule ccontr)&lt;br /&gt;
 qed&lt;br /&gt;
&lt;br /&gt;
(*danrodcha anaprarod bowma *)&lt;br /&gt;
lemma ej_4:&lt;br /&gt;
  assumes &amp;quot;¬(p ∧ q)&amp;quot;&lt;br /&gt;
  shows &amp;quot;¬p ∨ ¬q&amp;quot;&lt;br /&gt;
  proof (rule ccontr)&lt;br /&gt;
    assume &amp;quot;¬ (¬ p ∨ ¬ q)&amp;quot;&lt;br /&gt;
    hence &amp;quot;p ∧ q&amp;quot; by (rule ej_3)&lt;br /&gt;
    with assms show False  by (rule notE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* anaprarod *)&lt;br /&gt;
(* sin usar el ejercicio anterior *)&lt;br /&gt;
lemma ejercicio_4_4: &lt;br /&gt;
  assumes &amp;quot;¬(p ∧ q)&amp;quot;&lt;br /&gt;
  shows &amp;quot;¬p ∨ ¬q&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;¬p ∨ p&amp;quot; by (rule excluded_middle)&lt;br /&gt;
  thus &amp;quot;¬p ∨ ¬q&amp;quot;&lt;br /&gt;
  proof (rule disjE)&lt;br /&gt;
    {assume &amp;quot;¬p&amp;quot;&lt;br /&gt;
      thus &amp;quot;¬p ∨ ¬q&amp;quot; by (rule disjI1)}&lt;br /&gt;
    next&lt;br /&gt;
    {assume 1:&amp;quot;p&amp;quot;&lt;br /&gt;
      have &amp;quot;¬q ∨ q&amp;quot; by (rule excluded_middle)&lt;br /&gt;
      thus &amp;quot;¬p ∨ ¬q&amp;quot;&lt;br /&gt;
      proof (rule disjE)&lt;br /&gt;
        {assume &amp;quot;¬q&amp;quot;&lt;br /&gt;
          thus &amp;quot;¬p ∨ ¬q&amp;quot; by (rule disjI2)}&lt;br /&gt;
        next&lt;br /&gt;
        {assume 2:&amp;quot;q&amp;quot;&lt;br /&gt;
          have 3:&amp;quot;p ∧ q&amp;quot; using 1 2 by (rule conjI)&lt;br /&gt;
          have &amp;quot;¬p ∨ ¬q&amp;quot; using assms 3 by (rule notE)&lt;br /&gt;
          thus &amp;quot;¬p ∨ ¬q&amp;quot; by this}&lt;br /&gt;
      qed}&lt;br /&gt;
   qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* migtermor *)&lt;br /&gt;
lemma ejercicio_4_5:&lt;br /&gt;
 assumes 1: &amp;quot;¬(p∧q)&amp;quot;&lt;br /&gt;
 shows &amp;quot;¬p∨¬q&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
 have 2: &amp;quot;p∨¬p&amp;quot; by (rule lem)&lt;br /&gt;
 moreover&lt;br /&gt;
 {assume 3: &amp;quot;p&amp;quot; &lt;br /&gt;
  {assume 4: &amp;quot;q&amp;quot;&lt;br /&gt;
   also have 5: &amp;quot;p∧q&amp;quot; using 3 4 by (rule conjI)&lt;br /&gt;
   have 6: &amp;quot;False&amp;quot; using assms 5 by (rule notE)}&lt;br /&gt;
  then have 7: &amp;quot;¬q&amp;quot; by (rule notI)&lt;br /&gt;
  then have 8: &amp;quot;¬p∨¬q&amp;quot; by (rule disjI2)}&lt;br /&gt;
 moreover&lt;br /&gt;
 {assume 9: &amp;quot;¬p&amp;quot;&lt;br /&gt;
  then have &amp;quot;¬p∨¬q&amp;quot; by (rule disjI1)}&lt;br /&gt;
 ultimately show &amp;quot;¬p∨¬q&amp;quot; by (rule disjE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* paupeddeg pabrodmac*)&lt;br /&gt;
lemma ejercicio_4_6:&lt;br /&gt;
  assumes &amp;quot;¬(p ∧ q)&amp;quot;&lt;br /&gt;
  shows &amp;quot;¬p ∨ ¬q&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;¬p ∨ p&amp;quot; by (rule excluded_middle)&lt;br /&gt;
  thus &amp;quot;¬p ∨ ¬q&amp;quot;&lt;br /&gt;
  proof&lt;br /&gt;
    {assume &amp;quot;¬p&amp;quot;&lt;br /&gt;
    thus &amp;quot;¬p ∨ ¬q&amp;quot; by (rule disjI1)}&lt;br /&gt;
    next&lt;br /&gt;
    {assume &amp;quot;p&amp;quot;&lt;br /&gt;
      have &amp;quot;¬q&amp;quot;&lt;br /&gt;
      proof&lt;br /&gt;
      {assume &amp;quot;q&amp;quot;&lt;br /&gt;
      have &amp;quot;(p ∧ q)&amp;quot; using `p` `q`  by (rule conjI)&lt;br /&gt;
      show &amp;quot;False&amp;quot;  using `¬(p ∧ q)` `p ∧ q` by (rule notE)}&lt;br /&gt;
      qed&lt;br /&gt;
      thus &amp;quot;¬p ∨ ¬q&amp;quot; by (rule disjI2)}&lt;br /&gt;
      qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* pabrodmac*)&lt;br /&gt;
lemma ejercicio_4_7:&lt;br /&gt;
assumes &amp;quot;¬(p ∧ q)&amp;quot;&lt;br /&gt;
          &lt;br /&gt;
  shows &amp;quot;¬p ∨ ¬q&amp;quot; &lt;br /&gt;
proof -&lt;br /&gt;
  show &amp;quot;¬p ∨ ¬q&amp;quot; using assms by (rule Meson.not_conjD)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* dancorgar *)&lt;br /&gt;
lemma ejercicio_4_8:&lt;br /&gt;
  assumes &amp;quot;¬(p ∧ q)&amp;quot;&lt;br /&gt;
  shows &amp;quot;¬p ∨ ¬q&amp;quot;&lt;br /&gt;
proof-&lt;br /&gt;
  {assume &amp;quot;(p ∧ q)&amp;quot;&lt;br /&gt;
   have &amp;quot;¬p&amp;quot; using assms `(p ∧ q)` by (rule notE)&lt;br /&gt;
   then have &amp;quot;¬p ∨ ¬q&amp;quot;  by (rule disjI1)}&lt;br /&gt;
  then show &amp;quot;¬p ∨ ¬q&amp;quot;&lt;br /&gt;
  apply simp&lt;br /&gt;
  apply (rule ccontr)&lt;br /&gt;
  apply simp&lt;br /&gt;
  done&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* josgarsan *)&lt;br /&gt;
lemma ejercicio_4:&lt;br /&gt;
assumes 1: &amp;quot;¬(p ∧ q)&amp;quot;&lt;br /&gt;
shows &amp;quot;¬p ∨ ¬q&amp;quot;&lt;br /&gt;
proof (rule ccontr)&lt;br /&gt;
assume &amp;quot;¬(¬ p ∨ ¬ q)&amp;quot;&lt;br /&gt;
then show False using 1 by simp&lt;br /&gt;
qed   &lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. Demostrar&lt;br /&gt;
     ⊢ (p ⟶ q) ∨ (q ⟶ p)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
(* marcarmor13 jeamacpov serrodcal juancabsou *)&lt;br /&gt;
--&amp;quot;usando un supuesto q&amp;quot;&lt;br /&gt;
lemma ejercicio_5_1:&lt;br /&gt;
  assumes 1: &amp;quot;q&amp;quot; &lt;br /&gt;
               &lt;br /&gt;
  shows &amp;quot;(p ⟶ q) ∨ (q ⟶ p)&amp;quot;&lt;br /&gt;
proof-&lt;br /&gt;
  have 2: &amp;quot;p ⟶ q&amp;quot; using 1 by (rule impI)&lt;br /&gt;
show &amp;quot;(p ⟶ q) ∨ (q ⟶ p)&amp;quot; using 2  by (rule disjI1)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* ivamenjim marpoldia1 ferrenseg fraortmoy rubgonmar *)&lt;br /&gt;
lemma ejercicio_5_2:&lt;br /&gt;
  shows &amp;quot;(p ⟶ q) ∨ (q ⟶ p)&amp;quot;     &lt;br /&gt;
proof -&lt;br /&gt;
  {assume 1:&amp;quot;q&amp;quot;&lt;br /&gt;
   have &amp;quot;(p ⟶ q)&amp;quot; using 1 by (rule impI)&lt;br /&gt;
   then have &amp;quot;(p ⟶ q) ∨ (q ⟶ p)&amp;quot; by (rule disjI1)}&lt;br /&gt;
   thus &amp;quot;(p ⟶ q) ∨ (q ⟶ p)&amp;quot; by auto&lt;br /&gt;
qed  &lt;br /&gt;
&lt;br /&gt;
(* danrodcha pablucoto *)&lt;br /&gt;
lemma ej_5:&lt;br /&gt;
  shows &amp;quot;(p ⟶ q) ∨ (q ⟶ p)&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
  have &amp;quot;¬p ∨ p&amp;quot; by (rule excluded_middle)&lt;br /&gt;
  thus &amp;quot;(p ⟶ q) ∨ (q ⟶ p)&amp;quot;&lt;br /&gt;
  proof (rule disjE)&lt;br /&gt;
    { assume &amp;quot;¬p&amp;quot; &lt;br /&gt;
      have &amp;quot;¬q ∨ q&amp;quot; by (rule excluded_middle)&lt;br /&gt;
      thus &amp;quot;(p ⟶ q) ∨ (q ⟶ p)&amp;quot;&lt;br /&gt;
      proof (rule disjE)&lt;br /&gt;
      {assume &amp;quot;¬q&amp;quot;&lt;br /&gt;
        hence &amp;quot;¬p ⟶ ¬q&amp;quot; by (rule impI)&lt;br /&gt;
         { assume &amp;quot;q&amp;quot;&lt;br /&gt;
           hence &amp;quot;¬¬q&amp;quot; by (rule notnotI)&lt;br /&gt;
           with `¬p ⟶ ¬q` have &amp;quot;¬¬p&amp;quot; by (rule mt) &lt;br /&gt;
           hence &amp;quot;p&amp;quot; by (rule notnotD)}&lt;br /&gt;
         hence &amp;quot;q ⟶ p&amp;quot; by (rule impI)&lt;br /&gt;
         thus &amp;quot;(p ⟶ q) ∨ (q ⟶ p)&amp;quot; by (rule disjI2)}&lt;br /&gt;
      next&lt;br /&gt;
      {assume &amp;quot;q&amp;quot;&lt;br /&gt;
        hence &amp;quot;(p ⟶ q)&amp;quot; by (rule impI)&lt;br /&gt;
        thus &amp;quot;(p ⟶ q) ∨ (q ⟶ p)&amp;quot; by (rule disjI1)}&lt;br /&gt;
      qed}&lt;br /&gt;
    next&lt;br /&gt;
    {assume &amp;quot;p&amp;quot;&lt;br /&gt;
     hence &amp;quot;q ⟶ p&amp;quot; by (rule impI)&lt;br /&gt;
     thus &amp;quot;(p ⟶ q) ∨ (q ⟶ p)&amp;quot; by (rule disjI2)}&lt;br /&gt;
    qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* anaprarod *)&lt;br /&gt;
(* Muy parecida a la anterior pero con algunas etiquetas&lt;br /&gt;
   y con algunas implicaciones más detalladas *)&lt;br /&gt;
lemma ejercicio_5_3:&lt;br /&gt;
  shows &amp;quot;(p ⟶ q) ∨ (q ⟶ p)&amp;quot;&lt;br /&gt;
proof-&lt;br /&gt;
  have &amp;quot;¬p ∨ p&amp;quot; by (rule excluded_middle)&lt;br /&gt;
  thus &amp;quot;(p ⟶ q) ∨ (q ⟶ p)&amp;quot;&lt;br /&gt;
  proof (rule disjE)&lt;br /&gt;
    {assume &amp;quot;¬p&amp;quot;&lt;br /&gt;
      have &amp;quot;¬q ∨ q&amp;quot; by (rule excluded_middle)&lt;br /&gt;
      thus &amp;quot;(p ⟶ q) ∨ (q ⟶ p)&amp;quot;&lt;br /&gt;
      proof (rule disjE)&lt;br /&gt;
        {assume  &amp;quot;¬q&amp;quot;&lt;br /&gt;
          hence 1: &amp;quot;¬p ⟶ ¬q&amp;quot; by (rule impI) &lt;br /&gt;
          {assume &amp;quot;q&amp;quot;&lt;br /&gt;
            hence 2: &amp;quot;¬¬q&amp;quot; by (rule notnotI)&lt;br /&gt;
            have &amp;quot;¬¬p&amp;quot; using 1 2 by (rule mt)&lt;br /&gt;
            hence &amp;quot;p&amp;quot; by (rule notnotD)}&lt;br /&gt;
          hence &amp;quot;q ⟶ p&amp;quot; by (rule impI)&lt;br /&gt;
          thus &amp;quot;(p ⟶ q) ∨ (q ⟶ p)&amp;quot; by (rule disjI2)}&lt;br /&gt;
        next&lt;br /&gt;
        {assume 3: &amp;quot;q&amp;quot;&lt;br /&gt;
          {assume &amp;quot;p&amp;quot;&lt;br /&gt;
            have &amp;quot;q&amp;quot; using 3 by this}&lt;br /&gt;
          hence &amp;quot;p ⟶ q&amp;quot; by (rule impI)&lt;br /&gt;
          thus &amp;quot;(p ⟶ q) ∨ (q ⟶ p)&amp;quot; by (rule disjI1)}&lt;br /&gt;
        qed}&lt;br /&gt;
    next&lt;br /&gt;
    {assume 4: &amp;quot;p&amp;quot;&lt;br /&gt;
      {assume &amp;quot;q&amp;quot;&lt;br /&gt;
        have &amp;quot;p&amp;quot; using 4 by this}&lt;br /&gt;
      hence &amp;quot;q ⟶ p&amp;quot; by (rule impI)&lt;br /&gt;
      thus &amp;quot;(p ⟶ q) ∨ (q ⟶ p)&amp;quot; by (rule disjI2)}&lt;br /&gt;
    qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* migtermor *)&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_5_4:             &lt;br /&gt;
  shows &amp;quot;(p ⟶ q) ∨ (q ⟶ p)&amp;quot;&lt;br /&gt;
proof-&lt;br /&gt;
 have 1: &amp;quot;q∨¬q&amp;quot; by (rule lem)&lt;br /&gt;
 moreover &lt;br /&gt;
 {assume 2: &amp;quot;q&amp;quot;   &lt;br /&gt;
  have 3: &amp;quot;p ⟶ q&amp;quot; using 2 by (rule impI)&lt;br /&gt;
  then have 4: &amp;quot;(p ⟶ q) ∨ (q ⟶ p)&amp;quot; by (rule disjI1)}&lt;br /&gt;
 moreover&lt;br /&gt;
 {assume 5: &amp;quot;¬q&amp;quot;   &lt;br /&gt;
  have 6: &amp;quot;¬p⟶¬q&amp;quot; using 5 by (rule impI)&lt;br /&gt;
  then have 7: &amp;quot;q⟶p&amp;quot; by (rule ejercicio_1_2)&lt;br /&gt;
  then have &amp;quot;(p ⟶ q) ∨ (q ⟶ p)&amp;quot; by (rule disjI2)}&lt;br /&gt;
 ultimately show &amp;quot;(p ⟶ q) ∨ (q ⟶ p)&amp;quot; by (rule disjE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* paupeddeg pabrodmac crigomgom bowma *)&lt;br /&gt;
lemma aux3:&lt;br /&gt;
  assumes &amp;quot;¬q ∨ p&amp;quot;&lt;br /&gt;
  shows &amp;quot;q ⟶ p&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
note `¬q ∨ p`&lt;br /&gt;
moreover&lt;br /&gt;
 {assume &amp;quot;¬q&amp;quot;&lt;br /&gt;
   have &amp;quot;q ⟶ p&amp;quot;&lt;br /&gt;
   proof&lt;br /&gt;
    assume &amp;quot;q&amp;quot; &lt;br /&gt;
    show &amp;quot;p&amp;quot; using `¬q``q`by (rule notE)&lt;br /&gt;
    qed} &lt;br /&gt;
moreover&lt;br /&gt;
 {assume &amp;quot;p&amp;quot;&lt;br /&gt;
   have &amp;quot;q ⟶ p&amp;quot;&lt;br /&gt;
   proof&lt;br /&gt;
    assume &amp;quot;q&amp;quot;&lt;br /&gt;
    show &amp;quot;p&amp;quot; using `p` by this&lt;br /&gt;
    qed}&lt;br /&gt;
ultimately show &amp;quot;q ⟶ p&amp;quot; by (rule disjE)&lt;br /&gt;
qed    &lt;br /&gt;
        &lt;br /&gt;
lemma ejercicio_5_5:&lt;br /&gt;
  shows &amp;quot;(p ⟶ q) ∨ (q ⟶ p)&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;¬p ∨ p&amp;quot; by (rule excluded_middle) &lt;br /&gt;
  thus &amp;quot;(p ⟶ q) ∨ (q ⟶ p)&amp;quot;&lt;br /&gt;
  proof&lt;br /&gt;
    {assume &amp;quot;¬p&amp;quot;&lt;br /&gt;
     hence &amp;quot;¬p ∨ q&amp;quot; by (rule disjI1)&lt;br /&gt;
     hence &amp;quot;p ⟶ q&amp;quot; by (rule aux3)&lt;br /&gt;
     thus &amp;quot;(p ⟶ q) ∨ (q ⟶ p)&amp;quot; by (rule disjI1)} &lt;br /&gt;
    {assume &amp;quot;p&amp;quot;&lt;br /&gt;
     hence &amp;quot;¬q ∨ p&amp;quot; by (rule disjI2)&lt;br /&gt;
     hence &amp;quot;q ⟶ p&amp;quot; by (rule aux3)&lt;br /&gt;
     thus &amp;quot;(p ⟶ q) ∨ (q ⟶ p)&amp;quot; by (rule disjI2)} &lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(*pabrodmac*)       &lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_5_6: &lt;br /&gt;
  &amp;quot;(p ⟶ q) ∨ (q ⟶ p)&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;¬(p ⟶ q) ∨ (p ⟶ q)&amp;quot; by (rule excluded_middle)&lt;br /&gt;
  thus &amp;quot;(p ⟶ q) ∨ (q ⟶ p)&amp;quot;&lt;br /&gt;
  proof &lt;br /&gt;
    { assume &amp;quot;¬(p ⟶ q)&amp;quot;&lt;br /&gt;
      hence &amp;quot;p ∧ ¬ q&amp;quot; by (rule Meson.not_impD)&lt;br /&gt;
      have &amp;quot;(q ⟶ p)&amp;quot;&lt;br /&gt;
      proof&lt;br /&gt;
      assume &amp;quot;q&amp;quot;&lt;br /&gt;
      show &amp;quot;p&amp;quot; using `p ∧ ¬ q` by (rule conjunct1)&lt;br /&gt;
      qed&lt;br /&gt;
      thus &amp;quot;(p ⟶ q) ∨ (q ⟶ p)&amp;quot; by (rule disjI2) }&lt;br /&gt;
  next&lt;br /&gt;
    { assume &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
     then show &amp;quot;(p ⟶ q) ∨ (q ⟶ p)&amp;quot;  by (rule disjI1) }&lt;br /&gt;
  qed&lt;br /&gt;
qed &lt;br /&gt;
&lt;br /&gt;
(* josgarsan *)&lt;br /&gt;
lemma ejercicio_5_7:&lt;br /&gt;
shows &amp;quot;(p ⟶ q) ∨ (q ⟶ p)&amp;quot;&lt;br /&gt;
proof (cases)&lt;br /&gt;
assume &amp;quot;p&amp;quot;&lt;br /&gt;
then show &amp;quot;(p ⟶ q) ∨ (q ⟶ p)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
assume &amp;quot;¬p&amp;quot;&lt;br /&gt;
then show &amp;quot;(p ⟶ q) ∨ (q ⟶ p)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* dancorgar *)&lt;br /&gt;
lemma ejercicio_5_8:&lt;br /&gt;
  shows &amp;quot;(p ⟶ q) ∨ (q ⟶ p)&amp;quot;&lt;br /&gt;
proof (cases)&lt;br /&gt;
  assume &amp;quot;p&amp;quot;&lt;br /&gt;
  have &amp;quot;(q ⟶ p)&amp;quot; using `p` by (rule impI)&lt;br /&gt;
  then show &amp;quot;(p ⟶ q) ∨ (q ⟶ p)&amp;quot; by (rule disjI2)&lt;br /&gt;
next&lt;br /&gt;
  assume &amp;quot;¬p&amp;quot;&lt;br /&gt;
  have &amp;quot;(p ⟶ q)&amp;quot; using `¬p` by simp&lt;br /&gt;
  then show &amp;quot;(p ⟶ q) ∨ (q ⟶ p)&amp;quot; by (rule disjI1)&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>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2016/index.php?title=Relaci%C3%B3n_8&amp;diff=1242</id>
		<title>Relación 8</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2016/index.php?title=Relaci%C3%B3n_8&amp;diff=1242"/>
		<updated>2017-01-12T19:33:19Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: Desprotegió «Relación 8»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
chapter {* R8: Deducción natural proposicional en Isabelle/HOL *}&lt;br /&gt;
&lt;br /&gt;
theory R8_Deduccion_natural_proposicional&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Demostrar o refutar los siguientes lemas usando sólo las reglas&lt;br /&gt;
  básicas de deducción natural de la lógica proposicional, de los&lt;br /&gt;
  cuantificadores 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;
&lt;br /&gt;
  · allI:       ⟦∀x. P x; P x ⟹ R⟧ ⟹ R&lt;br /&gt;
  · allE:       (⋀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⟧ ⟹ a: = 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;
&lt;br /&gt;
text {*&lt;br /&gt;
  Se usarán las reglas notnotI, mt y not_ex que demostramos a 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;
lemma no_ex: &amp;quot;¬(∃x. P(x)) ⟹ ∀x. ¬P(x)&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. Demostrar&lt;br /&gt;
     ¬q ⟶ ¬p ⊢ p ⟶ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Demostrar&lt;br /&gt;
     ¬(¬p ∧ ¬q) ⊢ p ∨ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. Demostrar&lt;br /&gt;
     ¬(¬p ∨ ¬q) ⊢ p ∧ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Demostrar&lt;br /&gt;
     ¬(p ∧ q) ⊢ ¬p ∨ ¬q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. Demostrar&lt;br /&gt;
     ⊢ (p ⟶ q) ∨ (q ⟶ p)&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>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2016/index.php?title=R8&amp;diff=1241</id>
		<title>R8</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2016/index.php?title=R8&amp;diff=1241"/>
		<updated>2017-01-12T11:00:22Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: Protegió «R8» ([edit=sysop] (indefinido) [move=sysop] (indefinido))&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
chapter {* R8: Deducción natural proposicional en Isabelle/HOL *}&lt;br /&gt;
&lt;br /&gt;
theory R8_Deduccion_natural_proposicional&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Demostrar o refutar los siguientes lemas usando sólo las reglas&lt;br /&gt;
  básicas de deducción natural de la lógica proposicional, de los&lt;br /&gt;
  cuantificadores 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;
&lt;br /&gt;
  · allI:       ⟦∀x. P x; P x ⟹ R⟧ ⟹ R&lt;br /&gt;
  · allE:       (⋀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⟧ ⟹ a: = 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;
&lt;br /&gt;
text {*&lt;br /&gt;
  Se usarán las reglas notnotI, mt y not_ex que demostramos a 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;
lemma no_ex: &amp;quot;¬(∃x. P(x)) ⟹ ∀x. ¬P(x)&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. Demostrar&lt;br /&gt;
     ¬q ⟶ ¬p ⊢ p ⟶ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Demostrar&lt;br /&gt;
     ¬(¬p ∧ ¬q) ⊢ p ∨ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. Demostrar&lt;br /&gt;
     ¬(¬p ∨ ¬q) ⊢ p ∧ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Demostrar&lt;br /&gt;
     ¬(p ∧ q) ⊢ ¬p ∨ ¬q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. Demostrar&lt;br /&gt;
     ⊢ (p ⟶ q) ∨ (q ⟶ p)&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>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2016/index.php?title=Relaci%C3%B3n_8&amp;diff=1240</id>
		<title>Relación 8</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2016/index.php?title=Relaci%C3%B3n_8&amp;diff=1240"/>
		<updated>2017-01-12T11:00:07Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: Protegió «Relación 8» ([edit=sysop] (caduca el 11:00 13 ene 2017 (UTC)) [move=sysop] (caduca el 11:00 13 ene 2017 (UTC)))&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
chapter {* R8: Deducción natural proposicional en Isabelle/HOL *}&lt;br /&gt;
&lt;br /&gt;
theory R8_Deduccion_natural_proposicional&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Demostrar o refutar los siguientes lemas usando sólo las reglas&lt;br /&gt;
  básicas de deducción natural de la lógica proposicional, de los&lt;br /&gt;
  cuantificadores 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;
&lt;br /&gt;
  · allI:       ⟦∀x. P x; P x ⟹ R⟧ ⟹ R&lt;br /&gt;
  · allE:       (⋀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⟧ ⟹ a: = 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;
&lt;br /&gt;
text {*&lt;br /&gt;
  Se usarán las reglas notnotI, mt y not_ex que demostramos a 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;
lemma no_ex: &amp;quot;¬(∃x. P(x)) ⟹ ∀x. ¬P(x)&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. Demostrar&lt;br /&gt;
     ¬q ⟶ ¬p ⊢ p ⟶ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Demostrar&lt;br /&gt;
     ¬(¬p ∧ ¬q) ⊢ p ∨ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. Demostrar&lt;br /&gt;
     ¬(¬p ∨ ¬q) ⊢ p ∧ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Demostrar&lt;br /&gt;
     ¬(p ∧ q) ⊢ ¬p ∨ ¬q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. Demostrar&lt;br /&gt;
     ⊢ (p ⟶ q) ∨ (q ⟶ p)&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>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2016/index.php?title=Relaci%C3%B3n_8&amp;diff=1239</id>
		<title>Relación 8</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2016/index.php?title=Relaci%C3%B3n_8&amp;diff=1239"/>
		<updated>2017-01-12T10:58:59Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: Página creada con &amp;#039;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt; chapter {* R8: Deducción natural proposicional en Isabelle/HOL *}  theory R8_Deduccion_natural_proposicional imports Main  begin  text {*   Demostrar o ref...&amp;#039;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
chapter {* R8: Deducción natural proposicional en Isabelle/HOL *}&lt;br /&gt;
&lt;br /&gt;
theory R8_Deduccion_natural_proposicional&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Demostrar o refutar los siguientes lemas usando sólo las reglas&lt;br /&gt;
  básicas de deducción natural de la lógica proposicional, de los&lt;br /&gt;
  cuantificadores 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;
&lt;br /&gt;
  · allI:       ⟦∀x. P x; P x ⟹ R⟧ ⟹ R&lt;br /&gt;
  · allE:       (⋀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⟧ ⟹ a: = 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;
&lt;br /&gt;
text {*&lt;br /&gt;
  Se usarán las reglas notnotI, mt y not_ex que demostramos a 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;
lemma no_ex: &amp;quot;¬(∃x. P(x)) ⟹ ∀x. ¬P(x)&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. Demostrar&lt;br /&gt;
     ¬q ⟶ ¬p ⊢ p ⟶ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Demostrar&lt;br /&gt;
     ¬(¬p ∧ ¬q) ⊢ p ∨ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. Demostrar&lt;br /&gt;
     ¬(¬p ∨ ¬q) ⊢ p ∧ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Demostrar&lt;br /&gt;
     ¬(p ∧ q) ⊢ ¬p ∨ ¬q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. Demostrar&lt;br /&gt;
     ⊢ (p ⟶ q) ∨ (q ⟶ p)&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>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2016/index.php?title=R8&amp;diff=1238</id>
		<title>R8</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2016/index.php?title=R8&amp;diff=1238"/>
		<updated>2017-01-12T10:58:19Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: Página creada con &amp;#039;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt; chapter {* R8: Deducción natural proposicional en Isabelle/HOL *}  theory R8_Deduccion_natural_proposicional imports Main  begin  text {*   Demostrar o ref...&amp;#039;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
chapter {* R8: Deducción natural proposicional en Isabelle/HOL *}&lt;br /&gt;
&lt;br /&gt;
theory R8_Deduccion_natural_proposicional&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Demostrar o refutar los siguientes lemas usando sólo las reglas&lt;br /&gt;
  básicas de deducción natural de la lógica proposicional, de los&lt;br /&gt;
  cuantificadores 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;
&lt;br /&gt;
  · allI:       ⟦∀x. P x; P x ⟹ R⟧ ⟹ R&lt;br /&gt;
  · allE:       (⋀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⟧ ⟹ a: = 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;
&lt;br /&gt;
text {*&lt;br /&gt;
  Se usarán las reglas notnotI, mt y not_ex que demostramos a 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;
lemma no_ex: &amp;quot;¬(∃x. P(x)) ⟹ ∀x. ¬P(x)&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. Demostrar&lt;br /&gt;
     ¬q ⟶ ¬p ⊢ p ⟶ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Demostrar&lt;br /&gt;
     ¬(¬p ∧ ¬q) ⊢ p ∨ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. Demostrar&lt;br /&gt;
     ¬(¬p ∨ ¬q) ⊢ p ∧ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Demostrar&lt;br /&gt;
     ¬(p ∧ q) ⊢ ¬p ∨ ¬q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. Demostrar&lt;br /&gt;
     ⊢ (p ⟶ q) ∨ (q ⟶ p)&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>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2016/index.php?title=Ejercicios&amp;diff=1237</id>
		<title>Ejercicios</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2016/index.php?title=Ejercicios&amp;diff=1237"/>
		<updated>2017-01-12T10:57:13Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Relaciones de ejercicios ==&lt;br /&gt;
&lt;br /&gt;
=== Relaciones de ejercicios propuestos ===&lt;br /&gt;
&lt;br /&gt;
En esta sección se publicarán las relaciones de ejercicios. Las soluciones se escriben de forma colaborativa por los alumnos del curso y no deben tomarse como definitivas.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 1&amp;#039;&amp;#039;&amp;#039;: Programación funcional en Isabelle/HOL. ([[R1 |Enunciado]] y [[Relación 1 | Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 2&amp;#039;&amp;#039;&amp;#039;: Razonamiento automático sobre programas en Isabelle/HOL. ([[R2 |Enunciado]] y [[Relación 2 | Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 3&amp;#039;&amp;#039;&amp;#039;: Razonamiento estructurado sobre programas en Isabelle/HOL. ([[R3 |Enunciado]] y [[Relación 3 | Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 4&amp;#039;&amp;#039;&amp;#039;: Cuantificadores sobre listas. ([[R4 |Enunciado]] y [[Relación 4 | Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 5&amp;#039;&amp;#039;&amp;#039;: Eliminación de duplicados. ([[R5 |Enunciado]] y [[Relación 5 | Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 6&amp;#039;&amp;#039;&amp;#039;: Recorridos de árboles. ([[R6 |Enunciado]] y [[Relación 6 | Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 7&amp;#039;&amp;#039;&amp;#039;: Árboles binarios completos. ([[R7 |Enunciado]] y [[Relación 7 | Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 8&amp;#039;&amp;#039;&amp;#039;: Deducción natural proposicional en Isabelle/HOL. ([[R8 |Enunciado]] y [[Relación 8 | Solución colaborativa]]).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 10&amp;#039;&amp;#039;&amp;#039;: Formalización y argumentación en Isabelle/HOL. ([[R10 |Enunciado]] y [[Relación 10 | Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 11&amp;#039;&amp;#039;&amp;#039;: Plegados de listas y de árboles. ([[R11 |Enunciado]] y [[Relación 11 | Solución colaborativa]]).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Soluciones en GitHub ===&lt;br /&gt;
&lt;br /&gt;
Los siguientes repositorios de GitHub también contienen soluciones de alumnos del curso: [https://github.com/MULCIA/RAIsabelleHOL serrodcal].&lt;/div&gt;</summary>
		<author><name>Jalonso</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2016/index.php?title=Tema_9b:_Deducci%C3%B3n_natural_en_l%C3%B3gica_de_primer_orden_con_Isabelle/HOL&amp;diff=1236</id>
		<title>Tema 9b: Deducción natural en lógica de primer orden con Isabelle/HOL</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2016/index.php?title=Tema_9b:_Deducci%C3%B3n_natural_en_l%C3%B3gica_de_primer_orden_con_Isabelle/HOL&amp;diff=1236"/>
		<updated>2017-01-12T06:53:17Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: Página creada con &amp;#039;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt; chapter {* Tema 9: Deducción natural en lógica de primer orden *}  theory T9b_Deduccion_natural_en_logica_de_primer_orden imports Main  begin  text {*   E...&amp;#039;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
chapter {* Tema 9: Deducción natural en lógica de primer orden *}&lt;br /&gt;
&lt;br /&gt;
theory T9b_Deduccion_natural_en_logica_de_primer_orden&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  El objetivo de este tema es presentar la deducción natural en &lt;br /&gt;
  lógica de primer orden con Isabelle/HOL. La presentación se &lt;br /&gt;
  basa en los ejemplos de tema 8 del curso LMF que se encuentra &lt;br /&gt;
  en http://goo.gl/uJj8d (que a su vez se basa en el libro de &lt;br /&gt;
  Huth y Ryan &amp;quot;Logic in Computer Science&amp;quot; http://goo.gl/qsVpY ). &lt;br /&gt;
&lt;br /&gt;
  La página al lado de cada ejemplo indica la página de las &lt;br /&gt;
  transparencias de LMF donde se encuentra la demostración. *}&lt;br /&gt;
&lt;br /&gt;
section {* Reglas del cuantificador universal *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Las reglas del cuantificador universal son&lt;br /&gt;
  · allE:    ⟦∀x. P x; P a ⟹ R⟧ ⟹ R&lt;br /&gt;
  · allI:    (⋀x. P x) ⟹ ∀x. P x&lt;br /&gt;
  *}&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Ejemplo 1 (p. 10). Demostrar que&lt;br /&gt;
     P(c), ∀x. (P(x) ⟶ ¬Q(x)) ⊢ ¬Q(c)&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración detallada es&amp;quot;&lt;br /&gt;
lemma ejemplo_1a: &lt;br /&gt;
  assumes 1: &amp;quot;P(c)&amp;quot; and&lt;br /&gt;
          2: &amp;quot;∀x. (P(x) ⟶ ¬Q(x))&amp;quot;&lt;br /&gt;
  shows &amp;quot;¬Q(c)&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have 3: &amp;quot;P(c) ⟶ ¬Q(c)&amp;quot; using 2 by (rule allE)&lt;br /&gt;
  show 4: &amp;quot;¬Q(c)&amp;quot; using 3 1 by (rule mp)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma ejemplo_1b: &lt;br /&gt;
  assumes &amp;quot;P(c)&amp;quot;&lt;br /&gt;
          &amp;quot;∀x. (P(x) ⟶ ¬Q(x))&amp;quot;&lt;br /&gt;
  shows &amp;quot;¬Q(c)&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;P(c) ⟶ ¬Q(c)&amp;quot; using assms(2) ..&lt;br /&gt;
  thus &amp;quot;¬Q(c)&amp;quot; using assms(1) ..&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma ejemplo_1c: &lt;br /&gt;
  assumes &amp;quot;P(c)&amp;quot;&lt;br /&gt;
          &amp;quot;∀x. (P(x) ⟶ ¬Q(x))&amp;quot;&lt;br /&gt;
  shows &amp;quot;¬Q(c)&amp;quot;&lt;br /&gt;
using assms&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Ejemplo 2 (p. 11). Demostrar que&lt;br /&gt;
     ∀x. (P x ⟶ ¬(Q x)), ∀x. P x ⊢ ∀x. ¬(Q x)&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración detallada es&amp;quot;&lt;br /&gt;
lemma ejemplo_2a: &lt;br /&gt;
  assumes 1: &amp;quot;∀x. (P x ⟶ ¬(Q x))&amp;quot; and&lt;br /&gt;
          2: &amp;quot;∀x. P x&amp;quot;&lt;br /&gt;
  shows &amp;quot;∀x. ¬(Q x)&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  { fix a&lt;br /&gt;
    have 3: &amp;quot;P a ⟶ ¬(Q a)&amp;quot; using 1 by (rule allE)&lt;br /&gt;
    have 4: &amp;quot;P a&amp;quot; using 2 by (rule allE)&lt;br /&gt;
    have 5: &amp;quot;¬(Q a)&amp;quot; using 3 4 by (rule mp) }&lt;br /&gt;
  thus &amp;quot;∀x. ¬(Q x)&amp;quot; by (rule allI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración detallada hacia atrás es&amp;quot;&lt;br /&gt;
lemma ejemplo_2b: &lt;br /&gt;
  assumes 1: &amp;quot;∀x. (P x ⟶ ¬(Q x))&amp;quot; and&lt;br /&gt;
          2: &amp;quot;∀x. P x&amp;quot;&lt;br /&gt;
  shows &amp;quot;∀x. ¬(Q x)&amp;quot;&lt;br /&gt;
proof (rule allI)&lt;br /&gt;
  fix a&lt;br /&gt;
  have 3: &amp;quot;P a ⟶ ¬(Q a)&amp;quot; using 1 by (rule allE)&lt;br /&gt;
  have 4: &amp;quot;P a&amp;quot; using 2 by (rule allE)&lt;br /&gt;
  show 5: &amp;quot;¬(Q a)&amp;quot; using 3 4 by (rule mp) &lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma ejemplo_2c: &lt;br /&gt;
  assumes &amp;quot;∀x. (P x ⟶ ¬(Q x))&amp;quot;&lt;br /&gt;
          &amp;quot;∀x. P x&amp;quot;&lt;br /&gt;
  shows &amp;quot;∀x. ¬(Q x)&amp;quot;&lt;br /&gt;
proof &lt;br /&gt;
  fix a&lt;br /&gt;
  have &amp;quot;P a&amp;quot; using assms(2) ..&lt;br /&gt;
  have &amp;quot;P a ⟶ ¬(Q a)&amp;quot; using assms(1) ..&lt;br /&gt;
  thus &amp;quot;¬(Q a)&amp;quot; using `P a` ..&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma ejemplo_2d: &lt;br /&gt;
  assumes &amp;quot;∀x. (P x ⟶ ¬(Q x))&amp;quot;&lt;br /&gt;
          &amp;quot;∀x. P x&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∀x. ¬(Q x)&amp;quot;&lt;br /&gt;
using assms&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
section {* Reglas del cuantificador existencial *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Las reglas del cuantificador existencial son&lt;br /&gt;
  · exI:     P a ⟹ ∃x. P x&lt;br /&gt;
  · exE:     ⟦∃x. P x; ⋀x. P x ⟹ Q⟧ ⟹ Q&lt;br /&gt;
&lt;br /&gt;
  En la regla exE la nueva variable se introduce mediante la declaración &lt;br /&gt;
  &amp;quot;obtain ... where ... by (rule exE)&amp;quot; &lt;br /&gt;
  *}&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Ejemplo  (p. 12). Demostrar que&lt;br /&gt;
     ∀x. P x ⊢ ∃x. P x&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración detallada es&amp;quot;&lt;br /&gt;
lemma ejemplo_3a:&lt;br /&gt;
  assumes &amp;quot;∀x. P x&amp;quot;&lt;br /&gt;
  shows &amp;quot;∃x. P x&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  fix a&lt;br /&gt;
  have &amp;quot;P a&amp;quot; using assms by (rule allE)&lt;br /&gt;
  thus &amp;quot;∃x. P x&amp;quot; by (rule exI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma ejemplo_3b:&lt;br /&gt;
  assumes &amp;quot;∀x. P x&amp;quot;&lt;br /&gt;
  shows &amp;quot;∃x. P x&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  fix a&lt;br /&gt;
  have &amp;quot;P a&amp;quot; using assms ..&lt;br /&gt;
  thus &amp;quot;∃x. P x&amp;quot; ..&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada se puede simplificar&amp;quot;&lt;br /&gt;
lemma ejemplo_3c:&lt;br /&gt;
  assumes &amp;quot;∀x. P x&amp;quot;&lt;br /&gt;
  shows &amp;quot;∃x. P x&amp;quot;&lt;br /&gt;
proof (rule exI)&lt;br /&gt;
  fix a&lt;br /&gt;
  show &amp;quot;P a&amp;quot; using assms ..&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada se puede simplificar aún más&amp;quot;&lt;br /&gt;
lemma ejemplo_3d:&lt;br /&gt;
  assumes &amp;quot;∀x. P x&amp;quot;&lt;br /&gt;
  shows &amp;quot;∃x. P x&amp;quot;&lt;br /&gt;
proof &lt;br /&gt;
  fix a&lt;br /&gt;
  show &amp;quot;P a&amp;quot; using assms ..&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma ejemplo_3e:&lt;br /&gt;
  assumes &amp;quot;∀x. P x&amp;quot;&lt;br /&gt;
  shows &amp;quot;∃x. P x&amp;quot;&lt;br /&gt;
using assms&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Ejemplo 4 (p. 13). Demostrar&lt;br /&gt;
     ∀x. (P x ⟶ Q x), ∃x. P x ⊢ ∃x. Q x&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración detallada es&amp;quot;&lt;br /&gt;
lemma ejemplo_4a:&lt;br /&gt;
  assumes 1: &amp;quot;∀x. (P x ⟶ Q x)&amp;quot; and&lt;br /&gt;
          2: &amp;quot;∃x. P x&amp;quot;&lt;br /&gt;
  shows &amp;quot;∃x. Q x&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  obtain a where 3: &amp;quot;P a&amp;quot; using 2 by (rule exE)&lt;br /&gt;
  have 4: &amp;quot;P a ⟶ Q a&amp;quot; using 1 by (rule allE)&lt;br /&gt;
  have 5: &amp;quot;Q a&amp;quot; using 4 3 by (rule mp)&lt;br /&gt;
  thus 6: &amp;quot;∃x. Q x&amp;quot; by (rule exI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma ejemplo_4b:&lt;br /&gt;
  assumes &amp;quot;∀x. (P x ⟶ Q x)&amp;quot;&lt;br /&gt;
          &amp;quot;∃x. P x&amp;quot;&lt;br /&gt;
  shows &amp;quot;∃x. Q x&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  obtain a where &amp;quot;P a&amp;quot; using assms(2) ..&lt;br /&gt;
  have &amp;quot;P a ⟶ Q a&amp;quot; using assms(1) ..&lt;br /&gt;
  hence &amp;quot;Q a&amp;quot; using `P a` ..&lt;br /&gt;
  thus &amp;quot;∃x. Q x&amp;quot; ..&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma ejemplo_4c:&lt;br /&gt;
  assumes &amp;quot;∀x. (P x ⟶ Q x)&amp;quot;&lt;br /&gt;
          &amp;quot;∃x. P x&amp;quot;&lt;br /&gt;
  shows &amp;quot;∃x. Q x&amp;quot;&lt;br /&gt;
using assms&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
section {* Demostración de equivalencias *}&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Ejemplo 5.1 (p. 15). Demostrar&lt;br /&gt;
     ¬∀x. P x  ⊢ ∃x. ¬(P x) *}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración detallada es&amp;quot;&lt;br /&gt;
lemma ejemplo_5_1a:&lt;br /&gt;
  assumes &amp;quot;¬(∀x. P(x))&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∃x. ¬P(x)&amp;quot;&lt;br /&gt;
proof (rule ccontr)&lt;br /&gt;
  assume &amp;quot;¬(∃x. ¬P(x))&amp;quot;&lt;br /&gt;
  have &amp;quot;∀x. P(x)&amp;quot;&lt;br /&gt;
  proof (rule allI)&lt;br /&gt;
    fix a&lt;br /&gt;
    show &amp;quot;P(a)&amp;quot;&lt;br /&gt;
    proof (rule ccontr)&lt;br /&gt;
      assume &amp;quot;¬P(a)&amp;quot;&lt;br /&gt;
      hence &amp;quot;∃x. ¬P(x)&amp;quot; by (rule exI)&lt;br /&gt;
      with `¬(∃x. ¬P(x))` show False by (rule notE)&lt;br /&gt;
    qed&lt;br /&gt;
  qed&lt;br /&gt;
  with assms show False by (rule notE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma ejemplo_5_1b:&lt;br /&gt;
  assumes &amp;quot;¬(∀x. P(x))&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∃x. ¬P(x)&amp;quot;&lt;br /&gt;
proof (rule ccontr)&lt;br /&gt;
  assume &amp;quot;¬(∃x. ¬P(x))&amp;quot;&lt;br /&gt;
  have &amp;quot;∀x. P(x)&amp;quot;&lt;br /&gt;
  proof &lt;br /&gt;
    fix a&lt;br /&gt;
    show &amp;quot;P(a)&amp;quot;&lt;br /&gt;
    proof (rule ccontr)&lt;br /&gt;
      assume &amp;quot;¬P(a)&amp;quot;&lt;br /&gt;
      hence &amp;quot;∃x. ¬P(x)&amp;quot; ..&lt;br /&gt;
      with `¬(∃x. ¬P(x))` show False ..&lt;br /&gt;
    qed&lt;br /&gt;
  qed&lt;br /&gt;
  with assms show False ..&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma ejemplo_5_1c:&lt;br /&gt;
  assumes &amp;quot;¬(∀x. P(x))&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∃x. ¬P(x)&amp;quot;&lt;br /&gt;
using assms&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Ejemplo 5.2 (p. 16). Demostrar&lt;br /&gt;
     ∃x. ¬(P x)  ⊢ ¬∀x. P x *}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración detallada es&amp;quot;&lt;br /&gt;
lemma ejemplo_5_2a:&lt;br /&gt;
  assumes &amp;quot;∃x. ¬P(x)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;¬(∀x. P(x))&amp;quot;&lt;br /&gt;
proof (rule notI)&lt;br /&gt;
  assume &amp;quot;∀x. P(x)&amp;quot;&lt;br /&gt;
  obtain a where &amp;quot;¬P(a)&amp;quot; using assms by (rule exE)&lt;br /&gt;
  have &amp;quot;P(a)&amp;quot; using `∀x. P(x)` by (rule allE)&lt;br /&gt;
  with `¬P(a)` show False by (rule notE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma ejemplo_5_2b:&lt;br /&gt;
  assumes &amp;quot;∃x. ¬P(x)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;¬(∀x. P(x))&amp;quot;&lt;br /&gt;
proof &lt;br /&gt;
  assume &amp;quot;∀x. P(x)&amp;quot;&lt;br /&gt;
  obtain a where &amp;quot;¬P(a)&amp;quot; using assms ..&lt;br /&gt;
  have &amp;quot;P(a)&amp;quot; using `∀x. P(x)` ..&lt;br /&gt;
  with `¬P(a)` show False ..&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma ejemplo_5_2c:&lt;br /&gt;
  assumes &amp;quot;∃x. ¬P(x)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;¬(∀x. P(x))&amp;quot;&lt;br /&gt;
using assms&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Ejemplo 5.3 (p. 17). Demostrar&lt;br /&gt;
     ⊢ ¬∀x. P x  ⟷ ∃x. ¬(P x) *}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración detallada es&amp;quot;&lt;br /&gt;
lemma ejemplo_5_3a:&lt;br /&gt;
  &amp;quot;(¬(∀x. P(x))) ⟷ (∃x. ¬P(x))&amp;quot;&lt;br /&gt;
proof (rule iffI)&lt;br /&gt;
  assume &amp;quot;¬(∀x. P(x))&amp;quot;&lt;br /&gt;
  thus &amp;quot;∃x. ¬P(x)&amp;quot; by (rule ejemplo_5_1a)&lt;br /&gt;
next&lt;br /&gt;
  assume &amp;quot;∃x. ¬P(x)&amp;quot;&lt;br /&gt;
  thus &amp;quot;¬(∀x. P(x))&amp;quot; by (rule ejemplo_5_2a)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma ejemplo_5_3b:&lt;br /&gt;
  &amp;quot;(¬(∀x. P(x))) ⟷ (∃x. ¬P(x))&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Ejemplo 6.1 (p. 18). Demostrar&lt;br /&gt;
     ∀x. P(x) ∧ Q(x) ⊢  (∀x. P(x)) ∧ (∀x. Q(x)) *}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración detallada es&amp;quot;&lt;br /&gt;
lemma ejemplo_6_1a:&lt;br /&gt;
  assumes &amp;quot;∀x. P(x) ∧ Q(x)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;(∀x. P(x)) ∧ (∀x. Q(x))&amp;quot;&lt;br /&gt;
proof (rule conjI)&lt;br /&gt;
  show &amp;quot;∀x. P(x)&amp;quot;&lt;br /&gt;
  proof (rule allI)&lt;br /&gt;
    fix a&lt;br /&gt;
    have &amp;quot;P(a) ∧ Q(a)&amp;quot; using assms by (rule allE)&lt;br /&gt;
    thus &amp;quot;P(a)&amp;quot; by (rule conjunct1)&lt;br /&gt;
  qed&lt;br /&gt;
next&lt;br /&gt;
  show &amp;quot;∀x. Q(x)&amp;quot;&lt;br /&gt;
  proof (rule allI)&lt;br /&gt;
    fix a&lt;br /&gt;
    have &amp;quot;P(a) ∧ Q(a)&amp;quot; using assms by (rule allE)&lt;br /&gt;
    thus &amp;quot;Q(a)&amp;quot; by (rule conjunct2)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma ejemplo_6_1b:&lt;br /&gt;
  assumes &amp;quot;∀x. P(x) ∧ Q(x)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;(∀x. P(x)) ∧ (∀x. Q(x))&amp;quot;&lt;br /&gt;
proof &lt;br /&gt;
  show &amp;quot;∀x. P(x)&amp;quot;&lt;br /&gt;
  proof &lt;br /&gt;
    fix a&lt;br /&gt;
    have &amp;quot;P(a) ∧ Q(a)&amp;quot; using assms ..&lt;br /&gt;
    thus &amp;quot;P(a)&amp;quot; ..&lt;br /&gt;
  qed&lt;br /&gt;
next&lt;br /&gt;
  show &amp;quot;∀x. Q(x)&amp;quot;&lt;br /&gt;
  proof &lt;br /&gt;
    fix a&lt;br /&gt;
    have &amp;quot;P(a) ∧ Q(a)&amp;quot; using assms ..&lt;br /&gt;
    thus &amp;quot;Q(a)&amp;quot; ..&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma ejemplo_6_1c:&lt;br /&gt;
  assumes &amp;quot;∀x. P(x) ∧ Q(x)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;(∀x. P(x)) ∧ (∀x. Q(x))&amp;quot;&lt;br /&gt;
using assms&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Ejemplo 6.2 (p. 19). Demostrar&lt;br /&gt;
     (∀x. P(x)) ∧ (∀x. Q(x)) ⊢ ∀x. P(x) ∧ Q(x)  *}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración detallada es&amp;quot;&lt;br /&gt;
lemma ejemplo_6_2a:&lt;br /&gt;
  assumes &amp;quot;(∀x. P(x)) ∧ (∀x. Q(x))&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∀x. P(x) ∧ Q(x)&amp;quot;&lt;br /&gt;
proof (rule allI)&lt;br /&gt;
  fix a&lt;br /&gt;
  have &amp;quot;∀x. P(x)&amp;quot; using assms by (rule conjunct1)&lt;br /&gt;
  hence &amp;quot;P(a)&amp;quot; by (rule allE)&lt;br /&gt;
  have &amp;quot;∀x. Q(x)&amp;quot; using assms by (rule conjunct2)&lt;br /&gt;
  hence &amp;quot;Q(a)&amp;quot; by (rule allE)&lt;br /&gt;
  with `P(a)` show &amp;quot;P(a) ∧ Q(a)&amp;quot; by (rule conjI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma ejemplo_6_2b:&lt;br /&gt;
  assumes &amp;quot;(∀x. P(x)) ∧ (∀x. Q(x))&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∀x. P(x) ∧ Q(x)&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  fix a&lt;br /&gt;
  have &amp;quot;∀x. P(x)&amp;quot; using assms ..&lt;br /&gt;
  hence &amp;quot;P(a)&amp;quot; by (rule allE)&lt;br /&gt;
  have &amp;quot;∀x. Q(x)&amp;quot; using assms ..&lt;br /&gt;
  hence &amp;quot;Q(a)&amp;quot; ..&lt;br /&gt;
  with `P(a)` show &amp;quot;P(a) ∧ Q(a)&amp;quot; ..&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma ejemplo_6_2c:&lt;br /&gt;
  assumes &amp;quot;(∀x. P(x)) ∧ (∀x. Q(x))&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∀x. P(x) ∧ Q(x)&amp;quot;&lt;br /&gt;
using assms&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Ejemplo 6.3 (p. 20). Demostrar&lt;br /&gt;
     ⊢ ∀x. P(x) ∧ Q(x) ⟷ (∀x. P(x)) ∧ (∀x. Q(x)) *}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración detallada es&amp;quot;&lt;br /&gt;
lemma ejemplo_6_3a:&lt;br /&gt;
  &amp;quot;(∀x. P(x) ∧ Q(x)) ⟷ ((∀x. P(x)) ∧ (∀x. Q(x)))&amp;quot;&lt;br /&gt;
proof (rule iffI)&lt;br /&gt;
  assume &amp;quot;∀x. P(x) ∧ Q(x)&amp;quot;&lt;br /&gt;
  thus &amp;quot;(∀x. P(x)) ∧ (∀x. Q(x))&amp;quot; by (rule ejemplo_6_1a)&lt;br /&gt;
next&lt;br /&gt;
  assume &amp;quot;(∀x. P(x)) ∧ (∀x. Q(x))&amp;quot;&lt;br /&gt;
  thus &amp;quot;∀x. P(x) ∧ Q(x)&amp;quot; by (rule ejemplo_6_2a)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Ejemplo 7.1 (p. 21). Demostrar&lt;br /&gt;
     (∃x. P(x)) ∨ (∃x. Q(x)) ⊢ ∃x. P(x) ∨ Q(x)  *}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración detallada es&amp;quot;&lt;br /&gt;
lemma ejemplo_7_1a:&lt;br /&gt;
  assumes &amp;quot;(∃x. P(x)) ∨ (∃x. Q(x))&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∃x. P(x) ∨ Q(x)&amp;quot;&lt;br /&gt;
using assms&lt;br /&gt;
proof (rule disjE)&lt;br /&gt;
  assume &amp;quot;∃x. P(x)&amp;quot;&lt;br /&gt;
  then obtain a where &amp;quot;P(a)&amp;quot; by (rule exE)&lt;br /&gt;
  hence &amp;quot;P(a) ∨ Q(a)&amp;quot; by (rule disjI1)&lt;br /&gt;
  thus &amp;quot;∃x. P(x) ∨ Q(x)&amp;quot; by (rule exI)&lt;br /&gt;
next&lt;br /&gt;
  assume &amp;quot;∃x. Q(x)&amp;quot;&lt;br /&gt;
  then obtain a where &amp;quot;Q(a)&amp;quot; by (rule exE)&lt;br /&gt;
  hence &amp;quot;P(a) ∨ Q(a)&amp;quot; by (rule disjI2)&lt;br /&gt;
  thus &amp;quot;∃x. P(x) ∨ Q(x)&amp;quot; by (rule exI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma ejemplo_7_1b:&lt;br /&gt;
  assumes &amp;quot;(∃x. P(x)) ∨ (∃x. Q(x))&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∃x. P(x) ∨ Q(x)&amp;quot;&lt;br /&gt;
using assms&lt;br /&gt;
proof&lt;br /&gt;
  assume &amp;quot;∃x. P(x)&amp;quot;&lt;br /&gt;
  then obtain a where &amp;quot;P(a)&amp;quot; ..&lt;br /&gt;
  hence &amp;quot;P(a) ∨ Q(a)&amp;quot; ..&lt;br /&gt;
  thus &amp;quot;∃x. P(x) ∨ Q(x)&amp;quot; ..&lt;br /&gt;
next&lt;br /&gt;
  assume &amp;quot;∃x. Q(x)&amp;quot;&lt;br /&gt;
  then obtain a where &amp;quot;Q(a)&amp;quot; ..&lt;br /&gt;
  hence &amp;quot;P(a) ∨ Q(a)&amp;quot; ..&lt;br /&gt;
  thus &amp;quot;∃x. P(x) ∨ Q(x)&amp;quot; ..&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma ejemplo_7_1c:&lt;br /&gt;
  assumes &amp;quot;(∃x. P(x)) ∨ (∃x. Q(x))&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∃x. P(x) ∨ Q(x)&amp;quot;&lt;br /&gt;
using assms&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Ejemplo 7.2 (p. 22). Demostrar&lt;br /&gt;
     ∃x. P(x) ∨ Q(x) ⊢ (∃x. P(x)) ∨ (∃x. Q(x))  *}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración detallada es&amp;quot;&lt;br /&gt;
lemma ejemplo_7_2a:&lt;br /&gt;
  assumes &amp;quot;∃x. P(x) ∨ Q(x)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;(∃x. P(x)) ∨ (∃x. Q(x))&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  obtain a where &amp;quot;P(a) ∨ Q(a)&amp;quot; using assms by (rule exE)&lt;br /&gt;
  thus &amp;quot;(∃x. P(x)) ∨ (∃x. Q(x))&amp;quot;&lt;br /&gt;
  proof (rule disjE)&lt;br /&gt;
    assume &amp;quot;P(a)&amp;quot;&lt;br /&gt;
    hence &amp;quot;∃x. P(x)&amp;quot; by (rule exI)&lt;br /&gt;
    thus &amp;quot;(∃x. P(x)) ∨ (∃x. Q(x))&amp;quot; by (rule disjI1)&lt;br /&gt;
  next&lt;br /&gt;
    assume &amp;quot;Q(a)&amp;quot;&lt;br /&gt;
    hence &amp;quot;∃x. Q(x)&amp;quot; by (rule exI)&lt;br /&gt;
    thus &amp;quot;(∃x. P(x)) ∨ (∃x. Q(x))&amp;quot; by (rule disjI2)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma ejercicio_7_2b:&lt;br /&gt;
  assumes &amp;quot;∃x. P(x) ∨ Q(x)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;(∃x. P(x)) ∨ (∃x. Q(x))&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  obtain a where &amp;quot;P(a) ∨ Q(a)&amp;quot; using assms ..&lt;br /&gt;
  thus &amp;quot;(∃x. P(x)) ∨ (∃x. Q(x))&amp;quot;&lt;br /&gt;
  proof &lt;br /&gt;
    assume &amp;quot;P(a)&amp;quot;&lt;br /&gt;
    hence &amp;quot;∃x. P(x)&amp;quot; ..&lt;br /&gt;
    thus &amp;quot;(∃x. P(x)) ∨ (∃x. Q(x))&amp;quot; ..&lt;br /&gt;
  next&lt;br /&gt;
    assume &amp;quot;Q(a)&amp;quot;&lt;br /&gt;
    hence &amp;quot;∃x. Q(x)&amp;quot; ..&lt;br /&gt;
    thus &amp;quot;(∃x. P(x)) ∨ (∃x. Q(x))&amp;quot; ..&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma ejercicio_7_2c:&lt;br /&gt;
  assumes &amp;quot;∃x. P(x) ∨ Q(x)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;(∃x. P(x)) ∨ (∃x. Q(x))&amp;quot;&lt;br /&gt;
using assms&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Ejemplo 7.3 (p. 23). Demostrar&lt;br /&gt;
     ⊢ ((∃x. P(x)) ∨ (∃x. Q(x))) ⟷ (∃x. P(x) ∨ Q(x))  *}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración detallada es&amp;quot;&lt;br /&gt;
lemma ejemplo_7_3a:&lt;br /&gt;
  &amp;quot;((∃x. P(x)) ∨ (∃x. Q(x))) ⟷ (∃x. P(x) ∨ Q(x))&amp;quot;&lt;br /&gt;
proof (rule iffI)&lt;br /&gt;
  assume &amp;quot;(∃x. P(x)) ∨ (∃x. Q(x))&amp;quot;&lt;br /&gt;
  thus &amp;quot;∃x. P(x) ∨ Q(x)&amp;quot; by (rule ejemplo_7_1a)&lt;br /&gt;
next&lt;br /&gt;
  assume &amp;quot;∃x. P(x) ∨ Q(x)&amp;quot;&lt;br /&gt;
  thus &amp;quot;(∃x. P(x)) ∨ (∃x. Q(x))&amp;quot; by (rule ejemplo_7_2a)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma ejemplo_7_3b:&lt;br /&gt;
  &amp;quot;((∃x. P(x)) ∨ (∃x. Q(x))) ⟷ (∃x. P(x) ∨ Q(x))&amp;quot;&lt;br /&gt;
using assms&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Ejemplo 8.1 (p. 24). Demostrar&lt;br /&gt;
     ∃x y. P(x,y) ⊢ ∃y x. P(x,y)  *}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración detallada es&amp;quot;&lt;br /&gt;
lemma ejemplo_8_1a:&lt;br /&gt;
  assumes &amp;quot;∃x y. P(x,y)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∃y x. P(x,y)&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  obtain a where &amp;quot;∃y. P(a,y)&amp;quot; using assms by (rule exE)&lt;br /&gt;
  then obtain b where &amp;quot;P(a,b)&amp;quot; by (rule exE)&lt;br /&gt;
  hence &amp;quot;∃x. P(x,b)&amp;quot; by (rule exI)&lt;br /&gt;
  thus &amp;quot;∃y x. P(x,y)&amp;quot; by (rule exI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma ejemplo_8_1b:&lt;br /&gt;
  assumes &amp;quot;∃x y. P(x,y)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∃y x. P(x,y)&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  obtain a where &amp;quot;∃y. P(a,y)&amp;quot; using assms ..&lt;br /&gt;
  then obtain b where &amp;quot;P(a,b)&amp;quot; ..&lt;br /&gt;
  hence &amp;quot;∃x. P(x,b)&amp;quot; ..&lt;br /&gt;
  thus &amp;quot;∃y x. P(x,y)&amp;quot; ..&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma ejemplo_8_1c:&lt;br /&gt;
  assumes &amp;quot;∃x y. P(x,y)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∃y x. P(x,y)&amp;quot;&lt;br /&gt;
using assms&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Ejemplo 8.2. Demostrar&lt;br /&gt;
     ∃y x. P(x,y) ⊢ ∃x y. P(x,y)  *}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración detallada es&amp;quot;&lt;br /&gt;
lemma ejemplo_8_2a:&lt;br /&gt;
  assumes &amp;quot;∃y x. P(x,y)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∃x y. P(x,y)&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  obtain b where &amp;quot;∃x. P(x,b)&amp;quot; using assms by (rule exE)&lt;br /&gt;
  then obtain a where &amp;quot;P(a,b)&amp;quot; by (rule exE)&lt;br /&gt;
  hence &amp;quot;∃y. P(a,y)&amp;quot; by (rule exI)&lt;br /&gt;
  thus &amp;quot;∃x y. P(x,y)&amp;quot; by (rule exI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma ejemplo_8_2b:&lt;br /&gt;
  assumes &amp;quot;∃y x. P(x,y)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∃x y. P(x,y)&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  obtain b where &amp;quot;∃x. P(x,b)&amp;quot; using assms ..&lt;br /&gt;
  then obtain a where &amp;quot;P(a,b)&amp;quot; ..&lt;br /&gt;
  hence &amp;quot;∃y. P(a,y)&amp;quot; ..&lt;br /&gt;
  thus &amp;quot;∃x y. P(x,y)&amp;quot; ..&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma ejemplo_8_2c:&lt;br /&gt;
  assumes &amp;quot;∃y x. P(x,y)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;∃x y. P(x,y)&amp;quot;&lt;br /&gt;
using assms&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Ejemplo 8.3 (p. 25). Demostrar&lt;br /&gt;
     ⊢ (∃x y. P(x,y)) ⟷ (∃y x. P(x,y))  *}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración detallada es&amp;quot;&lt;br /&gt;
lemma ejemplo_8_3a:&lt;br /&gt;
  &amp;quot;(∃x y. P(x,y)) ⟷ (∃y x. P(x,y))&amp;quot;&lt;br /&gt;
proof (rule iffI)&lt;br /&gt;
  assume &amp;quot;∃x y. P(x,y)&amp;quot;&lt;br /&gt;
  thus &amp;quot;∃y x. P(x,y)&amp;quot; by (rule ejemplo_8_1a)&lt;br /&gt;
next&lt;br /&gt;
  assume &amp;quot;∃y x. P(x,y)&amp;quot;&lt;br /&gt;
  thus &amp;quot;∃x y. P(x,y)&amp;quot; by (rule ejemplo_8_2a)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma ejemplo_8_3b:&lt;br /&gt;
  &amp;quot;(∃x y. P(x,y)) ⟷ (∃y x. P(x,y))&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
section {* Reglas de la igualdad *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Las reglas básicas de la igualdad son:&lt;br /&gt;
  · refl:  t = t&lt;br /&gt;
  · subst: ⟦s = t; P s⟧ ⟹ P t&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Ejemplo 9 (p. 27). Demostrar&lt;br /&gt;
     x+1 = 1+x, x+1 &amp;gt; 1 ⟶ x+1 &amp;gt; 0 ⊢ 1+x &amp;gt; 1 ⟶ 1+x &amp;gt; 0&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración detallada es&amp;quot;&lt;br /&gt;
lemma ejemplo_9a: &lt;br /&gt;
  assumes &amp;quot;x+1 = 1+x&amp;quot; &lt;br /&gt;
          &amp;quot;x+1 &amp;gt; 1 ⟶ x+1 &amp;gt; 0&amp;quot;&lt;br /&gt;
  shows   &amp;quot;1+x &amp;gt; 1 ⟶ 1+x &amp;gt; 0&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  show &amp;quot;1+x &amp;gt; 1 ⟶ 1+x &amp;gt; 0&amp;quot; using assms by (rule subst)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma ejemplo_9b: &lt;br /&gt;
  assumes &amp;quot;x+1 = 1+x&amp;quot; &lt;br /&gt;
          &amp;quot;x+1 &amp;gt; 1 ⟶ x+1 &amp;gt; 0&amp;quot;&lt;br /&gt;
  shows   &amp;quot;1+x &amp;gt; 1 ⟶ 1+x &amp;gt; 0&amp;quot;&lt;br /&gt;
using assms &lt;br /&gt;
by (rule subst)&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma ejemplo_9c: &lt;br /&gt;
  assumes &amp;quot;x+1 = 1+x&amp;quot; &lt;br /&gt;
          &amp;quot;x+1 &amp;gt; 1 ⟶ x+1 &amp;gt; 0&amp;quot;&lt;br /&gt;
  shows   &amp;quot;1+x &amp;gt; 1 ⟶ 1+x &amp;gt; 0&amp;quot;&lt;br /&gt;
using assms &lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Ejemplo 10 (p. 27). Demostrar&lt;br /&gt;
     x = y, y = z ⊢ x = z&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración detallada es&amp;quot;&lt;br /&gt;
lemma ejemplo_10a:&lt;br /&gt;
  assumes &amp;quot;x = y&amp;quot; &lt;br /&gt;
          &amp;quot;y = z&amp;quot;&lt;br /&gt;
  shows   &amp;quot;x = z&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  show &amp;quot;x = z&amp;quot; using assms(2,1) by (rule subst)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma ejemplo_10b: &lt;br /&gt;
  assumes &amp;quot;x = y&amp;quot; &lt;br /&gt;
          &amp;quot;y = z&amp;quot;&lt;br /&gt;
  shows   &amp;quot;x = z&amp;quot;&lt;br /&gt;
using assms(2,1)&lt;br /&gt;
by (rule subst)&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma ejemplo_10c: &lt;br /&gt;
  assumes &amp;quot;x = y&amp;quot; &lt;br /&gt;
          &amp;quot;y = z&amp;quot;&lt;br /&gt;
  shows   &amp;quot;x = z&amp;quot;&lt;br /&gt;
using assms&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Ejemplo 11 (p. 28). Demostrar&lt;br /&gt;
     s = t ⊢ t = s&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración detallada es&amp;quot;&lt;br /&gt;
lemma ejemplo_11a:&lt;br /&gt;
  assumes &amp;quot;s = t&amp;quot;&lt;br /&gt;
  shows   &amp;quot;t = s&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;s = s&amp;quot; by (rule refl)&lt;br /&gt;
  with assms show &amp;quot;t = s&amp;quot; by (rule subst)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma ejemplo_11b:&lt;br /&gt;
  assumes &amp;quot;s = t&amp;quot;&lt;br /&gt;
  shows   &amp;quot;t = s&amp;quot;&lt;br /&gt;
using assms&lt;br /&gt;
by auto&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>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2016/index.php?title=Tema_8b:_Deducci%C3%B3n_natural_proposicional_con_Isabelle/HOL&amp;diff=1235</id>
		<title>Tema 8b: Deducción natural proposicional con Isabelle/HOL</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2016/index.php?title=Tema_8b:_Deducci%C3%B3n_natural_proposicional_con_Isabelle/HOL&amp;diff=1235"/>
		<updated>2017-01-12T06:51:16Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
chapter {* Tema 8b: Deducción natural proposicional con Isabelle/HOL *}&lt;br /&gt;
&lt;br /&gt;
theory T8b_Deduccion_natural_en_logica_proposicional_con_Isabelle&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  En este tema se presentan los ejemplos del tema de deducción natural&lt;br /&gt;
  proposicional siguiendo la presentación de Huth y Ryan en su libro&lt;br /&gt;
  &amp;quot;Logic in Computer Science&amp;quot; http://goo.gl/qsVpY y, más concretamente,&lt;br /&gt;
  a la forma como se explica en la asignatura de &amp;quot;Lógica informática&amp;quot; (LI) &lt;br /&gt;
  http://goo.gl/AwDiv&lt;br /&gt;
 &lt;br /&gt;
  La página al lado de cada ejemplo indica la página de las transparencias &lt;br /&gt;
  de LI donde se encuentra la demostración. *}&lt;br /&gt;
&lt;br /&gt;
subsection {* Reglas de la conjunción *}&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Ejemplo 1 (p. 4). Demostrar que&lt;br /&gt;
     p ∧ q, r ⊢ q ∧ r.&lt;br /&gt;
  *}     &lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración detallada es&amp;quot;&lt;br /&gt;
lemma ejemplo_1_1:&lt;br /&gt;
  assumes 1: &amp;quot;p ∧ q&amp;quot; and&lt;br /&gt;
          2: &amp;quot;r&amp;quot; &lt;br /&gt;
  shows &amp;quot;q ∧ r&amp;quot;     &lt;br /&gt;
proof -&lt;br /&gt;
  have 3: &amp;quot;q&amp;quot; using 1 by (rule conjunct2)&lt;br /&gt;
  show 4: &amp;quot;q ∧ r&amp;quot; using 3 2 by (rule conjI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Notas sobre el lenguaje: En la demostración anterior se ha usado&lt;br /&gt;
  · &amp;quot;assumes&amp;quot; para indicar las hipótesis,&lt;br /&gt;
  · &amp;quot;and&amp;quot; para separar las hipótesis,&lt;br /&gt;
  · &amp;quot;shows&amp;quot; para indicar la conclusión,&lt;br /&gt;
  · &amp;quot;proof&amp;quot; para iniciar la prueba,&lt;br /&gt;
  · &amp;quot;qed&amp;quot; para terminar la pruebas,&lt;br /&gt;
  · &amp;quot;-&amp;quot; (después de &amp;quot;proof&amp;quot;) para no usar el método por defecto,&lt;br /&gt;
  · &amp;quot;have&amp;quot; para establecer un paso,&lt;br /&gt;
  · &amp;quot;using&amp;quot; para usar hechos en un paso,&lt;br /&gt;
  · &amp;quot;by (rule ..)&amp;quot; para indicar la regla con la que se peueba un hecho,&lt;br /&gt;
  · &amp;quot;show&amp;quot; para establecer la conclusión.&lt;br /&gt;
&lt;br /&gt;
  Notas sobre la lógica: Las reglas de la conjunción son&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;
*}&lt;br /&gt;
&lt;br /&gt;
text {* Se pueden dejar implícitas las reglas como sigue *}&lt;br /&gt;
&lt;br /&gt;
lemma ejemplo_1_2:&lt;br /&gt;
  assumes 1: &amp;quot;p ∧ q&amp;quot; and &lt;br /&gt;
          2: &amp;quot;r&amp;quot; &lt;br /&gt;
  shows &amp;quot;q ∧ r&amp;quot;     &lt;br /&gt;
proof -&lt;br /&gt;
  have 3: &amp;quot;q&amp;quot; using 1 .. &lt;br /&gt;
  show 4: &amp;quot;q ∧ r&amp;quot; using 3 2 ..&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Nota sobre el lenguaje: En la demostración anterior se ha usado&lt;br /&gt;
  · &amp;quot;..&amp;quot; para indicar que se prueba por la regla correspondiente. *}&lt;br /&gt;
&lt;br /&gt;
text {* Se pueden eliminar las etiquetas como sigue *}&lt;br /&gt;
&lt;br /&gt;
lemma ejemplo_1_3:&lt;br /&gt;
  assumes &amp;quot;p ∧ q&amp;quot; &lt;br /&gt;
          &amp;quot;r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;q ∧ r&amp;quot;     &lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;q&amp;quot; using assms(1) ..&lt;br /&gt;
  thus &amp;quot;q ∧ r&amp;quot; using assms(2) ..&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Nota sobre el lenguaje: En la demostración anterior se ha usado&lt;br /&gt;
  · &amp;quot;assms(n)&amp;quot; para indicar la hipótesis n y&lt;br /&gt;
  · &amp;quot;thus&amp;quot; para demostrar la conclusión usando el hecho anterior.&lt;br /&gt;
  Además, no es necesario usar and entre las hipótesis. *}&lt;br /&gt;
&lt;br /&gt;
text {* Se puede automatizar la demostración como sigue *}&lt;br /&gt;
  &lt;br /&gt;
lemma ejemplo_1_4:&lt;br /&gt;
  assumes &amp;quot;p ∧ q&amp;quot; &lt;br /&gt;
          &amp;quot;r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;q ∧ r&amp;quot;     &lt;br /&gt;
using assms&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Nota sobre el lenguaje: En la demostración anterior se ha usado&lt;br /&gt;
  · &amp;quot;assms&amp;quot; para indicar las hipótesis y&lt;br /&gt;
  · &amp;quot;by auto&amp;quot; para demostrar la conclusión automáticamente. *}&lt;br /&gt;
&lt;br /&gt;
text {* Se puede automatizar totalmente la demostración como sigue *}&lt;br /&gt;
&lt;br /&gt;
lemma ejemplo_1_5:&lt;br /&gt;
  &amp;quot;⟦p ∧ q; r⟧ ⟹ q ∧ r&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Nota sobre el lenguaje: En la demostración anterior se ha usado&lt;br /&gt;
  · &amp;quot;⟦ ... ⟧&amp;quot; para representar las hipótesis,&lt;br /&gt;
  · &amp;quot;;&amp;quot; para separar las hipótesis y&lt;br /&gt;
  · &amp;quot;⟹&amp;quot; para separar las hipótesis de la conclusión. *}&lt;br /&gt;
&lt;br /&gt;
text {* Se puede hacer la demostración por razonamiento hacia atrás,&lt;br /&gt;
  como sigue *}&lt;br /&gt;
&lt;br /&gt;
lemma ejemplo_1_6:&lt;br /&gt;
  assumes &amp;quot;p ∧ q&amp;quot; &lt;br /&gt;
      and &amp;quot;r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;q ∧ r&amp;quot;     &lt;br /&gt;
proof (rule conjI)&lt;br /&gt;
  show &amp;quot;q&amp;quot; using assms(1) by (rule conjunct2)&lt;br /&gt;
next&lt;br /&gt;
  show &amp;quot;r&amp;quot; using assms(2) by this&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Nota sobre el lenguaje: En la demostración anterior se ha usado&lt;br /&gt;
  · &amp;quot;proof (rule r)&amp;quot; para indicar que se hará la demostración con la&lt;br /&gt;
    regla r,&lt;br /&gt;
  · &amp;quot;next&amp;quot; para indicar el comienzo de la prueba del siguiente&lt;br /&gt;
    subobjetivo,&lt;br /&gt;
  · &amp;quot;this&amp;quot; para indicar el hecho actual. *}&lt;br /&gt;
&lt;br /&gt;
text {* Se pueden dejar implícitas las reglas como sigue *}&lt;br /&gt;
&lt;br /&gt;
lemma ejemplo_1_7:&lt;br /&gt;
  assumes &amp;quot;p ∧ q&amp;quot; &lt;br /&gt;
          &amp;quot;r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;q ∧ r&amp;quot;     &lt;br /&gt;
proof &lt;br /&gt;
  show &amp;quot;q&amp;quot; using assms(1) ..&lt;br /&gt;
next&lt;br /&gt;
  show &amp;quot;r&amp;quot; using assms(2) . &lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Nota sobre el lenguaje: En la demostración anterior se ha usado&lt;br /&gt;
  · &amp;quot;.&amp;quot; para indicar por el hecho actual. *}&lt;br /&gt;
&lt;br /&gt;
subsection {* Reglas de la doble negación *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  La regla de eliminación de la doble negación es&lt;br /&gt;
  · notnotD: ¬¬ P ⟹ P&lt;br /&gt;
&lt;br /&gt;
  Para ajustarnos al tema de LI vamos a introducir la siguiente regla de&lt;br /&gt;
  introducción de la doble negación&lt;br /&gt;
  · notnotI: P ⟹ ¬¬ P&lt;br /&gt;
  aunque, de momento, no detallamos su demostración.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma notnotI [intro!]: &amp;quot;P ⟹ ¬¬ P&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Ejemplo 2. (p. 5)&lt;br /&gt;
       p, ¬¬(q ∧ r) ⊢ ¬¬p ∧ r&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración detallada es&amp;quot;&lt;br /&gt;
lemma ejemplo_2_1:&lt;br /&gt;
  assumes 1: &amp;quot;p&amp;quot; and&lt;br /&gt;
          2: &amp;quot;¬¬(q ∧ r)&amp;quot; &lt;br /&gt;
  shows      &amp;quot;¬¬p ∧ r&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have 3: &amp;quot;¬¬p&amp;quot; using 1 by (rule notnotI)&lt;br /&gt;
  have 4: &amp;quot;q ∧ r&amp;quot; using 2 by (rule notnotD)&lt;br /&gt;
  have 5: &amp;quot;r&amp;quot; using 4 by (rule conjunct2)&lt;br /&gt;
  show 6: &amp;quot;¬¬p ∧ r&amp;quot; using 3 5 by (rule conjI)&lt;br /&gt;
qed        &lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma ejemplo_2_2:&lt;br /&gt;
  assumes &amp;quot;p&amp;quot; &lt;br /&gt;
          &amp;quot;¬¬(q ∧ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;¬¬p ∧ r&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have  &amp;quot;¬¬p&amp;quot; using assms(1) ..&lt;br /&gt;
  have  &amp;quot;q ∧ r&amp;quot; using assms(2) by (rule notnotD)&lt;br /&gt;
  hence &amp;quot;r&amp;quot; ..&lt;br /&gt;
  with `¬¬p` show  &amp;quot;¬¬p ∧ r&amp;quot; ..&lt;br /&gt;
qed        &lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Nota sobre el lenguaje: En la demostración anterior se ha usado&lt;br /&gt;
  · &amp;quot;hence&amp;quot; para indicar que se tiene por el hecho anterior,&lt;br /&gt;
  · `...` para referenciar un hecho y&lt;br /&gt;
  · &amp;quot;with P show Q&amp;quot; para indicar que con el hecho anterior junto con el&lt;br /&gt;
    hecho P se demuestra Q. *}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma ejemplo_2_3:&lt;br /&gt;
  assumes &amp;quot;p&amp;quot; &lt;br /&gt;
          &amp;quot;¬¬(q ∧ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;¬¬p ∧ r&amp;quot;&lt;br /&gt;
using assms&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
text {* Se puede demostrar hacia atrás *}&lt;br /&gt;
&lt;br /&gt;
lemma ejemplo_2_4:&lt;br /&gt;
  assumes &amp;quot;p&amp;quot; &lt;br /&gt;
          &amp;quot;¬¬(q ∧ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;¬¬p ∧ r&amp;quot;&lt;br /&gt;
proof  (rule conjI)&lt;br /&gt;
  show &amp;quot;¬¬p&amp;quot; using assms(1) by (rule notnotI)&lt;br /&gt;
next&lt;br /&gt;
  have &amp;quot;q ∧ r&amp;quot; using assms(2) by (rule notnotD) &lt;br /&gt;
  thus &amp;quot;r&amp;quot; by (rule conjunct2)&lt;br /&gt;
qed &lt;br /&gt;
&lt;br /&gt;
text {* Se puede eliminar las reglas en la demostración anterior, como&lt;br /&gt;
  sigue: *}&lt;br /&gt;
&lt;br /&gt;
lemma ejemplo_2_5:&lt;br /&gt;
  assumes &amp;quot;p&amp;quot; &lt;br /&gt;
          &amp;quot;¬¬(q ∧ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;¬¬p ∧ r&amp;quot;&lt;br /&gt;
proof &lt;br /&gt;
  show &amp;quot;¬¬p&amp;quot; using assms(1) ..&lt;br /&gt;
next&lt;br /&gt;
  have &amp;quot;q ∧ r&amp;quot; using assms(2) by (rule notnotD) &lt;br /&gt;
  thus &amp;quot;r&amp;quot; .. &lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
subsection {* Regla de eliminación del condicional *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  La regla de eliminación del condicional es la regla del modus ponens&lt;br /&gt;
  · mp: ⟦P ⟶ Q; P⟧ ⟹ Q &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Ejemplo 3. (p. 6) Demostrar que&lt;br /&gt;
     ¬p ∧ q, ¬p ∧ q ⟶ r ∨ ¬p ⊢ r ∨ ¬p&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración detallada es&amp;quot;&lt;br /&gt;
lemma ejemplo_3_1:&lt;br /&gt;
  assumes 1: &amp;quot;¬p ∧ q&amp;quot; and &lt;br /&gt;
          2: &amp;quot;¬p ∧ q ⟶ r ∨ ¬p&amp;quot; &lt;br /&gt;
  shows      &amp;quot;r ∨ ¬p&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  show &amp;quot;r ∨ ¬p&amp;quot; using 2 1 by (rule mp)&lt;br /&gt;
qed    &lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma ejemplo_3_2:&lt;br /&gt;
  assumes &amp;quot;¬p ∧ q&amp;quot;&lt;br /&gt;
          &amp;quot;¬p ∧ q ⟶ r ∨ ¬p&amp;quot; &lt;br /&gt;
  shows   &amp;quot;r ∨ ¬p&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  show &amp;quot;r ∨ ¬p&amp;quot; using assms(2,1) ..&lt;br /&gt;
qed    &lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma ejemplo_3_3:&lt;br /&gt;
  assumes &amp;quot;¬p ∧ q&amp;quot;&lt;br /&gt;
          &amp;quot;¬p ∧ q ⟶ r ∨ ¬p&amp;quot; &lt;br /&gt;
  shows   &amp;quot;r ∨ ¬p&amp;quot;&lt;br /&gt;
using assms&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Ejemplo 4 (p. 6) Demostrar que&lt;br /&gt;
     p, p ⟶ q, p ⟶ (q ⟶ r) ⊢ r&lt;br /&gt;
 *}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración detallada es&amp;quot;&lt;br /&gt;
lemma ejemplo_4_1:&lt;br /&gt;
  assumes 1: &amp;quot;p&amp;quot; and &lt;br /&gt;
          2: &amp;quot;p ⟶ q&amp;quot; and &lt;br /&gt;
          3: &amp;quot;p ⟶ (q ⟶ r)&amp;quot; &lt;br /&gt;
  shows &amp;quot;r&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have 4: &amp;quot;q&amp;quot; using 2 1 by (rule mp)&lt;br /&gt;
  have 5: &amp;quot;q ⟶ r&amp;quot; using 3 1 by (rule mp)&lt;br /&gt;
  show 6: &amp;quot;r&amp;quot; using 5 4 by (rule mp)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma ejemplo_4_2:&lt;br /&gt;
  assumes &amp;quot;p&amp;quot;&lt;br /&gt;
          &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
          &amp;quot;p ⟶ (q ⟶ r)&amp;quot; &lt;br /&gt;
  shows &amp;quot;r&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;q&amp;quot; using assms(2,1) .. &lt;br /&gt;
  have &amp;quot;q ⟶ r&amp;quot; using assms(3,1) ..&lt;br /&gt;
  thus &amp;quot;r&amp;quot; using `q` ..&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma ejemplo_4_3:&lt;br /&gt;
  &amp;quot;⟦p; p ⟶ q; p ⟶ (q ⟶ r)⟧ ⟹ r&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
subsection {* Regla derivada del modus tollens *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Para ajustarnos al tema de LI vamos a introducir la regla del modus&lt;br /&gt;
  tollens&lt;br /&gt;
  · mt: ⟦F ⟶ G; ¬G⟧ ⟹ ¬F &lt;br /&gt;
  aunque, de momento, sin detallar su demostración.&lt;br /&gt;
*}&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;
  Ejemplo 5 (p. 7). Demostrar&lt;br /&gt;
     p ⟶ (q ⟶ r), p, ¬r ⊢ ¬q&lt;br /&gt;
 *}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración detallada es&amp;quot;&lt;br /&gt;
lemma ejemplo_5_1:&lt;br /&gt;
  assumes 1: &amp;quot;p ⟶ (q ⟶ r)&amp;quot; and &lt;br /&gt;
          2: &amp;quot;p&amp;quot; and &lt;br /&gt;
          3: &amp;quot;¬r&amp;quot; &lt;br /&gt;
  shows &amp;quot;¬q&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have 4: &amp;quot;q ⟶ r&amp;quot; using 1 2 by (rule mp)&lt;br /&gt;
  show &amp;quot;¬q&amp;quot; using 4 3 by (rule mt)&lt;br /&gt;
qed    &lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma ejemplo_5_2:&lt;br /&gt;
  assumes &amp;quot;p ⟶ (q ⟶ r)&amp;quot;&lt;br /&gt;
          &amp;quot;p&amp;quot;&lt;br /&gt;
          &amp;quot;¬r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;¬q&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;q ⟶ r&amp;quot; using assms(1,2) ..&lt;br /&gt;
  thus &amp;quot;¬q&amp;quot; using assms(3) by (rule mt)&lt;br /&gt;
qed    &lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma ejemplo_5_3:&lt;br /&gt;
  assumes &amp;quot;p ⟶ (q ⟶ r)&amp;quot;&lt;br /&gt;
          &amp;quot;p&amp;quot;&lt;br /&gt;
          &amp;quot;¬r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;¬q&amp;quot;&lt;br /&gt;
using assms&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Ejemplo 6. (p. 7) Demostrar &lt;br /&gt;
     ¬p ⟶ q, ¬q ⊢ p&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración detallada es&amp;quot;&lt;br /&gt;
lemma ejemplo_6_1:&lt;br /&gt;
  assumes 1: &amp;quot;¬p ⟶ q&amp;quot; and &lt;br /&gt;
          2: &amp;quot;¬q&amp;quot; &lt;br /&gt;
  shows &amp;quot;p&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have 3: &amp;quot;¬¬p&amp;quot; using 1 2 by (rule mt)&lt;br /&gt;
  show &amp;quot;p&amp;quot; using 3 by (rule notnotD)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma ejemplo_6_2:&lt;br /&gt;
  assumes &amp;quot;¬p ⟶ q&amp;quot;&lt;br /&gt;
          &amp;quot;¬q&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;¬¬p&amp;quot; using assms(1,2) by (rule mt)&lt;br /&gt;
  thus &amp;quot;p&amp;quot; by (rule notnotD)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma ejemplo_6_3:&lt;br /&gt;
  &amp;quot;⟦¬p ⟶ q; ¬q⟧ ⟹ p&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Ejemplo 7. (p. 7) Demostrar&lt;br /&gt;
     p ⟶ ¬q, q ⊢ ¬p&lt;br /&gt;
  *}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración detallada es&amp;quot;&lt;br /&gt;
lemma ejemplo_7_1:&lt;br /&gt;
  assumes 1: &amp;quot;p ⟶ ¬q&amp;quot; and &lt;br /&gt;
          2: &amp;quot;q&amp;quot; &lt;br /&gt;
  shows &amp;quot;¬p&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have 3: &amp;quot;¬¬q&amp;quot; using 2 by (rule notnotI)&lt;br /&gt;
  show &amp;quot;¬p&amp;quot; using 1 3 by (rule mt)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración detallada es&amp;quot;&lt;br /&gt;
lemma ejemplo_7_2:&lt;br /&gt;
  assumes &amp;quot;p ⟶ ¬q&amp;quot;&lt;br /&gt;
          &amp;quot;q&amp;quot; &lt;br /&gt;
  shows   &amp;quot;¬p&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;¬¬q&amp;quot; using assms(2) by (rule notnotI)&lt;br /&gt;
  with assms(1) show &amp;quot;¬p&amp;quot; by (rule mt)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma ejemplo_7_3:&lt;br /&gt;
  &amp;quot;⟦p ⟶ ¬q; q⟧ ⟹ ¬p&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
subsection {* Regla de introducción del condicional *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  La regla de introducción del condicional es&lt;br /&gt;
  · impI: (P ⟹ Q) ⟹ P ⟶ Q&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Ejemplo 8. (p. 8) Demostrar&lt;br /&gt;
     p ⟶ q ⊢ ¬q ⟶ ¬p&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración detallada es&amp;quot;&lt;br /&gt;
lemma ejemplo_8_1:&lt;br /&gt;
  assumes 1: &amp;quot;p ⟶ q&amp;quot; &lt;br /&gt;
  shows &amp;quot;¬q ⟶ ¬p&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  { assume 2: &amp;quot;¬q&amp;quot;&lt;br /&gt;
    have &amp;quot;¬p&amp;quot; using 1 2 by (rule mt) } &lt;br /&gt;
  thus &amp;quot;¬q ⟶ ¬p&amp;quot; by (rule impI)&lt;br /&gt;
qed    &lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Nota sobre el lenguaje: En la demostración anterior se ha usado&lt;br /&gt;
  · &amp;quot;{ ... }&amp;quot; para representar una caja. *}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma ejemplo_8_2:&lt;br /&gt;
  assumes &amp;quot;p ⟶ q&amp;quot; &lt;br /&gt;
  shows &amp;quot;¬q ⟶ ¬p&amp;quot;&lt;br /&gt;
proof &lt;br /&gt;
  assume &amp;quot;¬q&amp;quot;&lt;br /&gt;
  with assms show &amp;quot;¬p&amp;quot; by (rule mt)&lt;br /&gt;
qed    &lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma ejemplo_8_3:&lt;br /&gt;
  assumes &amp;quot;p ⟶ q&amp;quot; &lt;br /&gt;
  shows &amp;quot;¬q ⟶ ¬p&amp;quot;&lt;br /&gt;
using assms&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Ejemplo 9. (p. 9) Demostrar&lt;br /&gt;
     ¬q ⟶ ¬p ⊢ p ⟶ ¬¬q&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración detallada es&amp;quot;&lt;br /&gt;
lemma ejemplo_9_1: &lt;br /&gt;
  assumes 1: &amp;quot;¬q ⟶ ¬p&amp;quot; &lt;br /&gt;
  shows &amp;quot;p ⟶ ¬¬q&amp;quot;   &lt;br /&gt;
proof -&lt;br /&gt;
  { assume 2: &amp;quot;p&amp;quot;&lt;br /&gt;
    have 3: &amp;quot;¬¬p&amp;quot; using 2 by (rule notnotI)&lt;br /&gt;
    have &amp;quot;¬¬q&amp;quot; using 1 3 by (rule mt) } &lt;br /&gt;
  thus &amp;quot;p ⟶ ¬¬q&amp;quot; by (rule impI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma ejemplo_9_2:&lt;br /&gt;
  assumes &amp;quot;¬q ⟶ ¬p&amp;quot; &lt;br /&gt;
  shows    &amp;quot;p ⟶ ¬¬q&amp;quot;   &lt;br /&gt;
proof &lt;br /&gt;
  assume &amp;quot;p&amp;quot;&lt;br /&gt;
  hence &amp;quot;¬¬p&amp;quot; by (rule notnotI)&lt;br /&gt;
  with assms show &amp;quot;¬¬q&amp;quot; by (rule mt)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma ejemplo_9_3:&lt;br /&gt;
  assumes &amp;quot;¬q ⟶ ¬p&amp;quot; &lt;br /&gt;
  shows &amp;quot;p ⟶ ¬¬q&amp;quot;   &lt;br /&gt;
using assms&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Ejemplo 10 (p. 9). Demostrar&lt;br /&gt;
     ⊢ p ⟶ p&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración detallada es&amp;quot;&lt;br /&gt;
lemma ejemplo_10_1:&lt;br /&gt;
  &amp;quot;p ⟶ p&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  { assume 1: &amp;quot;p&amp;quot;&lt;br /&gt;
    have &amp;quot;p&amp;quot; using 1 by this }&lt;br /&gt;
  thus &amp;quot;p ⟶ p&amp;quot; by (rule impI) &lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma ejemplo_10_2:&lt;br /&gt;
  &amp;quot;p ⟶ p&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma ejemplo_10_3:&lt;br /&gt;
  &amp;quot;p ⟶ p&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Ejemplo 11 (p. 10) Demostrar&lt;br /&gt;
     ⊢ (q ⟶ r) ⟶ ((¬q ⟶ ¬p) ⟶ (p ⟶ r))&lt;br /&gt;
 *}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración detallada es&amp;quot;&lt;br /&gt;
lemma ejemplo_11_1:&lt;br /&gt;
  &amp;quot;(q ⟶ r) ⟶ ((¬q ⟶ ¬p) ⟶ (p ⟶ r))&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  { assume 1: &amp;quot;q ⟶ r&amp;quot;&lt;br /&gt;
    { assume 2: &amp;quot;¬q ⟶ ¬p&amp;quot;&lt;br /&gt;
      { assume 3: &amp;quot;p&amp;quot;&lt;br /&gt;
        have 4: &amp;quot;¬¬p&amp;quot; using 3 by (rule notnotI)&lt;br /&gt;
        have 5: &amp;quot;¬¬q&amp;quot; using 2 4 by (rule mt)&lt;br /&gt;
        have 6: &amp;quot;q&amp;quot; using 5 by (rule notnotD)&lt;br /&gt;
        have &amp;quot;r&amp;quot; using 1 6 by (rule mp) } &lt;br /&gt;
      hence &amp;quot;p ⟶ r&amp;quot; by (rule impI) } &lt;br /&gt;
    hence &amp;quot;(¬q ⟶ ¬p) ⟶ p ⟶ r&amp;quot; by (rule impI) } &lt;br /&gt;
  thus &amp;quot;(q ⟶ r) ⟶ ((¬q ⟶ ¬p) ⟶ p ⟶ r)&amp;quot; by (rule impI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración hacia atrás es&amp;quot;&lt;br /&gt;
lemma ejemplo_11_2:&lt;br /&gt;
  &amp;quot;(q ⟶ r) ⟶ ((¬q ⟶ ¬p) ⟶ (p ⟶ r))&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume 1: &amp;quot;q ⟶ r&amp;quot;&lt;br /&gt;
  show &amp;quot;(¬q ⟶ ¬p) ⟶ (p ⟶ r)&amp;quot;&lt;br /&gt;
  proof (rule impI)&lt;br /&gt;
    assume 2: &amp;quot;¬q ⟶ ¬p&amp;quot;&lt;br /&gt;
    show &amp;quot;p ⟶ r&amp;quot;&lt;br /&gt;
    proof (rule impI)&lt;br /&gt;
      assume 3: &amp;quot;p&amp;quot;&lt;br /&gt;
      have 4: &amp;quot;¬¬p&amp;quot; using 3 by (rule notnotI)&lt;br /&gt;
      have 5: &amp;quot;¬¬q&amp;quot; using 2 4 by (rule mt)&lt;br /&gt;
      have 6: &amp;quot;q&amp;quot; using 5 by (rule notnotD)&lt;br /&gt;
      show &amp;quot;r&amp;quot; using 1 6 by (rule mp)&lt;br /&gt;
    qed&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración hacia atrás con reglas implícitas es&amp;quot;&lt;br /&gt;
lemma ejemplo_11_3:&lt;br /&gt;
  &amp;quot;(q ⟶ r) ⟶ ((¬q ⟶ ¬p) ⟶ (p ⟶ r))&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume 1: &amp;quot;q ⟶ r&amp;quot;&lt;br /&gt;
  show &amp;quot;(¬q ⟶ ¬p) ⟶ (p ⟶ r)&amp;quot;&lt;br /&gt;
  proof&lt;br /&gt;
    assume 2: &amp;quot;¬q ⟶ ¬p&amp;quot;&lt;br /&gt;
    show &amp;quot;p ⟶ r&amp;quot;&lt;br /&gt;
    proof&lt;br /&gt;
      assume 3: &amp;quot;p&amp;quot;&lt;br /&gt;
      have 4: &amp;quot;¬¬p&amp;quot; using 3 ..&lt;br /&gt;
      have 5: &amp;quot;¬¬q&amp;quot; using 2 4 by (rule mt)&lt;br /&gt;
      have 6: &amp;quot;q&amp;quot; using 5 by (rule notnotD)&lt;br /&gt;
      show &amp;quot;r&amp;quot; using 1 6 ..&lt;br /&gt;
    qed&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración sin etiquetas es&amp;quot; &lt;br /&gt;
lemma ejemplo_11_4:&lt;br /&gt;
  &amp;quot;(q ⟶ r) ⟶ ((¬q ⟶ ¬p) ⟶ (p ⟶ r))&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume &amp;quot;q ⟶ r&amp;quot;&lt;br /&gt;
  show &amp;quot;(¬q ⟶ ¬p) ⟶ (p ⟶ r)&amp;quot;&lt;br /&gt;
  proof&lt;br /&gt;
    assume &amp;quot;¬q ⟶ ¬p&amp;quot;&lt;br /&gt;
    show &amp;quot;p ⟶ r&amp;quot;&lt;br /&gt;
    proof&lt;br /&gt;
      assume &amp;quot;p&amp;quot;&lt;br /&gt;
      hence &amp;quot;¬¬p&amp;quot; ..&lt;br /&gt;
      with `¬q ⟶ ¬p` have &amp;quot;¬¬q&amp;quot; by (rule mt)&lt;br /&gt;
      hence &amp;quot;q&amp;quot; by (rule notnotD)&lt;br /&gt;
      with `q ⟶ r` show &amp;quot;r&amp;quot; ..&lt;br /&gt;
    qed&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma ejemplo_11_5:&lt;br /&gt;
  &amp;quot;(q ⟶ r) ⟶ ((¬q ⟶ ¬p) ⟶ (p ⟶ r))&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
subsection {* Reglas de la disyunción *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Las reglas de la introducción de la disyunción son&lt;br /&gt;
  · disjI1: P ⟹ P ∨ Q&lt;br /&gt;
  · disjI2: Q ⟹ P ∨ Q&lt;br /&gt;
  La regla de elimación de la disyunción es&lt;br /&gt;
  · disjE:  ⟦P ∨ Q; P ⟹ R; Q ⟹ R⟧ ⟹ R &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Ejemplo 12 (p. 11). Demostrar&lt;br /&gt;
     p ∨ q ⊢ q ∨ p&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración detallada es&amp;quot;&lt;br /&gt;
lemma ejemplo_12_1:&lt;br /&gt;
  assumes &amp;quot;p ∨ q&amp;quot; &lt;br /&gt;
  shows &amp;quot;q ∨ p&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;p ∨ q&amp;quot; using assms by this&lt;br /&gt;
  moreover&lt;br /&gt;
  { assume 2: &amp;quot;p&amp;quot;&lt;br /&gt;
    have &amp;quot;q ∨ p&amp;quot; using 2 by (rule disjI2) }&lt;br /&gt;
  moreover&lt;br /&gt;
  { assume 3: &amp;quot;q&amp;quot;&lt;br /&gt;
    have &amp;quot;q ∨ p&amp;quot; using 3 by (rule disjI1) }&lt;br /&gt;
  ultimately show &amp;quot;q ∨ p&amp;quot; by (rule disjE) &lt;br /&gt;
qed    &lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Nota sobre el lenguaje: En la demostración anterior se ha usado&lt;br /&gt;
  · &amp;quot;moreover&amp;quot; para separar los bloques y&lt;br /&gt;
  · &amp;quot;ultimately&amp;quot; para unir los resultados de los bloques. *}&lt;br /&gt;
 &lt;br /&gt;
-- &amp;quot;La demostración detallada con reglas implícitas es&amp;quot;&lt;br /&gt;
lemma ejemplo_12_2:&lt;br /&gt;
  assumes &amp;quot;p ∨ q&amp;quot; &lt;br /&gt;
  shows &amp;quot;q ∨ p&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  note `p ∨ q`&lt;br /&gt;
  moreover&lt;br /&gt;
  { assume &amp;quot;p&amp;quot;&lt;br /&gt;
    hence &amp;quot;q ∨ p&amp;quot; .. }&lt;br /&gt;
  moreover&lt;br /&gt;
  { assume &amp;quot;q&amp;quot;&lt;br /&gt;
    hence &amp;quot;q ∨ p&amp;quot; .. }&lt;br /&gt;
  ultimately show &amp;quot;q ∨ p&amp;quot; ..&lt;br /&gt;
qed    &lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Nota sobre el lenguaje: En la demostración anterior se ha usado&lt;br /&gt;
  · &amp;quot;note&amp;quot; para copiar un hecho. *}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración hacia atrás es&amp;quot;&lt;br /&gt;
lemma ejemplo_12_3:&lt;br /&gt;
  assumes 1: &amp;quot;p ∨ q&amp;quot; &lt;br /&gt;
  shows &amp;quot;q ∨ p&amp;quot;&lt;br /&gt;
using 1&lt;br /&gt;
proof (rule disjE)&lt;br /&gt;
  { assume 2: &amp;quot;p&amp;quot;&lt;br /&gt;
    show &amp;quot;q ∨ p&amp;quot; using 2 by (rule disjI2) }&lt;br /&gt;
next&lt;br /&gt;
  { assume 3: &amp;quot;q&amp;quot;&lt;br /&gt;
    show &amp;quot;q ∨ p&amp;quot; using 3 by (rule disjI1) }&lt;br /&gt;
qed    &lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración hacia atrás con reglas implícitas es&amp;quot;&lt;br /&gt;
lemma ejemplo_12_4:&lt;br /&gt;
  assumes &amp;quot;p ∨ q&amp;quot; &lt;br /&gt;
  shows &amp;quot;q ∨ p&amp;quot;&lt;br /&gt;
using assms&lt;br /&gt;
proof &lt;br /&gt;
  { assume  &amp;quot;p&amp;quot;&lt;br /&gt;
    thus &amp;quot;q ∨ p&amp;quot; .. }&lt;br /&gt;
next&lt;br /&gt;
  { assume &amp;quot;q&amp;quot;&lt;br /&gt;
    thus &amp;quot;q ∨ p&amp;quot; .. }&lt;br /&gt;
qed    &lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma ejemplo_12_5:&lt;br /&gt;
  assumes &amp;quot;p ∨ q&amp;quot; &lt;br /&gt;
  shows &amp;quot;q ∨ p&amp;quot;&lt;br /&gt;
using assms&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Ejemplo 13. (p. 12) Demostrar&lt;br /&gt;
     q ⟶ r ⊢ p ∨ q ⟶ p ∨ r&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración detallada es&amp;quot; &lt;br /&gt;
lemma ejemplo_13_1:&lt;br /&gt;
  assumes 1: &amp;quot;q ⟶ r&amp;quot;&lt;br /&gt;
  shows &amp;quot;p ∨ q ⟶ p ∨ r&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume 2: &amp;quot;p ∨ q&amp;quot;&lt;br /&gt;
  thus &amp;quot;p ∨ r&amp;quot;&lt;br /&gt;
  proof (rule disjE)&lt;br /&gt;
    { assume 3: &amp;quot;p&amp;quot;&lt;br /&gt;
      show &amp;quot;p ∨ r&amp;quot; using 3 by (rule disjI1) }&lt;br /&gt;
  next&lt;br /&gt;
    { assume 4: &amp;quot;q&amp;quot;&lt;br /&gt;
      have 5: &amp;quot;r&amp;quot; using 1 4 by (rule mp)&lt;br /&gt;
      show &amp;quot;p ∨ r&amp;quot; using 5 by (rule disjI2) }&lt;br /&gt;
  qed&lt;br /&gt;
qed    &lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot; &lt;br /&gt;
lemma ejemplo_13_2:&lt;br /&gt;
  assumes &amp;quot;q ⟶ r&amp;quot;&lt;br /&gt;
  shows &amp;quot;p ∨ q ⟶ p ∨ r&amp;quot;&lt;br /&gt;
proof &lt;br /&gt;
  assume &amp;quot;p ∨ q&amp;quot;&lt;br /&gt;
  thus &amp;quot;p ∨ r&amp;quot;&lt;br /&gt;
  proof &lt;br /&gt;
    { assume &amp;quot;p&amp;quot;&lt;br /&gt;
      thus &amp;quot;p ∨ r&amp;quot; .. }&lt;br /&gt;
  next&lt;br /&gt;
    { assume &amp;quot;q&amp;quot;&lt;br /&gt;
      have &amp;quot;r&amp;quot; using assms `q` ..&lt;br /&gt;
      thus &amp;quot;p ∨ r&amp;quot; .. }&lt;br /&gt;
  qed&lt;br /&gt;
qed    &lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot; &lt;br /&gt;
lemma ejemplo_13_3:&lt;br /&gt;
  assumes &amp;quot;q ⟶ r&amp;quot;&lt;br /&gt;
  shows &amp;quot;p ∨ q ⟶ p ∨ r&amp;quot;&lt;br /&gt;
using assms&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
subsection {* Regla de copia *}&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Ejemplo 14 (p. 13). Demostrar&lt;br /&gt;
     ⊢ p ⟶ (q ⟶ p)&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración detallada es&amp;quot;&lt;br /&gt;
lemma ejemplo_14_1:&lt;br /&gt;
  &amp;quot;p ⟶ (q ⟶ p)&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume 1: &amp;quot;p&amp;quot;&lt;br /&gt;
  show &amp;quot;q ⟶ p&amp;quot; &lt;br /&gt;
  proof (rule impI)&lt;br /&gt;
    assume &amp;quot;q&amp;quot;&lt;br /&gt;
    show &amp;quot;p&amp;quot; using 1 by this&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma ejemplo_14_2:&lt;br /&gt;
  &amp;quot;p ⟶ (q ⟶ p)&amp;quot;&lt;br /&gt;
proof &lt;br /&gt;
  assume &amp;quot;p&amp;quot;&lt;br /&gt;
  thus &amp;quot;q ⟶ p&amp;quot; ..&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma ejemplo_14_3:&lt;br /&gt;
  &amp;quot;p ⟶ (q ⟶ p)&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
subsection {* Reglas de la negación *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  La regla de eliminación de lo falso es&lt;br /&gt;
  · FalseE: False ⟹ P&lt;br /&gt;
  La regla de eliminación de la negación es&lt;br /&gt;
  · notE: ⟦¬P; P⟧ ⟹ R&lt;br /&gt;
  La regla de introducción de la negación es&lt;br /&gt;
  · notI: (P ⟹ False) ⟹ ¬P&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Ejemplo 15 (p. 15). Demostrar&lt;br /&gt;
     ¬p ∨ q ⊢ p ⟶ q&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración detallada es&amp;quot;&lt;br /&gt;
lemma ejemplo_15_1:&lt;br /&gt;
  assumes 1: &amp;quot;¬p ∨ q&amp;quot; &lt;br /&gt;
  shows &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume 2: &amp;quot;p&amp;quot;&lt;br /&gt;
  note 1&lt;br /&gt;
  thus &amp;quot;q&amp;quot;&lt;br /&gt;
  proof (rule disjE)&lt;br /&gt;
    { assume 3: &amp;quot;¬p&amp;quot;&lt;br /&gt;
      show &amp;quot;q&amp;quot; using 3 2 by (rule notE) }&lt;br /&gt;
  next&lt;br /&gt;
    { assume 4: &amp;quot;q&amp;quot;&lt;br /&gt;
      show &amp;quot;q&amp;quot; using 4 by this}&lt;br /&gt;
  qed&lt;br /&gt;
qed    &lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma ejemplo_15_2:&lt;br /&gt;
  assumes &amp;quot;¬p ∨ q&amp;quot; &lt;br /&gt;
  shows &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
proof &lt;br /&gt;
  assume &amp;quot;p&amp;quot;&lt;br /&gt;
  note `¬p ∨ q`&lt;br /&gt;
  thus &amp;quot;q&amp;quot;&lt;br /&gt;
  proof&lt;br /&gt;
    assume &amp;quot;¬p&amp;quot;&lt;br /&gt;
    thus &amp;quot;q&amp;quot; using `p` .. &lt;br /&gt;
  next&lt;br /&gt;
    assume &amp;quot;q&amp;quot;&lt;br /&gt;
      thus &amp;quot;q&amp;quot; .&lt;br /&gt;
  qed&lt;br /&gt;
qed    &lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma ejemplo_15_3:&lt;br /&gt;
  assumes &amp;quot;¬p ∨ q&amp;quot; &lt;br /&gt;
  shows &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
using assms&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Ejemplo 16 (p. 16). Demostrar&lt;br /&gt;
     p ⟶ q, p ⟶ ¬q ⊢ ¬p&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración detallada es&amp;quot;&lt;br /&gt;
lemma ejemplo_16_1:&lt;br /&gt;
  assumes 1: &amp;quot;p ⟶ q&amp;quot; and &lt;br /&gt;
          2: &amp;quot;p ⟶ ¬q&amp;quot; &lt;br /&gt;
  shows &amp;quot;¬p&amp;quot;    &lt;br /&gt;
proof (rule notI)&lt;br /&gt;
  assume 3: &amp;quot;p&amp;quot;&lt;br /&gt;
  have 4: &amp;quot;q&amp;quot; using 1 3 by (rule mp)&lt;br /&gt;
  have 5: &amp;quot;¬q&amp;quot; using 2 3 by (rule mp)&lt;br /&gt;
  show False using 5 4 by (rule notE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma ejemplo_16_2:&lt;br /&gt;
  assumes &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
          &amp;quot;p ⟶ ¬q&amp;quot; &lt;br /&gt;
  shows &amp;quot;¬p&amp;quot;    &lt;br /&gt;
proof &lt;br /&gt;
  assume &amp;quot;p&amp;quot;&lt;br /&gt;
  have &amp;quot;q&amp;quot; using assms(1) `p` ..&lt;br /&gt;
  have &amp;quot;¬q&amp;quot; using assms(2) `p` ..&lt;br /&gt;
  thus False using `q` ..&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma ejemplo_16_3:&lt;br /&gt;
  assumes &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
          &amp;quot;p ⟶ ¬q&amp;quot; &lt;br /&gt;
  shows &amp;quot;¬p&amp;quot;    &lt;br /&gt;
using assms&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
subsection {* Reglas del bicondicional *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  La regla de introducción del bicondicional es&lt;br /&gt;
  · iffI: ⟦P ⟹ Q; Q ⟹ P⟧ ⟹ P ⟷ Q&lt;br /&gt;
  Las reglas de eliminación del bicondicional son&lt;br /&gt;
  · iffD1: ⟦Q ⟷ P; Q⟧ ⟹ P &lt;br /&gt;
  · iffD2: ⟦P ⟷ Q; Q⟧ ⟹ P&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Ejemplo 17 (p. 17) Demostrar&lt;br /&gt;
     (p ∧ q) ⟷ (q ∧ p)&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración detallada es&amp;quot;&lt;br /&gt;
lemma ejemplo_17_1:&lt;br /&gt;
  &amp;quot;(p ∧ q) ⟷ (q ∧ p)&amp;quot; &lt;br /&gt;
proof (rule iffI)&lt;br /&gt;
  { assume 1: &amp;quot;p ∧ q&amp;quot;&lt;br /&gt;
    have 2: &amp;quot;p&amp;quot; using 1 by (rule conjunct1)&lt;br /&gt;
    have 3: &amp;quot;q&amp;quot; using 1 by (rule conjunct2)&lt;br /&gt;
    show &amp;quot;q ∧ p&amp;quot; using 3 2 by (rule conjI) }&lt;br /&gt;
next&lt;br /&gt;
  { assume 4: &amp;quot;q ∧ p&amp;quot;&lt;br /&gt;
    have 5: &amp;quot;q&amp;quot; using 4 by (rule conjunct1)&lt;br /&gt;
    have 6: &amp;quot;p&amp;quot; using 4 by (rule conjunct2)&lt;br /&gt;
    show &amp;quot;p ∧ q&amp;quot; using 6 5 by (rule conjI) }&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma ejemplo_17_2:&lt;br /&gt;
  &amp;quot;(p ∧ q) ⟷ (q ∧ p)&amp;quot;&lt;br /&gt;
proof &lt;br /&gt;
  { assume 1: &amp;quot;p ∧ q&amp;quot;&lt;br /&gt;
    have &amp;quot;p&amp;quot; using 1 ..&lt;br /&gt;
    have &amp;quot;q&amp;quot; using 1 ..&lt;br /&gt;
    show &amp;quot;q ∧ p&amp;quot; using `q` `p` .. }&lt;br /&gt;
next&lt;br /&gt;
  { assume 2: &amp;quot;q ∧ p&amp;quot;&lt;br /&gt;
    have &amp;quot;q&amp;quot; using 2 ..&lt;br /&gt;
    have &amp;quot;p&amp;quot; using 2 ..&lt;br /&gt;
    show &amp;quot;p ∧ q&amp;quot; using `p` `q`  .. }&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma ejemplo_17_3:&lt;br /&gt;
  &amp;quot;(p ∧ q) ⟷ (q ∧ p)&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Ejemplo 18 (p. 18). Demostrar&lt;br /&gt;
     p ⟷ q, p ∨ q ⊢ p ∧ q&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración detallada es&amp;quot;&lt;br /&gt;
lemma ejemplo_18_1:&lt;br /&gt;
  assumes 1: &amp;quot;p ⟷ q&amp;quot; and &lt;br /&gt;
          2: &amp;quot;p ∨ q&amp;quot;  &lt;br /&gt;
  shows &amp;quot;p ∧ q&amp;quot;&lt;br /&gt;
using 2&lt;br /&gt;
proof (rule disjE)&lt;br /&gt;
  { assume 3: &amp;quot;p&amp;quot;&lt;br /&gt;
    have 4: &amp;quot;q&amp;quot; using 1 3 by (rule iffD1)&lt;br /&gt;
    show &amp;quot;p ∧ q&amp;quot; using 3 4 by (rule conjI) }&lt;br /&gt;
next&lt;br /&gt;
  { assume 5: &amp;quot;q&amp;quot;&lt;br /&gt;
    have 6: &amp;quot;p&amp;quot; using 1 5 by (rule iffD2)&lt;br /&gt;
    show &amp;quot;p ∧ q&amp;quot; using 6 5 by (rule conjI) }&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma ejemplo_18_2:&lt;br /&gt;
  assumes &amp;quot;p ⟷ q&amp;quot;&lt;br /&gt;
          &amp;quot;p ∨ q&amp;quot;  &lt;br /&gt;
  shows  &amp;quot;p ∧ q&amp;quot;&lt;br /&gt;
using assms(2)&lt;br /&gt;
proof&lt;br /&gt;
  { assume &amp;quot;p&amp;quot;&lt;br /&gt;
    with assms(1) have &amp;quot;q&amp;quot; ..&lt;br /&gt;
    with `p` show &amp;quot;p ∧ q&amp;quot; .. }&lt;br /&gt;
next&lt;br /&gt;
  { assume &amp;quot;q&amp;quot;&lt;br /&gt;
    with assms(1) have &amp;quot;p&amp;quot; ..&lt;br /&gt;
    thus &amp;quot;p ∧ q&amp;quot; using `q` .. }&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma ejemplo_18_3:&lt;br /&gt;
  assumes &amp;quot;p ⟷ q&amp;quot;&lt;br /&gt;
          &amp;quot;p ∨ q&amp;quot;  &lt;br /&gt;
  shows &amp;quot;p ∧ q&amp;quot;&lt;br /&gt;
using assms&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
subsection {* Reglas derivadas *}&lt;br /&gt;
&lt;br /&gt;
subsubsection {* Regla del modus tollens *}&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Ejemplo 19 (p. 20) Demostrar la regla del modus tollens a partir de&lt;br /&gt;
  las reglas básicas. &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración detallada es&amp;quot;&lt;br /&gt;
lemma ejemplo_20_1:&lt;br /&gt;
  assumes 1: &amp;quot;F ⟶ G&amp;quot; and &lt;br /&gt;
          2: &amp;quot;¬G&amp;quot; &lt;br /&gt;
  shows &amp;quot;¬F&amp;quot;&lt;br /&gt;
proof (rule notI)&lt;br /&gt;
  assume 3: &amp;quot;F&amp;quot;&lt;br /&gt;
  have 4: &amp;quot;G&amp;quot; using 1 3 by (rule mp)&lt;br /&gt;
  show False using 2 4 by (rule notE)&lt;br /&gt;
qed    &lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma ejemplo_20_2:&lt;br /&gt;
  assumes &amp;quot;F ⟶ G&amp;quot;&lt;br /&gt;
          &amp;quot;¬G&amp;quot; &lt;br /&gt;
  shows   &amp;quot;¬F&amp;quot;&lt;br /&gt;
proof &lt;br /&gt;
  assume &amp;quot;F&amp;quot;&lt;br /&gt;
  with assms(1) have &amp;quot;G&amp;quot; ..&lt;br /&gt;
  with assms(2) show False ..&lt;br /&gt;
qed    &lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma ejemplo_20_3:&lt;br /&gt;
  assumes &amp;quot;F ⟶ G&amp;quot;&lt;br /&gt;
          &amp;quot;¬G&amp;quot; &lt;br /&gt;
  shows &amp;quot;¬F&amp;quot;&lt;br /&gt;
using assms&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
subsubsection {* Regla de la introducción de la doble negación *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Ejemplo 21 (p. 21) Demostrar la regla de introducción de la doble&lt;br /&gt;
  negación a partir de las reglas básicas.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración detallada es&amp;quot;&lt;br /&gt;
lemma ejemplo_21_1:&lt;br /&gt;
  assumes 1: &amp;quot;F&amp;quot; &lt;br /&gt;
  shows &amp;quot;¬¬F&amp;quot;&lt;br /&gt;
proof (rule notI)&lt;br /&gt;
  assume 2: &amp;quot;¬F&amp;quot;&lt;br /&gt;
  show False using 2 1 by (rule notE)&lt;br /&gt;
qed    &lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma ejemplo_21_2:&lt;br /&gt;
  assumes &amp;quot;F&amp;quot; &lt;br /&gt;
  shows &amp;quot;¬¬F&amp;quot;&lt;br /&gt;
proof &lt;br /&gt;
  assume &amp;quot;¬F&amp;quot;&lt;br /&gt;
  thus False using assms ..&lt;br /&gt;
qed    &lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma ejemplo_21_3:&lt;br /&gt;
  assumes &amp;quot;F&amp;quot; &lt;br /&gt;
  shows &amp;quot;¬¬F&amp;quot;&lt;br /&gt;
using assms&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
subsubsection {* Regla de reducción al absurdo *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  La regla de reducción al absurdo en Isabelle se correponde con la&lt;br /&gt;
  regla clásica de contradicción &lt;br /&gt;
  · ccontr: (¬P ⟹ False) ⟹ P&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
subsubsection {* Ley del tercio excluso *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  La ley del tercio excluso es &lt;br /&gt;
  · excluded_middle: ¬P ∨ P&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Ejemplo 22 (p. 23). Demostrar la ley del tercio excluso a partir de&lt;br /&gt;
  las reglas básicas.  &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración detallada es&amp;quot;&lt;br /&gt;
lemma ejemplo_22_1:&lt;br /&gt;
  &amp;quot;F ∨ ¬F&amp;quot;&lt;br /&gt;
proof (rule ccontr)&lt;br /&gt;
  assume 1: &amp;quot;¬(F ∨ ¬F)&amp;quot;&lt;br /&gt;
  thus False&lt;br /&gt;
  proof (rule notE)&lt;br /&gt;
    show &amp;quot;F ∨ ¬F&amp;quot;&lt;br /&gt;
    proof (rule disjI2)&lt;br /&gt;
      show &amp;quot;¬F&amp;quot;&lt;br /&gt;
      proof (rule notI)&lt;br /&gt;
        assume 2: &amp;quot;F&amp;quot;&lt;br /&gt;
        hence 3: &amp;quot;F ∨ ¬F&amp;quot; by (rule disjI1)&lt;br /&gt;
        show False using 1 3 by (rule notE)&lt;br /&gt;
      qed&lt;br /&gt;
    qed&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
    &lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma ejemplo_22_2:&lt;br /&gt;
  &amp;quot;F ∨ ¬F&amp;quot;&lt;br /&gt;
proof (rule ccontr)&lt;br /&gt;
  assume &amp;quot;¬(F ∨ ¬F)&amp;quot;&lt;br /&gt;
  thus False&lt;br /&gt;
  proof (rule notE)&lt;br /&gt;
    show &amp;quot;F ∨ ¬F&amp;quot;&lt;br /&gt;
    proof (rule disjI2)&lt;br /&gt;
      show &amp;quot;¬F&amp;quot;&lt;br /&gt;
      proof (rule notI)&lt;br /&gt;
        assume &amp;quot;F&amp;quot;&lt;br /&gt;
        hence &amp;quot;F ∨ ¬F&amp;quot; ..&lt;br /&gt;
        with `¬(F ∨ ¬F)`show False ..&lt;br /&gt;
      qed&lt;br /&gt;
    qed&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
    &lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma ejemplo_22_3:&lt;br /&gt;
  &amp;quot;F ∨ ¬F&amp;quot;&lt;br /&gt;
using assms&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Ejemplo 23 (p. 24). Demostrar&lt;br /&gt;
     p ⟶ q ⊢ ¬p ∨ q&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración detallada es&amp;quot;&lt;br /&gt;
lemma ejemplo_23_1:&lt;br /&gt;
  assumes 1: &amp;quot;p ⟶ q&amp;quot; &lt;br /&gt;
  shows &amp;quot;¬p ∨ q&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;¬p ∨ p&amp;quot; by (rule excluded_middle)&lt;br /&gt;
  thus &amp;quot;¬p ∨ q&amp;quot;&lt;br /&gt;
  proof (rule disjE)&lt;br /&gt;
    { assume &amp;quot;¬p&amp;quot;&lt;br /&gt;
      thus &amp;quot;¬p ∨ q&amp;quot; by (rule disjI1) }&lt;br /&gt;
  next&lt;br /&gt;
    { assume 2: &amp;quot;p&amp;quot;&lt;br /&gt;
      have &amp;quot;q&amp;quot; using 1 2 by (rule mp)&lt;br /&gt;
      thus &amp;quot;¬p ∨ q&amp;quot; by (rule disjI2) }&lt;br /&gt;
  qed&lt;br /&gt;
qed    &lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma ejemplo_23_2:&lt;br /&gt;
  assumes &amp;quot;p ⟶ q&amp;quot; &lt;br /&gt;
  shows &amp;quot;¬p ∨ q&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;¬p ∨ p&amp;quot; ..&lt;br /&gt;
  thus &amp;quot;¬p ∨ q&amp;quot;&lt;br /&gt;
  proof &lt;br /&gt;
    { assume &amp;quot;¬p&amp;quot;&lt;br /&gt;
      thus &amp;quot;¬p ∨ q&amp;quot; .. }&lt;br /&gt;
  next&lt;br /&gt;
    { assume &amp;quot;p&amp;quot;&lt;br /&gt;
      with assms have &amp;quot;q&amp;quot; ..&lt;br /&gt;
      thus &amp;quot;¬p ∨ q&amp;quot; .. }&lt;br /&gt;
  qed&lt;br /&gt;
qed    &lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma ejemplo_23_3:&lt;br /&gt;
  assumes &amp;quot;p ⟶ q&amp;quot; &lt;br /&gt;
  shows &amp;quot;¬p ∨ q&amp;quot;&lt;br /&gt;
using assms&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
subsection {* Demostraciones por contradicción *}&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Ejemplo 24. Demostrar que &lt;br /&gt;
     ¬p, p ∨ q ⊢ q&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración detallada es&amp;quot;&lt;br /&gt;
lemma ejemplo_24_1:&lt;br /&gt;
  assumes &amp;quot;¬p&amp;quot;&lt;br /&gt;
          &amp;quot;p ∨ q&amp;quot;&lt;br /&gt;
  shows   &amp;quot;q&amp;quot;&lt;br /&gt;
using `p ∨ q`&lt;br /&gt;
proof (rule disjE)&lt;br /&gt;
  assume &amp;quot;p&amp;quot;&lt;br /&gt;
  with assms(1) show &amp;quot;q&amp;quot; by contradiction &lt;br /&gt;
next&lt;br /&gt;
  assume &amp;quot;q&amp;quot;&lt;br /&gt;
  thus &amp;quot;q&amp;quot; by assumption&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma ejemplo_24_2:&lt;br /&gt;
  assumes &amp;quot;¬p&amp;quot;&lt;br /&gt;
          &amp;quot;p ∨ q&amp;quot;&lt;br /&gt;
  shows &amp;quot;q&amp;quot;&lt;br /&gt;
using `p ∨ q`&lt;br /&gt;
proof &lt;br /&gt;
  assume &amp;quot;p&amp;quot;&lt;br /&gt;
  with assms(1) show &amp;quot;q&amp;quot; ..&lt;br /&gt;
next&lt;br /&gt;
  assume &amp;quot;q&amp;quot;&lt;br /&gt;
  thus &amp;quot;q&amp;quot; .&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma ejemplo_24_3:&lt;br /&gt;
  assumes &amp;quot;¬p&amp;quot;&lt;br /&gt;
          &amp;quot;p ∨ q&amp;quot;&lt;br /&gt;
  shows &amp;quot;q&amp;quot;&lt;br /&gt;
using assms&lt;br /&gt;
by auto&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>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2016/index.php?title=Tema_8b:_Deducci%C3%B3n_natural_proposicional_con_Isabelle/HOL&amp;diff=1234</id>
		<title>Tema 8b: Deducción natural proposicional con Isabelle/HOL</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2016/index.php?title=Tema_8b:_Deducci%C3%B3n_natural_proposicional_con_Isabelle/HOL&amp;diff=1234"/>
		<updated>2017-01-12T06:50:32Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: Página creada con &amp;#039;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt; chapter {* Tema 7b: Deducción natural proposicional con Isabelle/HOL *}  theory T8b_Deduccion_natural_en_logica_proposicional_con_Isabelle imports Main  be...&amp;#039;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
chapter {* Tema 7b: Deducción natural proposicional con Isabelle/HOL *}&lt;br /&gt;
&lt;br /&gt;
theory T8b_Deduccion_natural_en_logica_proposicional_con_Isabelle&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  En este tema se presentan los ejemplos del tema de deducción natural&lt;br /&gt;
  proposicional siguiendo la presentación de Huth y Ryan en su libro&lt;br /&gt;
  &amp;quot;Logic in Computer Science&amp;quot; http://goo.gl/qsVpY y, más concretamente,&lt;br /&gt;
  a la forma como se explica en la asignatura de &amp;quot;Lógica informática&amp;quot; (LI) &lt;br /&gt;
  http://goo.gl/AwDiv&lt;br /&gt;
 &lt;br /&gt;
  La página al lado de cada ejemplo indica la página de las transparencias &lt;br /&gt;
  de LI donde se encuentra la demostración. *}&lt;br /&gt;
&lt;br /&gt;
subsection {* Reglas de la conjunción *}&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Ejemplo 1 (p. 4). Demostrar que&lt;br /&gt;
     p ∧ q, r ⊢ q ∧ r.&lt;br /&gt;
  *}     &lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración detallada es&amp;quot;&lt;br /&gt;
lemma ejemplo_1_1:&lt;br /&gt;
  assumes 1: &amp;quot;p ∧ q&amp;quot; and&lt;br /&gt;
          2: &amp;quot;r&amp;quot; &lt;br /&gt;
  shows &amp;quot;q ∧ r&amp;quot;     &lt;br /&gt;
proof -&lt;br /&gt;
  have 3: &amp;quot;q&amp;quot; using 1 by (rule conjunct2)&lt;br /&gt;
  show 4: &amp;quot;q ∧ r&amp;quot; using 3 2 by (rule conjI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Notas sobre el lenguaje: En la demostración anterior se ha usado&lt;br /&gt;
  · &amp;quot;assumes&amp;quot; para indicar las hipótesis,&lt;br /&gt;
  · &amp;quot;and&amp;quot; para separar las hipótesis,&lt;br /&gt;
  · &amp;quot;shows&amp;quot; para indicar la conclusión,&lt;br /&gt;
  · &amp;quot;proof&amp;quot; para iniciar la prueba,&lt;br /&gt;
  · &amp;quot;qed&amp;quot; para terminar la pruebas,&lt;br /&gt;
  · &amp;quot;-&amp;quot; (después de &amp;quot;proof&amp;quot;) para no usar el método por defecto,&lt;br /&gt;
  · &amp;quot;have&amp;quot; para establecer un paso,&lt;br /&gt;
  · &amp;quot;using&amp;quot; para usar hechos en un paso,&lt;br /&gt;
  · &amp;quot;by (rule ..)&amp;quot; para indicar la regla con la que se peueba un hecho,&lt;br /&gt;
  · &amp;quot;show&amp;quot; para establecer la conclusión.&lt;br /&gt;
&lt;br /&gt;
  Notas sobre la lógica: Las reglas de la conjunción son&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;
*}&lt;br /&gt;
&lt;br /&gt;
text {* Se pueden dejar implícitas las reglas como sigue *}&lt;br /&gt;
&lt;br /&gt;
lemma ejemplo_1_2:&lt;br /&gt;
  assumes 1: &amp;quot;p ∧ q&amp;quot; and &lt;br /&gt;
          2: &amp;quot;r&amp;quot; &lt;br /&gt;
  shows &amp;quot;q ∧ r&amp;quot;     &lt;br /&gt;
proof -&lt;br /&gt;
  have 3: &amp;quot;q&amp;quot; using 1 .. &lt;br /&gt;
  show 4: &amp;quot;q ∧ r&amp;quot; using 3 2 ..&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Nota sobre el lenguaje: En la demostración anterior se ha usado&lt;br /&gt;
  · &amp;quot;..&amp;quot; para indicar que se prueba por la regla correspondiente. *}&lt;br /&gt;
&lt;br /&gt;
text {* Se pueden eliminar las etiquetas como sigue *}&lt;br /&gt;
&lt;br /&gt;
lemma ejemplo_1_3:&lt;br /&gt;
  assumes &amp;quot;p ∧ q&amp;quot; &lt;br /&gt;
          &amp;quot;r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;q ∧ r&amp;quot;     &lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;q&amp;quot; using assms(1) ..&lt;br /&gt;
  thus &amp;quot;q ∧ r&amp;quot; using assms(2) ..&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Nota sobre el lenguaje: En la demostración anterior se ha usado&lt;br /&gt;
  · &amp;quot;assms(n)&amp;quot; para indicar la hipótesis n y&lt;br /&gt;
  · &amp;quot;thus&amp;quot; para demostrar la conclusión usando el hecho anterior.&lt;br /&gt;
  Además, no es necesario usar and entre las hipótesis. *}&lt;br /&gt;
&lt;br /&gt;
text {* Se puede automatizar la demostración como sigue *}&lt;br /&gt;
  &lt;br /&gt;
lemma ejemplo_1_4:&lt;br /&gt;
  assumes &amp;quot;p ∧ q&amp;quot; &lt;br /&gt;
          &amp;quot;r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;q ∧ r&amp;quot;     &lt;br /&gt;
using assms&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Nota sobre el lenguaje: En la demostración anterior se ha usado&lt;br /&gt;
  · &amp;quot;assms&amp;quot; para indicar las hipótesis y&lt;br /&gt;
  · &amp;quot;by auto&amp;quot; para demostrar la conclusión automáticamente. *}&lt;br /&gt;
&lt;br /&gt;
text {* Se puede automatizar totalmente la demostración como sigue *}&lt;br /&gt;
&lt;br /&gt;
lemma ejemplo_1_5:&lt;br /&gt;
  &amp;quot;⟦p ∧ q; r⟧ ⟹ q ∧ r&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Nota sobre el lenguaje: En la demostración anterior se ha usado&lt;br /&gt;
  · &amp;quot;⟦ ... ⟧&amp;quot; para representar las hipótesis,&lt;br /&gt;
  · &amp;quot;;&amp;quot; para separar las hipótesis y&lt;br /&gt;
  · &amp;quot;⟹&amp;quot; para separar las hipótesis de la conclusión. *}&lt;br /&gt;
&lt;br /&gt;
text {* Se puede hacer la demostración por razonamiento hacia atrás,&lt;br /&gt;
  como sigue *}&lt;br /&gt;
&lt;br /&gt;
lemma ejemplo_1_6:&lt;br /&gt;
  assumes &amp;quot;p ∧ q&amp;quot; &lt;br /&gt;
      and &amp;quot;r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;q ∧ r&amp;quot;     &lt;br /&gt;
proof (rule conjI)&lt;br /&gt;
  show &amp;quot;q&amp;quot; using assms(1) by (rule conjunct2)&lt;br /&gt;
next&lt;br /&gt;
  show &amp;quot;r&amp;quot; using assms(2) by this&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Nota sobre el lenguaje: En la demostración anterior se ha usado&lt;br /&gt;
  · &amp;quot;proof (rule r)&amp;quot; para indicar que se hará la demostración con la&lt;br /&gt;
    regla r,&lt;br /&gt;
  · &amp;quot;next&amp;quot; para indicar el comienzo de la prueba del siguiente&lt;br /&gt;
    subobjetivo,&lt;br /&gt;
  · &amp;quot;this&amp;quot; para indicar el hecho actual. *}&lt;br /&gt;
&lt;br /&gt;
text {* Se pueden dejar implícitas las reglas como sigue *}&lt;br /&gt;
&lt;br /&gt;
lemma ejemplo_1_7:&lt;br /&gt;
  assumes &amp;quot;p ∧ q&amp;quot; &lt;br /&gt;
          &amp;quot;r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;q ∧ r&amp;quot;     &lt;br /&gt;
proof &lt;br /&gt;
  show &amp;quot;q&amp;quot; using assms(1) ..&lt;br /&gt;
next&lt;br /&gt;
  show &amp;quot;r&amp;quot; using assms(2) . &lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Nota sobre el lenguaje: En la demostración anterior se ha usado&lt;br /&gt;
  · &amp;quot;.&amp;quot; para indicar por el hecho actual. *}&lt;br /&gt;
&lt;br /&gt;
subsection {* Reglas de la doble negación *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  La regla de eliminación de la doble negación es&lt;br /&gt;
  · notnotD: ¬¬ P ⟹ P&lt;br /&gt;
&lt;br /&gt;
  Para ajustarnos al tema de LI vamos a introducir la siguiente regla de&lt;br /&gt;
  introducción de la doble negación&lt;br /&gt;
  · notnotI: P ⟹ ¬¬ P&lt;br /&gt;
  aunque, de momento, no detallamos su demostración.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma notnotI [intro!]: &amp;quot;P ⟹ ¬¬ P&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Ejemplo 2. (p. 5)&lt;br /&gt;
       p, ¬¬(q ∧ r) ⊢ ¬¬p ∧ r&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración detallada es&amp;quot;&lt;br /&gt;
lemma ejemplo_2_1:&lt;br /&gt;
  assumes 1: &amp;quot;p&amp;quot; and&lt;br /&gt;
          2: &amp;quot;¬¬(q ∧ r)&amp;quot; &lt;br /&gt;
  shows      &amp;quot;¬¬p ∧ r&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have 3: &amp;quot;¬¬p&amp;quot; using 1 by (rule notnotI)&lt;br /&gt;
  have 4: &amp;quot;q ∧ r&amp;quot; using 2 by (rule notnotD)&lt;br /&gt;
  have 5: &amp;quot;r&amp;quot; using 4 by (rule conjunct2)&lt;br /&gt;
  show 6: &amp;quot;¬¬p ∧ r&amp;quot; using 3 5 by (rule conjI)&lt;br /&gt;
qed        &lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma ejemplo_2_2:&lt;br /&gt;
  assumes &amp;quot;p&amp;quot; &lt;br /&gt;
          &amp;quot;¬¬(q ∧ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;¬¬p ∧ r&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have  &amp;quot;¬¬p&amp;quot; using assms(1) ..&lt;br /&gt;
  have  &amp;quot;q ∧ r&amp;quot; using assms(2) by (rule notnotD)&lt;br /&gt;
  hence &amp;quot;r&amp;quot; ..&lt;br /&gt;
  with `¬¬p` show  &amp;quot;¬¬p ∧ r&amp;quot; ..&lt;br /&gt;
qed        &lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Nota sobre el lenguaje: En la demostración anterior se ha usado&lt;br /&gt;
  · &amp;quot;hence&amp;quot; para indicar que se tiene por el hecho anterior,&lt;br /&gt;
  · `...` para referenciar un hecho y&lt;br /&gt;
  · &amp;quot;with P show Q&amp;quot; para indicar que con el hecho anterior junto con el&lt;br /&gt;
    hecho P se demuestra Q. *}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma ejemplo_2_3:&lt;br /&gt;
  assumes &amp;quot;p&amp;quot; &lt;br /&gt;
          &amp;quot;¬¬(q ∧ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;¬¬p ∧ r&amp;quot;&lt;br /&gt;
using assms&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
text {* Se puede demostrar hacia atrás *}&lt;br /&gt;
&lt;br /&gt;
lemma ejemplo_2_4:&lt;br /&gt;
  assumes &amp;quot;p&amp;quot; &lt;br /&gt;
          &amp;quot;¬¬(q ∧ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;¬¬p ∧ r&amp;quot;&lt;br /&gt;
proof  (rule conjI)&lt;br /&gt;
  show &amp;quot;¬¬p&amp;quot; using assms(1) by (rule notnotI)&lt;br /&gt;
next&lt;br /&gt;
  have &amp;quot;q ∧ r&amp;quot; using assms(2) by (rule notnotD) &lt;br /&gt;
  thus &amp;quot;r&amp;quot; by (rule conjunct2)&lt;br /&gt;
qed &lt;br /&gt;
&lt;br /&gt;
text {* Se puede eliminar las reglas en la demostración anterior, como&lt;br /&gt;
  sigue: *}&lt;br /&gt;
&lt;br /&gt;
lemma ejemplo_2_5:&lt;br /&gt;
  assumes &amp;quot;p&amp;quot; &lt;br /&gt;
          &amp;quot;¬¬(q ∧ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;¬¬p ∧ r&amp;quot;&lt;br /&gt;
proof &lt;br /&gt;
  show &amp;quot;¬¬p&amp;quot; using assms(1) ..&lt;br /&gt;
next&lt;br /&gt;
  have &amp;quot;q ∧ r&amp;quot; using assms(2) by (rule notnotD) &lt;br /&gt;
  thus &amp;quot;r&amp;quot; .. &lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
subsection {* Regla de eliminación del condicional *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  La regla de eliminación del condicional es la regla del modus ponens&lt;br /&gt;
  · mp: ⟦P ⟶ Q; P⟧ ⟹ Q &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Ejemplo 3. (p. 6) Demostrar que&lt;br /&gt;
     ¬p ∧ q, ¬p ∧ q ⟶ r ∨ ¬p ⊢ r ∨ ¬p&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración detallada es&amp;quot;&lt;br /&gt;
lemma ejemplo_3_1:&lt;br /&gt;
  assumes 1: &amp;quot;¬p ∧ q&amp;quot; and &lt;br /&gt;
          2: &amp;quot;¬p ∧ q ⟶ r ∨ ¬p&amp;quot; &lt;br /&gt;
  shows      &amp;quot;r ∨ ¬p&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  show &amp;quot;r ∨ ¬p&amp;quot; using 2 1 by (rule mp)&lt;br /&gt;
qed    &lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma ejemplo_3_2:&lt;br /&gt;
  assumes &amp;quot;¬p ∧ q&amp;quot;&lt;br /&gt;
          &amp;quot;¬p ∧ q ⟶ r ∨ ¬p&amp;quot; &lt;br /&gt;
  shows   &amp;quot;r ∨ ¬p&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  show &amp;quot;r ∨ ¬p&amp;quot; using assms(2,1) ..&lt;br /&gt;
qed    &lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma ejemplo_3_3:&lt;br /&gt;
  assumes &amp;quot;¬p ∧ q&amp;quot;&lt;br /&gt;
          &amp;quot;¬p ∧ q ⟶ r ∨ ¬p&amp;quot; &lt;br /&gt;
  shows   &amp;quot;r ∨ ¬p&amp;quot;&lt;br /&gt;
using assms&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Ejemplo 4 (p. 6) Demostrar que&lt;br /&gt;
     p, p ⟶ q, p ⟶ (q ⟶ r) ⊢ r&lt;br /&gt;
 *}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración detallada es&amp;quot;&lt;br /&gt;
lemma ejemplo_4_1:&lt;br /&gt;
  assumes 1: &amp;quot;p&amp;quot; and &lt;br /&gt;
          2: &amp;quot;p ⟶ q&amp;quot; and &lt;br /&gt;
          3: &amp;quot;p ⟶ (q ⟶ r)&amp;quot; &lt;br /&gt;
  shows &amp;quot;r&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have 4: &amp;quot;q&amp;quot; using 2 1 by (rule mp)&lt;br /&gt;
  have 5: &amp;quot;q ⟶ r&amp;quot; using 3 1 by (rule mp)&lt;br /&gt;
  show 6: &amp;quot;r&amp;quot; using 5 4 by (rule mp)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma ejemplo_4_2:&lt;br /&gt;
  assumes &amp;quot;p&amp;quot;&lt;br /&gt;
          &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
          &amp;quot;p ⟶ (q ⟶ r)&amp;quot; &lt;br /&gt;
  shows &amp;quot;r&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;q&amp;quot; using assms(2,1) .. &lt;br /&gt;
  have &amp;quot;q ⟶ r&amp;quot; using assms(3,1) ..&lt;br /&gt;
  thus &amp;quot;r&amp;quot; using `q` ..&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma ejemplo_4_3:&lt;br /&gt;
  &amp;quot;⟦p; p ⟶ q; p ⟶ (q ⟶ r)⟧ ⟹ r&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
subsection {* Regla derivada del modus tollens *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Para ajustarnos al tema de LI vamos a introducir la regla del modus&lt;br /&gt;
  tollens&lt;br /&gt;
  · mt: ⟦F ⟶ G; ¬G⟧ ⟹ ¬F &lt;br /&gt;
  aunque, de momento, sin detallar su demostración.&lt;br /&gt;
*}&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;
  Ejemplo 5 (p. 7). Demostrar&lt;br /&gt;
     p ⟶ (q ⟶ r), p, ¬r ⊢ ¬q&lt;br /&gt;
 *}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración detallada es&amp;quot;&lt;br /&gt;
lemma ejemplo_5_1:&lt;br /&gt;
  assumes 1: &amp;quot;p ⟶ (q ⟶ r)&amp;quot; and &lt;br /&gt;
          2: &amp;quot;p&amp;quot; and &lt;br /&gt;
          3: &amp;quot;¬r&amp;quot; &lt;br /&gt;
  shows &amp;quot;¬q&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have 4: &amp;quot;q ⟶ r&amp;quot; using 1 2 by (rule mp)&lt;br /&gt;
  show &amp;quot;¬q&amp;quot; using 4 3 by (rule mt)&lt;br /&gt;
qed    &lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma ejemplo_5_2:&lt;br /&gt;
  assumes &amp;quot;p ⟶ (q ⟶ r)&amp;quot;&lt;br /&gt;
          &amp;quot;p&amp;quot;&lt;br /&gt;
          &amp;quot;¬r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;¬q&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;q ⟶ r&amp;quot; using assms(1,2) ..&lt;br /&gt;
  thus &amp;quot;¬q&amp;quot; using assms(3) by (rule mt)&lt;br /&gt;
qed    &lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma ejemplo_5_3:&lt;br /&gt;
  assumes &amp;quot;p ⟶ (q ⟶ r)&amp;quot;&lt;br /&gt;
          &amp;quot;p&amp;quot;&lt;br /&gt;
          &amp;quot;¬r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;¬q&amp;quot;&lt;br /&gt;
using assms&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Ejemplo 6. (p. 7) Demostrar &lt;br /&gt;
     ¬p ⟶ q, ¬q ⊢ p&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración detallada es&amp;quot;&lt;br /&gt;
lemma ejemplo_6_1:&lt;br /&gt;
  assumes 1: &amp;quot;¬p ⟶ q&amp;quot; and &lt;br /&gt;
          2: &amp;quot;¬q&amp;quot; &lt;br /&gt;
  shows &amp;quot;p&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have 3: &amp;quot;¬¬p&amp;quot; using 1 2 by (rule mt)&lt;br /&gt;
  show &amp;quot;p&amp;quot; using 3 by (rule notnotD)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma ejemplo_6_2:&lt;br /&gt;
  assumes &amp;quot;¬p ⟶ q&amp;quot;&lt;br /&gt;
          &amp;quot;¬q&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;¬¬p&amp;quot; using assms(1,2) by (rule mt)&lt;br /&gt;
  thus &amp;quot;p&amp;quot; by (rule notnotD)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma ejemplo_6_3:&lt;br /&gt;
  &amp;quot;⟦¬p ⟶ q; ¬q⟧ ⟹ p&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Ejemplo 7. (p. 7) Demostrar&lt;br /&gt;
     p ⟶ ¬q, q ⊢ ¬p&lt;br /&gt;
  *}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración detallada es&amp;quot;&lt;br /&gt;
lemma ejemplo_7_1:&lt;br /&gt;
  assumes 1: &amp;quot;p ⟶ ¬q&amp;quot; and &lt;br /&gt;
          2: &amp;quot;q&amp;quot; &lt;br /&gt;
  shows &amp;quot;¬p&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have 3: &amp;quot;¬¬q&amp;quot; using 2 by (rule notnotI)&lt;br /&gt;
  show &amp;quot;¬p&amp;quot; using 1 3 by (rule mt)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración detallada es&amp;quot;&lt;br /&gt;
lemma ejemplo_7_2:&lt;br /&gt;
  assumes &amp;quot;p ⟶ ¬q&amp;quot;&lt;br /&gt;
          &amp;quot;q&amp;quot; &lt;br /&gt;
  shows   &amp;quot;¬p&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;¬¬q&amp;quot; using assms(2) by (rule notnotI)&lt;br /&gt;
  with assms(1) show &amp;quot;¬p&amp;quot; by (rule mt)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma ejemplo_7_3:&lt;br /&gt;
  &amp;quot;⟦p ⟶ ¬q; q⟧ ⟹ ¬p&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
subsection {* Regla de introducción del condicional *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  La regla de introducción del condicional es&lt;br /&gt;
  · impI: (P ⟹ Q) ⟹ P ⟶ Q&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Ejemplo 8. (p. 8) Demostrar&lt;br /&gt;
     p ⟶ q ⊢ ¬q ⟶ ¬p&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración detallada es&amp;quot;&lt;br /&gt;
lemma ejemplo_8_1:&lt;br /&gt;
  assumes 1: &amp;quot;p ⟶ q&amp;quot; &lt;br /&gt;
  shows &amp;quot;¬q ⟶ ¬p&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  { assume 2: &amp;quot;¬q&amp;quot;&lt;br /&gt;
    have &amp;quot;¬p&amp;quot; using 1 2 by (rule mt) } &lt;br /&gt;
  thus &amp;quot;¬q ⟶ ¬p&amp;quot; by (rule impI)&lt;br /&gt;
qed    &lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Nota sobre el lenguaje: En la demostración anterior se ha usado&lt;br /&gt;
  · &amp;quot;{ ... }&amp;quot; para representar una caja. *}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma ejemplo_8_2:&lt;br /&gt;
  assumes &amp;quot;p ⟶ q&amp;quot; &lt;br /&gt;
  shows &amp;quot;¬q ⟶ ¬p&amp;quot;&lt;br /&gt;
proof &lt;br /&gt;
  assume &amp;quot;¬q&amp;quot;&lt;br /&gt;
  with assms show &amp;quot;¬p&amp;quot; by (rule mt)&lt;br /&gt;
qed    &lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma ejemplo_8_3:&lt;br /&gt;
  assumes &amp;quot;p ⟶ q&amp;quot; &lt;br /&gt;
  shows &amp;quot;¬q ⟶ ¬p&amp;quot;&lt;br /&gt;
using assms&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Ejemplo 9. (p. 9) Demostrar&lt;br /&gt;
     ¬q ⟶ ¬p ⊢ p ⟶ ¬¬q&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración detallada es&amp;quot;&lt;br /&gt;
lemma ejemplo_9_1: &lt;br /&gt;
  assumes 1: &amp;quot;¬q ⟶ ¬p&amp;quot; &lt;br /&gt;
  shows &amp;quot;p ⟶ ¬¬q&amp;quot;   &lt;br /&gt;
proof -&lt;br /&gt;
  { assume 2: &amp;quot;p&amp;quot;&lt;br /&gt;
    have 3: &amp;quot;¬¬p&amp;quot; using 2 by (rule notnotI)&lt;br /&gt;
    have &amp;quot;¬¬q&amp;quot; using 1 3 by (rule mt) } &lt;br /&gt;
  thus &amp;quot;p ⟶ ¬¬q&amp;quot; by (rule impI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma ejemplo_9_2:&lt;br /&gt;
  assumes &amp;quot;¬q ⟶ ¬p&amp;quot; &lt;br /&gt;
  shows    &amp;quot;p ⟶ ¬¬q&amp;quot;   &lt;br /&gt;
proof &lt;br /&gt;
  assume &amp;quot;p&amp;quot;&lt;br /&gt;
  hence &amp;quot;¬¬p&amp;quot; by (rule notnotI)&lt;br /&gt;
  with assms show &amp;quot;¬¬q&amp;quot; by (rule mt)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma ejemplo_9_3:&lt;br /&gt;
  assumes &amp;quot;¬q ⟶ ¬p&amp;quot; &lt;br /&gt;
  shows &amp;quot;p ⟶ ¬¬q&amp;quot;   &lt;br /&gt;
using assms&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Ejemplo 10 (p. 9). Demostrar&lt;br /&gt;
     ⊢ p ⟶ p&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración detallada es&amp;quot;&lt;br /&gt;
lemma ejemplo_10_1:&lt;br /&gt;
  &amp;quot;p ⟶ p&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  { assume 1: &amp;quot;p&amp;quot;&lt;br /&gt;
    have &amp;quot;p&amp;quot; using 1 by this }&lt;br /&gt;
  thus &amp;quot;p ⟶ p&amp;quot; by (rule impI) &lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma ejemplo_10_2:&lt;br /&gt;
  &amp;quot;p ⟶ p&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma ejemplo_10_3:&lt;br /&gt;
  &amp;quot;p ⟶ p&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Ejemplo 11 (p. 10) Demostrar&lt;br /&gt;
     ⊢ (q ⟶ r) ⟶ ((¬q ⟶ ¬p) ⟶ (p ⟶ r))&lt;br /&gt;
 *}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración detallada es&amp;quot;&lt;br /&gt;
lemma ejemplo_11_1:&lt;br /&gt;
  &amp;quot;(q ⟶ r) ⟶ ((¬q ⟶ ¬p) ⟶ (p ⟶ r))&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  { assume 1: &amp;quot;q ⟶ r&amp;quot;&lt;br /&gt;
    { assume 2: &amp;quot;¬q ⟶ ¬p&amp;quot;&lt;br /&gt;
      { assume 3: &amp;quot;p&amp;quot;&lt;br /&gt;
        have 4: &amp;quot;¬¬p&amp;quot; using 3 by (rule notnotI)&lt;br /&gt;
        have 5: &amp;quot;¬¬q&amp;quot; using 2 4 by (rule mt)&lt;br /&gt;
        have 6: &amp;quot;q&amp;quot; using 5 by (rule notnotD)&lt;br /&gt;
        have &amp;quot;r&amp;quot; using 1 6 by (rule mp) } &lt;br /&gt;
      hence &amp;quot;p ⟶ r&amp;quot; by (rule impI) } &lt;br /&gt;
    hence &amp;quot;(¬q ⟶ ¬p) ⟶ p ⟶ r&amp;quot; by (rule impI) } &lt;br /&gt;
  thus &amp;quot;(q ⟶ r) ⟶ ((¬q ⟶ ¬p) ⟶ p ⟶ r)&amp;quot; by (rule impI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración hacia atrás es&amp;quot;&lt;br /&gt;
lemma ejemplo_11_2:&lt;br /&gt;
  &amp;quot;(q ⟶ r) ⟶ ((¬q ⟶ ¬p) ⟶ (p ⟶ r))&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume 1: &amp;quot;q ⟶ r&amp;quot;&lt;br /&gt;
  show &amp;quot;(¬q ⟶ ¬p) ⟶ (p ⟶ r)&amp;quot;&lt;br /&gt;
  proof (rule impI)&lt;br /&gt;
    assume 2: &amp;quot;¬q ⟶ ¬p&amp;quot;&lt;br /&gt;
    show &amp;quot;p ⟶ r&amp;quot;&lt;br /&gt;
    proof (rule impI)&lt;br /&gt;
      assume 3: &amp;quot;p&amp;quot;&lt;br /&gt;
      have 4: &amp;quot;¬¬p&amp;quot; using 3 by (rule notnotI)&lt;br /&gt;
      have 5: &amp;quot;¬¬q&amp;quot; using 2 4 by (rule mt)&lt;br /&gt;
      have 6: &amp;quot;q&amp;quot; using 5 by (rule notnotD)&lt;br /&gt;
      show &amp;quot;r&amp;quot; using 1 6 by (rule mp)&lt;br /&gt;
    qed&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración hacia atrás con reglas implícitas es&amp;quot;&lt;br /&gt;
lemma ejemplo_11_3:&lt;br /&gt;
  &amp;quot;(q ⟶ r) ⟶ ((¬q ⟶ ¬p) ⟶ (p ⟶ r))&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume 1: &amp;quot;q ⟶ r&amp;quot;&lt;br /&gt;
  show &amp;quot;(¬q ⟶ ¬p) ⟶ (p ⟶ r)&amp;quot;&lt;br /&gt;
  proof&lt;br /&gt;
    assume 2: &amp;quot;¬q ⟶ ¬p&amp;quot;&lt;br /&gt;
    show &amp;quot;p ⟶ r&amp;quot;&lt;br /&gt;
    proof&lt;br /&gt;
      assume 3: &amp;quot;p&amp;quot;&lt;br /&gt;
      have 4: &amp;quot;¬¬p&amp;quot; using 3 ..&lt;br /&gt;
      have 5: &amp;quot;¬¬q&amp;quot; using 2 4 by (rule mt)&lt;br /&gt;
      have 6: &amp;quot;q&amp;quot; using 5 by (rule notnotD)&lt;br /&gt;
      show &amp;quot;r&amp;quot; using 1 6 ..&lt;br /&gt;
    qed&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración sin etiquetas es&amp;quot; &lt;br /&gt;
lemma ejemplo_11_4:&lt;br /&gt;
  &amp;quot;(q ⟶ r) ⟶ ((¬q ⟶ ¬p) ⟶ (p ⟶ r))&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume &amp;quot;q ⟶ r&amp;quot;&lt;br /&gt;
  show &amp;quot;(¬q ⟶ ¬p) ⟶ (p ⟶ r)&amp;quot;&lt;br /&gt;
  proof&lt;br /&gt;
    assume &amp;quot;¬q ⟶ ¬p&amp;quot;&lt;br /&gt;
    show &amp;quot;p ⟶ r&amp;quot;&lt;br /&gt;
    proof&lt;br /&gt;
      assume &amp;quot;p&amp;quot;&lt;br /&gt;
      hence &amp;quot;¬¬p&amp;quot; ..&lt;br /&gt;
      with `¬q ⟶ ¬p` have &amp;quot;¬¬q&amp;quot; by (rule mt)&lt;br /&gt;
      hence &amp;quot;q&amp;quot; by (rule notnotD)&lt;br /&gt;
      with `q ⟶ r` show &amp;quot;r&amp;quot; ..&lt;br /&gt;
    qed&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma ejemplo_11_5:&lt;br /&gt;
  &amp;quot;(q ⟶ r) ⟶ ((¬q ⟶ ¬p) ⟶ (p ⟶ r))&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
subsection {* Reglas de la disyunción *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Las reglas de la introducción de la disyunción son&lt;br /&gt;
  · disjI1: P ⟹ P ∨ Q&lt;br /&gt;
  · disjI2: Q ⟹ P ∨ Q&lt;br /&gt;
  La regla de elimación de la disyunción es&lt;br /&gt;
  · disjE:  ⟦P ∨ Q; P ⟹ R; Q ⟹ R⟧ ⟹ R &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Ejemplo 12 (p. 11). Demostrar&lt;br /&gt;
     p ∨ q ⊢ q ∨ p&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración detallada es&amp;quot;&lt;br /&gt;
lemma ejemplo_12_1:&lt;br /&gt;
  assumes &amp;quot;p ∨ q&amp;quot; &lt;br /&gt;
  shows &amp;quot;q ∨ p&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;p ∨ q&amp;quot; using assms by this&lt;br /&gt;
  moreover&lt;br /&gt;
  { assume 2: &amp;quot;p&amp;quot;&lt;br /&gt;
    have &amp;quot;q ∨ p&amp;quot; using 2 by (rule disjI2) }&lt;br /&gt;
  moreover&lt;br /&gt;
  { assume 3: &amp;quot;q&amp;quot;&lt;br /&gt;
    have &amp;quot;q ∨ p&amp;quot; using 3 by (rule disjI1) }&lt;br /&gt;
  ultimately show &amp;quot;q ∨ p&amp;quot; by (rule disjE) &lt;br /&gt;
qed    &lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Nota sobre el lenguaje: En la demostración anterior se ha usado&lt;br /&gt;
  · &amp;quot;moreover&amp;quot; para separar los bloques y&lt;br /&gt;
  · &amp;quot;ultimately&amp;quot; para unir los resultados de los bloques. *}&lt;br /&gt;
 &lt;br /&gt;
-- &amp;quot;La demostración detallada con reglas implícitas es&amp;quot;&lt;br /&gt;
lemma ejemplo_12_2:&lt;br /&gt;
  assumes &amp;quot;p ∨ q&amp;quot; &lt;br /&gt;
  shows &amp;quot;q ∨ p&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  note `p ∨ q`&lt;br /&gt;
  moreover&lt;br /&gt;
  { assume &amp;quot;p&amp;quot;&lt;br /&gt;
    hence &amp;quot;q ∨ p&amp;quot; .. }&lt;br /&gt;
  moreover&lt;br /&gt;
  { assume &amp;quot;q&amp;quot;&lt;br /&gt;
    hence &amp;quot;q ∨ p&amp;quot; .. }&lt;br /&gt;
  ultimately show &amp;quot;q ∨ p&amp;quot; ..&lt;br /&gt;
qed    &lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Nota sobre el lenguaje: En la demostración anterior se ha usado&lt;br /&gt;
  · &amp;quot;note&amp;quot; para copiar un hecho. *}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración hacia atrás es&amp;quot;&lt;br /&gt;
lemma ejemplo_12_3:&lt;br /&gt;
  assumes 1: &amp;quot;p ∨ q&amp;quot; &lt;br /&gt;
  shows &amp;quot;q ∨ p&amp;quot;&lt;br /&gt;
using 1&lt;br /&gt;
proof (rule disjE)&lt;br /&gt;
  { assume 2: &amp;quot;p&amp;quot;&lt;br /&gt;
    show &amp;quot;q ∨ p&amp;quot; using 2 by (rule disjI2) }&lt;br /&gt;
next&lt;br /&gt;
  { assume 3: &amp;quot;q&amp;quot;&lt;br /&gt;
    show &amp;quot;q ∨ p&amp;quot; using 3 by (rule disjI1) }&lt;br /&gt;
qed    &lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración hacia atrás con reglas implícitas es&amp;quot;&lt;br /&gt;
lemma ejemplo_12_4:&lt;br /&gt;
  assumes &amp;quot;p ∨ q&amp;quot; &lt;br /&gt;
  shows &amp;quot;q ∨ p&amp;quot;&lt;br /&gt;
using assms&lt;br /&gt;
proof &lt;br /&gt;
  { assume  &amp;quot;p&amp;quot;&lt;br /&gt;
    thus &amp;quot;q ∨ p&amp;quot; .. }&lt;br /&gt;
next&lt;br /&gt;
  { assume &amp;quot;q&amp;quot;&lt;br /&gt;
    thus &amp;quot;q ∨ p&amp;quot; .. }&lt;br /&gt;
qed    &lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma ejemplo_12_5:&lt;br /&gt;
  assumes &amp;quot;p ∨ q&amp;quot; &lt;br /&gt;
  shows &amp;quot;q ∨ p&amp;quot;&lt;br /&gt;
using assms&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Ejemplo 13. (p. 12) Demostrar&lt;br /&gt;
     q ⟶ r ⊢ p ∨ q ⟶ p ∨ r&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración detallada es&amp;quot; &lt;br /&gt;
lemma ejemplo_13_1:&lt;br /&gt;
  assumes 1: &amp;quot;q ⟶ r&amp;quot;&lt;br /&gt;
  shows &amp;quot;p ∨ q ⟶ p ∨ r&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume 2: &amp;quot;p ∨ q&amp;quot;&lt;br /&gt;
  thus &amp;quot;p ∨ r&amp;quot;&lt;br /&gt;
  proof (rule disjE)&lt;br /&gt;
    { assume 3: &amp;quot;p&amp;quot;&lt;br /&gt;
      show &amp;quot;p ∨ r&amp;quot; using 3 by (rule disjI1) }&lt;br /&gt;
  next&lt;br /&gt;
    { assume 4: &amp;quot;q&amp;quot;&lt;br /&gt;
      have 5: &amp;quot;r&amp;quot; using 1 4 by (rule mp)&lt;br /&gt;
      show &amp;quot;p ∨ r&amp;quot; using 5 by (rule disjI2) }&lt;br /&gt;
  qed&lt;br /&gt;
qed    &lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot; &lt;br /&gt;
lemma ejemplo_13_2:&lt;br /&gt;
  assumes &amp;quot;q ⟶ r&amp;quot;&lt;br /&gt;
  shows &amp;quot;p ∨ q ⟶ p ∨ r&amp;quot;&lt;br /&gt;
proof &lt;br /&gt;
  assume &amp;quot;p ∨ q&amp;quot;&lt;br /&gt;
  thus &amp;quot;p ∨ r&amp;quot;&lt;br /&gt;
  proof &lt;br /&gt;
    { assume &amp;quot;p&amp;quot;&lt;br /&gt;
      thus &amp;quot;p ∨ r&amp;quot; .. }&lt;br /&gt;
  next&lt;br /&gt;
    { assume &amp;quot;q&amp;quot;&lt;br /&gt;
      have &amp;quot;r&amp;quot; using assms `q` ..&lt;br /&gt;
      thus &amp;quot;p ∨ r&amp;quot; .. }&lt;br /&gt;
  qed&lt;br /&gt;
qed    &lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot; &lt;br /&gt;
lemma ejemplo_13_3:&lt;br /&gt;
  assumes &amp;quot;q ⟶ r&amp;quot;&lt;br /&gt;
  shows &amp;quot;p ∨ q ⟶ p ∨ r&amp;quot;&lt;br /&gt;
using assms&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
subsection {* Regla de copia *}&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Ejemplo 14 (p. 13). Demostrar&lt;br /&gt;
     ⊢ p ⟶ (q ⟶ p)&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración detallada es&amp;quot;&lt;br /&gt;
lemma ejemplo_14_1:&lt;br /&gt;
  &amp;quot;p ⟶ (q ⟶ p)&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume 1: &amp;quot;p&amp;quot;&lt;br /&gt;
  show &amp;quot;q ⟶ p&amp;quot; &lt;br /&gt;
  proof (rule impI)&lt;br /&gt;
    assume &amp;quot;q&amp;quot;&lt;br /&gt;
    show &amp;quot;p&amp;quot; using 1 by this&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma ejemplo_14_2:&lt;br /&gt;
  &amp;quot;p ⟶ (q ⟶ p)&amp;quot;&lt;br /&gt;
proof &lt;br /&gt;
  assume &amp;quot;p&amp;quot;&lt;br /&gt;
  thus &amp;quot;q ⟶ p&amp;quot; ..&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma ejemplo_14_3:&lt;br /&gt;
  &amp;quot;p ⟶ (q ⟶ p)&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
subsection {* Reglas de la negación *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  La regla de eliminación de lo falso es&lt;br /&gt;
  · FalseE: False ⟹ P&lt;br /&gt;
  La regla de eliminación de la negación es&lt;br /&gt;
  · notE: ⟦¬P; P⟧ ⟹ R&lt;br /&gt;
  La regla de introducción de la negación es&lt;br /&gt;
  · notI: (P ⟹ False) ⟹ ¬P&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Ejemplo 15 (p. 15). Demostrar&lt;br /&gt;
     ¬p ∨ q ⊢ p ⟶ q&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración detallada es&amp;quot;&lt;br /&gt;
lemma ejemplo_15_1:&lt;br /&gt;
  assumes 1: &amp;quot;¬p ∨ q&amp;quot; &lt;br /&gt;
  shows &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume 2: &amp;quot;p&amp;quot;&lt;br /&gt;
  note 1&lt;br /&gt;
  thus &amp;quot;q&amp;quot;&lt;br /&gt;
  proof (rule disjE)&lt;br /&gt;
    { assume 3: &amp;quot;¬p&amp;quot;&lt;br /&gt;
      show &amp;quot;q&amp;quot; using 3 2 by (rule notE) }&lt;br /&gt;
  next&lt;br /&gt;
    { assume 4: &amp;quot;q&amp;quot;&lt;br /&gt;
      show &amp;quot;q&amp;quot; using 4 by this}&lt;br /&gt;
  qed&lt;br /&gt;
qed    &lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma ejemplo_15_2:&lt;br /&gt;
  assumes &amp;quot;¬p ∨ q&amp;quot; &lt;br /&gt;
  shows &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
proof &lt;br /&gt;
  assume &amp;quot;p&amp;quot;&lt;br /&gt;
  note `¬p ∨ q`&lt;br /&gt;
  thus &amp;quot;q&amp;quot;&lt;br /&gt;
  proof&lt;br /&gt;
    assume &amp;quot;¬p&amp;quot;&lt;br /&gt;
    thus &amp;quot;q&amp;quot; using `p` .. &lt;br /&gt;
  next&lt;br /&gt;
    assume &amp;quot;q&amp;quot;&lt;br /&gt;
      thus &amp;quot;q&amp;quot; .&lt;br /&gt;
  qed&lt;br /&gt;
qed    &lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma ejemplo_15_3:&lt;br /&gt;
  assumes &amp;quot;¬p ∨ q&amp;quot; &lt;br /&gt;
  shows &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
using assms&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Ejemplo 16 (p. 16). Demostrar&lt;br /&gt;
     p ⟶ q, p ⟶ ¬q ⊢ ¬p&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración detallada es&amp;quot;&lt;br /&gt;
lemma ejemplo_16_1:&lt;br /&gt;
  assumes 1: &amp;quot;p ⟶ q&amp;quot; and &lt;br /&gt;
          2: &amp;quot;p ⟶ ¬q&amp;quot; &lt;br /&gt;
  shows &amp;quot;¬p&amp;quot;    &lt;br /&gt;
proof (rule notI)&lt;br /&gt;
  assume 3: &amp;quot;p&amp;quot;&lt;br /&gt;
  have 4: &amp;quot;q&amp;quot; using 1 3 by (rule mp)&lt;br /&gt;
  have 5: &amp;quot;¬q&amp;quot; using 2 3 by (rule mp)&lt;br /&gt;
  show False using 5 4 by (rule notE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma ejemplo_16_2:&lt;br /&gt;
  assumes &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
          &amp;quot;p ⟶ ¬q&amp;quot; &lt;br /&gt;
  shows &amp;quot;¬p&amp;quot;    &lt;br /&gt;
proof &lt;br /&gt;
  assume &amp;quot;p&amp;quot;&lt;br /&gt;
  have &amp;quot;q&amp;quot; using assms(1) `p` ..&lt;br /&gt;
  have &amp;quot;¬q&amp;quot; using assms(2) `p` ..&lt;br /&gt;
  thus False using `q` ..&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma ejemplo_16_3:&lt;br /&gt;
  assumes &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
          &amp;quot;p ⟶ ¬q&amp;quot; &lt;br /&gt;
  shows &amp;quot;¬p&amp;quot;    &lt;br /&gt;
using assms&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
subsection {* Reglas del bicondicional *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  La regla de introducción del bicondicional es&lt;br /&gt;
  · iffI: ⟦P ⟹ Q; Q ⟹ P⟧ ⟹ P ⟷ Q&lt;br /&gt;
  Las reglas de eliminación del bicondicional son&lt;br /&gt;
  · iffD1: ⟦Q ⟷ P; Q⟧ ⟹ P &lt;br /&gt;
  · iffD2: ⟦P ⟷ Q; Q⟧ ⟹ P&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Ejemplo 17 (p. 17) Demostrar&lt;br /&gt;
     (p ∧ q) ⟷ (q ∧ p)&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración detallada es&amp;quot;&lt;br /&gt;
lemma ejemplo_17_1:&lt;br /&gt;
  &amp;quot;(p ∧ q) ⟷ (q ∧ p)&amp;quot; &lt;br /&gt;
proof (rule iffI)&lt;br /&gt;
  { assume 1: &amp;quot;p ∧ q&amp;quot;&lt;br /&gt;
    have 2: &amp;quot;p&amp;quot; using 1 by (rule conjunct1)&lt;br /&gt;
    have 3: &amp;quot;q&amp;quot; using 1 by (rule conjunct2)&lt;br /&gt;
    show &amp;quot;q ∧ p&amp;quot; using 3 2 by (rule conjI) }&lt;br /&gt;
next&lt;br /&gt;
  { assume 4: &amp;quot;q ∧ p&amp;quot;&lt;br /&gt;
    have 5: &amp;quot;q&amp;quot; using 4 by (rule conjunct1)&lt;br /&gt;
    have 6: &amp;quot;p&amp;quot; using 4 by (rule conjunct2)&lt;br /&gt;
    show &amp;quot;p ∧ q&amp;quot; using 6 5 by (rule conjI) }&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma ejemplo_17_2:&lt;br /&gt;
  &amp;quot;(p ∧ q) ⟷ (q ∧ p)&amp;quot;&lt;br /&gt;
proof &lt;br /&gt;
  { assume 1: &amp;quot;p ∧ q&amp;quot;&lt;br /&gt;
    have &amp;quot;p&amp;quot; using 1 ..&lt;br /&gt;
    have &amp;quot;q&amp;quot; using 1 ..&lt;br /&gt;
    show &amp;quot;q ∧ p&amp;quot; using `q` `p` .. }&lt;br /&gt;
next&lt;br /&gt;
  { assume 2: &amp;quot;q ∧ p&amp;quot;&lt;br /&gt;
    have &amp;quot;q&amp;quot; using 2 ..&lt;br /&gt;
    have &amp;quot;p&amp;quot; using 2 ..&lt;br /&gt;
    show &amp;quot;p ∧ q&amp;quot; using `p` `q`  .. }&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma ejemplo_17_3:&lt;br /&gt;
  &amp;quot;(p ∧ q) ⟷ (q ∧ p)&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Ejemplo 18 (p. 18). Demostrar&lt;br /&gt;
     p ⟷ q, p ∨ q ⊢ p ∧ q&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración detallada es&amp;quot;&lt;br /&gt;
lemma ejemplo_18_1:&lt;br /&gt;
  assumes 1: &amp;quot;p ⟷ q&amp;quot; and &lt;br /&gt;
          2: &amp;quot;p ∨ q&amp;quot;  &lt;br /&gt;
  shows &amp;quot;p ∧ q&amp;quot;&lt;br /&gt;
using 2&lt;br /&gt;
proof (rule disjE)&lt;br /&gt;
  { assume 3: &amp;quot;p&amp;quot;&lt;br /&gt;
    have 4: &amp;quot;q&amp;quot; using 1 3 by (rule iffD1)&lt;br /&gt;
    show &amp;quot;p ∧ q&amp;quot; using 3 4 by (rule conjI) }&lt;br /&gt;
next&lt;br /&gt;
  { assume 5: &amp;quot;q&amp;quot;&lt;br /&gt;
    have 6: &amp;quot;p&amp;quot; using 1 5 by (rule iffD2)&lt;br /&gt;
    show &amp;quot;p ∧ q&amp;quot; using 6 5 by (rule conjI) }&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma ejemplo_18_2:&lt;br /&gt;
  assumes &amp;quot;p ⟷ q&amp;quot;&lt;br /&gt;
          &amp;quot;p ∨ q&amp;quot;  &lt;br /&gt;
  shows  &amp;quot;p ∧ q&amp;quot;&lt;br /&gt;
using assms(2)&lt;br /&gt;
proof&lt;br /&gt;
  { assume &amp;quot;p&amp;quot;&lt;br /&gt;
    with assms(1) have &amp;quot;q&amp;quot; ..&lt;br /&gt;
    with `p` show &amp;quot;p ∧ q&amp;quot; .. }&lt;br /&gt;
next&lt;br /&gt;
  { assume &amp;quot;q&amp;quot;&lt;br /&gt;
    with assms(1) have &amp;quot;p&amp;quot; ..&lt;br /&gt;
    thus &amp;quot;p ∧ q&amp;quot; using `q` .. }&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma ejemplo_18_3:&lt;br /&gt;
  assumes &amp;quot;p ⟷ q&amp;quot;&lt;br /&gt;
          &amp;quot;p ∨ q&amp;quot;  &lt;br /&gt;
  shows &amp;quot;p ∧ q&amp;quot;&lt;br /&gt;
using assms&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
subsection {* Reglas derivadas *}&lt;br /&gt;
&lt;br /&gt;
subsubsection {* Regla del modus tollens *}&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Ejemplo 19 (p. 20) Demostrar la regla del modus tollens a partir de&lt;br /&gt;
  las reglas básicas. &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración detallada es&amp;quot;&lt;br /&gt;
lemma ejemplo_20_1:&lt;br /&gt;
  assumes 1: &amp;quot;F ⟶ G&amp;quot; and &lt;br /&gt;
          2: &amp;quot;¬G&amp;quot; &lt;br /&gt;
  shows &amp;quot;¬F&amp;quot;&lt;br /&gt;
proof (rule notI)&lt;br /&gt;
  assume 3: &amp;quot;F&amp;quot;&lt;br /&gt;
  have 4: &amp;quot;G&amp;quot; using 1 3 by (rule mp)&lt;br /&gt;
  show False using 2 4 by (rule notE)&lt;br /&gt;
qed    &lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma ejemplo_20_2:&lt;br /&gt;
  assumes &amp;quot;F ⟶ G&amp;quot;&lt;br /&gt;
          &amp;quot;¬G&amp;quot; &lt;br /&gt;
  shows   &amp;quot;¬F&amp;quot;&lt;br /&gt;
proof &lt;br /&gt;
  assume &amp;quot;F&amp;quot;&lt;br /&gt;
  with assms(1) have &amp;quot;G&amp;quot; ..&lt;br /&gt;
  with assms(2) show False ..&lt;br /&gt;
qed    &lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma ejemplo_20_3:&lt;br /&gt;
  assumes &amp;quot;F ⟶ G&amp;quot;&lt;br /&gt;
          &amp;quot;¬G&amp;quot; &lt;br /&gt;
  shows &amp;quot;¬F&amp;quot;&lt;br /&gt;
using assms&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
subsubsection {* Regla de la introducción de la doble negación *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Ejemplo 21 (p. 21) Demostrar la regla de introducción de la doble&lt;br /&gt;
  negación a partir de las reglas básicas.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración detallada es&amp;quot;&lt;br /&gt;
lemma ejemplo_21_1:&lt;br /&gt;
  assumes 1: &amp;quot;F&amp;quot; &lt;br /&gt;
  shows &amp;quot;¬¬F&amp;quot;&lt;br /&gt;
proof (rule notI)&lt;br /&gt;
  assume 2: &amp;quot;¬F&amp;quot;&lt;br /&gt;
  show False using 2 1 by (rule notE)&lt;br /&gt;
qed    &lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma ejemplo_21_2:&lt;br /&gt;
  assumes &amp;quot;F&amp;quot; &lt;br /&gt;
  shows &amp;quot;¬¬F&amp;quot;&lt;br /&gt;
proof &lt;br /&gt;
  assume &amp;quot;¬F&amp;quot;&lt;br /&gt;
  thus False using assms ..&lt;br /&gt;
qed    &lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma ejemplo_21_3:&lt;br /&gt;
  assumes &amp;quot;F&amp;quot; &lt;br /&gt;
  shows &amp;quot;¬¬F&amp;quot;&lt;br /&gt;
using assms&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
subsubsection {* Regla de reducción al absurdo *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  La regla de reducción al absurdo en Isabelle se correponde con la&lt;br /&gt;
  regla clásica de contradicción &lt;br /&gt;
  · ccontr: (¬P ⟹ False) ⟹ P&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
subsubsection {* Ley del tercio excluso *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  La ley del tercio excluso es &lt;br /&gt;
  · excluded_middle: ¬P ∨ P&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Ejemplo 22 (p. 23). Demostrar la ley del tercio excluso a partir de&lt;br /&gt;
  las reglas básicas.  &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración detallada es&amp;quot;&lt;br /&gt;
lemma ejemplo_22_1:&lt;br /&gt;
  &amp;quot;F ∨ ¬F&amp;quot;&lt;br /&gt;
proof (rule ccontr)&lt;br /&gt;
  assume 1: &amp;quot;¬(F ∨ ¬F)&amp;quot;&lt;br /&gt;
  thus False&lt;br /&gt;
  proof (rule notE)&lt;br /&gt;
    show &amp;quot;F ∨ ¬F&amp;quot;&lt;br /&gt;
    proof (rule disjI2)&lt;br /&gt;
      show &amp;quot;¬F&amp;quot;&lt;br /&gt;
      proof (rule notI)&lt;br /&gt;
        assume 2: &amp;quot;F&amp;quot;&lt;br /&gt;
        hence 3: &amp;quot;F ∨ ¬F&amp;quot; by (rule disjI1)&lt;br /&gt;
        show False using 1 3 by (rule notE)&lt;br /&gt;
      qed&lt;br /&gt;
    qed&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
    &lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma ejemplo_22_2:&lt;br /&gt;
  &amp;quot;F ∨ ¬F&amp;quot;&lt;br /&gt;
proof (rule ccontr)&lt;br /&gt;
  assume &amp;quot;¬(F ∨ ¬F)&amp;quot;&lt;br /&gt;
  thus False&lt;br /&gt;
  proof (rule notE)&lt;br /&gt;
    show &amp;quot;F ∨ ¬F&amp;quot;&lt;br /&gt;
    proof (rule disjI2)&lt;br /&gt;
      show &amp;quot;¬F&amp;quot;&lt;br /&gt;
      proof (rule notI)&lt;br /&gt;
        assume &amp;quot;F&amp;quot;&lt;br /&gt;
        hence &amp;quot;F ∨ ¬F&amp;quot; ..&lt;br /&gt;
        with `¬(F ∨ ¬F)`show False ..&lt;br /&gt;
      qed&lt;br /&gt;
    qed&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
    &lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma ejemplo_22_3:&lt;br /&gt;
  &amp;quot;F ∨ ¬F&amp;quot;&lt;br /&gt;
using assms&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Ejemplo 23 (p. 24). Demostrar&lt;br /&gt;
     p ⟶ q ⊢ ¬p ∨ q&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración detallada es&amp;quot;&lt;br /&gt;
lemma ejemplo_23_1:&lt;br /&gt;
  assumes 1: &amp;quot;p ⟶ q&amp;quot; &lt;br /&gt;
  shows &amp;quot;¬p ∨ q&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;¬p ∨ p&amp;quot; by (rule excluded_middle)&lt;br /&gt;
  thus &amp;quot;¬p ∨ q&amp;quot;&lt;br /&gt;
  proof (rule disjE)&lt;br /&gt;
    { assume &amp;quot;¬p&amp;quot;&lt;br /&gt;
      thus &amp;quot;¬p ∨ q&amp;quot; by (rule disjI1) }&lt;br /&gt;
  next&lt;br /&gt;
    { assume 2: &amp;quot;p&amp;quot;&lt;br /&gt;
      have &amp;quot;q&amp;quot; using 1 2 by (rule mp)&lt;br /&gt;
      thus &amp;quot;¬p ∨ q&amp;quot; by (rule disjI2) }&lt;br /&gt;
  qed&lt;br /&gt;
qed    &lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma ejemplo_23_2:&lt;br /&gt;
  assumes &amp;quot;p ⟶ q&amp;quot; &lt;br /&gt;
  shows &amp;quot;¬p ∨ q&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;¬p ∨ p&amp;quot; ..&lt;br /&gt;
  thus &amp;quot;¬p ∨ q&amp;quot;&lt;br /&gt;
  proof &lt;br /&gt;
    { assume &amp;quot;¬p&amp;quot;&lt;br /&gt;
      thus &amp;quot;¬p ∨ q&amp;quot; .. }&lt;br /&gt;
  next&lt;br /&gt;
    { assume &amp;quot;p&amp;quot;&lt;br /&gt;
      with assms have &amp;quot;q&amp;quot; ..&lt;br /&gt;
      thus &amp;quot;¬p ∨ q&amp;quot; .. }&lt;br /&gt;
  qed&lt;br /&gt;
qed    &lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma ejemplo_23_3:&lt;br /&gt;
  assumes &amp;quot;p ⟶ q&amp;quot; &lt;br /&gt;
  shows &amp;quot;¬p ∨ q&amp;quot;&lt;br /&gt;
using assms&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
subsection {* Demostraciones por contradicción *}&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Ejemplo 24. Demostrar que &lt;br /&gt;
     ¬p, p ∨ q ⊢ q&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración detallada es&amp;quot;&lt;br /&gt;
lemma ejemplo_24_1:&lt;br /&gt;
  assumes &amp;quot;¬p&amp;quot;&lt;br /&gt;
          &amp;quot;p ∨ q&amp;quot;&lt;br /&gt;
  shows   &amp;quot;q&amp;quot;&lt;br /&gt;
using `p ∨ q`&lt;br /&gt;
proof (rule disjE)&lt;br /&gt;
  assume &amp;quot;p&amp;quot;&lt;br /&gt;
  with assms(1) show &amp;quot;q&amp;quot; by contradiction &lt;br /&gt;
next&lt;br /&gt;
  assume &amp;quot;q&amp;quot;&lt;br /&gt;
  thus &amp;quot;q&amp;quot; by assumption&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma ejemplo_24_2:&lt;br /&gt;
  assumes &amp;quot;¬p&amp;quot;&lt;br /&gt;
          &amp;quot;p ∨ q&amp;quot;&lt;br /&gt;
  shows &amp;quot;q&amp;quot;&lt;br /&gt;
using `p ∨ q`&lt;br /&gt;
proof &lt;br /&gt;
  assume &amp;quot;p&amp;quot;&lt;br /&gt;
  with assms(1) show &amp;quot;q&amp;quot; ..&lt;br /&gt;
next&lt;br /&gt;
  assume &amp;quot;q&amp;quot;&lt;br /&gt;
  thus &amp;quot;q&amp;quot; .&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma ejemplo_24_3:&lt;br /&gt;
  assumes &amp;quot;¬p&amp;quot;&lt;br /&gt;
          &amp;quot;p ∨ q&amp;quot;&lt;br /&gt;
  shows &amp;quot;q&amp;quot;&lt;br /&gt;
using assms&lt;br /&gt;
by auto&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>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2016/index.php?title=Temas&amp;diff=1233</id>
		<title>Temas</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2016/index.php?title=Temas&amp;diff=1233"/>
		<updated>2017-01-12T06:46:02Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Temas de &amp;#039;&amp;#039;Razonamiento automático (2016-17)&amp;#039;&amp;#039; ==&lt;br /&gt;
&lt;br /&gt;
* [[Tema 1: Programación funcional en Isabelle]].&lt;br /&gt;
* Tema 2: Razonamiento sobre programas:&lt;br /&gt;
** [http://www.cs.us.es/~jalonso/cursos/i1m-16/temas/tema-8.pdf Tema 2a: Razonamiento sobre programas Haskell]&lt;br /&gt;
** [[Tema 2b: Razonamiento automático sobre programas en Isabelle/HOL]].&lt;br /&gt;
* [[Tema 3: Razonamiento estructurado sobre programas en Isabelle/HOL]].&lt;br /&gt;
* [[Tema 4: Razonamiento por casos y por inducción]].&lt;br /&gt;
* [[Tema 5: Razonamiento sobre árboles y bosques]].&lt;br /&gt;
* Tema 6: Verificación de algoritmos de ordenación:&lt;br /&gt;
** [[Tema 6a: Verificación de la ordenación por inserción]].&lt;br /&gt;
** [[Tema 6b: Verificación de la ordenación por mezcla]].&lt;br /&gt;
* [[Tema 7: Caso de estudio: Compilación de expresiones]].&lt;br /&gt;
* Tema 8: Deducción natural proposicional:&lt;br /&gt;
** [http://www.cs.us.es/~jalonso/cursos/li/temas/tema-2.pdf Tema 7a: Deducción natural proposicional].&lt;br /&gt;
** [[Tema 8b: Deducción natural proposicional con Isabelle/HOL]].&lt;br /&gt;
* Tema 9: Deducción natural de primer orden:&lt;br /&gt;
** [http://www.cs.us.es/~jalonso/cursos/li/temas/tema-8.pdf Tema 8a: Deducción natural en lógica de primer orden].&lt;br /&gt;
** [[Tema 9b: Deducción natural en lógica de primer orden con Isabelle/HOL]]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
* [[Tema 9: Conjuntos, funciones y relaciones]].&lt;br /&gt;
* [[Tema 10: Conjuntos definidos inductivamente]].&lt;br /&gt;
* [[Tema 11: Gramáticas libre de contexto]].&lt;br /&gt;
* Tema 12: Misceláneas:&lt;br /&gt;
** [[Tema 12a: Razonamiento modular (Teoría de grupos)]].&lt;br /&gt;
** [[Tema 12b: Razonamiento modular]].&lt;br /&gt;
** [[Tema 12c: Automatización]].&lt;br /&gt;
** [[Tema 12d: Pasos elementales]].&lt;br /&gt;
** [[Tema 12e: Sudoku]].&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jalonso</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2016/index.php?title=Temas&amp;diff=1232</id>
		<title>Temas</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2016/index.php?title=Temas&amp;diff=1232"/>
		<updated>2017-01-12T06:45:08Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Temas de &amp;#039;&amp;#039;Razonamiento automático (2016-17)&amp;#039;&amp;#039; ==&lt;br /&gt;
&lt;br /&gt;
* [[Tema 1: Programación funcional en Isabelle]].&lt;br /&gt;
* Tema 2: Razonamiento sobre programas:&lt;br /&gt;
** [http://www.cs.us.es/~jalonso/cursos/i1m-16/temas/tema-8.pdf Tema 2a: Razonamiento sobre programas Haskell]&lt;br /&gt;
** [[Tema 2b: Razonamiento automático sobre programas en Isabelle/HOL]].&lt;br /&gt;
* [[Tema 3: Razonamiento estructurado sobre programas en Isabelle/HOL]].&lt;br /&gt;
* [[Tema 4: Razonamiento por casos y por inducción]].&lt;br /&gt;
* [[Tema 5: Razonamiento sobre árboles y bosques]].&lt;br /&gt;
* Tema 6: Verificación de algoritmos de ordenación:&lt;br /&gt;
** [[Tema 6a: Verificación de la ordenación por inserción]].&lt;br /&gt;
** [[Tema 6b: Verificación de la ordenación por mezcla]].&lt;br /&gt;
* [[Tema 7: Caso de estudio: Compilación de expresiones]].&lt;br /&gt;
* Tema 8: Deducción natural proposicional:&lt;br /&gt;
** [http://www.cs.us.es/~jalonso/cursos/li/temas/tema-2.pdf Tema 7a: Deducción natural proposicional]].&lt;br /&gt;
** [[Tema 8b: Deducción natural proposicional con Isabelle/HOL]].&lt;br /&gt;
* Tema 9: Deducción natural de primer orden:&lt;br /&gt;
** [http://www.cs.us.es/~jalonso/cursos/li/temas/tema-8.pdf Tema 8a: Deducción natural en lógica de primer orden]].&lt;br /&gt;
** [[Tema 9b: Deducción natural en lógica de primer orden con Isabelle/HOL]]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
* [[Tema 9: Conjuntos, funciones y relaciones]].&lt;br /&gt;
* [[Tema 10: Conjuntos definidos inductivamente]].&lt;br /&gt;
* [[Tema 11: Gramáticas libre de contexto]].&lt;br /&gt;
* Tema 12: Misceláneas:&lt;br /&gt;
** [[Tema 12a: Razonamiento modular (Teoría de grupos)]].&lt;br /&gt;
** [[Tema 12b: Razonamiento modular]].&lt;br /&gt;
** [[Tema 12c: Automatización]].&lt;br /&gt;
** [[Tema 12d: Pasos elementales]].&lt;br /&gt;
** [[Tema 12e: Sudoku]].&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jalonso</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2016/index.php?title=Relaci%C3%B3n_7&amp;diff=1224</id>
		<title>Relación 7</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2016/index.php?title=Relaci%C3%B3n_7&amp;diff=1224"/>
		<updated>2017-01-03T07:17:03Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: Desprotegió «Relación 7»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
chapter {* R7: Árboles binarios completos *}&lt;br /&gt;
&lt;br /&gt;
theory R7_Arboles_binarios_completos&lt;br /&gt;
imports Main &lt;br /&gt;
begin &lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  En esta relación se piden demostraciones automáticas (lo más cortas&lt;br /&gt;
  posibles). Para ello, en algunos casos es necesario incluir lemas&lt;br /&gt;
  auxiliares (que se demuestran automáticamente) y usar ejercicios&lt;br /&gt;
  anteriores. &lt;br /&gt;
&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. Definir el tipo de datos arbol para representar los&lt;br /&gt;
  árboles binarios que no tienen información ni en los nodos y ni en las&lt;br /&gt;
  hojas. Por ejemplo, el árbol&lt;br /&gt;
          ·&lt;br /&gt;
         / \&lt;br /&gt;
        /   \&lt;br /&gt;
       ·     ·&lt;br /&gt;
      / \   / \&lt;br /&gt;
     ·   · ·   · &lt;br /&gt;
  se representa por &amp;quot;N (N H H) (N H H)&amp;quot;.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
datatype arbol = H | N arbol arbol&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;N (N H H) (N H H) = (N (N H H) (N H H) :: arbol)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Definir la función&lt;br /&gt;
     hojas :: &amp;quot;arbol =&amp;gt; nat&amp;quot; &lt;br /&gt;
  tal que (hojas a) es el número de hojas del árbol a. Por ejemplo,&lt;br /&gt;
     hojas (N (N H H) (N H H)) = 4&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* fraortmoy marcarmor13 josgarsan fracorjim1 *)&lt;br /&gt;
fun hojas :: &amp;quot;arbol =&amp;gt; nat&amp;quot; where&lt;br /&gt;
  &amp;quot;hojas H       = Suc 0&amp;quot;&lt;br /&gt;
| &amp;quot;hojas (N a b) = hojas a + hojas b&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;hojas (N (N H H) (N H H)) = 4&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* marpoldia1 anaprarod paupeddeg migtermor wilmorort pablucoto &lt;br /&gt;
   ivamenjim serrodcal crigomgom rubgonmar  danrodcha ferrenseg&lt;br /&gt;
   manmorjim1 juacabsou lucnovdos dancorgar bowma *)&lt;br /&gt;
(* Es muy parecida a la definición anterior *)&lt;br /&gt;
fun hojas2 :: &amp;quot;arbol =&amp;gt; nat&amp;quot; where&lt;br /&gt;
  &amp;quot;hojas2 H       = 1&amp;quot; &lt;br /&gt;
| &amp;quot;hojas2 (N i d) = hojas2 i + hojas2 d&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
value &amp;quot;hojas2 (N (N H H) (N H H)) = 4&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* anaprarod *)&lt;br /&gt;
(* Equivalencia de las definiciones *)&lt;br /&gt;
lemma &amp;quot;hojas a = hojas2 a&amp;quot;&lt;br /&gt;
by (induct a) simp_all&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Definir la función&lt;br /&gt;
     profundidad :: &amp;quot;arbol =&amp;gt; nat&amp;quot; &lt;br /&gt;
  tal que (profundidad a) es la profundidad del árbol a. Por ejemplo,&lt;br /&gt;
     profundidad (N (N H H) (N H H)) = 2&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* fraortmoy marpoldia1 anaprarod migtermor wilmorort marcarmor13&lt;br /&gt;
   dancorgar *) &lt;br /&gt;
fun profundidad :: &amp;quot;arbol =&amp;gt; nat&amp;quot; where&lt;br /&gt;
  &amp;quot;profundidad H = 0&amp;quot;&lt;br /&gt;
| &amp;quot;profundidad (N a b) = (if profundidad a &amp;gt; profundidad b&lt;br /&gt;
                          then 1 + profundidad a &lt;br /&gt;
                          else 1 + profundidad b)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;profundidad (N (N H H) (N H H)) = 2&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* anaprarod wilmorort pablucoto ivamenjim serrodcal crigomgom rubgonmar &lt;br /&gt;
   danrodcha ferrenseg josgarsan juacabsou lucnovdos bowma *)&lt;br /&gt;
fun profundidad2 :: &amp;quot;arbol =&amp;gt; nat&amp;quot; where&lt;br /&gt;
  &amp;quot;profundidad2 H       = 0&amp;quot;&lt;br /&gt;
| &amp;quot;profundidad2 (N i d) = 1 + (max (profundidad2 i) (profundidad2 d))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;profundidad2 (N (N H H) (N H H)) = 2&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* anaprarod *)&lt;br /&gt;
(* Equivalencia de las definiciones *)&lt;br /&gt;
lemma &amp;quot;profundidad a= profundidad2 a&amp;quot;&lt;br /&gt;
by (induct a) auto&lt;br /&gt;
&lt;br /&gt;
(* paupeddeg *)&lt;br /&gt;
fun maximo :: &amp;quot;nat ×  nat =&amp;gt; nat&amp;quot; where&lt;br /&gt;
  &amp;quot;maximo (a,b) = (if a &amp;gt; b then a else b)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
fun profundidad3 :: &amp;quot;arbol =&amp;gt; nat&amp;quot; where&lt;br /&gt;
  &amp;quot;profundidad3 H       = 0&amp;quot;&lt;br /&gt;
| &amp;quot;profundidad3 (N i d) = 1 + maximo (profundidad3 i, profundidad3 d)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* ivamenjim: llamando a la función anterior profundidad3 *)&lt;br /&gt;
lemma &amp;quot;profundidad a = profundidad3 a&amp;quot;&lt;br /&gt;
by (induct a) auto&lt;br /&gt;
&lt;br /&gt;
(* ivamenjim manmorjim1 fracorjim1 *)&lt;br /&gt;
fun profundidad4 :: &amp;quot;arbol =&amp;gt; nat&amp;quot; where&lt;br /&gt;
  &amp;quot;profundidad4 H       = 0&amp;quot;&lt;br /&gt;
| &amp;quot;profundidad4 (N i d) = Suc (max (profundidad4 i) (profundidad4 d))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;profundidad a = profundidad4 a&amp;quot;&lt;br /&gt;
by (induct a) auto&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. Definir la función&lt;br /&gt;
     abc :: &amp;quot;nat ⇒ arbol&amp;quot; &lt;br /&gt;
  tal que (abc n) es el árbol binario completo de profundidad n. Por&lt;br /&gt;
  ejemplo,  &lt;br /&gt;
     abc 3 = N (N (N H H) (N H H)) (N (N H H) (N H H))&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* fraortmoy marpoldia1 anaprarod paupeddeg migtermor  wilmorort &lt;br /&gt;
   serrodcal crigomgom rubgonmar danrodcha ferrenseg josgarsan&lt;br /&gt;
   manmorjim1 juacabsou fracorjim1 lucnovdos dancorgar bowma *)&lt;br /&gt;
fun abc :: &amp;quot;nat ⇒ arbol&amp;quot; where&lt;br /&gt;
  &amp;quot;abc 0       = H&amp;quot;&lt;br /&gt;
| &amp;quot;abc (Suc n) = (N (abc n) (abc n))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;abc 3 = N (N (N H H) (N H H)) (N (N H H) (N H H))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* ivamenjim pablucoto marcarmor13 *)&lt;br /&gt;
fun abc2 :: &amp;quot;nat ⇒ arbol&amp;quot; where&lt;br /&gt;
  &amp;quot;abc2 0 = H&amp;quot;&lt;br /&gt;
| &amp;quot;abc2 t = N (abc2 (t-1)) (abc2 (t-1))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;abc2 3 = N (N (N H H) (N H H)) (N (N H H) (N H H))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* ivamenjim: Metaejercicio de demostración *)&lt;br /&gt;
lemma &amp;quot;abc t = abc2 t&amp;quot;&lt;br /&gt;
by (induct t) auto&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 6. Un árbol binario a es completo respecto de la medida f si&lt;br /&gt;
  a es una hoja o bien a es de la forma (N i d) y se cumple que tanto i&lt;br /&gt;
  como d son árboles binarios completos respecto de f y, además, &lt;br /&gt;
  f(i) = f(r).&lt;br /&gt;
&lt;br /&gt;
  Definir la función&lt;br /&gt;
     es_abc :: &amp;quot;(arbol =&amp;gt; &amp;#039;a) =&amp;gt; arbol =&amp;gt; bool&lt;br /&gt;
  tal que (es_abc f a) se verifica si a es un árbol binario completo&lt;br /&gt;
  respecto de f.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* fraortmoy anaprarod migtermor serrodcal crigomgom rubgonmar &lt;br /&gt;
   danrodcha ferrenseg juacabsou josgarsan fracorjim1 lucnovdos bowma *)&lt;br /&gt;
fun es_abc :: &amp;quot;(arbol =&amp;gt; &amp;#039;a) =&amp;gt; arbol =&amp;gt; bool&amp;quot; where&lt;br /&gt;
  &amp;quot;es_abc _ H       = True&amp;quot;&lt;br /&gt;
| &amp;quot;es_abc f (N a b) = (es_abc f a ∧ es_abc f b ∧ (f a = f b))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* marpoldia1 paupeddeg ivamenjim pablucoto marcarmor13 manmorjim1&lt;br /&gt;
   dancorgar *) &lt;br /&gt;
fun es_abc2 :: &amp;quot;(arbol =&amp;gt; &amp;#039;a) =&amp;gt; arbol =&amp;gt; bool&amp;quot; where&lt;br /&gt;
  &amp;quot;es_abc2 f H       = True&amp;quot; &lt;br /&gt;
| &amp;quot;es_abc2 f (N i d) = ((f i = f d) ∧ (es_abc2 f i) ∧ (es_abc2 f d))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* anaprarod *)&lt;br /&gt;
(* Equivalencia de las definiciones *)&lt;br /&gt;
lemma &amp;quot;es_abc f a = es_abc2 f a&amp;quot;&lt;br /&gt;
by (induct a) auto&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Nota. (size a) es el número de nodos del árbol a. Por ejemplo,&lt;br /&gt;
     size (N (N H H) (N H H)) = 3&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;size (N (N H H) (N H H)) = 3&amp;quot;&lt;br /&gt;
value &amp;quot;size (N (N (N H H) (N H H)) (N (N H H) (N H H))) = 7&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Nota. Tenemos 3 funciones de medida sobre los árboles: número de&lt;br /&gt;
  hojas, número de nodos y profundidad. A cada una le corresponde un&lt;br /&gt;
  concepto de completitud. En los siguientes ejercicios demostraremos&lt;br /&gt;
  que los tres conceptos de completitud son iguales.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 7. Demostrar que un árbol binario a es completo respecto de&lt;br /&gt;
  la profundidad syss es completo respecto del número de hojas.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* fraortmoy marpoldia1 migtermor wilmorort pablucoto serrodcal&lt;br /&gt;
   fracorjim1 josgarsan lucnovdos bowma *) &lt;br /&gt;
lemma abc_prof_num_hojas:&lt;br /&gt;
  assumes &amp;quot;es_abc profundidad a&amp;quot;&lt;br /&gt;
  shows   &amp;quot;hojas a = 2^(profundidad a)&amp;quot;&lt;br /&gt;
using assms&lt;br /&gt;
by (induct a) auto&lt;br /&gt;
&lt;br /&gt;
(* Otra forma de escribir lo mismo *)&lt;br /&gt;
(* anaprarod crigomgom ivamenjim paupeddeg juacabsou *)&lt;br /&gt;
lemma AUX7: &amp;quot;es_abc profundidad a ⟶ (hojas a = 2^(profundidad a))&amp;quot;&lt;br /&gt;
by (induct a) simp_all&lt;br /&gt;
&lt;br /&gt;
(* Otra forma de escribir lo mismo *)&lt;br /&gt;
(* danrodcha *)&lt;br /&gt;
lemma aux1: &amp;quot;es_abc profundidad (a::arbol) ⟹ (hojas a = 2^ (profundidad a))&amp;quot;&lt;br /&gt;
by (induct a) simp_all&lt;br /&gt;
&lt;br /&gt;
(* fraortmoy marpoldia1 migtermor anaprarod wilmorort serrodcal&lt;br /&gt;
   crigomgom rubgonmar ivamenjim danrodcha marcarmor13 paupeddeg&lt;br /&gt;
   juacabsou bowma *) &lt;br /&gt;
(* También funciona con AUX7 *)&lt;br /&gt;
lemma lej7: &amp;quot;es_abc profundidad a = es_abc hojas a&amp;quot;&lt;br /&gt;
by (induct a) (auto simp add: abc_prof_num_hojas)&lt;br /&gt;
&lt;br /&gt;
(* danrodcha *)&lt;br /&gt;
lemma 7: &amp;quot;es_abc profundidad a = es_abc hojas a&amp;quot;&lt;br /&gt;
apply (induct a) &lt;br /&gt;
apply simp&lt;br /&gt;
apply (auto simp add: aux1)&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
(* ferrenseg *)&lt;br /&gt;
lemma [simp]: &amp;quot;es_abc profundidad a ⟶ hojas a = 2 ^ (profundidad a)&amp;quot;&lt;br /&gt;
by (induct a) auto&lt;br /&gt;
&lt;br /&gt;
(* Comentario: Uso de la declaración simp *)&lt;br /&gt;
&lt;br /&gt;
theorem es_abc_profundidad_hojas: &lt;br /&gt;
  &amp;quot;es_abc profundidad a = es_abc hojas a&amp;quot;&lt;br /&gt;
by (induct a) auto&lt;br /&gt;
&lt;br /&gt;
(* Comentario: Dependencia de la declaración simp. *)&lt;br /&gt;
&lt;br /&gt;
(* dancorgar *)&lt;br /&gt;
lemma rel_hojas_prof: &amp;quot;es_abc hojas a ∧ es_abc profundidad a&lt;br /&gt;
      ⟹ hojas a = 2 ^ profundidad a&amp;quot;&lt;br /&gt;
by (induct a) (auto)&lt;br /&gt;
&lt;br /&gt;
theorem &amp;quot;es_abc hojas a = es_abc profundidad a&amp;quot;&lt;br /&gt;
by (induct a) (auto simp add: rel_hojas_prof)&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 8. Demostrar que un árbol binario a es completo respecto del&lt;br /&gt;
  número de hojas syss es completo respecto del número de nodos.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* fraortmoy marpoldia1 migtermor wilmorort pablucoto serrodcal&lt;br /&gt;
   marcarmor13 josgarsan lucnovdos bowma *) &lt;br /&gt;
lemma abc_hojas_num_nodos:&lt;br /&gt;
  assumes &amp;quot;es_abc hojas a&amp;quot;&lt;br /&gt;
  shows   &amp;quot;Suc (size a) = hojas a&amp;quot;&lt;br /&gt;
using assms&lt;br /&gt;
by (induct a) auto&lt;br /&gt;
&lt;br /&gt;
(* Comentario sobre orientación de igualdades. *)&lt;br /&gt;
&lt;br /&gt;
(* Otra forma de escribir lo mismo *)&lt;br /&gt;
(* anaprarod crigomgom paupeddeg juacabsou rubgonmar *)&lt;br /&gt;
lemma AUX8: &amp;quot;es_abc hojas a ⟶ (hojas a = (Suc (size a)))&amp;quot;&lt;br /&gt;
by (induct a) auto&lt;br /&gt;
&lt;br /&gt;
(* fraortmoy marpoldia1 migtermor anaprarod wilmorort pablucoto&lt;br /&gt;
   serrodcal *) &lt;br /&gt;
lemma lej8: &amp;quot;es_abc hojas a = es_abc size a&amp;quot;&lt;br /&gt;
by (induct a) (auto simp add:abc_hojas_num_nodos [symmetric])&lt;br /&gt;
&lt;br /&gt;
(* Comentario sobre orientación de igualdades. *)&lt;br /&gt;
&lt;br /&gt;
(* anaprarod crigomgom paupeddeg juacabsou rubgonmar *)&lt;br /&gt;
(* Usando AUX8 *)&lt;br /&gt;
lemma L8: &amp;quot;es_abc hojas a = es_abc size a&amp;quot;&lt;br /&gt;
by (induct a) (auto simp add: AUX8)&lt;br /&gt;
&lt;br /&gt;
(* ivamenjim *)&lt;br /&gt;
(* Teorema auxiliar *)&lt;br /&gt;
lemma auxEj8: &amp;quot;hojas a = size a + 1&amp;quot;&lt;br /&gt;
by (induct a) auto&lt;br /&gt;
&lt;br /&gt;
(* ivamenjim *)&lt;br /&gt;
lemma lej8b: &amp;quot;es_abc hojas a = es_abc size a&amp;quot;&lt;br /&gt;
by (induct a) (auto simp add: auxEj8)&lt;br /&gt;
&lt;br /&gt;
(* danrodcha *)&lt;br /&gt;
lemma aux3: &amp;quot;es_abc hojas a ⟹ (hojas a = 1 + size a)&amp;quot;&lt;br /&gt;
by (induct a) simp_all&lt;br /&gt;
&lt;br /&gt;
(* danrodcha *)&lt;br /&gt;
lemma 8: &amp;quot;es_abc hojas a = es_abc size a&amp;quot;&lt;br /&gt;
apply (induct a) &lt;br /&gt;
apply simp&lt;br /&gt;
apply (auto simp add: aux3)&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
(* ferrenseg *)&lt;br /&gt;
lemma [simp]: &amp;quot;hojas a = size a + 1&amp;quot;&lt;br /&gt;
by (induct a) auto&lt;br /&gt;
 &lt;br /&gt;
theorem es_abc_hojas_size: &amp;quot;es_abc hojas a = es_abc size a&amp;quot;&lt;br /&gt;
by (induct a) auto&lt;br /&gt;
&lt;br /&gt;
(* fracorjim1 *)&lt;br /&gt;
lemma aux10 : &amp;quot;hojas (a::arbol) = Suc(size a)&amp;quot;&lt;br /&gt;
apply (induct a)&lt;br /&gt;
apply auto&lt;br /&gt;
done&lt;br /&gt;
    &lt;br /&gt;
lemma es_abc_hojas_size_10 : &amp;quot;es_abc hojas (a::arbol) = es_abc size a&amp;quot;&lt;br /&gt;
apply (induct a)&lt;br /&gt;
apply (auto simp add: aux10)&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
(* dancorgar *)&lt;br /&gt;
lemma rel_hojas_size: &amp;quot;es_abc hojas a ∧ es_abc size a&lt;br /&gt;
      ⟹ hojas a = (size a) + 1&amp;quot;&lt;br /&gt;
by (induct a) (auto)&lt;br /&gt;
&lt;br /&gt;
theorem &amp;quot;es_abc hojas a = es_abc size a&amp;quot;&lt;br /&gt;
by (induct a) (auto simp add: rel_hojas_size)&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 9. Demostrar que un árbol binario a es completo respecto de&lt;br /&gt;
  la profundidad syss es completo respecto del número de nodos.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* fraortmoy marpoldia1 migtermor anaprarod  wilmorort pablucoto &lt;br /&gt;
   serrodcal crigomgom rubgonmar danrodcha ivamenjim marcarmor13&lt;br /&gt;
   paupeddeg juacabsou josgarsan bowma lucnovdos *)&lt;br /&gt;
lemma lej9:  &amp;quot;es_abc profundidad a = es_abc size a&amp;quot;&lt;br /&gt;
by (simp add: lej7 lej8)&lt;br /&gt;
&lt;br /&gt;
(* ferrenseg *)&lt;br /&gt;
corollary es_abc_size_profundidad: &amp;quot;es_abc size a = es_abc profundidad a&amp;quot;&lt;br /&gt;
by (simp add: es_abc_profundidad_hojas es_abc_hojas_size)&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 10. Demostrar que (abc n) es un árbol binario completo.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* fraortmoy marpoldia1 migtermor wilmorort pablucoto serrodcal&lt;br /&gt;
   crigomgom marcarmor13 paupeddeg juacabsou dancorgar lucnovdos *)&lt;br /&gt;
lemma lej10: &amp;quot;es_abc profundidad (abc n)&amp;quot;&lt;br /&gt;
by (induct n) auto&lt;br /&gt;
&lt;br /&gt;
(* anaprarod rubgonmar danrodcha ferrenseg ivamenjim paupeddeg juacabsou bowma*)&lt;br /&gt;
(* con un demostrador más débil *)&lt;br /&gt;
(* y en general para cualquier medida *)&lt;br /&gt;
lemma L10:  &amp;quot;es_abc f (abc a)&amp;quot;&lt;br /&gt;
by (induct a) simp_all&lt;br /&gt;
&lt;br /&gt;
(* ivamenjim *)&lt;br /&gt;
(* Igual que el anterior pero usando auto *)&lt;br /&gt;
lemma lej10b: &amp;quot;es_abc f (abc n)&amp;quot;&lt;br /&gt;
by (induct n) auto&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 11. Demostrar que si a es un árbolo binario completo&lt;br /&gt;
  respecto de la profundidad, entonces a es igual a&lt;br /&gt;
  (abc (profundidad a)).&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* fraortmoy marpoldia1 migtermor wilmorort pablucoto serrodcal&lt;br /&gt;
   marcarmor13 *) &lt;br /&gt;
lemma lej11: &lt;br /&gt;
  assumes &amp;quot;es_abc profundidad a&amp;quot;&lt;br /&gt;
  shows   &amp;quot;a = (abc (profundidad a))&amp;quot;&lt;br /&gt;
using assms&lt;br /&gt;
by (induct a) auto&lt;br /&gt;
&lt;br /&gt;
(* Otra forma de escribir lo mismo *)&lt;br /&gt;
(* anaprarod crigomgom rubgonmar ferrenseg ivamenjim paupeddeg juacabsou&lt;br /&gt;
   dancorgar bowma lucnovdos *) &lt;br /&gt;
lemma &amp;quot;es_abc profundidad a ⟶ (a = (abc (profundidad a)))&amp;quot;&lt;br /&gt;
by (induct a) auto&lt;br /&gt;
&lt;br /&gt;
(* danrodcha*)&lt;br /&gt;
lemma 11:&amp;quot;es_abc profundidad a ⟹ (a = (abc (profundidad a)))&amp;quot;&lt;br /&gt;
by (induct a) simp_all&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 12. Encontrar una medida f tal que (es_abc f) es distinto de &lt;br /&gt;
  (es_abc size).&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* migtermor *)&lt;br /&gt;
fun medida_nula :: &amp;quot;arbol =&amp;gt; nat&amp;quot; where&lt;br /&gt;
  &amp;quot;medida_nula H       = 0&amp;quot;&lt;br /&gt;
| &amp;quot;medida_nula (N i d) = 0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;es_abc medida_nula a = es_abc size a&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
(* Quickcheck encuentra el siguiente contraejemplo:&lt;br /&gt;
  a = N H (N H H) &lt;br /&gt;
  Tras evaluar:&lt;br /&gt;
  es_abc medida_nula a = True&lt;br /&gt;
  es_abc size a = False*)&lt;br /&gt;
&lt;br /&gt;
(* anaprarod  wilmorort pablucoto serrodcal danrodcha marcarmor13&lt;br /&gt;
   ferrenseg ivamenjim paupeddeg juacabsou rubgonmar bowma lucnovdos *) &lt;br /&gt;
lemma &amp;quot;es_abc f a =  es_abc size a&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
(* Quickcheck found a counterexample:&lt;br /&gt;
  f = λx. a⇩1   &lt;br /&gt;
  a = N H (N H H)&lt;br /&gt;
Evaluated terms:&lt;br /&gt;
  es_abc f a = True&lt;br /&gt;
  es_abc size a = False *)&lt;br /&gt;
oops&lt;br /&gt;
(* el contraejemplo que encuentra es la medida constante a1 *)&lt;br /&gt;
&lt;br /&gt;
(*crigomgom *)&lt;br /&gt;
(* Como en la primera de las soluciones he usado la función constante 0&lt;br /&gt;
   pero he usado una expresión lambda *) &lt;br /&gt;
lemma &amp;quot;es_abc (λx. 0::nat) a = es_abc size a&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
(* dancorgar *)&lt;br /&gt;
fun medida :: &amp;quot;arbol =&amp;gt; bool&amp;quot; where&lt;br /&gt;
  &amp;quot;medida H       = True&amp;quot;&lt;br /&gt;
| &amp;quot;medida (N i d) = ((profundidad i) = (size d))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
theorem &amp;quot;es_abc size a = es_abc medida a&amp;quot;&lt;br /&gt;
quickcheck&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>Jalonso</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2016/index.php?title=Tema_2b:_Razonamiento_autom%C3%A1tico_sobre_programas_en_Isabelle/HOL&amp;diff=1214</id>
		<title>Tema 2b: Razonamiento automático sobre programas en Isabelle/HOL</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2016/index.php?title=Tema_2b:_Razonamiento_autom%C3%A1tico_sobre_programas_en_Isabelle/HOL&amp;diff=1214"/>
		<updated>2016-12-22T11:37:03Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: Protegió «Tema 2b: Razonamiento automático sobre programas en Isabelle/HOL» ([edit=sysop] (indefinido) [move=sysop] (indefinido))&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
chapter {* Tema 2: Razonamiento automático sobre programas en Isabelle/HOL *}&lt;br /&gt;
&lt;br /&gt;
theory T2b_Razonamiento_automatico_sobre_programas_en_IsabelleHOL&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  En este tema se demuestra con Isabelle las propiedades de los&lt;br /&gt;
  programas funcionales como se expone en el tema 8 del curso&lt;br /&gt;
  &amp;quot;Informática&amp;quot; que puede leerse en http://goo.gl/Imvyt *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Se usarán nombres cortos. *}&lt;br /&gt;
  &lt;br /&gt;
declare [[names_short]]&lt;br /&gt;
&lt;br /&gt;
section {* Razonamiento ecuacional *}&lt;br /&gt;
&lt;br /&gt;
text {* ----------------------------------------------------------------&lt;br /&gt;
  Ejemplo 1. Definir, por recursión, la función&lt;br /&gt;
     longitud :: &amp;#039;a list ⇒ nat&lt;br /&gt;
  tal que (longitud xs) es la longitud de la listas xs. Por ejemplo,&lt;br /&gt;
     longitud [4,2,5] = 3&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
fun longitud :: &amp;quot;&amp;#039;a list ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;longitud []     = 0&amp;quot;&lt;br /&gt;
| &amp;quot;longitud (x#xs) = 1 + longitud xs&amp;quot;&lt;br /&gt;
   &lt;br /&gt;
value &amp;quot;longitud [4,2,5] = 3&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejemplo 2. Demostrar que &lt;br /&gt;
     longitud [4,2,5] = 3&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;longitud [4,2,5] = 3&amp;quot;&lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejemplo 3. Definir la función&lt;br /&gt;
     fun intercambia :: &amp;#039;a × &amp;#039;b ⇒ &amp;#039;b × &amp;#039;a&lt;br /&gt;
  tal que (intercambia p) es el par obtenido intercambiando las&lt;br /&gt;
  componentes del par p. Por ejemplo,&lt;br /&gt;
     intercambia (u,v) = (v,u)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun intercambia :: &amp;quot;&amp;#039;a × &amp;#039;b ⇒ &amp;#039;b × &amp;#039;a&amp;quot; where&lt;br /&gt;
  &amp;quot;intercambia (x,y) = (y,x)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;intercambia (u,v) = (v,u)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejemplo 4. (p.6) Demostrar que &lt;br /&gt;
     intercambia (intercambia (x,y)) = (x,y)&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;intercambia (intercambia (x,y)) = (x,y)&amp;quot;&lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejemplo 5. Definir, por recursión, la función&lt;br /&gt;
     inversa :: &amp;#039;a list ⇒ &amp;#039;a list&lt;br /&gt;
  tal que (inversa xs) es la lista obtenida invirtiendo el orden de los&lt;br /&gt;
  elementos de xs. Por ejemplo,&lt;br /&gt;
     inversa [a,d,c] = [c,d,a]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun inversa :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;inversa []     = []&amp;quot;&lt;br /&gt;
| &amp;quot;inversa (x#xs) = inversa xs @ [x]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;inversa [a,d,c] = [c,d,a]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejemplo 6. (p. 9) Demostrar que &lt;br /&gt;
     inversa [x] = [x]&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;inversa [x] = [x]&amp;quot;&lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
section {* Razonamiento por inducción sobre los naturales *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  [Principio de inducción sobre los naturales] Para demostrar una&lt;br /&gt;
  propiedad P para todos los números naturales basta probar que el 0&lt;br /&gt;
  tiene la propiedad P y que si n tiene la propiedad P, entonces n+1&lt;br /&gt;
  también la tiene.  &lt;br /&gt;
     ⟦P 0; ⋀n. P n ⟹ P (Suc n)⟧ ⟹ P m&lt;br /&gt;
&lt;br /&gt;
  En Isabelle el principio de inducción sobre los naturales está&lt;br /&gt;
  formalizado en el teorema nat.induct y puede verse con&lt;br /&gt;
     thm nat.induct&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
thm nat.induct&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejemplo 7. Definir la función&lt;br /&gt;
     repite :: nat ⇒ &amp;#039;a ⇒ &amp;#039;a list&lt;br /&gt;
  tal que (repite n x) es la lista formada por n copias del elemento&lt;br /&gt;
  x. Por ejemplo, &lt;br /&gt;
     repite 3 a = [a,a,a]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun repite :: &amp;quot;nat ⇒ &amp;#039;a ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;repite 0 x       = []&amp;quot;&lt;br /&gt;
| &amp;quot;repite (Suc n) x = x # (repite n x)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;repite 3 a = [a,a,a]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejemplo 8. (p. 18) Demostrar que &lt;br /&gt;
     longitud (repite n x) = n&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
(* 1ª demostración (procedimental) *)  &lt;br /&gt;
lemma &amp;quot;longitud (repite n x) = n&amp;quot;&lt;br /&gt;
apply (induct n)&lt;br /&gt;
apply auto&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
(* 2ª demostración (declarativa) *)  &lt;br /&gt;
lemma &amp;quot;longitud (repite n x) = n&amp;quot;&lt;br /&gt;
by (induct n) auto&lt;br /&gt;
&lt;br /&gt;
section {* Razonamiento por inducción sobre listas *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Para demostrar una propiedad para todas las listas basta demostrar&lt;br /&gt;
  que la lista vacía tiene la propiedad y que al añadir un elemento a&lt;br /&gt;
  una lista que tiene la propiedad se obtiene otra lista que también&lt;br /&gt;
  tiene la propiedad. &lt;br /&gt;
&lt;br /&gt;
  En Isabelle el principio de inducción sobre listas está formalizado&lt;br /&gt;
  mediante el teorema list.induct que puede verse con &lt;br /&gt;
     thm list.induct&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
thm list.induct&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejemplo 9. Definir la función&lt;br /&gt;
     conc :: &amp;#039;a list ⇒ &amp;#039;a list ⇒ &amp;#039;a list&lt;br /&gt;
  tal que (conc xs ys) es la concatención de las listas xs e ys. Por&lt;br /&gt;
  ejemplo, &lt;br /&gt;
     conc [a,d] [b,d,a,c] = [a,d,b,d,a,c]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun conc :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;conc []     ys = ys&amp;quot;&lt;br /&gt;
| &amp;quot;conc (x#xs) ys = x # (conc xs ys)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;conc [a,d] [b,d,a,c] = [a,d,b,d,a,c]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejemplo 10. (p. 24) Demostrar que &lt;br /&gt;
     conc xs (conc ys zs) = (conc xs ys) zs&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
(* 1ª demostración *)  &lt;br /&gt;
lemma &amp;quot;conc xs (conc ys zs) = conc (conc xs ys) zs&amp;quot;&lt;br /&gt;
apply (induct xs) &lt;br /&gt;
apply auto&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
(* 2ª demostración *)  &lt;br /&gt;
lemma &amp;quot;conc xs (conc ys zs) = conc (conc xs ys) zs&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejemplo 11. Refutar que &lt;br /&gt;
     conc xs ys = conc ys xs&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;conc xs ys = conc ys xs&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {* Encuentra el contraejemplo, &lt;br /&gt;
  xs = [a\&amp;lt;^isub&amp;gt;2]&lt;br /&gt;
  ys = [a\&amp;lt;^isub&amp;gt;1] *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejemplo 12. (p. 28) Demostrar que &lt;br /&gt;
     conc xs [] = xs&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
(* 1ª demostración *)  &lt;br /&gt;
lemma &amp;quot;conc xs [] = xs&amp;quot;&lt;br /&gt;
apply (induct xs) &lt;br /&gt;
apply auto&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
(* 2ª demostración *)  &lt;br /&gt;
lemma &amp;quot;conc xs [] = xs&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejemplo 13. (p. 30) Demostrar que &lt;br /&gt;
     longitud (conc xs ys) = longitud xs + longitud ys&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
(* 1ª demostración *)  &lt;br /&gt;
lemma &amp;quot;longitud (conc xs ys) = longitud xs + longitud ys&amp;quot;&lt;br /&gt;
apply (induct xs) &lt;br /&gt;
apply auto&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
(* 2ª demostración *)  &lt;br /&gt;
lemma &amp;quot;longitud (conc xs ys) = longitud xs + longitud ys&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
section {* Inducción correspondiente a la definición recursiva *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejemplo 14. Definir la función&lt;br /&gt;
     coge :: nat ⇒ &amp;#039;a list ⇒ &amp;#039;a list&lt;br /&gt;
  tal que (coge n xs) es la lista de los n primeros elementos de xs. Por &lt;br /&gt;
  ejemplo, &lt;br /&gt;
     coge 2 [a,c,d,b,e] = [a,c]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun coge :: &amp;quot;nat ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;coge n []           = []&amp;quot;&lt;br /&gt;
| &amp;quot;coge 0 xs           = []&amp;quot;&lt;br /&gt;
| &amp;quot;coge (Suc n) (x#xs) = x # (coge n xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;coge 2 [a,c,d,b,e] = [a,c]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejemplo 15. Definir la función&lt;br /&gt;
     elimina :: nat ⇒ &amp;#039;a list ⇒ &amp;#039;a list&lt;br /&gt;
  tal que (elimina n xs) es la lista obtenida eliminando los n primeros&lt;br /&gt;
  elementos de xs. Por ejemplo, &lt;br /&gt;
     elimina 2 [a,c,d,b,e] = [d,b,e]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun elimina :: &amp;quot;nat ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;elimina n []           = []&amp;quot;&lt;br /&gt;
| &amp;quot;elimina 0 xs           = xs&amp;quot;&lt;br /&gt;
| &amp;quot;elimina (Suc n) (x#xs) = elimina n xs&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;elimina 2 [a,c,d,b,e] = [d,b,e]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  La definición coge genera el esquema de inducción coge.induct:&lt;br /&gt;
     ⟦⋀n. P n []; &lt;br /&gt;
      ⋀x xs. P 0 (x#xs); &lt;br /&gt;
      ⋀n x xs. P n xs ⟹ P (Suc n) (x#xs)⟧&lt;br /&gt;
     ⟹ P n x&lt;br /&gt;
&lt;br /&gt;
  Puede verse usando &amp;quot;thm coge.induct&amp;quot;. *}&lt;br /&gt;
&lt;br /&gt;
thm coge.induct&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejemplo 16. (p. 35) Demostrar que &lt;br /&gt;
     conc (coge n xs) (elimina n xs) = xs&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
(* 1ª demostración *)  &lt;br /&gt;
lemma &amp;quot;conc (coge n xs) (elimina n xs) = xs&amp;quot;&lt;br /&gt;
apply (induct rule: coge.induct) &lt;br /&gt;
apply auto&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
(* 2ª demostración *)  &lt;br /&gt;
lemma &amp;quot;conc (coge n xs) (elimina n xs) = xs&amp;quot;&lt;br /&gt;
by (induct rule: coge.induct) auto&lt;br /&gt;
&lt;br /&gt;
section {* Razonamiento por casos *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Distinción de casos sobre listas:&lt;br /&gt;
  · El método de distinción de casos se activa con (cases xs) donde xs&lt;br /&gt;
    es del tipo lista. &lt;br /&gt;
  · &amp;quot;case Nil&amp;quot; es una abreviatura de &lt;br /&gt;
       &amp;quot;assume Nil: xs =[]&amp;quot;.&lt;br /&gt;
  · &amp;quot;case Cons&amp;quot; es una abreviatura de &lt;br /&gt;
       &amp;quot;fix ? ?? assume Cons: xs = ? # ??&amp;quot;&lt;br /&gt;
    donde ? y ?? son variables anónimas. *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejemplo 17. Definir la función&lt;br /&gt;
     esVacia :: &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (esVacia xs) se verifica si xs es la lista vacía. Por ejemplo,&lt;br /&gt;
     esVacia []  = True&lt;br /&gt;
     esVacia [1] = False&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun esVacia :: &amp;quot;&amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;esVacia []     = True&amp;quot;&lt;br /&gt;
| &amp;quot;esVacia (x#xs) = False&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;esVacia []  = True&amp;quot;&lt;br /&gt;
value &amp;quot;esVacia [1] = False&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejemplo 18 (p. 39) . Demostrar que &lt;br /&gt;
     esVacia xs = esVacia (conc xs xs)&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
(* 1ª demostración *)  &lt;br /&gt;
lemma &amp;quot;esVacia xs = esVacia (conc xs xs)&amp;quot;&lt;br /&gt;
apply (cases xs) &lt;br /&gt;
apply auto&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
(* 2ª demostración *)  &lt;br /&gt;
lemma &amp;quot;esVacia xs = esVacia (conc xs xs)&amp;quot;&lt;br /&gt;
by (cases xs) auto&lt;br /&gt;
&lt;br /&gt;
section {* Heurística de generalización *}&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Heurística de generalización: Cuando se use demostración estructural,&lt;br /&gt;
  cuantificar universalmente las variables libres (o, equivalentemente,&lt;br /&gt;
  considerar las variables libres como variables arbitrarias). *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejemplo 19. Definir la función&lt;br /&gt;
     inversaAc :: &amp;#039;a list ⇒ &amp;#039;a list&lt;br /&gt;
  tal que (inversaAc xs) es a inversa de xs calculada usando&lt;br /&gt;
  acumuladores. Por ejemplo, &lt;br /&gt;
     inversaAc [a,c,b,e] = [e,b,c,a]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun inversaAcAux :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;inversaAcAux [] ys     = ys&amp;quot;&lt;br /&gt;
| &amp;quot;inversaAcAux (x#xs) ys = inversaAcAux xs (x#ys)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
fun inversaAc :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;inversaAc xs = inversaAcAux xs []&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;inversaAc [a,c,b,e] = [e,b,c,a]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejemplo 20. (p. 44) Demostrar que &lt;br /&gt;
     inversaAcAux xs ys = (inversa xs) @ ys&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
(* 1ª demostración *)  &lt;br /&gt;
lemma inversaAcAux_es_inversa:&lt;br /&gt;
  &amp;quot;inversaAcAux xs ys = (inversa xs)@ys&amp;quot;&lt;br /&gt;
apply (induct xs arbitrary: ys) &lt;br /&gt;
apply auto&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
(* 2ª demostración *)  &lt;br /&gt;
lemma inversaAcAux_es_inversa:&lt;br /&gt;
  &amp;quot;inversaAcAux xs ys = (inversa xs)@ys&amp;quot;&lt;br /&gt;
by (induct xs arbitrary: ys) auto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejemplo 21. (p. 43) Demostrar que &lt;br /&gt;
     inversaAc xs = inversa xs&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
corollary &amp;quot;inversaAc xs = inversa xs&amp;quot;&lt;br /&gt;
by (simp add: inversaAcAux_es_inversa)&lt;br /&gt;
&lt;br /&gt;
section {* Demostración por inducción para funciones de orden superior *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejemplo 22. Definir la función&lt;br /&gt;
     sum :: nat list ⇒ nat&lt;br /&gt;
  tal que (sum xs) es la suma de los elementos de xs. Por ejemplo,&lt;br /&gt;
     sum [3,2,5] = 10&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun sum :: &amp;quot;nat list ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;sum []     = 0&amp;quot;&lt;br /&gt;
| &amp;quot;sum (x#xs) = x + sum xs&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;sum [3,2,5] = 10&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejemplo 23. Definir la función&lt;br /&gt;
     map :: (&amp;#039;a ⇒ &amp;#039;b) ⇒ &amp;#039;a list ⇒ &amp;#039;b list&lt;br /&gt;
  tal que (map f xs) es la lista obtenida aplicando la función f a los&lt;br /&gt;
  elementos de xs. Por ejemplo,&lt;br /&gt;
     map (λx. 2*x) [3,2,5] = [6,4,10]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun map :: &amp;quot;(&amp;#039;a ⇒ &amp;#039;b) ⇒ &amp;#039;a list ⇒ &amp;#039;b list&amp;quot; where&lt;br /&gt;
  &amp;quot;map f []     = []&amp;quot;&lt;br /&gt;
| &amp;quot;map f (x#xs) = (f x) # map f xs&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;map (λx. 2*x) [3::nat,2,5] = [6,4,10]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejemplo 24. (p. 45) Demostrar que &lt;br /&gt;
     sum (map (λx. 2*x) xs) = 2 * (sum xs)&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
(* 1ª demostración *)  &lt;br /&gt;
lemma &amp;quot;sum (map (λx. 2*x) xs) = 2 * (sum xs)&amp;quot;&lt;br /&gt;
apply (induct xs) &lt;br /&gt;
apply auto&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
(* 2ª demostración *)  &lt;br /&gt;
lemma &amp;quot;sum (map (λx. 2*x) xs) = 2 * (sum xs)&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejemplo 25. (p. 48) Demostrar que &lt;br /&gt;
     longitud (map f xs) = longitud xs&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
(* 1ª demostración *)  &lt;br /&gt;
lemma &amp;quot;longitud (map f xs) = longitud xs&amp;quot;&lt;br /&gt;
apply (induct xs) &lt;br /&gt;
apply auto&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
(* 2ª demostración *)  &lt;br /&gt;
lemma &amp;quot;longitud (map f xs) = longitud xs&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
section {* Referencias *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  · J.A. Alonso. &amp;quot;Razonamiento sobre programas&amp;quot; http://goo.gl/R06O3&lt;br /&gt;
  · G. Hutton. &amp;quot;Programming in Haskell&amp;quot;. Cap. 13 &amp;quot;Reasoning about&lt;br /&gt;
    programms&amp;quot;. http://bit.ly/1gMqK0X &lt;br /&gt;
  · S. Thompson. &amp;quot;Haskell: the Craft of Functional Programming, 3rd&lt;br /&gt;
    Edition. Cap. 8 &amp;quot;Reasoning about programms&amp;quot;. &lt;br /&gt;
  · L. Paulson. &amp;quot;ML for the Working Programmer, 2nd Edition&amp;quot;. Cap. 6. &lt;br /&gt;
    &amp;quot;Reasoning about functional programs&amp;quot;. http://bit.ly/1gMqFKI&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>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2016/index.php?title=Tema_5:_Razonamiento_sobre_%C3%A1rboles_y_bosques&amp;diff=1213</id>
		<title>Tema 5: Razonamiento sobre árboles y bosques</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2016/index.php?title=Tema_5:_Razonamiento_sobre_%C3%A1rboles_y_bosques&amp;diff=1213"/>
		<updated>2016-12-22T11:36:35Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: Protegió «Tema 5: Razonamiento sobre árboles y bosques» ([edit=sysop] (indefinido) [move=sysop] (indefinido))&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
chapter {* Tema 5: Razonamiento sobre árboles *}&lt;br /&gt;
&lt;br /&gt;
theory T5_Razonamiento_sobre_arboles&lt;br /&gt;
imports Main Parity&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  En este tema se estudia razonamiento sobre otras estructuras&lt;br /&gt;
  recursivas como árboles binarios, árboles generales y bosques.&lt;br /&gt;
  &lt;br /&gt;
  También se muestra cómo definir tipos de datos por recursión cruzada y&lt;br /&gt;
  la demostración de sus propiedades por inducción.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
section {* Razonamiento sobre árboles binarios *}&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Ejemplo de definición de tipos recursivos:&lt;br /&gt;
  Definir un tipo de dato para los árboles binarios.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
datatype &amp;#039;a arbolB = Hoja &amp;quot;&amp;#039;a&amp;quot; &lt;br /&gt;
                   | Nodo &amp;quot;&amp;#039;a&amp;quot; &amp;quot;&amp;#039;a arbolB&amp;quot; &amp;quot;&amp;#039;a arbolB&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Ejemplo de definición sobre árboles binarios:&lt;br /&gt;
  Definir la función &amp;quot;espejo&amp;quot; que aplicada a un árbol devuelve su imagen&lt;br /&gt;
  especular.  &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
fun espejo :: &amp;quot;&amp;#039;a arbolB ⇒ &amp;#039;a arbolB&amp;quot; where&lt;br /&gt;
  &amp;quot;espejo (Hoja x) = (Hoja x)&amp;quot;&lt;br /&gt;
| &amp;quot;espejo (Nodo x i d) = (Nodo x (espejo d) (espejo i))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;espejo (Nodo a (Nodo b (Hoja c) (Hoja d)) (Hoja e))&amp;quot;&lt;br /&gt;
-- &amp;quot;= Nodo a (Hoja e) (Nodo b (Hoja d) (Hoja c))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Ejemplo de demostración sobre árboles binarios:&lt;br /&gt;
  Demostrar que la función &amp;quot;espejo&amp;quot; es involutiva; es decir, para&lt;br /&gt;
  cualquier árbol a, se tiene que &lt;br /&gt;
     espejo(espejo(a)) = a.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma espejo_involutiva:&lt;br /&gt;
  fixes a :: &amp;quot;&amp;#039;b arbolB&amp;quot; &lt;br /&gt;
  shows &amp;quot;espejo (espejo a) = a&amp;quot; (is &amp;quot;?P a&amp;quot;)&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix x &lt;br /&gt;
  show &amp;quot;?P (Hoja x)&amp;quot; by simp &lt;br /&gt;
next&lt;br /&gt;
  fix x&lt;br /&gt;
  fix i assume h1: &amp;quot;?P i&amp;quot;&lt;br /&gt;
  fix d assume h2: &amp;quot;?P d&amp;quot;&lt;br /&gt;
  show &amp;quot;?P (Nodo x i d)&amp;quot; &lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;espejo(espejo(Nodo x i d)) = &lt;br /&gt;
          espejo(Nodo x (espejo d) (espejo i))&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;… = Nodo x (espejo (espejo i)) (espejo (espejo d))&amp;quot; &lt;br /&gt;
      by simp&lt;br /&gt;
    also have &amp;quot;… = Nodo x i d&amp;quot; using h1 h2 by simp &lt;br /&gt;
    finally show ?thesis .&lt;br /&gt;
 qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Comentarios sobre la demostración anterior:&lt;br /&gt;
  · (fixes a :: &amp;quot;&amp;#039;b arbolB&amp;quot;) es una abreviatura de &amp;quot;sea a1 un árbol binario&lt;br /&gt;
    cuyos elementos son de tipo b&amp;quot;. &lt;br /&gt;
  · (induct a) indica que el método de demostración es por inducción&lt;br /&gt;
    en el árbol binario a.&lt;br /&gt;
  · Se generan dos casos:&lt;br /&gt;
    1. ⋀a. espejo (espejo (Hoja a)) = Hoja a&lt;br /&gt;
    2. ⋀a1 a2 a3. ⟦espejo (espejo a2) = a2; &lt;br /&gt;
                   espejo (espejo a3) = a3⟧&lt;br /&gt;
                  ⟹ espejo (espejo (Nodo a1 a2 a3)) = Nodo a1 a2 a3&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma espejo_involutiva_1: &lt;br /&gt;
  &amp;quot;espejo (espejo a ) = a&amp;quot;&lt;br /&gt;
by (induct a) auto&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Ejemplo. [Aplanamiento de árboles]&lt;br /&gt;
  Definir la función &amp;quot;aplana&amp;quot; que aplane los árboles recorriéndolos en&lt;br /&gt;
  orden infijo.  &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
fun aplana :: &amp;quot;&amp;#039;a arbolB ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;aplana (Hoja x)     = [x]&amp;quot;&lt;br /&gt;
| &amp;quot;aplana (Nodo x i d) = (aplana i) @ [x] @ (aplana d)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;aplana (Nodo a (Nodo b (Hoja c) (Hoja d)) (Hoja e))&amp;quot;&lt;br /&gt;
-- &amp;quot;= [c, b, d, a, e]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Ejemplo. [Aplanamiento de la imagen especular] Demostrar que&lt;br /&gt;
     aplana (espejo a) = rev (aplana a)&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;
  fixes a :: &amp;quot;&amp;#039;b arbolB&amp;quot;&lt;br /&gt;
  shows &amp;quot;aplana (espejo a) = rev (aplana a)&amp;quot; (is &amp;quot;?P a&amp;quot;)&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix x&lt;br /&gt;
  show &amp;quot;?P (Hoja x)&amp;quot; by simp &lt;br /&gt;
next&lt;br /&gt;
  fix x &lt;br /&gt;
  fix i assume h1: &amp;quot;?P i&amp;quot;&lt;br /&gt;
  fix d assume h2: &amp;quot;?P d&amp;quot;&lt;br /&gt;
  show &amp;quot;?P (Nodo x i d)&amp;quot; &lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;aplana (espejo (Nodo x i d)) = &lt;br /&gt;
          aplana (Nodo x (espejo d) (espejo i))&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;… = (aplana(espejo d))@[x]@(aplana(espejo i))&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;… = (rev(aplana d))@[x]@(rev(aplana i))&amp;quot; &lt;br /&gt;
      using h1 h2 by simp&lt;br /&gt;
    also have &amp;quot;… = rev((aplana i)@[x]@(aplana d))&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;… = rev(aplana (Nodo x i d))&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis .&lt;br /&gt;
 qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma &amp;quot;aplana (espejo a) = rev (aplana a)&amp;quot;&lt;br /&gt;
by (induct a) auto&lt;br /&gt;
&lt;br /&gt;
section {* Árboles y bosques. Recursión mutua e inducción *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Nota. [Ejemplo de definición de tipos mediante recursión cruzada]&lt;br /&gt;
  · Un árbol de tipo a es una hoja o un nodo de tipo a junto con un&lt;br /&gt;
    bosque de tipo a.&lt;br /&gt;
  · Un bosque de tipo a es el boque vacío o un bosque contruido añadiendo&lt;br /&gt;
    un árbol de tipo a a un bosque de tipo a.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
datatype &amp;#039;a arbol = Hoja | Nodo &amp;quot;&amp;#039;a&amp;quot; &amp;quot;&amp;#039;a bosque&amp;quot;&lt;br /&gt;
     and &amp;#039;a bosque = Vacio | ConsB &amp;quot;&amp;#039;a arbol&amp;quot; &amp;quot;&amp;#039;a bosque&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Regla de inducción correspondiente a la recursión cruzada:&lt;br /&gt;
  La regla de inducción sobre árboles y bosques es arbol_bosque.induct:&lt;br /&gt;
     ⟦P1 Hoja; &lt;br /&gt;
      ⋀x b. P2 b ⟹ P1 (Nodo x b); &lt;br /&gt;
      P2 Vacio;&lt;br /&gt;
      ⋀a b. ⟦P1 a; P2 b⟧ ⟹ P2 (ConsB a b)⟧ &lt;br /&gt;
     ⟹ P1 a ∧ P2 b&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Ejemplos de definición por recursión cruzada:&lt;br /&gt;
  · aplana_arbol a) es la lista obtenida aplanando el árbol a.   &lt;br /&gt;
  · (aplana_bosque b) es la lista obtenida aplanando el bosque b.   &lt;br /&gt;
  · (map_arbol a h) es el árbol obtenido aplicando la función h a&lt;br /&gt;
    todos los nodos del árbol a.   &lt;br /&gt;
  · (map_bosque b h) es el bosque obtenido aplicando la función h a&lt;br /&gt;
    todos los nodos del bosque b. &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
fun aplana_arbol :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a list&amp;quot; and &lt;br /&gt;
    aplana_bosque :: &amp;quot;&amp;#039;a bosque ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;aplana_arbol Hoja = []&amp;quot;&lt;br /&gt;
| &amp;quot;aplana_arbol (Nodo x b) = x#(aplana_bosque b)&amp;quot;&lt;br /&gt;
| &amp;quot;aplana_bosque Vacio = []&amp;quot;&lt;br /&gt;
| &amp;quot;aplana_bosque (ConsB a b) = (aplana_arbol a) @ (aplana_bosque b)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
fun map_arbol :: &amp;quot;(&amp;#039;a ⇒ &amp;#039;b) ⇒ &amp;#039;a arbol ⇒ &amp;#039;b arbol&amp;quot; and&lt;br /&gt;
    map_bosque :: &amp;quot;(&amp;#039;a ⇒ &amp;#039;b) ⇒ &amp;#039;a bosque ⇒ &amp;#039;b bosque&amp;quot; where&lt;br /&gt;
  &amp;quot;map_arbol  f Hoja        = Hoja&amp;quot;&lt;br /&gt;
| &amp;quot;map_arbol  f (Nodo x b)  = Nodo (f x) (map_bosque f b)&amp;quot;&lt;br /&gt;
| &amp;quot;map_bosque f Vacio       = Vacio&amp;quot;&lt;br /&gt;
| &amp;quot;map_bosque f (ConsB a b) = ConsB (map_arbol f a) (map_bosque f b)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Ejemplo de demostración por inducción cruzada:&lt;br /&gt;
  Demostrar que:&lt;br /&gt;
  · aplana_arbol  (map_arbol  f a) = map f (aplana_arbol a)&lt;br /&gt;
  · aplana_bosque (map_bosque f b) = map f (aplana_bosque b)&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración detallada es&amp;quot;&lt;br /&gt;
lemma &amp;quot;aplana_arbol  (map_arbol  f a) = map f (aplana_arbol a)&lt;br /&gt;
     ∧ aplana_bosque (map_bosque f b) = map f (aplana_bosque b)&amp;quot;&lt;br /&gt;
proof (induct_tac a and b)&lt;br /&gt;
  show &amp;quot;aplana_arbol (map_arbol f Hoja ) = map f (aplana_arbol Hoja)&amp;quot; &lt;br /&gt;
    by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x b&lt;br /&gt;
  assume HI: &amp;quot;aplana_bosque (map_bosque f b) = map f (aplana_bosque b)&amp;quot;&lt;br /&gt;
  have &amp;quot;aplana_arbol (map_arbol f (Nodo x b)) = &lt;br /&gt;
        aplana_arbol (Nodo (f x) (map_bosque f b))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;… = (f x)#(aplana_bosque (map_bosque f b))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;… = (f x)#(map f (aplana_bosque b))&amp;quot; using HI by simp&lt;br /&gt;
  also have &amp;quot;… = map f (aplana_arbol (Nodo x b))&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;aplana_arbol (map_arbol f (Nodo x b))&lt;br /&gt;
                = map f (aplana_arbol (Nodo x b))&amp;quot; .&lt;br /&gt;
next&lt;br /&gt;
  show &amp;quot;aplana_bosque (map_bosque f Vacio) = map f (aplana_bosque Vacio)&amp;quot; &lt;br /&gt;
    by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a b&lt;br /&gt;
  assume HI1: &amp;quot;aplana_arbol (map_arbol f a) = map f (aplana_arbol a)&amp;quot;&lt;br /&gt;
     and HI2: &amp;quot;aplana_bosque (map_bosque f b) = map f (aplana_bosque b)&amp;quot;&lt;br /&gt;
  have &amp;quot;aplana_bosque (map_bosque f (ConsB a b)) = &lt;br /&gt;
        aplana_bosque (ConsB (map_arbol f a) (map_bosque f b))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;… = aplana_arbol(map_arbol f a)@aplana_bosque(map_bosque f b)&amp;quot; &lt;br /&gt;
    by simp&lt;br /&gt;
  also have &amp;quot;… = (map f (aplana_arbol a))@(map f (aplana_bosque b))&amp;quot; &lt;br /&gt;
    using HI1 HI2 by simp&lt;br /&gt;
  also have &amp;quot;… = map f (aplana_bosque (ConsB a b))&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;aplana_bosque (map_bosque f (ConsB a b)) &lt;br /&gt;
                = map f (aplana_bosque (ConsB a b))&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Comentarios sobre la demostración anterior:&lt;br /&gt;
  · (induct_tac a and b) indica que el método de demostración es por&lt;br /&gt;
    inducción cruzada sobre a y b.&lt;br /&gt;
  · Se generan 4 casos:&lt;br /&gt;
    1. aplana_arbol (map_arbol arbol.Hoja h) = map h (aplana_arbol arbol.Hoja)&lt;br /&gt;
    2. ⋀a bosque.&lt;br /&gt;
          aplana_bosque (map_bosque bosque h) = map h (aplana_bosque bosque) ⟹&lt;br /&gt;
          aplana_arbol (map_arbol (arbol.Nodo a bosque) h) =&lt;br /&gt;
          map h (aplana_arbol (arbol.Nodo a bosque))&lt;br /&gt;
    3. aplana_bosque (map_bosque Vacio h) = map h (aplana_bosque Vacio)&lt;br /&gt;
    4. ⋀arbol bosque.&lt;br /&gt;
          ⟦aplana_arbol (map_arbol arbol h) = map h (aplana_arbol arbol);&lt;br /&gt;
           aplana_bosque (map_bosque bosque h) = map h (aplana_bosque bosque)⟧&lt;br /&gt;
          ⟹ aplana_bosque (map_bosque (ConsB arbol bosque) h) =&lt;br /&gt;
             map h (aplana_bosque (ConsB arbol bosque))&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma &amp;quot;aplana_arbol  (map_arbol  f a) = map f (aplana_arbol a)&lt;br /&gt;
     ∧ aplana_bosque (map_bosque f b) = map f (aplana_bosque b)&amp;quot;&lt;br /&gt;
by (induct_tac a and b) auto&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>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2016/index.php?title=Tema_6a:_Verificaci%C3%B3n_de_la_ordenaci%C3%B3n_por_inserci%C3%B3n&amp;diff=1212</id>
		<title>Tema 6a: Verificación de la ordenación por inserción</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2016/index.php?title=Tema_6a:_Verificaci%C3%B3n_de_la_ordenaci%C3%B3n_por_inserci%C3%B3n&amp;diff=1212"/>
		<updated>2016-12-22T11:36:22Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: Protegió «Tema 6a: Verificación de la ordenación por inserción» ([edit=sysop] (indefinido) [move=sysop] (indefinido))&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
chapter {* T6a: Verificación de la ordenación por inserción *}&lt;br /&gt;
&lt;br /&gt;
theory T6a_Verificacion_de_la_ordenacion_por_insercion&lt;br /&gt;
imports Main&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  En este de tema se define el algoritmo de ordenación de listas &lt;br /&gt;
  por inserción y se demuestra que es correcto. *}&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. Definir la función&lt;br /&gt;
     inserta :: int ⇒ int list ⇒ int list&lt;br /&gt;
  tal que (inserta a xs) es la lista obtenida insertando a delante del&lt;br /&gt;
  primer elemento de xs que es mayor o igual que a. Por ejemplo,&lt;br /&gt;
     inserta 3 [2,5,1,7] = [2,3,5,1,7]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun inserta :: &amp;quot;int ⇒ int list ⇒ int list&amp;quot; where&lt;br /&gt;
  &amp;quot;inserta a []     = [a]&amp;quot;&lt;br /&gt;
| &amp;quot;inserta a (x#xs) = (if a ≤ x &lt;br /&gt;
                       then a # x # xs &lt;br /&gt;
                       else x # inserta a xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;inserta 3 [2,5,1,7] = [2,3,5,1,7]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Definir la función&lt;br /&gt;
     ordena :: int list ⇒ int list&lt;br /&gt;
  tal que (ordena xs) es la lista obtenida ordenando xs por inserción. &lt;br /&gt;
  Por ejemplo, &lt;br /&gt;
     ordena [3,2,5,3] = [2,3,3,5]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun ordena :: &amp;quot;int list ⇒ int list&amp;quot; where&lt;br /&gt;
  &amp;quot;ordena []     = []&amp;quot;&lt;br /&gt;
| &amp;quot;ordena (x#xs) = inserta x (ordena xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;ordena [3,2,5,3] = [2,3,3,5]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. Definir la función&lt;br /&gt;
     menor :: int ⇒ int list ⇒ bool&lt;br /&gt;
  tal que (menor a xs) se verifica si a es menor o igual que todos los&lt;br /&gt;
  elementos de xs.Por ejemplo,  &lt;br /&gt;
     menor 2 [3,2,5] = True&lt;br /&gt;
     menor 2 [3,0,5] = False&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun menor :: &amp;quot;int ⇒ int list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;menor a []     = True&amp;quot;&lt;br /&gt;
| &amp;quot;menor a (x#xs) = (a ≤ x ∧ menor a xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;menor 2 [3,2,5] = True&amp;quot;&lt;br /&gt;
value &amp;quot;menor 2 [3,0,5] = False&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Definir la función&lt;br /&gt;
     ordenada :: int list ⇒ bool&lt;br /&gt;
  tal que (ordenada xs) se verifica si xs es una lista ordenada de&lt;br /&gt;
  manera creciente. Por ejemplo,  &lt;br /&gt;
     ordenada [2,3,3,5] = True &lt;br /&gt;
     ordenada [2,4,3,5] = False &lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun ordenada :: &amp;quot;int list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;ordenada []     = True&amp;quot;&lt;br /&gt;
| &amp;quot;ordenada (x#xs) = (menor x xs &amp;amp; ordenada xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;ordenada [2,3,3,5] = True&amp;quot; &lt;br /&gt;
value &amp;quot;ordenada [2,4,3,5] = False&amp;quot; &lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. Demostrar que si y es una cota inferior de zs y x ≤ y,&lt;br /&gt;
  entonces x es una cota inferior de zs.&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma menor_menor: &lt;br /&gt;
  assumes &amp;quot;x ≤ y&amp;quot;  &lt;br /&gt;
  shows   &amp;quot;menor y zs ⟶ menor x zs&amp;quot;&lt;br /&gt;
using assms&lt;br /&gt;
by (induct zs) auto&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma menor_menor_2: &lt;br /&gt;
  assumes &amp;quot;x ≤ y&amp;quot;  &lt;br /&gt;
  shows   &amp;quot;menor y zs ⟶ menor x zs&amp;quot;&lt;br /&gt;
proof (induct zs)&lt;br /&gt;
  show &amp;quot;menor y [] ⟶ menor x []&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix z zs&lt;br /&gt;
  assume HI: &amp;quot;menor y zs ⟶ menor x zs&amp;quot;  &lt;br /&gt;
  show &amp;quot;menor y (z # zs) ⟶ menor x (z # zs)&amp;quot;&lt;br /&gt;
  proof&lt;br /&gt;
    assume sup: &amp;quot;menor y (z # zs)&amp;quot;&lt;br /&gt;
    show &amp;quot;menor x (z # zs)&amp;quot;&lt;br /&gt;
    proof (simp only: menor.simps(2))&lt;br /&gt;
      show &amp;quot;x ≤ z ∧ menor x zs&amp;quot;&lt;br /&gt;
      proof&lt;br /&gt;
          have &amp;quot;x ≤ y&amp;quot; using assms .&lt;br /&gt;
          also have &amp;quot;y ≤ z&amp;quot; using sup by simp&lt;br /&gt;
          finally show &amp;quot;x ≤ z&amp;quot; .&lt;br /&gt;
      next&lt;br /&gt;
        have &amp;quot;menor y zs&amp;quot; using sup by simp&lt;br /&gt;
        with HI show &amp;quot;menor x zs&amp;quot; by simp&lt;br /&gt;
      qed&lt;br /&gt;
    qed&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 6. Demostrar el siguiente teorema de corrección: x es una&lt;br /&gt;
  cota inferior de la lista obtenida insertando y en zs syss x ≤ y y x&lt;br /&gt;
  es una cota inferior de zs.&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma menor_inserta:&lt;br /&gt;
  &amp;quot;menor x (inserta y zs) = (x ≤ y ∧ menor x zs)&amp;quot;&lt;br /&gt;
by (induct zs) auto&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma menor_inserta_2: &lt;br /&gt;
  &amp;quot;menor x (inserta y zs) = (x ≤ y ∧ menor x zs)&amp;quot;&lt;br /&gt;
proof (induct zs)&lt;br /&gt;
  show &amp;quot;menor x (inserta y []) = (x ≤ y ∧ menor x [])&amp;quot; by simp&lt;br /&gt;
next &lt;br /&gt;
  fix z zs&lt;br /&gt;
  assume HI: &amp;quot;menor x (inserta y zs) = (x ≤ y ∧ menor x zs)&amp;quot;&lt;br /&gt;
  show &amp;quot;menor x (inserta y (z#zs)) = (x ≤ y ∧ menor x (z#zs))&amp;quot; &lt;br /&gt;
  proof (cases &amp;quot;y ≤ z&amp;quot;)&lt;br /&gt;
    assume &amp;quot;y ≤ z&amp;quot;&lt;br /&gt;
    hence &amp;quot;menor x (inserta y (z#zs)) = menor x (y#z#zs)&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;… = (x ≤ y ∧ menor x (z#zs))&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis by simp&lt;br /&gt;
  next&lt;br /&gt;
    assume &amp;quot;¬(y ≤ z)&amp;quot;&lt;br /&gt;
    hence &amp;quot;menor x (inserta y (z#zs)) = &lt;br /&gt;
           menor x (z # inserta y zs)&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;… = (x ≤ z ∧ menor x (inserta y zs))&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;… = (x ≤ z ∧ x ≤ y ∧ menor x zs)&amp;quot; using HI by simp&lt;br /&gt;
    also have &amp;quot;… = (x ≤ y ∧ menor x (z#zs))&amp;quot; by auto&lt;br /&gt;
    finally show ?thesis by simp&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 6. Demostrar que al insertar un elemento la lista obtenida&lt;br /&gt;
  está ordenada syss lo estaba la original.&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma ordenada_inserta:&lt;br /&gt;
  &amp;quot;ordenada (inserta a xs) = ordenada xs&amp;quot;&lt;br /&gt;
by (induct xs) (auto simp add: menor_menor menor_inserta)&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma ordenada_inserta_2:&lt;br /&gt;
  &amp;quot;ordenada (inserta a xs) = ordenada xs&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;ordenada (inserta a []) = ordenada []&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x xs&lt;br /&gt;
  assume HI: &amp;quot;ordenada (inserta a xs) = ordenada xs&amp;quot; &lt;br /&gt;
  show &amp;quot;ordenada (inserta a (x # xs)) = ordenada (x # xs)&amp;quot; &lt;br /&gt;
  proof (cases &amp;quot;a ≤ x&amp;quot;)&lt;br /&gt;
    assume &amp;quot;a ≤ x&amp;quot;&lt;br /&gt;
    hence &amp;quot;ordenada (inserta a (x # xs)) = &lt;br /&gt;
           ordenada (a # x # xs)&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;… = (menor a (x#xs) ∧ ordenada (x # xs))&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;… = ordenada (x # xs)&amp;quot;  &lt;br /&gt;
      using `a ≤ x`  by (auto simp add: menor_menor)&lt;br /&gt;
    finally show &amp;quot;ordenada (inserta a (x # xs)) = ordenada (x # xs)&amp;quot; &lt;br /&gt;
      by simp&lt;br /&gt;
  next&lt;br /&gt;
    assume &amp;quot;¬(a ≤ x)&amp;quot;&lt;br /&gt;
    hence &amp;quot;ordenada (inserta a (x # xs)) = &lt;br /&gt;
           ordenada (x # inserta a xs)&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;… = (menor x (inserta a xs) ∧ ordenada (inserta a xs))&amp;quot; &lt;br /&gt;
      by simp&lt;br /&gt;
    also have &amp;quot;… = (menor x (inserta a xs) ∧ ordenada xs)&amp;quot; &lt;br /&gt;
      using HI by simp&lt;br /&gt;
    also have &amp;quot;… = (menor x xs ∧ ordenada xs)&amp;quot; &lt;br /&gt;
      using `¬(a ≤ x)` by (simp add: menor_inserta)&lt;br /&gt;
    also have &amp;quot;… = ordenada (x # xs)&amp;quot; by simp&lt;br /&gt;
    finally show &amp;quot;ordenada (inserta a (x # xs)) = ordenada (x # xs)&amp;quot; &lt;br /&gt;
      by simp&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 7. Demostrar que, para toda lista xs, (ordena xs) está&lt;br /&gt;
  ordenada. &lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
theorem ordenada_ordena:&lt;br /&gt;
  &amp;quot;ordenada (ordena xs)&amp;quot;&lt;br /&gt;
by (induct xs) (auto simp add: ordenada_inserta)&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
theorem ordenada_ordena_2:&lt;br /&gt;
  &amp;quot;ordenada (ordena xs)&amp;quot;&lt;br /&gt;
proof (induct xs) &lt;br /&gt;
  show &amp;quot;ordenada (ordena [])&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x xs&lt;br /&gt;
  assume &amp;quot;ordenada (ordena xs)&amp;quot; &lt;br /&gt;
  then have &amp;quot;ordenada (inserta x (ordena xs))&amp;quot; &lt;br /&gt;
    by (simp add: ordenada_inserta)  &lt;br /&gt;
  then show &amp;quot;ordenada (ordena (x # xs))&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Nota. El teorema anterior no garantiza que ordena sea correcta, ya que&lt;br /&gt;
  puede que (ordena xs) no tenga los mismos elementos que xs. Por&lt;br /&gt;
  ejemplo, si se define (ordena xs) como [] se tiene que (ordena xs)&lt;br /&gt;
  está ordenada pero no es una ordenación de xs. &lt;br /&gt;
&lt;br /&gt;
  Para garantizarlo, definimos la función cuenta.&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 8. Definir la función&lt;br /&gt;
     cuenta :: int list ⇒ int ⇒ nat&lt;br /&gt;
  tal que (cuenta xs y) es el número de veces que aparece el elemento y&lt;br /&gt;
  en la lista xs. Por ejemplo, &lt;br /&gt;
     cuenta [1,3,4,3,5] 3 = 2&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun cuenta :: &amp;quot;int list ⇒ int ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;cuenta []     y = 0&amp;quot;&lt;br /&gt;
| &amp;quot;cuenta (x#xs) y = (if x=y &lt;br /&gt;
                      then Suc (cuenta xs y) &lt;br /&gt;
                      else cuenta xs y)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;cuenta [1,3,4,3,5] 3 = 2&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 9. Demostrar que el número de veces que aparece y en &lt;br /&gt;
  (inserta x xs) es &lt;br /&gt;
  * uno más el número de veces que aparece en xs, si y = x; &lt;br /&gt;
  * el número de veces que aparece en xs, si y ≠ x; &lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma cuenta_inserta:&lt;br /&gt;
  &amp;quot;cuenta (inserta x xs) y =&lt;br /&gt;
   (if x=y then Suc (cuenta xs y) else cuenta xs y)&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 10. Demostrar que el número de veces que aparece y en &lt;br /&gt;
  (ordena xs) es el número de veces que aparece en xs.&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
theorem cuenta_ordena:&lt;br /&gt;
  &amp;quot;cuenta (ordena xs) y = cuenta xs y&amp;quot;&lt;br /&gt;
by (induct xs) (auto simp add: cuenta_inserta)&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
theorem cuenta_ordena_2:&lt;br /&gt;
  &amp;quot;cuenta (ordena xs) y = cuenta xs y&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;cuenta (ordena []) y = cuenta [] y&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x xs&lt;br /&gt;
  assume HI: &amp;quot;cuenta (ordena xs) y = cuenta xs y&amp;quot;&lt;br /&gt;
  show &amp;quot;cuenta (ordena (x # xs)) y = cuenta (x # xs) y&amp;quot; &lt;br /&gt;
  proof (cases &amp;quot;x = y&amp;quot;)&lt;br /&gt;
    assume &amp;quot;x = y&amp;quot;&lt;br /&gt;
    have &amp;quot;cuenta (ordena (x # xs)) y = cuenta (inserta x (ordena xs)) y&amp;quot; &lt;br /&gt;
      by simp&lt;br /&gt;
    also have &amp;quot;… = Suc (cuenta (ordena xs) y)&amp;quot; using `x = y` &lt;br /&gt;
      by (simp add: cuenta_inserta) &lt;br /&gt;
    also have &amp;quot;… = Suc (cuenta xs y)&amp;quot; using HI by simp&lt;br /&gt;
    also have &amp;quot;… = cuenta (x # xs) y&amp;quot; using `x = y` by simp&lt;br /&gt;
    finally show &amp;quot;cuenta (ordena (x # xs)) y = cuenta (x # xs) y&amp;quot; by simp&lt;br /&gt;
  next&lt;br /&gt;
    assume &amp;quot;x ≠ y&amp;quot;&lt;br /&gt;
    have &amp;quot;cuenta (ordena (x # xs)) y = cuenta (inserta x (ordena xs)) y&amp;quot; &lt;br /&gt;
      by simp&lt;br /&gt;
    also have &amp;quot;… = cuenta (ordena xs) y&amp;quot; using `x ≠ y` &lt;br /&gt;
      by (simp add: cuenta_inserta) &lt;br /&gt;
    also have &amp;quot;… = cuenta xs y&amp;quot; using HI by simp&lt;br /&gt;
    also have &amp;quot;… = cuenta (x # xs) y&amp;quot; using `x ≠ y` by simp&lt;br /&gt;
    finally show &amp;quot;cuenta (ordena (x # xs)) y = cuenta (x # xs) y&amp;quot; &lt;br /&gt;
      by simp&lt;br /&gt;
  qed&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>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2016/index.php?title=Tema_6b:_Verificaci%C3%B3n_de_la_ordenaci%C3%B3n_por_mezcla&amp;diff=1211</id>
		<title>Tema 6b: Verificación de la ordenación por mezcla</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2016/index.php?title=Tema_6b:_Verificaci%C3%B3n_de_la_ordenaci%C3%B3n_por_mezcla&amp;diff=1211"/>
		<updated>2016-12-22T11:36:10Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: Protegió «Tema 6b: Verificación de la ordenación por mezcla» ([edit=sysop] (indefinido) [move=sysop] (indefinido))&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
chapter {* T6b: Verificación de la ordenación por mezcla *}&lt;br /&gt;
&lt;br /&gt;
theory T6b_Verificacion_de_la_ordenacion_por_mezcla_sol&lt;br /&gt;
imports Main&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  En esta relación de ejercicios se define el algoritmo de ordenación de&lt;br /&gt;
  listas por mezcla y se demuestra que es correcto.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
section {* Ordenación de listas *}&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. Definir la función&lt;br /&gt;
     menor :: int ⇒ int list ⇒ bool&lt;br /&gt;
  tal que (menor a xs) se verifica si a es menor o igual que todos los&lt;br /&gt;
  elementos de xs.Por ejemplo,  &lt;br /&gt;
     menor 2 [3,2,5] = True&lt;br /&gt;
     menor 2 [3,0,5] = False&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun menor :: &amp;quot;int ⇒ int list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;menor a []     = True&amp;quot;&lt;br /&gt;
| &amp;quot;menor a (x#xs) = (a ≤ x ∧ menor a xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;menor 2 [3,2,5] = True&amp;quot;&lt;br /&gt;
value &amp;quot;menor 2 [3,0,5] = False&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Definir la función&lt;br /&gt;
     ordenada :: int list ⇒ bool&lt;br /&gt;
  tal que (ordenada xs) se verifica si xs es una lista ordenada de&lt;br /&gt;
  manera creciente. Por ejemplo,  &lt;br /&gt;
     ordenada [2,3,3,5] = True &lt;br /&gt;
     ordenada [2,4,3,5] = False &lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun ordenada :: &amp;quot;int list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;ordenada []     = True&amp;quot;&lt;br /&gt;
| &amp;quot;ordenada (x#xs) = (menor x xs &amp;amp; ordenada xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;ordenada [2,3,3,5] = True&amp;quot; &lt;br /&gt;
value &amp;quot;ordenada [2,4,3,5] = False&amp;quot; &lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. Definir la función&lt;br /&gt;
     cuenta :: int list =&amp;gt; int =&amp;gt; nat&lt;br /&gt;
  tal que (cuenta xs y) es el número de veces que aparece el elemento y&lt;br /&gt;
  en la lista xs. Por ejemplo, &lt;br /&gt;
     cuenta [1,3,4,3,5] 3 = 2&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun cuenta :: &amp;quot;int list =&amp;gt; int =&amp;gt; nat&amp;quot; where&lt;br /&gt;
  &amp;quot;cuenta []     y = 0&amp;quot;&lt;br /&gt;
| &amp;quot;cuenta (x#xs) y = (if x=y &lt;br /&gt;
                      then Suc(cuenta xs y) &lt;br /&gt;
                      else cuenta xs y)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;cuenta [1,3,4,3,5] 3 = 2&amp;quot;&lt;br /&gt;
&lt;br /&gt;
section {* Ordenación por mezcla *}&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Definir la función&lt;br /&gt;
     mezcla :: int list ⇒ int list ⇒ int list&lt;br /&gt;
  tal que (mezcla xs ys) es la lista obtenida mezclando las listas&lt;br /&gt;
  ordenadas xs e ys. Por ejemplo, &lt;br /&gt;
     mezcla [1,2,5] [3,5,7] = [1,2,3,5,5,7]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun mezcla :: &amp;quot;int list ⇒ int list ⇒ int list&amp;quot; where&lt;br /&gt;
  &amp;quot;mezcla [] ys = ys&amp;quot; &lt;br /&gt;
| &amp;quot;mezcla xs [] = xs&amp;quot; &lt;br /&gt;
| &amp;quot;mezcla (x # xs) (y # ys) = (if x ≤ y&lt;br /&gt;
                               then x # mezcla xs (y # ys)&lt;br /&gt;
                               else y # mezcla (x # xs) ys)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;mezcla [1,2,5] [3,5,7] = [1,2,3,5,5,7]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. Definir la función&lt;br /&gt;
     ordenaM :: int list ⇒ int list&lt;br /&gt;
  tal que (ordenaM xs) es la lista obtenida ordenando la lista xs&lt;br /&gt;
  mediante mezclas; es decir, la divide en dos mitades, las ordena y las&lt;br /&gt;
  mezcla. Por ejemplo, &lt;br /&gt;
     ordenaM [3,2,5,2] = [2,2,3,5]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun ordenaM :: &amp;quot;int list ⇒ int list&amp;quot; where&lt;br /&gt;
  &amp;quot;ordenaM []  = []&amp;quot; &lt;br /&gt;
| &amp;quot;ordenaM [x] = [x]&amp;quot; &lt;br /&gt;
| &amp;quot;ordenaM xs = &lt;br /&gt;
     (let mitad = length xs div 2 in&lt;br /&gt;
      mezcla (ordenaM (take mitad xs)) &lt;br /&gt;
             (ordenaM (drop mitad xs)))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;ordenaM [3,2,5,2] = [2,2,3,5]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 6. Sea x ≤ y. Si y es menor o igual que todos los elementos&lt;br /&gt;
  de xs, entonces x es menor o igual que todos los elementos de xs&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma menor_menor: &lt;br /&gt;
  &amp;quot;x ≤ y ⟹ menor y xs ⟶ menor x xs&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 7. Demostrar que el número de veces que aparece n en la&lt;br /&gt;
  mezcla de dos listas es igual a la suma del número de apariciones en&lt;br /&gt;
  cada una de las listas&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma cuenta_mezcla: &lt;br /&gt;
  &amp;quot;cuenta (mezcla xs ys) n = cuenta xs n + cuenta ys n&amp;quot;&lt;br /&gt;
by (induct xs ys rule: mezcla.induct) auto&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 8. Demostrar que si x es menor que todos los elementos de&lt;br /&gt;
  ys y de zs, entonces también lo es de su mezcla.&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma menor_mezcla:&lt;br /&gt;
  assumes &amp;quot;menor x ys&amp;quot; &lt;br /&gt;
          &amp;quot;menor x zs&amp;quot; &lt;br /&gt;
  shows   &amp;quot;menor x (mezcla ys zs)&amp;quot;&lt;br /&gt;
using assms &lt;br /&gt;
by (induct ys zs rule: mezcla.induct) simp_all&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 9. Demostrar que la mezcla de dos listas ordenadas es una&lt;br /&gt;
  lista ordenada. &lt;br /&gt;
  Indicación: Usar los siguientes lemas&lt;br /&gt;
  · linorder_not_le: (¬ x ≤ y) = (y &amp;lt; x)&lt;br /&gt;
  · order_less_le:   (x &amp;lt; y) = (x ≤ y ∧ x ≠ y)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ordenada_mezcla:&lt;br /&gt;
  assumes &amp;quot;ordenada xs&amp;quot; &lt;br /&gt;
          &amp;quot;ordenada ys&amp;quot; &lt;br /&gt;
  shows   &amp;quot;ordenada (mezcla xs ys)&amp;quot;&lt;br /&gt;
using assms &lt;br /&gt;
by (induct xs ys rule: mezcla.induct) &lt;br /&gt;
   (auto simp add: menor_mezcla&lt;br /&gt;
                   menor_menor&lt;br /&gt;
                   linorder_not_le &lt;br /&gt;
                   order_less_le)&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 10. Demostrar que si x es mayor que 1, entonces el mínimo de&lt;br /&gt;
  x y su mitad es menor que x.&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma min_mitad: &lt;br /&gt;
  &amp;quot;1 &amp;lt; x ⟹ min x (x div 2::int) &amp;lt; x&amp;quot;&lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 11. Demostrar que si x es mayor que 1, entonces x menos su&lt;br /&gt;
  mitad es menor que x. &lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma menos_mitad: &lt;br /&gt;
  &amp;quot;1 &amp;lt; x ⟹ x - x div (2::int) &amp;lt; x&amp;quot;&lt;br /&gt;
by arith&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 11. Demostrar que (ordenaM xs) está ordenada.&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
theorem ordenada_ordenaM:&lt;br /&gt;
  &amp;quot;ordenada (ordenaM xs)&amp;quot;&lt;br /&gt;
by (induct xs rule: ordenaM.induct) &lt;br /&gt;
   (auto simp add: ordenada_mezcla)&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 12. Demostrar que el número de apariciones de un elemento en&lt;br /&gt;
  la concatenación de dos listas es la suma del número de apariciones en&lt;br /&gt;
  cada una.&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma cuenta_conc: &lt;br /&gt;
  &amp;quot;cuenta (xs @ ys) x = cuenta xs x + cuenta ys x&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 13. Demostrar que las listas xs y (ordenaM xs) tienen los&lt;br /&gt;
  mismos elementos.&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
theorem cuenta_ordenaM: &lt;br /&gt;
  &amp;quot;cuenta (ordenaM xs) x = cuenta xs x&amp;quot;&lt;br /&gt;
by (induct xs rule: ordenaM.induct) &lt;br /&gt;
   (auto simp add: cuenta_mezcla &lt;br /&gt;
                   cuenta_conc [symmetric])&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>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2016/index.php?title=Tema_7:_Caso_de_estudio:_Compilaci%C3%B3n_de_expresiones&amp;diff=1210</id>
		<title>Tema 7: Caso de estudio: Compilación de expresiones</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2016/index.php?title=Tema_7:_Caso_de_estudio:_Compilaci%C3%B3n_de_expresiones&amp;diff=1210"/>
		<updated>2016-12-22T11:35:58Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: Protegió «Tema 7: Caso de estudio: Compilación de expresiones» ([edit=sysop] (indefinido) [move=sysop] (indefinido))&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
chapter {* Tema 7: Caso de estudio: Compilación de expresiones *}&lt;br /&gt;
&lt;br /&gt;
theory T7_Caso_de_estudio_Compilacion_de_expresiones&lt;br /&gt;
&lt;br /&gt;
imports Main&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
declare [[names_short]]&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  El objetivo de este tema es contruir un compilador de expresiones&lt;br /&gt;
  genéricas (construidas con variables, constantes y operaciones&lt;br /&gt;
  binarias) a una máquina de pila y demostrar su corrección.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
section {* Las expresiones y el intérprete *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Definición. Las expresiones son las constantes, las variables&lt;br /&gt;
  (representadas por números naturales) y las aplicaciones de operadores&lt;br /&gt;
  binarios a dos expresiones. &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
type_synonym &amp;#039;v binop = &amp;quot;&amp;#039;v ⇒ &amp;#039;v ⇒ &amp;#039;v&amp;quot;&lt;br /&gt;
&lt;br /&gt;
datatype &amp;#039;v expr = &lt;br /&gt;
  Const &amp;#039;v &lt;br /&gt;
| Var nat &lt;br /&gt;
| App &amp;quot;&amp;#039;v binop&amp;quot; &amp;quot;&amp;#039;v expr&amp;quot; &amp;quot;&amp;#039;v expr&amp;quot; &lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Definición. [Intérprete] &lt;br /&gt;
  La función &amp;quot;valor&amp;quot; toma como argumentos una expresión y un entorno&lt;br /&gt;
  (i.e. una aplicación de las variables en elementos del lenguaje) y&lt;br /&gt;
  devuelve el valor de la expresión en el entorno.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
fun valor :: &amp;quot;&amp;#039;v expr ⇒ (nat ⇒ &amp;#039;v) ⇒ &amp;#039;v&amp;quot; where&lt;br /&gt;
  &amp;quot;valor (Const b)     ent = b&amp;quot;&lt;br /&gt;
| &amp;quot;valor (Var x)       ent = ent x&amp;quot;&lt;br /&gt;
| &amp;quot;valor (App f e1 e2) ent = (f (valor e1 ent) (valor e2 ent))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Ejemplo. A continuación mostramos algunos ejemplos de evaluación con&lt;br /&gt;
  el intérprete. &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &lt;br /&gt;
  &amp;quot;valor (Const 3) id = 3 ∧&lt;br /&gt;
   valor (Var 2) id = 2 ∧&lt;br /&gt;
   valor (Var 2) (λx. x+1) = 3 ∧ &lt;br /&gt;
   valor (App (op +) (Const 3) (Var 2)) (λx. x+1) = 6 ∧&lt;br /&gt;
   valor (App (op +) (Const 3) (Var 2)) (λx. x+4) = 9&amp;quot; &lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
section {* La máquina de pila *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Nota. La máquina de pila tiene tres clases de intrucciones:&lt;br /&gt;
  · cargar en la pila una constante,&lt;br /&gt;
  · cargar en la pila el contenido de una dirección y&lt;br /&gt;
  · aplicar un operador binario a los dos elementos superiores de la pila.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
datatype &amp;#039;v instr = &lt;br /&gt;
  IConst &amp;#039;v &lt;br /&gt;
| ILoad nat &lt;br /&gt;
| IApp &amp;quot;&amp;#039;v binop&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Definición. [Ejecución]&lt;br /&gt;
  La ejecución de la máquina de pila se modeliza mediante la función &lt;br /&gt;
  &amp;quot;ejec&amp;quot; que toma una lista de intrucciones, una memoria (representada &lt;br /&gt;
  como una función de las direcciones a los valores, análogamente a los &lt;br /&gt;
  entornos) y una pila (representada como una lista) y devuelve la pila&lt;br /&gt;
  al final de la ejecución.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
fun ejec :: &amp;quot;&amp;#039;v instr list ⇒ (nat ⇒ &amp;#039;v) ⇒ &amp;#039;v list ⇒ &amp;#039;v list&amp;quot; where&lt;br /&gt;
  &amp;quot;ejec []     ent vs = vs&amp;quot;&lt;br /&gt;
| &amp;quot;ejec (i#is) ent vs = &lt;br /&gt;
     (case i of&lt;br /&gt;
        IConst v ⇒ ejec is ent (v#vs)&lt;br /&gt;
      | ILoad x  ⇒ ejec is ent ((ent x)#vs)&lt;br /&gt;
      | IApp f   ⇒ ejec is ent ((f (hd vs) (hd (tl vs)))#(tl(tl vs))))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  A continuación se muestran ejemplos de ejecución.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma&lt;br /&gt;
  &amp;quot;ejec [IConst 3]          id                     [7] = [3,7] ∧&lt;br /&gt;
   ejec [ILoad 2, IConst 3] id                     [7] = [3,2,7] ∧&lt;br /&gt;
   ejec [ILoad 2, IConst 3] (λx. x+4)              [7] = [3,6,7] ∧&lt;br /&gt;
   ejec [ILoad 2, IConst 3, IApp (op +)] (λx. x+4) [7] = [9,7]&amp;quot;&lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
section {* El compilador *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Definición. El compilador &amp;quot;comp&amp;quot; traduce una expresión en una lista de&lt;br /&gt;
  instrucciones. &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
fun comp :: &amp;quot;&amp;#039;v expr ⇒ &amp;#039;v instr list&amp;quot; where&lt;br /&gt;
  &amp;quot;comp (Const v)     = [IConst v]&amp;quot;&lt;br /&gt;
| &amp;quot;comp (Var x)       = [ILoad x]&amp;quot;&lt;br /&gt;
| &amp;quot;comp (App f e1 e2) = (comp e2) @ (comp e1) @ [IApp f]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  A continuación se muestran ejemplos de compilación.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma&lt;br /&gt;
  &amp;quot;comp (Const 3)                      = [IConst 3] ∧&lt;br /&gt;
   comp (Var 2)                        = [ILoad 2] ∧&lt;br /&gt;
   comp (App (op +) (Const 3) (Var 2)) = [ILoad 2, IConst 3, IApp (op +)]&amp;quot;&lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
section {* Corrección del compilador *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Para demostrar que el compilador es correcto, probamos que el&lt;br /&gt;
  resultado de compilar una expresión y a continuación ejecutarla es lo&lt;br /&gt;
  mismo que interpretarla; es decir, &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
theorem &amp;quot;ejec (comp e) ent [] = [valor e ent]&amp;quot; &lt;br /&gt;
apply (induct e)&lt;br /&gt;
apply auto&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  El teorema anterior no puede demostrarse por inducción en e. Para&lt;br /&gt;
  demostrarlo, lo generalizamos a&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
theorem &amp;quot;∀vs. ejec (comp e) ent vs = (valor e ent)#vs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  En la demostración del teorema anterior usaremos el siguiente lema.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma ejec_append:&lt;br /&gt;
  &amp;quot;∀ vs. ejec (xs@ys) ent vs = ejec ys ent (ejec xs ent vs)&amp;quot; (is &amp;quot;?P xs&amp;quot;)&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;?P []&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume &amp;quot;?P xs&amp;quot;&lt;br /&gt;
  thus &amp;quot;?P (a#xs)&amp;quot; by (cases &amp;quot;a&amp;quot;, auto)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración detallada es&amp;quot; &lt;br /&gt;
lemma ejec_append_1:&lt;br /&gt;
  &amp;quot;∀ vs. ejec (xs@ys) ent vs = ejec ys ent (ejec xs ent vs)&amp;quot; (is &amp;quot;?P xs&amp;quot;)&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;?P []&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume HI: &amp;quot;?P xs&amp;quot;&lt;br /&gt;
  thus &amp;quot;?P (a#xs)&amp;quot;&lt;br /&gt;
  proof (cases &amp;quot;a&amp;quot;)&lt;br /&gt;
    case IConst thus ?thesis using HI by simp&lt;br /&gt;
  next&lt;br /&gt;
    case ILoad thus ?thesis using HI by simp&lt;br /&gt;
  next&lt;br /&gt;
    case IApp thus ?thesis using HI by simp&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Una demostración más detallada del lema es la siguiente:&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma ejec_append_2:&lt;br /&gt;
  &amp;quot;∀vs. ejec (xs@ys) ent vs = ejec ys ent (ejec xs ent vs)&amp;quot; (is &amp;quot;?P xs&amp;quot;)&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;?P []&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume HI: &amp;quot;?P xs&amp;quot;&lt;br /&gt;
  thus &amp;quot;?P (a#xs)&amp;quot;&lt;br /&gt;
  proof (cases &amp;quot;a&amp;quot;)&lt;br /&gt;
    fix v assume C1: &amp;quot;a=IConst v&amp;quot;&lt;br /&gt;
    show &amp;quot; ∀vs. ejec ((a#xs)@ys) ent vs = ejec ys ent (ejec (a#xs) ent vs)&amp;quot;&lt;br /&gt;
    proof&lt;br /&gt;
      fix vs&lt;br /&gt;
      have &amp;quot;ejec ((a#xs)@ys) ent vs = ejec (((IConst v)#xs)@ys) ent vs&amp;quot;&lt;br /&gt;
        using C1 by simp&lt;br /&gt;
      also have &amp;quot;… = ejec (xs@ys) ent (v#vs)&amp;quot; by simp&lt;br /&gt;
      also have &amp;quot;… = ejec ys ent (ejec xs ent (v#vs))&amp;quot; using HI by simp&lt;br /&gt;
      also have &amp;quot;… = ejec ys ent (ejec ((IConst v)#xs) ent vs)&amp;quot; by simp&lt;br /&gt;
      also have &amp;quot;… = ejec ys ent (ejec (a#xs) ent vs)&amp;quot; using C1 by simp&lt;br /&gt;
      finally show &amp;quot;ejec ((a#xs)@ys) ent vs = &lt;br /&gt;
                    ejec ys ent (ejec (a#xs) ent vs)&amp;quot; .&lt;br /&gt;
    qed&lt;br /&gt;
  next&lt;br /&gt;
    fix n assume C2: &amp;quot;a=ILoad n&amp;quot;&lt;br /&gt;
    show &amp;quot; ∀vs. ejec ((a#xs)@ys) ent vs = ejec ys ent (ejec (a#xs) ent vs)&amp;quot;&lt;br /&gt;
    proof&lt;br /&gt;
      fix vs&lt;br /&gt;
      have &amp;quot;ejec ((a#xs)@ys) ent vs = ejec (((ILoad n)#xs)@ys) ent vs&amp;quot;&lt;br /&gt;
        using C2 by simp&lt;br /&gt;
      also have &amp;quot;… = ejec (xs@ys) ent ((ent n)#vs)&amp;quot; by simp&lt;br /&gt;
      also have &amp;quot;… = ejec ys ent (ejec xs ent ((ent n)#vs))&amp;quot; using HI by simp&lt;br /&gt;
      also have &amp;quot;… = ejec ys ent (ejec ((ILoad n)#xs) ent vs)&amp;quot; by simp&lt;br /&gt;
      also have &amp;quot;… = ejec ys ent (ejec (a#xs) ent vs)&amp;quot; using C2 by simp&lt;br /&gt;
      finally show &amp;quot;ejec ((a#xs)@ys) ent vs = &lt;br /&gt;
                    ejec ys ent (ejec (a#xs) ent vs)&amp;quot; .&lt;br /&gt;
    qed&lt;br /&gt;
  next&lt;br /&gt;
    fix f assume C3: &amp;quot;a=IApp f&amp;quot;&lt;br /&gt;
    show &amp;quot;∀vs. ejec ((a#xs)@ys) ent vs = ejec ys ent (ejec (a#xs) ent vs)&amp;quot;&lt;br /&gt;
    proof&lt;br /&gt;
      fix vs&lt;br /&gt;
      have &amp;quot;ejec ((a#xs)@ys) ent vs = ejec (((IApp f)#xs)@ys) ent vs&amp;quot;&lt;br /&gt;
        using C3 by simp&lt;br /&gt;
      also have &amp;quot;… = ejec (xs@ys) ent ((f (hd vs) (hd (tl vs)))#(tl(tl vs)))&amp;quot; &lt;br /&gt;
        by simp&lt;br /&gt;
      also have &amp;quot;… = ejec ys &lt;br /&gt;
                          ent &lt;br /&gt;
                          (ejec xs ent ((f (hd vs) (hd (tl vs)))#(tl(tl vs))))&amp;quot; &lt;br /&gt;
        using HI by simp&lt;br /&gt;
      also have &amp;quot;… = ejec ys ent (ejec ((IApp f)#xs) ent vs)&amp;quot; by simp&lt;br /&gt;
      also have &amp;quot;… = ejec ys ent (ejec (a#xs) ent vs)&amp;quot; using C3 by simp&lt;br /&gt;
      finally show &amp;quot;ejec ((a#xs)@ys) ent vs = &lt;br /&gt;
                    ejec ys ent (ejec (a#xs) ent vs)&amp;quot; .&lt;br /&gt;
    qed&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  La demostración automática del teorema es&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
theorem &amp;quot;∀vs. ejec (comp e) ent vs = (valor e ent)#vs&amp;quot;&lt;br /&gt;
by (induct e) (auto simp add: ejec_append)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  La demostración estructurada del teorema es&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
theorem &amp;quot;∀vs. ejec (comp e) ent vs = (valor e ent)#vs&amp;quot;&lt;br /&gt;
proof (induct e)&lt;br /&gt;
  fix v&lt;br /&gt;
  show &amp;quot;∀vs. ejec (comp (Const v)) ent vs = (valor (Const v) ent)#vs&amp;quot; &lt;br /&gt;
    by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x&lt;br /&gt;
  show &amp;quot;∀vs. ejec (comp (Var x)) ent vs = (valor (Var x) ent) # vs&amp;quot; &lt;br /&gt;
    by simp&lt;br /&gt;
next&lt;br /&gt;
  fix f e1 e2&lt;br /&gt;
  assume HI1: &amp;quot;∀vs. ejec (comp e1) ent vs = (valor e1 ent) # vs&amp;quot;&lt;br /&gt;
    and HI2: &amp;quot;∀vs. ejec (comp e2) ent vs = (valor e2 ent) # vs&amp;quot;&lt;br /&gt;
  show &amp;quot;∀vs. ejec (comp (App f e1 e2)) ent vs = &lt;br /&gt;
             (valor (App f e1 e2) ent) # vs&amp;quot;&lt;br /&gt;
  proof&lt;br /&gt;
    fix vs&lt;br /&gt;
    have &amp;quot;ejec (comp (App f e1 e2)) ent vs&lt;br /&gt;
          = ejec ((comp e2) @ (comp e1) @ [IApp f]) ent vs&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;… = ejec ((comp e1) @ [IApp f]) ent (ejec (comp e2) ent vs)&amp;quot;&lt;br /&gt;
      using ejec_append by blast&lt;br /&gt;
    also have &amp;quot;… = ejec [IApp f] &lt;br /&gt;
                         ent &lt;br /&gt;
                         (ejec (comp e1) ent (ejec (comp e2) ent vs))&amp;quot; &lt;br /&gt;
      using ejec_append by blast&lt;br /&gt;
    also have &amp;quot;… =  ejec [IApp f] ent (ejec (comp e1) ent ((valor e2 ent)#vs))&amp;quot;&lt;br /&gt;
      using HI2 by simp&lt;br /&gt;
    also have &amp;quot;… = ejec [IApp f] ent ((valor e1 ent)#((valor e2 ent)#vs))&amp;quot;&lt;br /&gt;
      using HI1 by simp&lt;br /&gt;
    also have &amp;quot;… = (f (valor e1 ent) (valor e2 ent))#vs&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;… = (valor (App f e1 e2) ent) # vs&amp;quot; by simp&lt;br /&gt;
    finally &lt;br /&gt;
    show &amp;quot;ejec (comp (App f e1 e2)) ent vs = (valor (App f e1 e2) ent) # vs&amp;quot; &lt;br /&gt;
      by blast&lt;br /&gt;
  qed&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>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2016/index.php?title=Tema_7:_Caso_de_estudio:_Compilaci%C3%B3n_de_expresiones&amp;diff=1209</id>
		<title>Tema 7: Caso de estudio: Compilación de expresiones</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2016/index.php?title=Tema_7:_Caso_de_estudio:_Compilaci%C3%B3n_de_expresiones&amp;diff=1209"/>
		<updated>2016-12-22T11:35:49Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: Página creada con &amp;#039;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt; chapter {* Tema 7: Caso de estudio: Compilación de expresiones *}  theory T7_Caso_de_estudio_Compilacion_de_expresiones  imports Main begin  declare [[name...&amp;#039;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
chapter {* Tema 7: Caso de estudio: Compilación de expresiones *}&lt;br /&gt;
&lt;br /&gt;
theory T7_Caso_de_estudio_Compilacion_de_expresiones&lt;br /&gt;
&lt;br /&gt;
imports Main&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
declare [[names_short]]&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  El objetivo de este tema es contruir un compilador de expresiones&lt;br /&gt;
  genéricas (construidas con variables, constantes y operaciones&lt;br /&gt;
  binarias) a una máquina de pila y demostrar su corrección.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
section {* Las expresiones y el intérprete *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Definición. Las expresiones son las constantes, las variables&lt;br /&gt;
  (representadas por números naturales) y las aplicaciones de operadores&lt;br /&gt;
  binarios a dos expresiones. &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
type_synonym &amp;#039;v binop = &amp;quot;&amp;#039;v ⇒ &amp;#039;v ⇒ &amp;#039;v&amp;quot;&lt;br /&gt;
&lt;br /&gt;
datatype &amp;#039;v expr = &lt;br /&gt;
  Const &amp;#039;v &lt;br /&gt;
| Var nat &lt;br /&gt;
| App &amp;quot;&amp;#039;v binop&amp;quot; &amp;quot;&amp;#039;v expr&amp;quot; &amp;quot;&amp;#039;v expr&amp;quot; &lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Definición. [Intérprete] &lt;br /&gt;
  La función &amp;quot;valor&amp;quot; toma como argumentos una expresión y un entorno&lt;br /&gt;
  (i.e. una aplicación de las variables en elementos del lenguaje) y&lt;br /&gt;
  devuelve el valor de la expresión en el entorno.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
fun valor :: &amp;quot;&amp;#039;v expr ⇒ (nat ⇒ &amp;#039;v) ⇒ &amp;#039;v&amp;quot; where&lt;br /&gt;
  &amp;quot;valor (Const b)     ent = b&amp;quot;&lt;br /&gt;
| &amp;quot;valor (Var x)       ent = ent x&amp;quot;&lt;br /&gt;
| &amp;quot;valor (App f e1 e2) ent = (f (valor e1 ent) (valor e2 ent))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Ejemplo. A continuación mostramos algunos ejemplos de evaluación con&lt;br /&gt;
  el intérprete. &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &lt;br /&gt;
  &amp;quot;valor (Const 3) id = 3 ∧&lt;br /&gt;
   valor (Var 2) id = 2 ∧&lt;br /&gt;
   valor (Var 2) (λx. x+1) = 3 ∧ &lt;br /&gt;
   valor (App (op +) (Const 3) (Var 2)) (λx. x+1) = 6 ∧&lt;br /&gt;
   valor (App (op +) (Const 3) (Var 2)) (λx. x+4) = 9&amp;quot; &lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
section {* La máquina de pila *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Nota. La máquina de pila tiene tres clases de intrucciones:&lt;br /&gt;
  · cargar en la pila una constante,&lt;br /&gt;
  · cargar en la pila el contenido de una dirección y&lt;br /&gt;
  · aplicar un operador binario a los dos elementos superiores de la pila.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
datatype &amp;#039;v instr = &lt;br /&gt;
  IConst &amp;#039;v &lt;br /&gt;
| ILoad nat &lt;br /&gt;
| IApp &amp;quot;&amp;#039;v binop&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Definición. [Ejecución]&lt;br /&gt;
  La ejecución de la máquina de pila se modeliza mediante la función &lt;br /&gt;
  &amp;quot;ejec&amp;quot; que toma una lista de intrucciones, una memoria (representada &lt;br /&gt;
  como una función de las direcciones a los valores, análogamente a los &lt;br /&gt;
  entornos) y una pila (representada como una lista) y devuelve la pila&lt;br /&gt;
  al final de la ejecución.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
fun ejec :: &amp;quot;&amp;#039;v instr list ⇒ (nat ⇒ &amp;#039;v) ⇒ &amp;#039;v list ⇒ &amp;#039;v list&amp;quot; where&lt;br /&gt;
  &amp;quot;ejec []     ent vs = vs&amp;quot;&lt;br /&gt;
| &amp;quot;ejec (i#is) ent vs = &lt;br /&gt;
     (case i of&lt;br /&gt;
        IConst v ⇒ ejec is ent (v#vs)&lt;br /&gt;
      | ILoad x  ⇒ ejec is ent ((ent x)#vs)&lt;br /&gt;
      | IApp f   ⇒ ejec is ent ((f (hd vs) (hd (tl vs)))#(tl(tl vs))))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  A continuación se muestran ejemplos de ejecución.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma&lt;br /&gt;
  &amp;quot;ejec [IConst 3]          id                     [7] = [3,7] ∧&lt;br /&gt;
   ejec [ILoad 2, IConst 3] id                     [7] = [3,2,7] ∧&lt;br /&gt;
   ejec [ILoad 2, IConst 3] (λx. x+4)              [7] = [3,6,7] ∧&lt;br /&gt;
   ejec [ILoad 2, IConst 3, IApp (op +)] (λx. x+4) [7] = [9,7]&amp;quot;&lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
section {* El compilador *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Definición. El compilador &amp;quot;comp&amp;quot; traduce una expresión en una lista de&lt;br /&gt;
  instrucciones. &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
fun comp :: &amp;quot;&amp;#039;v expr ⇒ &amp;#039;v instr list&amp;quot; where&lt;br /&gt;
  &amp;quot;comp (Const v)     = [IConst v]&amp;quot;&lt;br /&gt;
| &amp;quot;comp (Var x)       = [ILoad x]&amp;quot;&lt;br /&gt;
| &amp;quot;comp (App f e1 e2) = (comp e2) @ (comp e1) @ [IApp f]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  A continuación se muestran ejemplos de compilación.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma&lt;br /&gt;
  &amp;quot;comp (Const 3)                      = [IConst 3] ∧&lt;br /&gt;
   comp (Var 2)                        = [ILoad 2] ∧&lt;br /&gt;
   comp (App (op +) (Const 3) (Var 2)) = [ILoad 2, IConst 3, IApp (op +)]&amp;quot;&lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
section {* Corrección del compilador *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Para demostrar que el compilador es correcto, probamos que el&lt;br /&gt;
  resultado de compilar una expresión y a continuación ejecutarla es lo&lt;br /&gt;
  mismo que interpretarla; es decir, &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
theorem &amp;quot;ejec (comp e) ent [] = [valor e ent]&amp;quot; &lt;br /&gt;
apply (induct e)&lt;br /&gt;
apply auto&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  El teorema anterior no puede demostrarse por inducción en e. Para&lt;br /&gt;
  demostrarlo, lo generalizamos a&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
theorem &amp;quot;∀vs. ejec (comp e) ent vs = (valor e ent)#vs&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  En la demostración del teorema anterior usaremos el siguiente lema.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma ejec_append:&lt;br /&gt;
  &amp;quot;∀ vs. ejec (xs@ys) ent vs = ejec ys ent (ejec xs ent vs)&amp;quot; (is &amp;quot;?P xs&amp;quot;)&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;?P []&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume &amp;quot;?P xs&amp;quot;&lt;br /&gt;
  thus &amp;quot;?P (a#xs)&amp;quot; by (cases &amp;quot;a&amp;quot;, auto)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración detallada es&amp;quot; &lt;br /&gt;
lemma ejec_append_1:&lt;br /&gt;
  &amp;quot;∀ vs. ejec (xs@ys) ent vs = ejec ys ent (ejec xs ent vs)&amp;quot; (is &amp;quot;?P xs&amp;quot;)&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;?P []&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume HI: &amp;quot;?P xs&amp;quot;&lt;br /&gt;
  thus &amp;quot;?P (a#xs)&amp;quot;&lt;br /&gt;
  proof (cases &amp;quot;a&amp;quot;)&lt;br /&gt;
    case IConst thus ?thesis using HI by simp&lt;br /&gt;
  next&lt;br /&gt;
    case ILoad thus ?thesis using HI by simp&lt;br /&gt;
  next&lt;br /&gt;
    case IApp thus ?thesis using HI by simp&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Una demostración más detallada del lema es la siguiente:&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma ejec_append_2:&lt;br /&gt;
  &amp;quot;∀vs. ejec (xs@ys) ent vs = ejec ys ent (ejec xs ent vs)&amp;quot; (is &amp;quot;?P xs&amp;quot;)&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;?P []&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume HI: &amp;quot;?P xs&amp;quot;&lt;br /&gt;
  thus &amp;quot;?P (a#xs)&amp;quot;&lt;br /&gt;
  proof (cases &amp;quot;a&amp;quot;)&lt;br /&gt;
    fix v assume C1: &amp;quot;a=IConst v&amp;quot;&lt;br /&gt;
    show &amp;quot; ∀vs. ejec ((a#xs)@ys) ent vs = ejec ys ent (ejec (a#xs) ent vs)&amp;quot;&lt;br /&gt;
    proof&lt;br /&gt;
      fix vs&lt;br /&gt;
      have &amp;quot;ejec ((a#xs)@ys) ent vs = ejec (((IConst v)#xs)@ys) ent vs&amp;quot;&lt;br /&gt;
        using C1 by simp&lt;br /&gt;
      also have &amp;quot;… = ejec (xs@ys) ent (v#vs)&amp;quot; by simp&lt;br /&gt;
      also have &amp;quot;… = ejec ys ent (ejec xs ent (v#vs))&amp;quot; using HI by simp&lt;br /&gt;
      also have &amp;quot;… = ejec ys ent (ejec ((IConst v)#xs) ent vs)&amp;quot; by simp&lt;br /&gt;
      also have &amp;quot;… = ejec ys ent (ejec (a#xs) ent vs)&amp;quot; using C1 by simp&lt;br /&gt;
      finally show &amp;quot;ejec ((a#xs)@ys) ent vs = &lt;br /&gt;
                    ejec ys ent (ejec (a#xs) ent vs)&amp;quot; .&lt;br /&gt;
    qed&lt;br /&gt;
  next&lt;br /&gt;
    fix n assume C2: &amp;quot;a=ILoad n&amp;quot;&lt;br /&gt;
    show &amp;quot; ∀vs. ejec ((a#xs)@ys) ent vs = ejec ys ent (ejec (a#xs) ent vs)&amp;quot;&lt;br /&gt;
    proof&lt;br /&gt;
      fix vs&lt;br /&gt;
      have &amp;quot;ejec ((a#xs)@ys) ent vs = ejec (((ILoad n)#xs)@ys) ent vs&amp;quot;&lt;br /&gt;
        using C2 by simp&lt;br /&gt;
      also have &amp;quot;… = ejec (xs@ys) ent ((ent n)#vs)&amp;quot; by simp&lt;br /&gt;
      also have &amp;quot;… = ejec ys ent (ejec xs ent ((ent n)#vs))&amp;quot; using HI by simp&lt;br /&gt;
      also have &amp;quot;… = ejec ys ent (ejec ((ILoad n)#xs) ent vs)&amp;quot; by simp&lt;br /&gt;
      also have &amp;quot;… = ejec ys ent (ejec (a#xs) ent vs)&amp;quot; using C2 by simp&lt;br /&gt;
      finally show &amp;quot;ejec ((a#xs)@ys) ent vs = &lt;br /&gt;
                    ejec ys ent (ejec (a#xs) ent vs)&amp;quot; .&lt;br /&gt;
    qed&lt;br /&gt;
  next&lt;br /&gt;
    fix f assume C3: &amp;quot;a=IApp f&amp;quot;&lt;br /&gt;
    show &amp;quot;∀vs. ejec ((a#xs)@ys) ent vs = ejec ys ent (ejec (a#xs) ent vs)&amp;quot;&lt;br /&gt;
    proof&lt;br /&gt;
      fix vs&lt;br /&gt;
      have &amp;quot;ejec ((a#xs)@ys) ent vs = ejec (((IApp f)#xs)@ys) ent vs&amp;quot;&lt;br /&gt;
        using C3 by simp&lt;br /&gt;
      also have &amp;quot;… = ejec (xs@ys) ent ((f (hd vs) (hd (tl vs)))#(tl(tl vs)))&amp;quot; &lt;br /&gt;
        by simp&lt;br /&gt;
      also have &amp;quot;… = ejec ys &lt;br /&gt;
                          ent &lt;br /&gt;
                          (ejec xs ent ((f (hd vs) (hd (tl vs)))#(tl(tl vs))))&amp;quot; &lt;br /&gt;
        using HI by simp&lt;br /&gt;
      also have &amp;quot;… = ejec ys ent (ejec ((IApp f)#xs) ent vs)&amp;quot; by simp&lt;br /&gt;
      also have &amp;quot;… = ejec ys ent (ejec (a#xs) ent vs)&amp;quot; using C3 by simp&lt;br /&gt;
      finally show &amp;quot;ejec ((a#xs)@ys) ent vs = &lt;br /&gt;
                    ejec ys ent (ejec (a#xs) ent vs)&amp;quot; .&lt;br /&gt;
    qed&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  La demostración automática del teorema es&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
theorem &amp;quot;∀vs. ejec (comp e) ent vs = (valor e ent)#vs&amp;quot;&lt;br /&gt;
by (induct e) (auto simp add: ejec_append)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  La demostración estructurada del teorema es&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
theorem &amp;quot;∀vs. ejec (comp e) ent vs = (valor e ent)#vs&amp;quot;&lt;br /&gt;
proof (induct e)&lt;br /&gt;
  fix v&lt;br /&gt;
  show &amp;quot;∀vs. ejec (comp (Const v)) ent vs = (valor (Const v) ent)#vs&amp;quot; &lt;br /&gt;
    by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x&lt;br /&gt;
  show &amp;quot;∀vs. ejec (comp (Var x)) ent vs = (valor (Var x) ent) # vs&amp;quot; &lt;br /&gt;
    by simp&lt;br /&gt;
next&lt;br /&gt;
  fix f e1 e2&lt;br /&gt;
  assume HI1: &amp;quot;∀vs. ejec (comp e1) ent vs = (valor e1 ent) # vs&amp;quot;&lt;br /&gt;
    and HI2: &amp;quot;∀vs. ejec (comp e2) ent vs = (valor e2 ent) # vs&amp;quot;&lt;br /&gt;
  show &amp;quot;∀vs. ejec (comp (App f e1 e2)) ent vs = &lt;br /&gt;
             (valor (App f e1 e2) ent) # vs&amp;quot;&lt;br /&gt;
  proof&lt;br /&gt;
    fix vs&lt;br /&gt;
    have &amp;quot;ejec (comp (App f e1 e2)) ent vs&lt;br /&gt;
          = ejec ((comp e2) @ (comp e1) @ [IApp f]) ent vs&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;… = ejec ((comp e1) @ [IApp f]) ent (ejec (comp e2) ent vs)&amp;quot;&lt;br /&gt;
      using ejec_append by blast&lt;br /&gt;
    also have &amp;quot;… = ejec [IApp f] &lt;br /&gt;
                         ent &lt;br /&gt;
                         (ejec (comp e1) ent (ejec (comp e2) ent vs))&amp;quot; &lt;br /&gt;
      using ejec_append by blast&lt;br /&gt;
    also have &amp;quot;… =  ejec [IApp f] ent (ejec (comp e1) ent ((valor e2 ent)#vs))&amp;quot;&lt;br /&gt;
      using HI2 by simp&lt;br /&gt;
    also have &amp;quot;… = ejec [IApp f] ent ((valor e1 ent)#((valor e2 ent)#vs))&amp;quot;&lt;br /&gt;
      using HI1 by simp&lt;br /&gt;
    also have &amp;quot;… = (f (valor e1 ent) (valor e2 ent))#vs&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;… = (valor (App f e1 e2) ent) # vs&amp;quot; by simp&lt;br /&gt;
    finally &lt;br /&gt;
    show &amp;quot;ejec (comp (App f e1 e2)) ent vs = (valor (App f e1 e2) ent) # vs&amp;quot; &lt;br /&gt;
      by blast&lt;br /&gt;
  qed&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>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2016/index.php?title=Temas&amp;diff=1208</id>
		<title>Temas</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2016/index.php?title=Temas&amp;diff=1208"/>
		<updated>2016-12-22T11:34:33Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Temas de &amp;#039;&amp;#039;Razonamiento automático (2016-17)&amp;#039;&amp;#039; ==&lt;br /&gt;
&lt;br /&gt;
* [[Tema 1: Programación funcional en Isabelle]].&lt;br /&gt;
* Tema 2: Razonamiento sobre programas:&lt;br /&gt;
** [http://www.cs.us.es/~jalonso/cursos/i1m-16/temas/tema-8.pdf Tema 2a: Razonamiento sobre programas Haskell]&lt;br /&gt;
** [[Tema 2b: Razonamiento automático sobre programas en Isabelle/HOL]].&lt;br /&gt;
* [[Tema 3: Razonamiento estructurado sobre programas en Isabelle/HOL]].&lt;br /&gt;
* [[Tema 4: Razonamiento por casos y por inducción]].&lt;br /&gt;
* [[Tema 5: Razonamiento sobre árboles y bosques]].&lt;br /&gt;
* Tema 6: Verificación de algoritmos de ordenación:&lt;br /&gt;
** [[Tema 6a: Verificación de la ordenación por inserción]].&lt;br /&gt;
** [[Tema 6b: Verificación de la ordenación por mezcla]].&lt;br /&gt;
* [[Tema 7: Caso de estudio: Compilación de expresiones]].&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
* Tema 7: Deducción natural proposicional:&lt;br /&gt;
** [http://www.cs.us.es/~jalonso/cursos/li/temas/tema-2.pdf Tema 7a: Deducción natural proposicional]].&lt;br /&gt;
** [[Tema 7b: Deducción natural proposicional con Isabelle/HOL]].&lt;br /&gt;
* Tema 8: Deducción natural de primer orden:&lt;br /&gt;
** [http://www.cs.us.es/~jalonso/cursos/li/temas/tema-8.pdf Tema 8a: Deducción natural en lógica de primer orden]].&lt;br /&gt;
** [[Tema 8b: Deducción natural en lógica de primer orden con Isabelle/HOL]]&lt;br /&gt;
* [[Tema 9: Conjuntos, funciones y relaciones]].&lt;br /&gt;
* [[Tema 10: Conjuntos definidos inductivamente]].&lt;br /&gt;
* [[Tema 11: Gramáticas libre de contexto]].&lt;br /&gt;
* Tema 12: Misceláneas:&lt;br /&gt;
** [[Tema 12a: Razonamiento modular (Teoría de grupos)]].&lt;br /&gt;
** [[Tema 12b: Razonamiento modular]].&lt;br /&gt;
** [[Tema 12c: Automatización]].&lt;br /&gt;
** [[Tema 12d: Pasos elementales]].&lt;br /&gt;
** [[Tema 12e: Sudoku]].&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jalonso</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2016/index.php?title=Relaci%C3%B3n_7&amp;diff=1207</id>
		<title>Relación 7</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2016/index.php?title=Relaci%C3%B3n_7&amp;diff=1207"/>
		<updated>2016-12-22T08:26:54Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
chapter {* R7: Árboles binarios completos *}&lt;br /&gt;
&lt;br /&gt;
theory R7_Arboles_binarios_completos&lt;br /&gt;
imports Main &lt;br /&gt;
begin &lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  En esta relación se piden demostraciones automáticas (lo más cortas&lt;br /&gt;
  posibles). Para ello, en algunos casos es necesario incluir lemas&lt;br /&gt;
  auxiliares (que se demuestran automáticamente) y usar ejercicios&lt;br /&gt;
  anteriores. &lt;br /&gt;
&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. Definir el tipo de datos arbol para representar los&lt;br /&gt;
  árboles binarios que no tienen información ni en los nodos y ni en las&lt;br /&gt;
  hojas. Por ejemplo, el árbol&lt;br /&gt;
          ·&lt;br /&gt;
         / \&lt;br /&gt;
        /   \&lt;br /&gt;
       ·     ·&lt;br /&gt;
      / \   / \&lt;br /&gt;
     ·   · ·   · &lt;br /&gt;
  se representa por &amp;quot;N (N H H) (N H H)&amp;quot;.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
datatype arbol = H | N arbol arbol&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;N (N H H) (N H H) = (N (N H H) (N H H) :: arbol)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Definir la función&lt;br /&gt;
     hojas :: &amp;quot;arbol =&amp;gt; nat&amp;quot; &lt;br /&gt;
  tal que (hojas a) es el número de hojas del árbol a. Por ejemplo,&lt;br /&gt;
     hojas (N (N H H) (N H H)) = 4&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* fraortmoy marcarmor13 josgarsan fracorjim1 *)&lt;br /&gt;
fun hojas :: &amp;quot;arbol =&amp;gt; nat&amp;quot; where&lt;br /&gt;
  &amp;quot;hojas H       = Suc 0&amp;quot;&lt;br /&gt;
| &amp;quot;hojas (N a b) = hojas a + hojas b&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;hojas (N (N H H) (N H H)) = 4&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* marpoldia1 anaprarod paupeddeg migtermor wilmorort pablucoto &lt;br /&gt;
   ivamenjim serrodcal crigomgom rubgonmar  danrodcha ferrenseg&lt;br /&gt;
   manmorjim1 juacabsou lucnovdos dancorgar bowma *)&lt;br /&gt;
(* Es muy parecida a la definición anterior *)&lt;br /&gt;
fun hojas2 :: &amp;quot;arbol =&amp;gt; nat&amp;quot; where&lt;br /&gt;
  &amp;quot;hojas2 H       = 1&amp;quot; &lt;br /&gt;
| &amp;quot;hojas2 (N i d) = hojas2 i + hojas2 d&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
value &amp;quot;hojas2 (N (N H H) (N H H)) = 4&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* anaprarod *)&lt;br /&gt;
(* Equivalencia de las definiciones *)&lt;br /&gt;
lemma &amp;quot;hojas a = hojas2 a&amp;quot;&lt;br /&gt;
by (induct a) simp_all&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Definir la función&lt;br /&gt;
     profundidad :: &amp;quot;arbol =&amp;gt; nat&amp;quot; &lt;br /&gt;
  tal que (profundidad a) es la profundidad del árbol a. Por ejemplo,&lt;br /&gt;
     profundidad (N (N H H) (N H H)) = 2&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* fraortmoy marpoldia1 anaprarod migtermor wilmorort marcarmor13&lt;br /&gt;
   dancorgar *) &lt;br /&gt;
fun profundidad :: &amp;quot;arbol =&amp;gt; nat&amp;quot; where&lt;br /&gt;
  &amp;quot;profundidad H = 0&amp;quot;&lt;br /&gt;
| &amp;quot;profundidad (N a b) = (if profundidad a &amp;gt; profundidad b&lt;br /&gt;
                          then 1 + profundidad a &lt;br /&gt;
                          else 1 + profundidad b)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;profundidad (N (N H H) (N H H)) = 2&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* anaprarod wilmorort pablucoto ivamenjim serrodcal crigomgom rubgonmar &lt;br /&gt;
   danrodcha ferrenseg josgarsan juacabsou lucnovdos bowma *)&lt;br /&gt;
fun profundidad2 :: &amp;quot;arbol =&amp;gt; nat&amp;quot; where&lt;br /&gt;
  &amp;quot;profundidad2 H       = 0&amp;quot;&lt;br /&gt;
| &amp;quot;profundidad2 (N i d) = 1 + (max (profundidad2 i) (profundidad2 d))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;profundidad2 (N (N H H) (N H H)) = 2&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* anaprarod *)&lt;br /&gt;
(* Equivalencia de las definiciones *)&lt;br /&gt;
lemma &amp;quot;profundidad a= profundidad2 a&amp;quot;&lt;br /&gt;
by (induct a) auto&lt;br /&gt;
&lt;br /&gt;
(* paupeddeg *)&lt;br /&gt;
fun maximo :: &amp;quot;nat ×  nat =&amp;gt; nat&amp;quot; where&lt;br /&gt;
  &amp;quot;maximo (a,b) = (if a &amp;gt; b then a else b)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
fun profundidad3 :: &amp;quot;arbol =&amp;gt; nat&amp;quot; where&lt;br /&gt;
  &amp;quot;profundidad3 H       = 0&amp;quot;&lt;br /&gt;
| &amp;quot;profundidad3 (N i d) = 1 + maximo (profundidad3 i, profundidad3 d)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* ivamenjim: llamando a la función anterior profundidad3 *)&lt;br /&gt;
lemma &amp;quot;profundidad a = profundidad3 a&amp;quot;&lt;br /&gt;
by (induct a) auto&lt;br /&gt;
&lt;br /&gt;
(* ivamenjim manmorjim1 fracorjim1 *)&lt;br /&gt;
fun profundidad4 :: &amp;quot;arbol =&amp;gt; nat&amp;quot; where&lt;br /&gt;
  &amp;quot;profundidad4 H       = 0&amp;quot;&lt;br /&gt;
| &amp;quot;profundidad4 (N i d) = Suc (max (profundidad4 i) (profundidad4 d))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;profundidad a = profundidad4 a&amp;quot;&lt;br /&gt;
by (induct a) auto&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. Definir la función&lt;br /&gt;
     abc :: &amp;quot;nat ⇒ arbol&amp;quot; &lt;br /&gt;
  tal que (abc n) es el árbol binario completo de profundidad n. Por&lt;br /&gt;
  ejemplo,  &lt;br /&gt;
     abc 3 = N (N (N H H) (N H H)) (N (N H H) (N H H))&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* fraortmoy marpoldia1 anaprarod paupeddeg migtermor  wilmorort &lt;br /&gt;
   serrodcal crigomgom rubgonmar danrodcha ferrenseg josgarsan&lt;br /&gt;
   manmorjim1 juacabsou fracorjim1 lucnovdos dancorgar bowma *)&lt;br /&gt;
fun abc :: &amp;quot;nat ⇒ arbol&amp;quot; where&lt;br /&gt;
  &amp;quot;abc 0       = H&amp;quot;&lt;br /&gt;
| &amp;quot;abc (Suc n) = (N (abc n) (abc n))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;abc 3 = N (N (N H H) (N H H)) (N (N H H) (N H H))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* ivamenjim pablucoto marcarmor13 *)&lt;br /&gt;
fun abc2 :: &amp;quot;nat ⇒ arbol&amp;quot; where&lt;br /&gt;
  &amp;quot;abc2 0 = H&amp;quot;&lt;br /&gt;
| &amp;quot;abc2 t = N (abc2 (t-1)) (abc2 (t-1))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;abc2 3 = N (N (N H H) (N H H)) (N (N H H) (N H H))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* ivamenjim: Metaejercicio de demostración *)&lt;br /&gt;
lemma &amp;quot;abc t = abc2 t&amp;quot;&lt;br /&gt;
by (induct t) auto&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 6. Un árbol binario a es completo respecto de la medida f si&lt;br /&gt;
  a es una hoja o bien a es de la forma (N i d) y se cumple que tanto i&lt;br /&gt;
  como d son árboles binarios completos respecto de f y, además, &lt;br /&gt;
  f(i) = f(r).&lt;br /&gt;
&lt;br /&gt;
  Definir la función&lt;br /&gt;
     es_abc :: &amp;quot;(arbol =&amp;gt; &amp;#039;a) =&amp;gt; arbol =&amp;gt; bool&lt;br /&gt;
  tal que (es_abc f a) se verifica si a es un árbol binario completo&lt;br /&gt;
  respecto de f.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* fraortmoy anaprarod migtermor serrodcal crigomgom rubgonmar &lt;br /&gt;
   danrodcha ferrenseg juacabsou josgarsan fracorjim1 lucnovdos bowma *)&lt;br /&gt;
fun es_abc :: &amp;quot;(arbol =&amp;gt; &amp;#039;a) =&amp;gt; arbol =&amp;gt; bool&amp;quot; where&lt;br /&gt;
  &amp;quot;es_abc _ H       = True&amp;quot;&lt;br /&gt;
| &amp;quot;es_abc f (N a b) = (es_abc f a ∧ es_abc f b ∧ (f a = f b))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* marpoldia1 paupeddeg ivamenjim pablucoto marcarmor13 manmorjim1&lt;br /&gt;
   dancorgar *) &lt;br /&gt;
fun es_abc2 :: &amp;quot;(arbol =&amp;gt; &amp;#039;a) =&amp;gt; arbol =&amp;gt; bool&amp;quot; where&lt;br /&gt;
  &amp;quot;es_abc2 f H       = True&amp;quot; &lt;br /&gt;
| &amp;quot;es_abc2 f (N i d) = ((f i = f d) ∧ (es_abc2 f i) ∧ (es_abc2 f d))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* anaprarod *)&lt;br /&gt;
(* Equivalencia de las definiciones *)&lt;br /&gt;
lemma &amp;quot;es_abc f a = es_abc2 f a&amp;quot;&lt;br /&gt;
by (induct a) auto&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Nota. (size a) es el número de nodos del árbol a. Por ejemplo,&lt;br /&gt;
     size (N (N H H) (N H H)) = 3&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;size (N (N H H) (N H H)) = 3&amp;quot;&lt;br /&gt;
value &amp;quot;size (N (N (N H H) (N H H)) (N (N H H) (N H H))) = 7&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Nota. Tenemos 3 funciones de medida sobre los árboles: número de&lt;br /&gt;
  hojas, número de nodos y profundidad. A cada una le corresponde un&lt;br /&gt;
  concepto de completitud. En los siguientes ejercicios demostraremos&lt;br /&gt;
  que los tres conceptos de completitud son iguales.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 7. Demostrar que un árbol binario a es completo respecto de&lt;br /&gt;
  la profundidad syss es completo respecto del número de hojas.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* fraortmoy marpoldia1 migtermor wilmorort pablucoto serrodcal&lt;br /&gt;
   fracorjim1 josgarsan lucnovdos bowma *) &lt;br /&gt;
lemma abc_prof_num_hojas:&lt;br /&gt;
  assumes &amp;quot;es_abc profundidad a&amp;quot;&lt;br /&gt;
  shows   &amp;quot;hojas a = 2^(profundidad a)&amp;quot;&lt;br /&gt;
using assms&lt;br /&gt;
by (induct a) auto&lt;br /&gt;
&lt;br /&gt;
(* Otra forma de escribir lo mismo *)&lt;br /&gt;
(* anaprarod crigomgom ivamenjim paupeddeg juacabsou *)&lt;br /&gt;
lemma AUX7: &amp;quot;es_abc profundidad a ⟶ (hojas a = 2^(profundidad a))&amp;quot;&lt;br /&gt;
by (induct a) simp_all&lt;br /&gt;
&lt;br /&gt;
(* Otra forma de escribir lo mismo *)&lt;br /&gt;
(* danrodcha *)&lt;br /&gt;
lemma aux1: &amp;quot;es_abc profundidad (a::arbol) ⟹ (hojas a = 2^ (profundidad a))&amp;quot;&lt;br /&gt;
by (induct a) simp_all&lt;br /&gt;
&lt;br /&gt;
(* fraortmoy marpoldia1 migtermor anaprarod wilmorort serrodcal&lt;br /&gt;
   crigomgom rubgonmar ivamenjim danrodcha marcarmor13 paupeddeg&lt;br /&gt;
   juacabsou bowma *) &lt;br /&gt;
(* También funciona con AUX7 *)&lt;br /&gt;
lemma lej7: &amp;quot;es_abc profundidad a = es_abc hojas a&amp;quot;&lt;br /&gt;
by (induct a) (auto simp add: abc_prof_num_hojas)&lt;br /&gt;
&lt;br /&gt;
(* danrodcha *)&lt;br /&gt;
lemma 7: &amp;quot;es_abc profundidad a = es_abc hojas a&amp;quot;&lt;br /&gt;
apply (induct a) &lt;br /&gt;
apply simp&lt;br /&gt;
apply (auto simp add: aux1)&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
(* ferrenseg *)&lt;br /&gt;
lemma [simp]: &amp;quot;es_abc profundidad a ⟶ hojas a = 2 ^ (profundidad a)&amp;quot;&lt;br /&gt;
by (induct a) auto&lt;br /&gt;
&lt;br /&gt;
(* Comentario: Uso de la declaración simp *)&lt;br /&gt;
&lt;br /&gt;
theorem es_abc_profundidad_hojas: &lt;br /&gt;
  &amp;quot;es_abc profundidad a = es_abc hojas a&amp;quot;&lt;br /&gt;
by (induct a) auto&lt;br /&gt;
&lt;br /&gt;
(* Comentario: Dependencia de la declaración simp. *)&lt;br /&gt;
&lt;br /&gt;
(* dancorgar *)&lt;br /&gt;
lemma rel_hojas_prof: &amp;quot;es_abc hojas a ∧ es_abc profundidad a&lt;br /&gt;
      ⟹ hojas a = 2 ^ profundidad a&amp;quot;&lt;br /&gt;
by (induct a) (auto)&lt;br /&gt;
&lt;br /&gt;
theorem &amp;quot;es_abc hojas a = es_abc profundidad a&amp;quot;&lt;br /&gt;
by (induct a) (auto simp add: rel_hojas_prof)&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 8. Demostrar que un árbol binario a es completo respecto del&lt;br /&gt;
  número de hojas syss es completo respecto del número de nodos.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* fraortmoy marpoldia1 migtermor wilmorort pablucoto serrodcal&lt;br /&gt;
   marcarmor13 josgarsan lucnovdos bowma *) &lt;br /&gt;
lemma abc_hojas_num_nodos:&lt;br /&gt;
  assumes &amp;quot;es_abc hojas a&amp;quot;&lt;br /&gt;
  shows   &amp;quot;Suc (size a) = hojas a&amp;quot;&lt;br /&gt;
using assms&lt;br /&gt;
by (induct a) auto&lt;br /&gt;
&lt;br /&gt;
(* Comentario sobre orientación de igualdades. *)&lt;br /&gt;
&lt;br /&gt;
(* Otra forma de escribir lo mismo *)&lt;br /&gt;
(* anaprarod crigomgom paupeddeg juacabsou rubgonmar *)&lt;br /&gt;
lemma AUX8: &amp;quot;es_abc hojas a ⟶ (hojas a = (Suc (size a)))&amp;quot;&lt;br /&gt;
by (induct a) auto&lt;br /&gt;
&lt;br /&gt;
(* fraortmoy marpoldia1 migtermor anaprarod wilmorort pablucoto&lt;br /&gt;
   serrodcal *) &lt;br /&gt;
lemma lej8: &amp;quot;es_abc hojas a = es_abc size a&amp;quot;&lt;br /&gt;
by (induct a) (auto simp add:abc_hojas_num_nodos [symmetric])&lt;br /&gt;
&lt;br /&gt;
(* Comentario sobre orientación de igualdades. *)&lt;br /&gt;
&lt;br /&gt;
(* anaprarod crigomgom paupeddeg juacabsou rubgonmar *)&lt;br /&gt;
(* Usando AUX8 *)&lt;br /&gt;
lemma L8: &amp;quot;es_abc hojas a = es_abc size a&amp;quot;&lt;br /&gt;
by (induct a) (auto simp add: AUX8)&lt;br /&gt;
&lt;br /&gt;
(* ivamenjim *)&lt;br /&gt;
(* Teorema auxiliar *)&lt;br /&gt;
lemma auxEj8: &amp;quot;hojas a = size a + 1&amp;quot;&lt;br /&gt;
by (induct a) auto&lt;br /&gt;
&lt;br /&gt;
(* ivamenjim *)&lt;br /&gt;
lemma lej8b: &amp;quot;es_abc hojas a = es_abc size a&amp;quot;&lt;br /&gt;
by (induct a) (auto simp add: auxEj8)&lt;br /&gt;
&lt;br /&gt;
(* danrodcha *)&lt;br /&gt;
lemma aux3: &amp;quot;es_abc hojas a ⟹ (hojas a = 1 + size a)&amp;quot;&lt;br /&gt;
by (induct a) simp_all&lt;br /&gt;
&lt;br /&gt;
(* danrodcha *)&lt;br /&gt;
lemma 8: &amp;quot;es_abc hojas a = es_abc size a&amp;quot;&lt;br /&gt;
apply (induct a) &lt;br /&gt;
apply simp&lt;br /&gt;
apply (auto simp add: aux3)&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
(* ferrenseg *)&lt;br /&gt;
lemma [simp]: &amp;quot;hojas a = size a + 1&amp;quot;&lt;br /&gt;
by (induct a) auto&lt;br /&gt;
 &lt;br /&gt;
theorem es_abc_hojas_size: &amp;quot;es_abc hojas a = es_abc size a&amp;quot;&lt;br /&gt;
by (induct a) auto&lt;br /&gt;
&lt;br /&gt;
(* fracorjim1 *)&lt;br /&gt;
lemma aux10 : &amp;quot;hojas (a::arbol) = Suc(size a)&amp;quot;&lt;br /&gt;
apply (induct a)&lt;br /&gt;
apply auto&lt;br /&gt;
done&lt;br /&gt;
    &lt;br /&gt;
lemma es_abc_hojas_size_10 : &amp;quot;es_abc hojas (a::arbol) = es_abc size a&amp;quot;&lt;br /&gt;
apply (induct a)&lt;br /&gt;
apply (auto simp add: aux10)&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
(* dancorgar *)&lt;br /&gt;
lemma rel_hojas_size: &amp;quot;es_abc hojas a ∧ es_abc size a&lt;br /&gt;
      ⟹ hojas a = (size a) + 1&amp;quot;&lt;br /&gt;
by (induct a) (auto)&lt;br /&gt;
&lt;br /&gt;
theorem &amp;quot;es_abc hojas a = es_abc size a&amp;quot;&lt;br /&gt;
by (induct a) (auto simp add: rel_hojas_size)&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 9. Demostrar que un árbol binario a es completo respecto de&lt;br /&gt;
  la profundidad syss es completo respecto del número de nodos.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* fraortmoy marpoldia1 migtermor anaprarod  wilmorort pablucoto &lt;br /&gt;
   serrodcal crigomgom rubgonmar danrodcha ivamenjim marcarmor13&lt;br /&gt;
   paupeddeg juacabsou josgarsan bowma lucnovdos *)&lt;br /&gt;
lemma lej9:  &amp;quot;es_abc profundidad a = es_abc size a&amp;quot;&lt;br /&gt;
by (simp add: lej7 lej8)&lt;br /&gt;
&lt;br /&gt;
(* ferrenseg *)&lt;br /&gt;
corollary es_abc_size_profundidad: &amp;quot;es_abc size a = es_abc profundidad a&amp;quot;&lt;br /&gt;
by (simp add: es_abc_profundidad_hojas es_abc_hojas_size)&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 10. Demostrar que (abc n) es un árbol binario completo.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* fraortmoy marpoldia1 migtermor wilmorort pablucoto serrodcal&lt;br /&gt;
   crigomgom marcarmor13 paupeddeg juacabsou dancorgar lucnovdos *)&lt;br /&gt;
lemma lej10: &amp;quot;es_abc profundidad (abc n)&amp;quot;&lt;br /&gt;
by (induct n) auto&lt;br /&gt;
&lt;br /&gt;
(* anaprarod rubgonmar danrodcha ferrenseg ivamenjim paupeddeg juacabsou bowma*)&lt;br /&gt;
(* con un demostrador más débil *)&lt;br /&gt;
(* y en general para cualquier medida *)&lt;br /&gt;
lemma L10:  &amp;quot;es_abc f (abc a)&amp;quot;&lt;br /&gt;
by (induct a) simp_all&lt;br /&gt;
&lt;br /&gt;
(* ivamenjim *)&lt;br /&gt;
(* Igual que el anterior pero usando auto *)&lt;br /&gt;
lemma lej10b: &amp;quot;es_abc f (abc n)&amp;quot;&lt;br /&gt;
by (induct n) auto&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 11. Demostrar que si a es un árbolo binario completo&lt;br /&gt;
  respecto de la profundidad, entonces a es igual a&lt;br /&gt;
  (abc (profundidad a)).&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* fraortmoy marpoldia1 migtermor wilmorort pablucoto serrodcal&lt;br /&gt;
   marcarmor13 *) &lt;br /&gt;
lemma lej11: &lt;br /&gt;
  assumes &amp;quot;es_abc profundidad a&amp;quot;&lt;br /&gt;
  shows   &amp;quot;a = (abc (profundidad a))&amp;quot;&lt;br /&gt;
using assms&lt;br /&gt;
by (induct a) auto&lt;br /&gt;
&lt;br /&gt;
(* Otra forma de escribir lo mismo *)&lt;br /&gt;
(* anaprarod crigomgom rubgonmar ferrenseg ivamenjim paupeddeg juacabsou&lt;br /&gt;
   dancorgar bowma lucnovdos *) &lt;br /&gt;
lemma &amp;quot;es_abc profundidad a ⟶ (a = (abc (profundidad a)))&amp;quot;&lt;br /&gt;
by (induct a) auto&lt;br /&gt;
&lt;br /&gt;
(* danrodcha*)&lt;br /&gt;
lemma 11:&amp;quot;es_abc profundidad a ⟹ (a = (abc (profundidad a)))&amp;quot;&lt;br /&gt;
by (induct a) simp_all&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 12. Encontrar una medida f tal que (es_abc f) es distinto de &lt;br /&gt;
  (es_abc size).&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* migtermor *)&lt;br /&gt;
fun medida_nula :: &amp;quot;arbol =&amp;gt; nat&amp;quot; where&lt;br /&gt;
  &amp;quot;medida_nula H       = 0&amp;quot;&lt;br /&gt;
| &amp;quot;medida_nula (N i d) = 0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;es_abc medida_nula a = es_abc size a&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
(* Quickcheck encuentra el siguiente contraejemplo:&lt;br /&gt;
  a = N H (N H H) &lt;br /&gt;
  Tras evaluar:&lt;br /&gt;
  es_abc medida_nula a = True&lt;br /&gt;
  es_abc size a = False*)&lt;br /&gt;
&lt;br /&gt;
(* anaprarod  wilmorort pablucoto serrodcal danrodcha marcarmor13&lt;br /&gt;
   ferrenseg ivamenjim paupeddeg juacabsou rubgonmar bowma lucnovdos *) &lt;br /&gt;
lemma &amp;quot;es_abc f a =  es_abc size a&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
(* Quickcheck found a counterexample:&lt;br /&gt;
  f = λx. a⇩1   &lt;br /&gt;
  a = N H (N H H)&lt;br /&gt;
Evaluated terms:&lt;br /&gt;
  es_abc f a = True&lt;br /&gt;
  es_abc size a = False *)&lt;br /&gt;
oops&lt;br /&gt;
(* el contraejemplo que encuentra es la medida constante a1 *)&lt;br /&gt;
&lt;br /&gt;
(*crigomgom *)&lt;br /&gt;
(* Como en la primera de las soluciones he usado la función constante 0&lt;br /&gt;
   pero he usado una expresión lambda *) &lt;br /&gt;
lemma &amp;quot;es_abc (λx. 0::nat) a = es_abc size a&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
(* dancorgar *)&lt;br /&gt;
fun medida :: &amp;quot;arbol =&amp;gt; bool&amp;quot; where&lt;br /&gt;
  &amp;quot;medida H       = True&amp;quot;&lt;br /&gt;
| &amp;quot;medida (N i d) = ((profundidad i) = (size d))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
theorem &amp;quot;es_abc size a = es_abc medida a&amp;quot;&lt;br /&gt;
quickcheck&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>Jalonso</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2016/index.php?title=Relaci%C3%B3n_7&amp;diff=1206</id>
		<title>Relación 7</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2016/index.php?title=Relaci%C3%B3n_7&amp;diff=1206"/>
		<updated>2016-12-22T08:00:48Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: Protegió «Relación 7» ([edit=sysop] (indefinido) [move=sysop] (indefinido))&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
chapter {* R7: Árboles binarios completos *}&lt;br /&gt;
&lt;br /&gt;
theory R7_Arboles_binarios_completos&lt;br /&gt;
imports Main &lt;br /&gt;
begin &lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  En esta relación se piden demostraciones automáticas (lo más cortas&lt;br /&gt;
  posibles). Para ello, en algunos casos es necesario incluir lemas&lt;br /&gt;
  auxiliares (que se demuestran automáticamente) y usar ejercicios&lt;br /&gt;
  anteriores. &lt;br /&gt;
&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. Definir el tipo de datos arbol para representar los&lt;br /&gt;
  árboles binarios que no tienen información ni en los nodos y ni en las&lt;br /&gt;
  hojas. Por ejemplo, el árbol&lt;br /&gt;
          ·&lt;br /&gt;
         / \&lt;br /&gt;
        /   \&lt;br /&gt;
       ·     ·&lt;br /&gt;
      / \   / \&lt;br /&gt;
     ·   · ·   · &lt;br /&gt;
  se representa por &amp;quot;N (N H H) (N H H)&amp;quot;.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
datatype arbol = H | N arbol arbol&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;N (N H H) (N H H) = (N (N H H) (N H H) :: arbol)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Definir la función&lt;br /&gt;
     hojas :: &amp;quot;arbol =&amp;gt; nat&amp;quot; &lt;br /&gt;
  tal que (hojas a) es el número de hojas del árbol a. Por ejemplo,&lt;br /&gt;
     hojas (N (N H H) (N H H)) = 4&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* fraortmoy marcarmor13 josgarsan fracorjim1 *)&lt;br /&gt;
fun hojas :: &amp;quot;arbol =&amp;gt; nat&amp;quot; where&lt;br /&gt;
  &amp;quot;hojas H = Suc 0&amp;quot;&lt;br /&gt;
| &amp;quot;hojas (N a b) = hojas a + hojas b&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;hojas (N (N H H) (N H H)) = 4&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* marpoldia1 anaprarod paupeddeg migtermor wilmorort pablucoto &lt;br /&gt;
    ivamenjim serrodcal crigomgom rubgonmar  danrodcha ferrenseg manmorjim1 juacabsou lucnovdos &lt;br /&gt;
    dancorgar bowma *)&lt;br /&gt;
(* Es muy parecida a la definición anterior *)&lt;br /&gt;
fun hojas2 :: &amp;quot;arbol =&amp;gt; nat&amp;quot; where&lt;br /&gt;
  &amp;quot;hojas2 H = 1&amp;quot; |&lt;br /&gt;
  &amp;quot;hojas2 (N i d) = hojas2 i + hojas2 d&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
value &amp;quot;hojas2 (N (N H H) (N H H)) = 4&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(* anaprarod *)&lt;br /&gt;
(* Equivalencia de las definiciones *)&lt;br /&gt;
lemma &amp;quot;hojas a = hojas2 a&amp;quot;&lt;br /&gt;
by (induct a) simp_all&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Definir la función&lt;br /&gt;
     profundidad :: &amp;quot;arbol =&amp;gt; nat&amp;quot; &lt;br /&gt;
  tal que (profundidad a) es la profundidad del árbol a. Por ejemplo,&lt;br /&gt;
     profundidad (N (N H H) (N H H)) = 2&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* fraortmoy marpoldia1 anaprarod migtermor wilmorort marcarmor13 dancorgar *)&lt;br /&gt;
fun profundidad :: &amp;quot;arbol =&amp;gt; nat&amp;quot; where&lt;br /&gt;
  &amp;quot;profundidad H = 0&amp;quot;&lt;br /&gt;
| &amp;quot;profundidad (N a b) = (if profundidad a &amp;gt; profundidad b&lt;br /&gt;
                          then 1 + profundidad a &lt;br /&gt;
                          else 1 + profundidad b)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;profundidad (N (N H H) (N H H)) = 2&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* anaprarod wilmorort pablucoto ivamenjim serrodcal crigomgom rubgonmar &lt;br /&gt;
    danrodcha ferrenseg josgarsan juacabsou lucnovdos bowma *)&lt;br /&gt;
fun profundidad2 :: &amp;quot;arbol =&amp;gt; nat&amp;quot; where&lt;br /&gt;
  &amp;quot;profundidad2 H = 0&amp;quot;&lt;br /&gt;
 |&amp;quot;profundidad2 (N i d) = 1 + (max (profundidad2 i) (profundidad2 d))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;profundidad2 (N (N H H) (N H H)) = 2&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* anaprarod *)&lt;br /&gt;
(* Equivalencia de las definiciones *)&lt;br /&gt;
lemma &amp;quot;profundidad a= profundidad2 a&amp;quot;&lt;br /&gt;
by (induct a) auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(* paupeddeg *)&lt;br /&gt;
fun maximo :: &amp;quot;nat ×  nat =&amp;gt; nat&amp;quot; where&lt;br /&gt;
  &amp;quot;maximo (a,b) = (if a &amp;gt; b &lt;br /&gt;
                    then a else b)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
fun profundidad :: &amp;quot;arbol =&amp;gt; nat&amp;quot; where&lt;br /&gt;
  &amp;quot;profundidad H = 0&amp;quot;&lt;br /&gt;
| &amp;quot;profundidad (N i d) = 1 + maximo(profundidad i, profundidad d)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(* ivamenjim: llamando a la función anterior profundidad3 *)&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;profundidad a = profundidad3 a&amp;quot;&lt;br /&gt;
by (induct a) auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(* ivamenjim manmorjim1 fracorjim1 *)&lt;br /&gt;
fun profundidad4 :: &amp;quot;arbol =&amp;gt; nat&amp;quot; where&lt;br /&gt;
  &amp;quot;profundidad4 H = 0&amp;quot;&lt;br /&gt;
| &amp;quot;profundidad4 (N i d) = Suc (max (profundidad4 i)(profundidad4 d))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;profundidad a = profundidad4 a&amp;quot;&lt;br /&gt;
by (induct a) auto&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. Definir la función&lt;br /&gt;
     abc :: &amp;quot;nat ⇒ arbol&amp;quot; &lt;br /&gt;
  tal que (abc n) es el árbol binario completo de profundidad n. Por&lt;br /&gt;
  ejemplo,  &lt;br /&gt;
     abc 3 = N (N (N H H) (N H H)) (N (N H H) (N H H))&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
(* fraortmoy marpoldia1 anaprarod paupeddeg migtermor  wilmorort &lt;br /&gt;
    serrodcal crigomgom rubgonmar danrodcha ferrenseg josgarsan manmorjim1 juacabsou fracorjim1 lucnovdos &lt;br /&gt;
    dancorgar bowma *)&lt;br /&gt;
fun abc :: &amp;quot;nat ⇒ arbol&amp;quot; where&lt;br /&gt;
  &amp;quot;abc 0 = H&amp;quot;&lt;br /&gt;
| &amp;quot;abc (Suc n) = (N (abc n) (abc n))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;abc 3 = N (N (N H H) (N H H)) (N (N H H) (N H H))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* ivamenjim pablucoto marcarmor13*)&lt;br /&gt;
fun abc2 :: &amp;quot;nat ⇒ arbol&amp;quot; where&lt;br /&gt;
  &amp;quot;abc2 0 = H&amp;quot;&lt;br /&gt;
| &amp;quot;abc2 t = N (abc2 (t-1)) (abc2 (t-1))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;abc2 3 = N (N (N H H) (N H H)) (N (N H H) (N H H))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* ivamenjim: Metaejercicio de demostración *)&lt;br /&gt;
lemma &amp;quot;abc t = abc2 t&amp;quot;&lt;br /&gt;
by (induct t) auto&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 6. Un árbol binario a es completo respecto de la medida f si&lt;br /&gt;
  a es una hoja o bien a es de la forma (N i d) y se cumple que tanto i&lt;br /&gt;
  como d son árboles binarios completos respecto de f y, además, &lt;br /&gt;
  f(i) = f(r).&lt;br /&gt;
&lt;br /&gt;
  Definir la función&lt;br /&gt;
     es_abc :: &amp;quot;(arbol =&amp;gt; &amp;#039;a) =&amp;gt; arbol =&amp;gt; bool&lt;br /&gt;
  tal que (es_abc f a) se verifica si a es un árbol binario completo&lt;br /&gt;
  respecto de f.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* fraortmoy anaprarod migtermor serrodcal crigomgom rubgonmar &lt;br /&gt;
    danrodcha ferrenseg juacabsou josgarsan fracorjim1 lucnovdos bowma *)&lt;br /&gt;
fun es_abc :: &amp;quot;(arbol =&amp;gt; &amp;#039;a) =&amp;gt; arbol =&amp;gt; bool&amp;quot; where&lt;br /&gt;
  &amp;quot;es_abc _ H = True&amp;quot;&lt;br /&gt;
| &amp;quot;es_abc f (N a b) = (es_abc f a ∧ es_abc f b ∧ (f a = f b))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(* marpoldia1 paupeddeg ivamenjim pablucoto marcarmor13 manmorjim1 dancorgar *)&lt;br /&gt;
fun es_abc2 :: &amp;quot;(arbol =&amp;gt; &amp;#039;a) =&amp;gt; arbol =&amp;gt; bool&amp;quot; where&lt;br /&gt;
  &amp;quot;es_abc2 f H = True&amp;quot; |&lt;br /&gt;
  &amp;quot;es_abc2 f (N i d) = ((f i = f d) ∧ (es_abc2 f i) ∧ (es_abc2 f d))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* anaprarod *)&lt;br /&gt;
(* Equivalencia de las definiciones *)&lt;br /&gt;
lemma &amp;quot;es_abc f a = es_abc2 f a&amp;quot;&lt;br /&gt;
by (induct a) auto&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Nota. (size a) es el número de nodos del árbol a. Por ejemplo,&lt;br /&gt;
     size (N (N H H) (N H H)) = 3&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;size (N (N H H) (N H H)) = 3&amp;quot;&lt;br /&gt;
value &amp;quot;size (N (N (N H H) (N H H)) (N (N H H) (N H H))) = 7&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Nota. Tenemos 3 funciones de medida sobre los árboles: número de&lt;br /&gt;
  hojas, número de nodos y profundidad. A cada una le corresponde un&lt;br /&gt;
  concepto de completitud. En los siguientes ejercicios demostraremos&lt;br /&gt;
  que los tres conceptos de completitud son iguales.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 7. Demostrar que un árbol binario a es completo respecto de&lt;br /&gt;
  la profundidad syss es completo respecto del número de hojas.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* fraortmoy marpoldia1 migtermor wilmorort pablucoto serrodcal fracorjim1 josgarsan lucnovdos bowma *)&lt;br /&gt;
&lt;br /&gt;
lemma abc_prof_num_hojas:&lt;br /&gt;
  assumes &amp;quot;es_abc profundidad a&amp;quot;&lt;br /&gt;
  shows &amp;quot;hojas a = 2^(profundidad a)&amp;quot;&lt;br /&gt;
using assms&lt;br /&gt;
by (induct a) auto&lt;br /&gt;
&lt;br /&gt;
(* Otra forma de escribir lo mismo *)&lt;br /&gt;
(* anaprarod crigomgom ivamenjim paupeddeg juacabsou *)&lt;br /&gt;
lemma AUX7: &amp;quot;es_abc profundidad a ⟶ (hojas a = 2^(profundidad a))&amp;quot;&lt;br /&gt;
by (induct a) simp_all&lt;br /&gt;
&lt;br /&gt;
(* Otra forma de escribir lo mismo *)&lt;br /&gt;
(* danrodcha *)&lt;br /&gt;
lemma aux1: &amp;quot;es_abc profundidad (a::arbol) ⟹ (hojas a = 2^ (profundidad a))&amp;quot;&lt;br /&gt;
by (induct a) simp_all&lt;br /&gt;
&lt;br /&gt;
(* fraortmoy marpoldia1 migtermor anaprarod wilmorort serrodcal crigomgom &lt;br /&gt;
    rubgonmar ivamenjim danrodcha marcarmor13 paupeddeg juacabsou bowma *)&lt;br /&gt;
(* También funciona con AUX7 *)&lt;br /&gt;
&lt;br /&gt;
lemma lej7: &amp;quot;es_abc profundidad a = es_abc hojas a&amp;quot;&lt;br /&gt;
by (induct a) (auto simp add: abc_prof_num_hojas)&lt;br /&gt;
&lt;br /&gt;
(* danrodcha *)&lt;br /&gt;
lemma 7: &amp;quot;es_abc profundidad a = es_abc hojas a&amp;quot;&lt;br /&gt;
apply (induct a) &lt;br /&gt;
apply simp&lt;br /&gt;
apply (auto simp add: aux1)&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
(* ferrenseg *)&lt;br /&gt;
lemma [simp]: &amp;quot;es_abc profundidad a ⟶ hojas a = 2 ^ (profundidad a)&amp;quot;&lt;br /&gt;
by (induct a) auto&lt;br /&gt;
 &lt;br /&gt;
theorem es_abc_profundidad_hojas: &amp;quot;es_abc profundidad a = es_abc hojas a&amp;quot;&lt;br /&gt;
by (induct a) auto&lt;br /&gt;
&lt;br /&gt;
(* dancorgar *)&lt;br /&gt;
lemma rel_hojas_prof: &amp;quot;es_abc hojas a ∧ es_abc profundidad a&lt;br /&gt;
      ⟹ hojas a = 2 ^ profundidad a&amp;quot;&lt;br /&gt;
by (induct a) (auto)&lt;br /&gt;
&lt;br /&gt;
theorem &amp;quot;es_abc hojas a = es_abc profundidad a&amp;quot;&lt;br /&gt;
by (induct a) (auto simp add: rel_hojas_prof)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 8. Demostrar que un árbol binario a es completo respecto del&lt;br /&gt;
  número de hojas syss es completo respecto del número de nodos.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* fraortmoy marpoldia1 migtermor wilmorort pablucoto serrodcal marcarmor13 josgarsan lucnovdos bowma*)&lt;br /&gt;
&lt;br /&gt;
lemma abc_hojas_num_nodos:&lt;br /&gt;
  assumes &amp;quot;es_abc hojas a&amp;quot;&lt;br /&gt;
  shows &amp;quot;Suc(size a) = hojas a&amp;quot;&lt;br /&gt;
using assms&lt;br /&gt;
by (induct a) auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(* Otra forma de escribir lo mismo *)&lt;br /&gt;
(* anaprarod crigomgom paupeddeg juacabsou rubgonmar *)&lt;br /&gt;
lemma AUX8: &amp;quot;es_abc hojas a ⟶ (hojas a = (Suc (size a)))&amp;quot;&lt;br /&gt;
by (induct a) auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(* fraortmoy marpoldia1 migtermor anaprarod wilmorort pablucoto serrodcal  *)&lt;br /&gt;
&lt;br /&gt;
lemma lej8: &amp;quot;es_abc hojas a = es_abc size a&amp;quot;&lt;br /&gt;
by (induct a) (auto simp add:abc_hojas_num_nodos [symmetric])&lt;br /&gt;
&lt;br /&gt;
(* anaprarod crigomgom paupeddeg juacabsou rubgonmar *)&lt;br /&gt;
(* Usando AUX8 *)&lt;br /&gt;
lemma L8: &amp;quot;es_abc hojas a= es_abc size a&amp;quot;&lt;br /&gt;
by (induct a) (auto simp add: AUX8)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(* ivamenjim *)&lt;br /&gt;
(* Teorema auxiliar *)&lt;br /&gt;
lemma auxEj8: &amp;quot;hojas a = size a + 1&amp;quot;&lt;br /&gt;
by (induct a) auto&lt;br /&gt;
&lt;br /&gt;
(* ivamenjim *)&lt;br /&gt;
lemma lej8: &amp;quot;es_abc hojas a = es_abc size a&amp;quot;&lt;br /&gt;
by (induct a) (auto simp add: auxEj8)&lt;br /&gt;
&lt;br /&gt;
(* danrodcha *)&lt;br /&gt;
lemma aux3: &amp;quot;es_abc hojas a ⟹ (hojas a = 1 + size a)&amp;quot;&lt;br /&gt;
by (induct a) simp_all&lt;br /&gt;
&lt;br /&gt;
(* danrodcha *)&lt;br /&gt;
lemma 8: &amp;quot;es_abc hojas a = es_abc size a&amp;quot;&lt;br /&gt;
apply (induct a) &lt;br /&gt;
apply simp&lt;br /&gt;
apply (auto simp add: aux3)&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
(* ferrenseg *)&lt;br /&gt;
lemma [simp]: &amp;quot;hojas a = size a + 1&amp;quot;&lt;br /&gt;
by (induct a) auto&lt;br /&gt;
 &lt;br /&gt;
theorem es_abc_hojas_size: &amp;quot;es_abc hojas a = es_abc size a&amp;quot;&lt;br /&gt;
by (induct a) auto&lt;br /&gt;
&lt;br /&gt;
(* fracorjim1 *)&lt;br /&gt;
&lt;br /&gt;
lemma aux10 : &amp;quot;hojas (a::arbol) = Suc(size a)&amp;quot;&lt;br /&gt;
apply (induct a)&lt;br /&gt;
apply auto&lt;br /&gt;
done&lt;br /&gt;
    &lt;br /&gt;
lemma es_abc_hojas_size_10 : &amp;quot;es_abc hojas (a::arbol) = es_abc size a&amp;quot;&lt;br /&gt;
apply (induct a)&lt;br /&gt;
apply (auto simp add: aux10)&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
(* dancorgar *)&lt;br /&gt;
lemma rel_hojas_size: &amp;quot;es_abc hojas a ∧ es_abc size a&lt;br /&gt;
      ⟹ hojas a = (size a) + 1&amp;quot;&lt;br /&gt;
by (induct a) (auto)&lt;br /&gt;
&lt;br /&gt;
theorem &amp;quot;es_abc hojas a = es_abc size a&amp;quot;&lt;br /&gt;
by (induct a) (auto simp add: rel_hojas_size)&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 9. Demostrar que un árbol binario a es completo respecto de&lt;br /&gt;
  la profundidad syss es completo respecto del número de nodos.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* fraortmoy marpoldia1 migtermor anaprarod  wilmorort pablucoto &lt;br /&gt;
   serrodcal crigomgom rubgonmar danrodcha ivamenjim marcarmor13 paupeddeg juacabsou&lt;br /&gt;
   josgarsan bowma lucnovdos *)&lt;br /&gt;
&lt;br /&gt;
lemma lej9:  &amp;quot;es_abc profundidad a = es_abc size a&amp;quot;&lt;br /&gt;
by (simp add: lej7 lej8)&lt;br /&gt;
&lt;br /&gt;
(* ferrenseg *)&lt;br /&gt;
&lt;br /&gt;
corollary es_abc_size_profundidad: &amp;quot;es_abc size a = es_abc profundidad a&amp;quot;&lt;br /&gt;
by (simp add: es_abc_profundidad_hojas es_abc_hojas_size)&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 10. Demostrar que (abc n) es un árbol binario completo.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* fraortmoy marpoldia1 migtermor wilmorort pablucoto serrodcal crigomgom marcarmor13 paupeddeg juacabsou&lt;br /&gt;
   dancorgar lucnovdos *)&lt;br /&gt;
&lt;br /&gt;
lemma lej10: &amp;quot;es_abc profundidad (abc n)&amp;quot;&lt;br /&gt;
by (induct n) auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(* anaprarod rubgonmar danrodcha ferrenseg ivamenjim paupeddeg juacabsou bowma*)&lt;br /&gt;
(* con un demostrador más débil *)&lt;br /&gt;
(* y en general para cualquier medida *)&lt;br /&gt;
lemma L10:  &amp;quot;es_abc f (abc a)&amp;quot;&lt;br /&gt;
by (induct a) simp_all&lt;br /&gt;
&lt;br /&gt;
(* ivamenjim *)&lt;br /&gt;
(* Igual que el anterior pero usando auto *)&lt;br /&gt;
lemma lej10: &amp;quot;es_abc f (abc n)&amp;quot;&lt;br /&gt;
by (induct n) auto&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 11. Demostrar que si a es un árbolo binario completo&lt;br /&gt;
  respecto de la profundidad, entonces a es igual a&lt;br /&gt;
  (abc (profundidad a)).&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* fraortmoy marpoldia1 migtermor wilmorort pablucoto serrodcal marcarmor13  *)&lt;br /&gt;
&lt;br /&gt;
lemma lej11: &lt;br /&gt;
  assumes &amp;quot; es_abc profundidad a&amp;quot;&lt;br /&gt;
  shows &amp;quot;a = (abc (profundidad a))&amp;quot;&lt;br /&gt;
using assms&lt;br /&gt;
by (induct a) auto&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(* Otra forma de escribir lo mismo *)&lt;br /&gt;
(* anaprarod crigomgom rubgonmar ferrenseg ivamenjim paupeddeg juacabsou dancorgar bowma lucnovdos *)&lt;br /&gt;
lemma &amp;quot;es_abc profundidad a ⟶ (a = (abc (profundidad a)))&amp;quot;&lt;br /&gt;
by (induct a) auto&lt;br /&gt;
&lt;br /&gt;
(* danrodcha*)&lt;br /&gt;
lemma 11:&amp;quot;es_abc profundidad a ⟹ (a = (abc (profundidad a)))&amp;quot;&lt;br /&gt;
by (induct a) simp_all&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 12. Encontrar una medida f tal que (es_abc f) es distinto de &lt;br /&gt;
  (es_abc size).&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* migtermor *)&lt;br /&gt;
fun medida_nula :: &amp;quot;arbol =&amp;gt; nat&amp;quot; where&lt;br /&gt;
 &amp;quot;medida_nula H = 0&amp;quot;&lt;br /&gt;
| &amp;quot;medida_nula (N i d) = 0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;es_abc medida_nula a = es_abc size a&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
(* Quickcheck encuentra el siguiente contraejemplo:&lt;br /&gt;
  a= N H (N H H) &lt;br /&gt;
  Tras evaluar:&lt;br /&gt;
  es_abc medida_nula a = True&lt;br /&gt;
  es_abc size a = False*)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(* anaprarod  wilmorort pablucoto serrodcal danrodcha marcarmor13 ferrenseg ivamenjim paupeddeg juacabsou rubgonmar bowma lucnovdos *)&lt;br /&gt;
lemma &amp;quot;es_abc f a =  es_abc size a&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
(* Quickcheck found a counterexample:&lt;br /&gt;
  f = λx. a⇩1   &lt;br /&gt;
  a = N H (N H H)&lt;br /&gt;
Evaluated terms:&lt;br /&gt;
  es_abc f a = True&lt;br /&gt;
  es_abc size a = False *)&lt;br /&gt;
oops&lt;br /&gt;
(* el contraejemplo que encuentra es la medida constante a1 *)&lt;br /&gt;
&lt;br /&gt;
(*crigomgom *)&lt;br /&gt;
(* Como en la primera de las soluciones he usado la función constante 0 pero he usado una expresión lambda*)&lt;br /&gt;
lemma &amp;quot;es_abc (λx. 0::nat) a = es_abc size a&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
(* dancorgar *)&lt;br /&gt;
fun medida :: &amp;quot;arbol =&amp;gt; bool&amp;quot; where&lt;br /&gt;
  &amp;quot;medida H = True&amp;quot;&lt;br /&gt;
| &amp;quot;medida (N i d) = ((profundidad i) = (size d))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
theorem &amp;quot;es_abc size a = es_abc medida a&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&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>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2016/index.php?title=Relaci%C3%B3n_6&amp;diff=1098</id>
		<title>Relación 6</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2016/index.php?title=Relaci%C3%B3n_6&amp;diff=1098"/>
		<updated>2016-12-18T11:54:30Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: Desprotegió «Relación 6»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
chapter {* R6: Recorridos de árboles *}&lt;br /&gt;
&lt;br /&gt;
theory R6_Recorridos_de_arboles&lt;br /&gt;
imports Main &lt;br /&gt;
begin &lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. Definir el tipo de datos arbol para representar los&lt;br /&gt;
  árboles binarios que tiene información en los nodos y en las hojas. &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;
     a   d f   3&lt;br /&gt;
  se representa por &amp;quot;N e (N c (H a) (H d)) (N g (H f) (H h))&amp;quot;.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* ivamenjim marpoldia1 manmorjim1 bowma migtermor wilmorort &lt;br /&gt;
   juacabsou serrodcal pabrodmac ferrenseg rubgonmar paupeddeg &lt;br /&gt;
   crigomgom danrodcha jeamacpov marcarmor13 josgarsan fraortmoy &lt;br /&gt;
   dancorgar fracorjim1*)&lt;br /&gt;
&lt;br /&gt;
datatype &amp;#039;a arbol = H &amp;quot;&amp;#039;a&amp;quot; | 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;
value &amp;quot;N e (N c (H a) (H d)) (N g (H f) (H h))&amp;quot; &lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Definir la función &lt;br /&gt;
     preOrden :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a list&amp;quot;&lt;br /&gt;
  tal que (preOrden a) es el recorrido pre orden del árbol a. Por&lt;br /&gt;
  ejemplo, &lt;br /&gt;
     preOrden (N e (N c (H a) (H d)) (N g (H f) (H h)))&lt;br /&gt;
     = [e,c,a,d,g,f,h] &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* ivamenjim marpoldia1 pablucoto bowma fraortmoy migtermor &lt;br /&gt;
   wilmorort lucnovdos serrodcal pabrodmac jeamacpov paupeddeg&lt;br /&gt;
   marcarmor13 josgarsan dancorgar *)&lt;br /&gt;
&lt;br /&gt;
fun preOrden :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;preOrden (H t)     = [t]&amp;quot;&lt;br /&gt;
| &amp;quot;preOrden (N t i d) = [t] @ (preOrden i) @ (preOrden d)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* danrodcha crigomgom manmorjim1 bowma juacabsou ferrenseg &lt;br /&gt;
   rubgonmar paupeddeg fracorjim1 *)&lt;br /&gt;
fun preOrden1 :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;preOrden1 (H x)     = [x]&amp;quot;&lt;br /&gt;
| &amp;quot;preOrden1 (N x i d) = x # preOrden1 i @ preOrden1 d&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;preOrden (N e (N c (H a) (H d)) (N g (H f) (H h)))  &lt;br /&gt;
      = [e,c,a,d,g,f,h]&amp;quot; &lt;br /&gt;
value &amp;quot;preOrden1 (N e (N c (H a) (H d)) (N g (H f) (H h)))  &lt;br /&gt;
      = [e,c,a,d,g,f,h]&amp;quot; &lt;br /&gt;
&lt;br /&gt;
(* danrodcha *)&lt;br /&gt;
lemma &amp;quot;preOrden a = preOrden1 a&amp;quot;&lt;br /&gt;
by (induct a) simp_all&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. Definir la función &lt;br /&gt;
     postOrden :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a list&amp;quot;&lt;br /&gt;
  tal que (postOrden a) es el recorrido post orden del árbol a. Por&lt;br /&gt;
  ejemplo, &lt;br /&gt;
     postOrden (N e (N c (H a) (H d)) (N g (H f) (H h)))&lt;br /&gt;
     = [e,c,a,d,g,f,h] &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* ivamenjim  danrodcha crigomgom marpoldia1 manmorjim1&lt;br /&gt;
    pablucoto bowma fraortmoy migtermor wilmorort lucnovdos&lt;br /&gt;
    juacabsou serrodcal pabrodmac  ferrenseg jeamacpov &lt;br /&gt;
    rubgonmar paupeddeg marcarmor13 josgarsan dancorgar fracorjim1 *)&lt;br /&gt;
&lt;br /&gt;
fun postOrden :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;postOrden (H t)     = [t]&amp;quot;&lt;br /&gt;
| &amp;quot;postOrden (N t i d) = (postOrden i) @ (postOrden d) @ [t]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;postOrden (N e (N c (H a) (H d)) (N g (H f) (H h)))&lt;br /&gt;
       = [a,d,c,f,h,g,e]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Definir la función &lt;br /&gt;
     inOrden :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a list&amp;quot;&lt;br /&gt;
  tal que (inOrden a) es el recorrido in orden del árbol a. Por&lt;br /&gt;
  ejemplo, &lt;br /&gt;
     inOrden (N e (N c (H a) (H d)) (N g (H f) (H h)))&lt;br /&gt;
     = [a,c,d,e,f,g,h]&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* ivamenjim crigomgom marpoldia1 pablucoto bowma fraortmoy &lt;br /&gt;
   migtermor wilmorort lucnovdos juacabsou serrodcal pabrodmac &lt;br /&gt;
   ferrenseg jeamacpov rubgonmar paupeddeg marcarmor13 josgarsan&lt;br /&gt;
   dancorgar *)&lt;br /&gt;
fun inOrden :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;inOrden (H t)     = [t]&amp;quot;&lt;br /&gt;
| &amp;quot;inOrden (N t i d) = (inOrden i) @ [t] @ (inOrden d)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* danrodcha manmorjim1 fracorjim1 *)&lt;br /&gt;
fun inOrden1 :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;inOrden1 (H t)     = [t]&amp;quot;&lt;br /&gt;
| &amp;quot;inOrden1 (N t i d) = inOrden1 i @ t#inOrden1 d&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;inOrden (N e (N c (H a) (H d)) (N g (H f) (H h)))&lt;br /&gt;
       = [a,c,d,e,f,g,h]&amp;quot;&lt;br /&gt;
value &amp;quot;inOrden1 (N e (N c (H a) (H d)) (N g (H f) (H h)))&lt;br /&gt;
       = [a,c,d,e,f,g,h]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* manmorjim1 *)&lt;br /&gt;
lemma &amp;quot;inOrden t = inOrden1 t&amp;quot;&lt;br /&gt;
apply (induct t)&lt;br /&gt;
apply auto&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. Definir la función &lt;br /&gt;
     espejo :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a arbol&amp;quot;&lt;br /&gt;
  tal que (espejo a) es la imagen especular del árbol a. Por ejemplo, &lt;br /&gt;
     espejo (N e (N c (H a) (H d)) (N g (H f) (H h)))&lt;br /&gt;
     = N e (N g (H h) (H f)) (N c (H d) (H a))&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* ivamenjim danrodcha crigomgom marpoldia1 manmorjim1 &lt;br /&gt;
   pablucoto bowma fraortmoy migtermor wilmorort lucnovdos &lt;br /&gt;
   juacabsou serrodcal pabrodmac ferrenseg jeamacpov rubgonmar &lt;br /&gt;
   paupeddeg marcarmor13 josgarsan dancorgar fracorjim1 *)&lt;br /&gt;
fun espejo :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a arbol&amp;quot; where&lt;br /&gt;
  &amp;quot;espejo (H t)     = H t&amp;quot;&lt;br /&gt;
| &amp;quot;espejo (N t i d) = N t (espejo d) (espejo i)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;espejo (N e (N c (H a) (H d)) (N g (H f) (H h))) &lt;br /&gt;
       = N e (N g (H h) (H f)) (N c (H d) (H a))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 6. Demostrar que&lt;br /&gt;
     preOrden (espejo a) = rev (postOrden a)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* ivamenjim migtermor wilmorort juacabsou serrodcal dancorgar josgarsan&lt;br /&gt;
*) &lt;br /&gt;
lemma  &amp;quot;preOrden (espejo a) = rev (postOrden a)&amp;quot; (is &amp;quot;?P a&amp;quot;)&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix x &lt;br /&gt;
  show &amp;quot;?P (H x)&amp;quot; by simp &lt;br /&gt;
next&lt;br /&gt;
  fix x &lt;br /&gt;
  fix i assume h1: &amp;quot;?P i&amp;quot;&lt;br /&gt;
  fix d assume h2: &amp;quot;?P d&amp;quot;&lt;br /&gt;
  have &amp;quot;preOrden (espejo (N x i d)) = &lt;br /&gt;
        preOrden (N x (espejo d) (espejo i))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = [x] @ (preOrden (espejo d)) @ (preOrden (espejo i))&amp;quot; &lt;br /&gt;
    by simp&lt;br /&gt;
  also have &amp;quot;... = [x] @ rev (postOrden d) @ rev (postOrden i)&amp;quot; &lt;br /&gt;
    using h1 h2 by simp &lt;br /&gt;
  finally show &amp;quot;preOrden (espejo (N x i d)) = rev (postOrden (N x i d))&amp;quot; &lt;br /&gt;
    by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* danrodcha paupeddeg *)&lt;br /&gt;
lemma  &amp;quot;preOrden (espejo a) = rev (postOrden a)&amp;quot;&lt;br /&gt;
by (induct a) simp_all&lt;br /&gt;
&lt;br /&gt;
(* danrodcha crigomgom fracorjim1 *)&lt;br /&gt;
lemma  &amp;quot;preOrden1 (espejo a) = rev (postOrden a)&amp;quot; (is &amp;quot;?P a&amp;quot;)&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix x&lt;br /&gt;
  show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x i d &lt;br /&gt;
  assume HIi: &amp;quot;?P i&amp;quot;&lt;br /&gt;
  assume HId: &amp;quot;?P d&amp;quot;&lt;br /&gt;
  have &amp;quot;preOrden1 (espejo (N x i d)) = &lt;br /&gt;
        preOrden1 (N x (espejo d) (espejo i))&amp;quot;&lt;br /&gt;
    by (simp only: espejo.simps(2))&lt;br /&gt;
  also have &amp;quot;… = x#preOrden1 (espejo d) @ preOrden1 (espejo i)&amp;quot;&lt;br /&gt;
    by (simp only: preOrden1.simps(2))&lt;br /&gt;
  also have&amp;quot;… = x#rev (postOrden d) @ rev (postOrden i)&amp;quot; &lt;br /&gt;
    using HIi HId by simp&lt;br /&gt;
  also have &amp;quot;… = rev (postOrden (N x i d))&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N x i d)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* danrodcha fraortmoy *)&lt;br /&gt;
lemma  &amp;quot;preOrden (espejo a) = rev (postOrden a)&amp;quot; (is &amp;quot;?P a&amp;quot;)&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix x&lt;br /&gt;
  show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x i d &lt;br /&gt;
  assume HIi: &amp;quot;?P i&amp;quot;&lt;br /&gt;
  assume HId: &amp;quot;?P d&amp;quot;&lt;br /&gt;
  show &amp;quot;?P (N x i d)&amp;quot; using HIi HId by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* bowma *)&lt;br /&gt;
lemma  &amp;quot;preOrden (espejo a) = rev (postOrden a)&amp;quot;&lt;br /&gt;
apply (induct a)&lt;br /&gt;
apply simp_all&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
(* pablucoto marpoldia1 jeamacpov paupeddeg marcarmor13*)&lt;br /&gt;
lemma  &amp;quot;preOrden (espejo a) = rev (postOrden a)&amp;quot; (is &amp;quot;?P a&amp;quot;)&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix x &lt;br /&gt;
  show &amp;quot;?P (H x)&amp;quot; by simp &lt;br /&gt;
next&lt;br /&gt;
  fix x i d &lt;br /&gt;
  assume h1: &amp;quot;?P i&amp;quot;&lt;br /&gt;
  assume h2: &amp;quot;?P d&amp;quot;&lt;br /&gt;
  have &amp;quot;preOrden (espejo (N x i d)) = &lt;br /&gt;
        preOrden (N x (espejo d) (espejo i))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = [x] @ (preOrden (espejo d)) @ (preOrden (espejo i))&amp;quot; &lt;br /&gt;
    by simp&lt;br /&gt;
  also have &amp;quot;... = [x] @ rev (postOrden d) @ rev (postOrden i)&amp;quot; &lt;br /&gt;
    using h1 h2 by simp&lt;br /&gt;
  also have &amp;quot;... = [x] @ rev (postOrden i @ postOrden d)&amp;quot; by simp &lt;br /&gt;
  also have &amp;quot;... = rev ( postOrden i @ postOrden d @ [x] ) &amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = rev (postOrden (N x i d)) &amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N x i d)&amp;quot; by simp  &lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* bowma *)&lt;br /&gt;
lemma  &amp;quot;preOrden (espejo a) = rev (postOrden a)&amp;quot; (is &amp;quot;?p a&amp;quot;)&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix t&lt;br /&gt;
  show &amp;quot;?p (H t)&amp;quot; by simp&lt;br /&gt;
  (* Aquí si le diga &amp;quot;preOrden (espejo (H t)) = rev (postOrden (H t))&amp;quot;,&lt;br /&gt;
     isabelle dice: &lt;br /&gt;
  proof (prove)&lt;br /&gt;
  goal (1 subgoal):&lt;br /&gt;
  1. preOrden (espejo (H t)) = rev (postOrden (H t)) &lt;br /&gt;
  Introduced fixed type variable(s): &amp;#039;b in &amp;quot;t__&amp;quot; &lt;br /&gt;
  No entiendo porqué *)&lt;br /&gt;
next &lt;br /&gt;
  fix t i d&lt;br /&gt;
  assume H1: &amp;quot;?p i&amp;quot;&lt;br /&gt;
  assume H2: &amp;quot;?p d&amp;quot;&lt;br /&gt;
  have &amp;quot;preOrden (espejo (N t i d)) = &lt;br /&gt;
        preOrden (N t (espejo d) (espejo i))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = [t] @ (preOrden (espejo d)) @ (preOrden (espejo i))&amp;quot; &lt;br /&gt;
    by simp&lt;br /&gt;
  also have &amp;quot;... = [t] @ rev (postOrden d) @ rev (postOrden i)&amp;quot; &lt;br /&gt;
    using H1 H2 by simp&lt;br /&gt;
  finally show &amp;quot;?p (N t i d)&amp;quot; by simp&lt;br /&gt;
qed &lt;br /&gt;
&lt;br /&gt;
(* Comentario sobre tipo inducido. *)&lt;br /&gt;
&lt;br /&gt;
(* fraortmoy lucnovdos pabrodmac*)&lt;br /&gt;
lemma  &amp;quot;preOrden (espejo a) = rev (postOrden a)&amp;quot;&lt;br /&gt;
by (induct a) auto&lt;br /&gt;
&lt;br /&gt;
(*pabrodmac*)&lt;br /&gt;
lemma&lt;br /&gt;
  fixes a ::&amp;quot;&amp;#039;b arbol&amp;quot; &lt;br /&gt;
  shows &amp;quot;preOrden (espejo a) = rev (postOrden a)&amp;quot; (is &amp;quot;?P a&amp;quot;)&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix x &lt;br /&gt;
  show &amp;quot;?P (H x)&amp;quot; by simp &lt;br /&gt;
next&lt;br /&gt;
  fix x&lt;br /&gt;
  fix i assume h1: &amp;quot;?P i&amp;quot;&lt;br /&gt;
  fix d assume h2: &amp;quot;?P d&amp;quot;&lt;br /&gt;
  show &amp;quot;?P (N x i d)&amp;quot;   &lt;br /&gt;
  proof -               &lt;br /&gt;
    have &amp;quot;preOrden (espejo (N x i d)) =  &lt;br /&gt;
          preOrden(N x (espejo d) (espejo i))&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;… = [x]@rev(postOrden d)@rev(postOrden i)&amp;quot; &lt;br /&gt;
      using h1 h2 by simp&lt;br /&gt;
    also have &amp;quot;… = rev(postOrden (N x i d))&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis .&lt;br /&gt;
 qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* ferrenseg rubgonmar *)&lt;br /&gt;
lemma  &amp;quot;preOrden (espejo a) = rev (postOrden a)&amp;quot; (is &amp;quot;?P a&amp;quot;)&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix x&lt;br /&gt;
  show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x l r&lt;br /&gt;
  assume H1: &amp;quot;?P l&amp;quot;&lt;br /&gt;
  assume H2: &amp;quot;?P r&amp;quot;&lt;br /&gt;
  show &amp;quot;?P (N x l r)&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;preOrden (espejo (N x l r)) = &lt;br /&gt;
          preOrden (N x (espejo r) (espejo l))&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;… = x # (preOrden (espejo r) @ preOrden (espejo l))&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;… = x # (rev (postOrden r) @ rev (postOrden l))&amp;quot; &lt;br /&gt;
       using H1 H2 by simp &lt;br /&gt;
    also have &amp;quot;… = x # rev (postOrden l @ postOrden r)&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;… = rev ((postOrden l) @ (postOrden r) @ [x])&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;… = rev (postOrden (N x l r))&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis .&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 7. Demostrar que&lt;br /&gt;
     postOrden (espejo a) = rev (preOrden a)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* ivamenjim crigomgom bowma migtermor wilmorort juacabsou serrodcal&lt;br /&gt;
   dancorgar josgarsan*) &lt;br /&gt;
lemma &amp;quot;postOrden (espejo a) = rev (preOrden a)&amp;quot; (is &amp;quot;?P a&amp;quot;)&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix x &lt;br /&gt;
  show &amp;quot;?P (H x)&amp;quot; by simp &lt;br /&gt;
next&lt;br /&gt;
  fix x &lt;br /&gt;
  fix i assume h1: &amp;quot;?P i&amp;quot;&lt;br /&gt;
  fix d assume h2: &amp;quot;?P d&amp;quot;&lt;br /&gt;
  have &amp;quot;postOrden (espejo (N x i d)) = &lt;br /&gt;
        postOrden (N x (espejo d) (espejo i))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (postOrden (espejo d)) @ (postOrden (espejo i)) @ [x]&amp;quot; &lt;br /&gt;
    by simp&lt;br /&gt;
  also have &amp;quot;... = rev (preOrden d) @ rev (preOrden i) @ [x]&amp;quot; &lt;br /&gt;
    using h1 h2 by simp &lt;br /&gt;
  finally show &amp;quot;postOrden (espejo (N x i d)) = rev (preOrden (N x i d))&amp;quot; &lt;br /&gt;
    by simp&lt;br /&gt;
    (* &amp;quot;?p (N x i d)&amp;quot; más corto *)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* danrodcha fraortmoy *)&lt;br /&gt;
lemma &amp;quot;postOrden (espejo a) = rev (preOrden a)&amp;quot; (is &amp;quot;?P a&amp;quot;)&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix x&lt;br /&gt;
  show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x i d &lt;br /&gt;
  assume HIi: &amp;quot;?P i&amp;quot;&lt;br /&gt;
  assume HId: &amp;quot;?P d&amp;quot;&lt;br /&gt;
  show &amp;quot;?P (N x i d)&amp;quot; using HIi HId by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* pablucoto marpoldia1 jeamacpov paupeddeg rubgonmar *)&lt;br /&gt;
lemma &amp;quot;postOrden (espejo a) = rev (preOrden a)&amp;quot;  (is &amp;quot;?P a&amp;quot;)&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix x&lt;br /&gt;
  show &amp;quot;?P (H x)&amp;quot; by simp &lt;br /&gt;
next &lt;br /&gt;
  fix x i d&lt;br /&gt;
  assume H1: &amp;quot;?P i&amp;quot;&lt;br /&gt;
  assume H2: &amp;quot;?P d&amp;quot;&lt;br /&gt;
  have &amp;quot; postOrden (espejo (N x i d)) = &lt;br /&gt;
         postOrden ( N x (espejo d) (espejo i)) &amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = postOrden (espejo d) @ postOrden (espejo i) @ [x]&amp;quot; &lt;br /&gt;
    by simp&lt;br /&gt;
  also have &amp;quot;... = rev (preOrden d) @ rev (preOrden i) @ [x] &amp;quot; &lt;br /&gt;
    using H1 H2 by simp&lt;br /&gt;
  also have &amp;quot;... = rev (preOrden d) @ rev (x # preOrden i)&amp;quot;  by simp&lt;br /&gt;
  also have &amp;quot;... = rev (x # preOrden i @ preOrden d)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = rev (preOrden (N x i d)) &amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N x i d)&amp;quot; by simp&lt;br /&gt;
 qed&lt;br /&gt;
&lt;br /&gt;
(* fraortmoy lucnovdos pabrodmac paupeddeg marcarmor13 *)&lt;br /&gt;
lemma &amp;quot;postOrden (espejo a) = rev (preOrden a)&amp;quot;&lt;br /&gt;
by (induct a) auto&lt;br /&gt;
&lt;br /&gt;
(*pabrodmac*)&lt;br /&gt;
lemma&lt;br /&gt;
  fixes a ::&amp;quot;&amp;#039;b arbol&amp;quot; &lt;br /&gt;
  shows &amp;quot;postOrden (espejo a) = rev (preOrden a)&amp;quot; (is &amp;quot;?P a&amp;quot;)&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix x &lt;br /&gt;
  show &amp;quot;?P (H x)&amp;quot; by simp &lt;br /&gt;
next&lt;br /&gt;
  fix x&lt;br /&gt;
  fix i assume h1: &amp;quot;?P i&amp;quot;&lt;br /&gt;
  fix d assume h2: &amp;quot;?P d&amp;quot;&lt;br /&gt;
  show &amp;quot;?P (N x i d)&amp;quot;   &lt;br /&gt;
  proof -               &lt;br /&gt;
    have &amp;quot;postOrden (espejo (N x i d)) =  &lt;br /&gt;
          postOrden(N x (espejo d) (espejo i))&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;… = rev (preOrden d) @ rev (preOrden i) @ [x]&amp;quot; &lt;br /&gt;
      using h1 h2 by simp&lt;br /&gt;
    also have &amp;quot;… = rev (preOrden (N x i d))&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis.&lt;br /&gt;
 qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* ferrenseg *)&lt;br /&gt;
lemma &amp;quot;postOrden (espejo a) = rev (preOrden a)&amp;quot; (is &amp;quot;?P a&amp;quot;)&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix x&lt;br /&gt;
  show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x l r&lt;br /&gt;
  assume H1: &amp;quot;?P l&amp;quot;&lt;br /&gt;
  assume H2: &amp;quot;?P r&amp;quot;&lt;br /&gt;
  show &amp;quot;?P (N x l r)&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;postOrden (espejo (N x l r)) = &lt;br /&gt;
          postOrden (N x (espejo r) (espejo l))&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;… = postOrden (espejo r) @ postOrden (espejo l) @ [x]&amp;quot; &lt;br /&gt;
      by simp&lt;br /&gt;
    also have &amp;quot;… = rev (preOrden r) @ rev (preOrden l) @ [x]&amp;quot; &lt;br /&gt;
      using H1 H2 by simp&lt;br /&gt;
    also have &amp;quot;… = rev (preOrden l @ preOrden r) @ [x]&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;… = rev ([x] @ preOrden l @ preOrden r)&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;… = rev (preOrden (N x l r))&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis .&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 8. Demostrar que&lt;br /&gt;
     inOrden (espejo a) = rev (inOrden a)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* ivamenjim crigomgom bowma migtermor wilmorort juacabsou serrodcal&lt;br /&gt;
   dancorgar josgarsan *) &lt;br /&gt;
theorem &amp;quot;inOrden (espejo a) = rev (inOrden a)&amp;quot; (is &amp;quot;?P a&amp;quot;)&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix x &lt;br /&gt;
  show &amp;quot;?P (H x)&amp;quot; by simp &lt;br /&gt;
next&lt;br /&gt;
  fix x &lt;br /&gt;
  fix i assume h1: &amp;quot;?P i&amp;quot;&lt;br /&gt;
  fix d assume h2: &amp;quot;?P d&amp;quot;&lt;br /&gt;
  have &amp;quot;inOrden (espejo (N x i d)) = inOrden (N x (espejo d) (espejo i))&amp;quot; &lt;br /&gt;
    by simp&lt;br /&gt;
  also have &amp;quot;... = (inOrden (espejo d)) @ [x] @ (inOrden (espejo i))&amp;quot; &lt;br /&gt;
    by simp&lt;br /&gt;
  also have &amp;quot;... = rev (inOrden d) @ [x] @ rev (inOrden i)&amp;quot; &lt;br /&gt;
    using h1 h2 by simp &lt;br /&gt;
  finally show &amp;quot;inOrden (espejo (N x i d)) = rev (inOrden (N x i d))&amp;quot; &lt;br /&gt;
    by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* danrodcha *)&lt;br /&gt;
theorem &amp;quot;inOrden (espejo a) = rev (inOrden a)&amp;quot;&lt;br /&gt;
by (induct a) simp_all&lt;br /&gt;
&lt;br /&gt;
(* danrodcha *)&lt;br /&gt;
theorem &amp;quot;inOrden (espejo a) = rev (inOrden a)&amp;quot; (is &amp;quot;?P a&amp;quot;)&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix x&lt;br /&gt;
  show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x i d &lt;br /&gt;
  assume HIi: &amp;quot;?P i&amp;quot;&lt;br /&gt;
  assume HId: &amp;quot;?P d&amp;quot;&lt;br /&gt;
  show &amp;quot;?P (N x i d)&amp;quot; using HIi HId by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* pablucoto marpoldia1 jeamacpov paupeddeg marcarmor13*)&lt;br /&gt;
theorem &amp;quot;inOrden (espejo a) = rev (inOrden a)&amp;quot; (is &amp;quot;?P a&amp;quot;)&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix x&lt;br /&gt;
  show &amp;quot;?P (H x) &amp;quot; by simp&lt;br /&gt;
next &lt;br /&gt;
  fix x i d &lt;br /&gt;
  assume HI1: &amp;quot;?P i&amp;quot;&lt;br /&gt;
  assume HI2: &amp;quot;?P d&amp;quot;&lt;br /&gt;
  have &amp;quot;inOrden (espejo (N x i d)) = &lt;br /&gt;
        inOrden ( N x (espejo d) (espejo i) )&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = inOrden (espejo d) @ [x] @ inOrden (espejo i)&amp;quot; &lt;br /&gt;
    by simp&lt;br /&gt;
  also have &amp;quot;... = rev (inOrden d) @ [x] @ rev (inOrden i)&amp;quot; &lt;br /&gt;
    using HI1 HI2 by simp&lt;br /&gt;
  also have &amp;quot;... = rev (x # inOrden d ) @ rev (inOrden i)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = rev ( inOrden i @ x # inOrden d) &amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = rev (inOrden (N x i d))&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N x i d)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* lucnovdos pabrodmac paupeddeg fraortmoy *)&lt;br /&gt;
theorem &amp;quot;inOrden (espejo a) = rev (inOrden a)&amp;quot;&lt;br /&gt;
by (induct a) auto&lt;br /&gt;
&lt;br /&gt;
(* pabrodmac *)&lt;br /&gt;
lemma&lt;br /&gt;
  fixes a ::&amp;quot;&amp;#039;b arbol&amp;quot; &lt;br /&gt;
  shows &amp;quot;inOrden (espejo a) = rev (inOrden a)&amp;quot; (is &amp;quot;?P a&amp;quot;)&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix x &lt;br /&gt;
  show &amp;quot;?P (H x)&amp;quot; by simp &lt;br /&gt;
next&lt;br /&gt;
  fix x&lt;br /&gt;
  fix i assume h1: &amp;quot;?P i&amp;quot;&lt;br /&gt;
  fix d assume h2: &amp;quot;?P d&amp;quot;&lt;br /&gt;
  show &amp;quot;?P (N x i d)&amp;quot;   &lt;br /&gt;
  proof -               &lt;br /&gt;
    have &amp;quot;inOrden (espejo (N x i d)) =  &lt;br /&gt;
          inOrden(N x (espejo d) (espejo i))&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;… =rev(inOrden d)@[x]@rev(inOrden i)&amp;quot; using h1 h2 by simp&lt;br /&gt;
    also have &amp;quot;… =rev(inOrden (N x i d))&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis .&lt;br /&gt;
 qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* ferrenseg rubgonmar *)&lt;br /&gt;
theorem &amp;quot;inOrden (espejo a) = rev (inOrden a)&amp;quot; (is &amp;quot;?P a&amp;quot;)&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix x&lt;br /&gt;
  show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x l r  &lt;br /&gt;
  assume H1: &amp;quot;?P l&amp;quot;&lt;br /&gt;
  assume H2: &amp;quot;?P r&amp;quot;&lt;br /&gt;
  show &amp;quot;?P (N x l r)&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;inOrden (espejo (N x l r)) = &lt;br /&gt;
          inOrden (N x (espejo r) (espejo l))&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;… = inOrden (espejo r) @ [x] @ inOrden (espejo l)&amp;quot; &lt;br /&gt;
      by simp&lt;br /&gt;
    also have &amp;quot;… = rev (inOrden r) @ [x] @ rev (inOrden l)&amp;quot; &lt;br /&gt;
      using H1 H2 by simp&lt;br /&gt;
    also have &amp;quot;… = rev (inOrden l @ [x] @ inOrden r)&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;… = rev (inOrden (N x l r))&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis .&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* fraortmoy *)&lt;br /&gt;
theorem &amp;quot;inOrden (espejo a) = rev (inOrden a)&amp;quot; (is &amp;quot;?P a&amp;quot;)&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix x &lt;br /&gt;
  show &amp;quot;?P (H x)&amp;quot; by simp &lt;br /&gt;
next&lt;br /&gt;
  fix x &lt;br /&gt;
  fix i assume h1: &amp;quot;?P i&amp;quot;&lt;br /&gt;
  fix d assume h2: &amp;quot;?P d&amp;quot;&lt;br /&gt;
  show &amp;quot;inOrden (espejo (N x i d)) = rev (inOrden (N x i d))&amp;quot; &lt;br /&gt;
    using h1 h2  by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 9. Definir la función &lt;br /&gt;
     raiz :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a&amp;quot;&lt;br /&gt;
  tal que (raiz a) es la raiz del árbol a. Por ejemplo, &lt;br /&gt;
     raiz (N e (N c (H a) (H d)) (N g (H f) (H h))) = e&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* danrodcha crigomgom manmorjim1 ivamenjim bowma pablucoto &lt;br /&gt;
   migtermor marpoldia1 wilmorort lucnovdos  juacabsou serrodcal &lt;br /&gt;
   ferrenseg paupeddeg rubgonmar jeamacpov marcarmor13 fraortmoy &lt;br /&gt;
   fracorjim1 josgarsan dancorgar *)&lt;br /&gt;
fun raiz :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a&amp;quot; where&lt;br /&gt;
  &amp;quot;raiz (H x)     = x&amp;quot;&lt;br /&gt;
| &amp;quot;raiz (N x i d) = x&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;raiz (N e (N c (H a) (H d)) (N g (H f) (H h))) = e&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 10. Definir la función &lt;br /&gt;
     extremo_izquierda :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a&amp;quot;&lt;br /&gt;
  tal que (extremo_izquierda a) es el nodo más a la izquierda del árbol&lt;br /&gt;
  a. Por ejemplo,  &lt;br /&gt;
     extremo_izquierda (N e (N c (H a) (H d)) (N g (H f) (H h))) = a&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* danrodcha crigomgom manmorjim1 ivamenjim bowma pablucoto &lt;br /&gt;
   migtermor marpoldia1 wilmorort lucnovdos  juacabsou serrodcal &lt;br /&gt;
   pabrodmac ferrenseg jeamacpov paupeddeg rubgonmar marcarmor13&lt;br /&gt;
   fraortmoy fracorjim1 josgarsan dancorgar *)&lt;br /&gt;
fun extremo_izquierda :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a&amp;quot; where&lt;br /&gt;
  &amp;quot;extremo_izquierda (H x)     = x&amp;quot;&lt;br /&gt;
| &amp;quot;extremo_izquierda (N x i d) = extremo_izquierda i&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;extremo_izquierda (N e (N c (H a) (H d)) (N g (H f) (H h))) = a&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* bowma *)&lt;br /&gt;
fun extremo_izquierda_1 :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a&amp;quot; where&lt;br /&gt;
  &amp;quot;extremo_izquierda_1 (H t)     = t&amp;quot;&lt;br /&gt;
| &amp;quot;extremo_izquierda_1 (N t i d) = hd (inOrden (N t i d))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* ivamenjim *)&lt;br /&gt;
(* Metaejercicio de demostración. &lt;br /&gt;
   Llamando teorema_13 al teorema del ejercicio 13 *)&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;extremo_izquierda a = extremo_izquierda_1 a&amp;quot;&lt;br /&gt;
by (induct a, simp_all add: aux_ej12_1 teorema_13)&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 11. Definir la función &lt;br /&gt;
     extremo_derecha :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a&amp;quot;&lt;br /&gt;
  tal que (extremo_derecha a) es el nodo más a la derecha del árbol&lt;br /&gt;
  a. Por ejemplo,  &lt;br /&gt;
     extremo_derecha (N e (N c (H a) (H d)) (N g (H f) (H h))) = h&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* danrodcha crigomgom manmorjim1 ivamenjim bowma pablucoto &lt;br /&gt;
   migtermor marpoldia1 wilmorort lucnovdos  juacabsou pabrodmac &lt;br /&gt;
   serrodcal ferrenseg jeamacpov paupeddeg rubgonmar marcarmor13&lt;br /&gt;
   fraortmoy fracorjim1 josgarsan dancorgar *)&lt;br /&gt;
fun extremo_derecha :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a&amp;quot; where&lt;br /&gt;
  &amp;quot;extremo_derecha (H x) = x&amp;quot;&lt;br /&gt;
| &amp;quot;extremo_derecha (N x i d) = extremo_derecha d&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;extremo_derecha (N e (N c (H a) (H d)) (N g (H f) (H h))) = h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* bowma *)&lt;br /&gt;
fun extremo_derecha_1 :: &amp;quot;&amp;#039;a arbol ⇒ &amp;#039;a&amp;quot; where&lt;br /&gt;
  &amp;quot;extremo_derecha_1 (H t) = t&amp;quot;&lt;br /&gt;
| &amp;quot;extremo_derecha_1 (N t i d) = last (inOrden (N t i d))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* ivamenjim *)&lt;br /&gt;
(* Metaejercicio de demostración. &lt;br /&gt;
   Llamando teorema_12 al teorema del ejercicio 12 *)&lt;br /&gt;
&lt;br /&gt;
(*&lt;br /&gt;
lemma &amp;quot;extremo_derecha a = extremo_derecha_1 a&amp;quot;&lt;br /&gt;
by (induct a, simp_all add: aux_ej12_1 teorema_12)&lt;br /&gt;
*)&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 12. Demostrar o refutar&lt;br /&gt;
     last (inOrden a) = extremo_derecha a&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* danrodcha *)&lt;br /&gt;
lemma aux_ej12: &amp;quot;inOrden a ≠ []&amp;quot;&lt;br /&gt;
apply (induct a) &lt;br /&gt;
apply simp&lt;br /&gt;
apply simp&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
(* danrodcha pablucoto crigomgom  wilmorort juacabsou serrodcal &lt;br /&gt;
   rubgonmar jeamacpov marcarmor13*)&lt;br /&gt;
theorem &amp;quot;last (inOrden a) = extremo_derecha a&amp;quot; (is &amp;quot;?P a&amp;quot;)&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix x&lt;br /&gt;
  show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x i d &lt;br /&gt;
  assume HIi: &amp;quot;?P i&amp;quot;&lt;br /&gt;
  assume HId: &amp;quot;?P d&amp;quot;&lt;br /&gt;
  have &amp;quot;last (inOrden (N x i d)) = last (inOrden i @ [x] @ inOrden d)&amp;quot; &lt;br /&gt;
    by (simp only: inOrden.simps(2))&lt;br /&gt;
  also have &amp;quot;… = last (inOrden d)&amp;quot; by (simp add: aux_ej12)&lt;br /&gt;
  also have &amp;quot;… = extremo_derecha d&amp;quot; using HId by simp&lt;br /&gt;
  also have &amp;quot;… = extremo_derecha (N x i d)&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N x i d)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* ivamenjim *)&lt;br /&gt;
lemma aux_ej12_1: &amp;quot;inOrden a ≠ []&amp;quot;&lt;br /&gt;
by (induct a) simp_all &lt;br /&gt;
&lt;br /&gt;
(* ivamenjim marpoldia1 paupeddeg *)&lt;br /&gt;
(* Igual que la anterior, pero poniendo solo by simp en el primer have *)&lt;br /&gt;
theorem &amp;quot;last (inOrden a) = extremo_derecha a&amp;quot; (is &amp;quot;?P a&amp;quot;)&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix x &lt;br /&gt;
  show &amp;quot;?P (H x)&amp;quot; by simp &lt;br /&gt;
next&lt;br /&gt;
  fix x &lt;br /&gt;
  fix i assume h1: &amp;quot;?P i&amp;quot;&lt;br /&gt;
  fix d assume h2: &amp;quot;?P d&amp;quot;&lt;br /&gt;
  have &amp;quot;last (inOrden (N x i d)) = &lt;br /&gt;
        last ((inOrden i) @ [x] @ (inOrden d))&amp;quot; by simp &lt;br /&gt;
  also have &amp;quot;... = last (inOrden d)&amp;quot; by (simp add: aux_ej12_1)&lt;br /&gt;
  also have &amp;quot;... = extremo_derecha d&amp;quot; using h2 by simp &lt;br /&gt;
  finally show &amp;quot;last (inOrden (N x i d)) = extremo_derecha (N x i d)&amp;quot; &lt;br /&gt;
    by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* bowma *)&lt;br /&gt;
(* Casi lo mismo que el anterior,pero no hace falta suponer &amp;quot;?p i&amp;quot; *)&lt;br /&gt;
theorem &amp;quot;last (inOrden a) = extremo_derecha a&amp;quot; (is &amp;quot;?p a&amp;quot;)&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix t&lt;br /&gt;
  show &amp;quot;?p (H t)&amp;quot; by simp&lt;br /&gt;
next &lt;br /&gt;
  fix t i d&lt;br /&gt;
  assume HI: &amp;quot;?p d&amp;quot;&lt;br /&gt;
  have &amp;quot;last (inOrden (N t i d)) = last (inOrden i @ [t] @ inOrden d)&amp;quot; &lt;br /&gt;
    by simp&lt;br /&gt;
  also have &amp;quot;... = last (inOrden d)&amp;quot; by (simp add:aux_ej12)&lt;br /&gt;
  also have &amp;quot;... = extremo_derecha d&amp;quot; using HI by simp&lt;br /&gt;
  finally show &amp;quot;?p (N t i d)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* lucnovdos*)&lt;br /&gt;
(* El mismo que el anterior,pero sin usar patrones *)&lt;br /&gt;
theorem &amp;quot;last (inOrden a) = extremo_derecha a&amp;quot;&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix x ::&amp;quot;&amp;#039;a&amp;quot;&lt;br /&gt;
  show &amp;quot;last (inOrden (H x)) = extremo_derecha (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x   ::&amp;quot;&amp;#039;a&amp;quot;&lt;br /&gt;
  fix i d ::&amp;quot;&amp;#039;a arbol&amp;quot;&lt;br /&gt;
  assume HI: &amp;quot;last (inOrden d) = extremo_derecha d&amp;quot;&lt;br /&gt;
  have &amp;quot;last (inOrden (N x i d)) = &lt;br /&gt;
        last ((inOrden i) @ [x] @ (inOrden d))&amp;quot; by simp &lt;br /&gt;
  also have &amp;quot;… = last (inOrden d)&amp;quot; by (simp add: aux_ej12)&lt;br /&gt;
  also have &amp;quot;… = extremo_derecha d&amp;quot; using HI by simp&lt;br /&gt;
  also have &amp;quot;… = extremo_derecha (N x i d)&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;last (inOrden (N x i d)) = extremo_derecha (N x i d)&amp;quot; &lt;br /&gt;
    by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* migtermor *)&lt;br /&gt;
theorem &amp;quot;last (inOrden a) = extremo_derecha a&amp;quot; (is &amp;quot;?P a&amp;quot;)&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix h&lt;br /&gt;
  show &amp;quot;?P (H h)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix n i&lt;br /&gt;
  fix d assume HId: &amp;quot;?P d&amp;quot;&lt;br /&gt;
  have AUX: &amp;quot;¬ (inOrden d = [])&amp;quot; (is &amp;quot;?Q d&amp;quot;)&lt;br /&gt;
     proof (induct d)&lt;br /&gt;
      fix hd&lt;br /&gt;
      show &amp;quot;?Q (H hd)&amp;quot; by simp&lt;br /&gt;
     next&lt;br /&gt;
     fix nd&lt;br /&gt;
     fix id assume HIid: &amp;quot;?Q id&amp;quot;&lt;br /&gt;
     fix dd assume HIdd: &amp;quot;?Q dd&amp;quot;&lt;br /&gt;
     show &amp;quot;?Q (N nd id dd)&amp;quot; using HIid HIdd by simp&lt;br /&gt;
     qed&lt;br /&gt;
  have &amp;quot;last (inOrden (N n i d)) = last (inOrden i @[n]@inOrden d)&amp;quot; &lt;br /&gt;
    by simp&lt;br /&gt;
  also have &amp;quot;… = last (inOrden d)&amp;quot; using AUX by simp&lt;br /&gt;
  also have &amp;quot;… = extremo_derecha d&amp;quot; using HId by simp&lt;br /&gt;
  finally show &amp;quot;?P (N n i d)&amp;quot;  by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* pabrodmac fraortmoy *)&lt;br /&gt;
lemma Aux_ej12: &amp;quot;inOrden a ≠ []&amp;quot;&lt;br /&gt;
by (induct a) auto&lt;br /&gt;
&lt;br /&gt;
(* pabrodmac fraortmoy *)&lt;br /&gt;
theorem &amp;quot;last (inOrden a) = extremo_derecha a&amp;quot;&lt;br /&gt;
by (induct a)(auto simp add: Aux_ej12)&lt;br /&gt;
&lt;br /&gt;
(* pabrodmac *)&lt;br /&gt;
lemma&lt;br /&gt;
  fixes a ::&amp;quot;&amp;#039;b arbol&amp;quot; &lt;br /&gt;
  shows &amp;quot;last (inOrden a) = extremo_derecha a&amp;quot; (is &amp;quot;?P a&amp;quot;)&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix x &lt;br /&gt;
  show &amp;quot;?P (H x)&amp;quot; by simp &lt;br /&gt;
next&lt;br /&gt;
  fix x&lt;br /&gt;
  fix i assume h1: &amp;quot;?P i&amp;quot;&lt;br /&gt;
  fix d assume h2: &amp;quot;?P d&amp;quot;&lt;br /&gt;
  show &amp;quot;?P (N x i d)&amp;quot;   &lt;br /&gt;
  proof -               &lt;br /&gt;
    have &amp;quot;last (inOrden (N x i d)) = last((inOrden i)@ [x] @ (inOrden d))&amp;quot; &lt;br /&gt;
      by simp&lt;br /&gt;
    also have &amp;quot;… = last(inOrden d)&amp;quot; by (simp add: Aux_ej12)&lt;br /&gt;
    also have &amp;quot;… = extremo_derecha d&amp;quot; using h1 h2 by simp&lt;br /&gt;
    also have &amp;quot;… = extremo_derecha (N x i d)&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis .&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* ferrenseg *)&lt;br /&gt;
theorem &amp;quot;last (inOrden a) = extremo_derecha a&amp;quot; (is &amp;quot;?P a&amp;quot;)&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix x&lt;br /&gt;
  show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x l r&lt;br /&gt;
  assume HI: &amp;quot;?P r&amp;quot;&lt;br /&gt;
  show &amp;quot;?P (N x l r)&amp;quot;&lt;br /&gt;
  proof -  &lt;br /&gt;
    have &amp;quot;last (inOrden (N x l r)) = &lt;br /&gt;
          last (inOrden r @ [x] @ inOrden r)&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;… = last (inOrden r)&amp;quot;  by (simp add: inOrden)&lt;br /&gt;
    also have &amp;quot;… = extremo_derecha r&amp;quot; using HI by simp&lt;br /&gt;
    also have &amp;quot;… =  extremo_derecha (N x l r)&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis .&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* fraortmoy *)&lt;br /&gt;
lemma&lt;br /&gt;
  fixes a ::&amp;quot;&amp;#039;b arbol&amp;quot; &lt;br /&gt;
  shows &amp;quot;last (inOrden a) = extremo_derecha a&amp;quot; (is &amp;quot;?P a&amp;quot;)&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix x &lt;br /&gt;
  show &amp;quot;?P (H x)&amp;quot; by simp &lt;br /&gt;
next&lt;br /&gt;
  fix x&lt;br /&gt;
  fix i assume h1: &amp;quot;?P i&amp;quot;&lt;br /&gt;
  fix d assume h2: &amp;quot;?P d&amp;quot;&lt;br /&gt;
  show &amp;quot;?P (N x i d)&amp;quot; using h1 h2 by (simp add: Aux_ej12)  &lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* dancorgar *)&lt;br /&gt;
theorem &amp;quot;last (inOrden a) = extremo_derecha a&amp;quot; (is &amp;quot;?P a&amp;quot;)&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix t&lt;br /&gt;
  show &amp;quot;?P (H t)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix t i d&lt;br /&gt;
  assume H2: &amp;quot;?P d&amp;quot;&lt;br /&gt;
  have &amp;quot;last (inOrden (N t i d)) = last ((inOrden i)@[t]@(inOrden d))&amp;quot; &lt;br /&gt;
    by simp&lt;br /&gt;
  also have &amp;quot;… = last (inOrden d)&amp;quot;&lt;br /&gt;
  proof (induct d)&lt;br /&gt;
    fix x&lt;br /&gt;
    show &amp;quot;last (inOrden i @ [t] @ inOrden (H x)) = last (inOrden (H x))&amp;quot; &lt;br /&gt;
      by simp&lt;br /&gt;
  next&lt;br /&gt;
    fix x1a d1 d2&lt;br /&gt;
    show &amp;quot;last (inOrden i @ [t] @ inOrden (N x1a d1 d2)) = &lt;br /&gt;
          last (inOrden (N x1a d1 d2))&amp;quot; by simp&lt;br /&gt;
  qed&lt;br /&gt;
  finally show &amp;quot;last (inOrden (N t i d)) = extremo_derecha (N t i d)&amp;quot; &lt;br /&gt;
    using H2 by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 13. Demostrar o refutar&lt;br /&gt;
     hd (inOrden a) = extremo_izquierda a&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* danrodcha pablucoto crigomgom juacabsou serrodcal jeamacpov&lt;br /&gt;
   marcarmor13 *) &lt;br /&gt;
theorem &amp;quot;hd (inOrden a) = extremo_izquierda a&amp;quot; (is &amp;quot;?P a&amp;quot;)&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix x&lt;br /&gt;
  show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x i d &lt;br /&gt;
  assume HIi: &amp;quot;?P i&amp;quot;&lt;br /&gt;
  assume HId: &amp;quot;?P d&amp;quot;&lt;br /&gt;
  have &amp;quot;hd (inOrden (N x i d)) = hd (inOrden i @ [x] @ inOrden d)&amp;quot; &lt;br /&gt;
    by (simp only: inOrden.simps(2))&lt;br /&gt;
  also have &amp;quot;… = hd (inOrden i)&amp;quot; by (simp add: aux_ej12)&lt;br /&gt;
  also have &amp;quot;… = extremo_izquierda i&amp;quot; using HIi by simp&lt;br /&gt;
  also have &amp;quot;… = extremo_izquierda (N x i d)&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N x i d)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* bowma lucnovdos dancorgar *)&lt;br /&gt;
theorem &amp;quot;hd (inOrden a) = extremo_izquierda a&amp;quot; (is &amp;quot;?p a&amp;quot;)&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix t&lt;br /&gt;
  show &amp;quot;?p (H t)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix t i d &lt;br /&gt;
  assume HI: &amp;quot;?p i&amp;quot;&lt;br /&gt;
  have &amp;quot;hd (inOrden (N t i d)) = hd (inOrden i @ [t] @ inOrden d)&amp;quot; &lt;br /&gt;
    by simp&lt;br /&gt;
  also have &amp;quot;… = hd (inOrden i)&amp;quot; by (simp add: aux_ej12)&lt;br /&gt;
  also have &amp;quot;… = extremo_izquierda i&amp;quot; using HI by simp&lt;br /&gt;
  finally show &amp;quot;?p (N t i d)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* migtermor *)&lt;br /&gt;
theorem &amp;quot;hd (inOrden a) = extremo_izquierda a&amp;quot; (is &amp;quot;?P a&amp;quot;)&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix h&lt;br /&gt;
  show &amp;quot;?P (H h)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix n d&lt;br /&gt;
  fix i assume HId: &amp;quot;?P i&amp;quot;&lt;br /&gt;
  have AUX: &amp;quot;¬ (inOrden i = [])&amp;quot; (is &amp;quot;?Q i&amp;quot;)&lt;br /&gt;
     proof (induct i)&lt;br /&gt;
      fix hi&lt;br /&gt;
      show &amp;quot;?Q (H hi)&amp;quot; by simp&lt;br /&gt;
     next&lt;br /&gt;
     fix ni&lt;br /&gt;
     fix ii assume HIid: &amp;quot;?Q ii&amp;quot;&lt;br /&gt;
     fix di assume HIdd: &amp;quot;?Q di&amp;quot;&lt;br /&gt;
     show &amp;quot;?Q (N ni ii di)&amp;quot; using HIid HIdd by simp&lt;br /&gt;
     qed&lt;br /&gt;
  have &amp;quot;hd (inOrden (N n i d)) = hd (inOrden i @[n]@inOrden d)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;… = hd (inOrden i)&amp;quot; using AUX by simp&lt;br /&gt;
  also have &amp;quot;… = extremo_izquierda i&amp;quot; using HId by simp&lt;br /&gt;
  finally show &amp;quot;?P (N n i d)&amp;quot;  by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* ivamenjim marpoldia1 wilmorort paupeddeg rubgonmar *)&lt;br /&gt;
theorem &amp;quot;hd (inOrden a) = extremo_izquierda a&amp;quot; (is &amp;quot;?P a&amp;quot;)&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix x &lt;br /&gt;
  show &amp;quot;?P (H x)&amp;quot; by simp &lt;br /&gt;
next&lt;br /&gt;
  fix x &lt;br /&gt;
  fix i assume h1: &amp;quot;?P i&amp;quot;&lt;br /&gt;
  fix d assume h2: &amp;quot;?P d&amp;quot;&lt;br /&gt;
  have &amp;quot;hd (inOrden (N x i d)) = hd ((inOrden i) @ [x] @ (inOrden d))&amp;quot; &lt;br /&gt;
    by simp&lt;br /&gt;
  also have &amp;quot;... = hd (inOrden i)&amp;quot; by (simp add: aux_ej12_1)&lt;br /&gt;
  also have &amp;quot;... = extremo_izquierda i&amp;quot; using h1 by simp &lt;br /&gt;
  finally show &amp;quot;hd (inOrden (N x i d)) = extremo_izquierda (N x i d)&amp;quot; &lt;br /&gt;
    by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* pabrodmac paupeddeg*)&lt;br /&gt;
theorem &amp;quot;hd (inOrden a) = extremo_izquierda a&amp;quot;&lt;br /&gt;
by (induct a)(auto simp add: Aux_ej12)&lt;br /&gt;
&lt;br /&gt;
(* pabrodmac *)&lt;br /&gt;
lemma&lt;br /&gt;
  fixes a ::&amp;quot;&amp;#039;b arbol&amp;quot; &lt;br /&gt;
  shows &amp;quot;hd (inOrden a) = extremo_izquierda a&amp;quot; (is &amp;quot;?P a&amp;quot;)&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix x &lt;br /&gt;
  show &amp;quot;?P (H x)&amp;quot; by simp &lt;br /&gt;
next&lt;br /&gt;
  fix x&lt;br /&gt;
  fix i assume h1: &amp;quot;?P i&amp;quot;&lt;br /&gt;
  fix d assume h2: &amp;quot;?P d&amp;quot;&lt;br /&gt;
  show &amp;quot;?P (N x i d)&amp;quot;   &lt;br /&gt;
  proof -               &lt;br /&gt;
    have &amp;quot;hd (inOrden (N x i d)) =  hd((inOrden i)@ [x] @ (inOrden d))&amp;quot; &lt;br /&gt;
      by simp&lt;br /&gt;
    also have &amp;quot;… = hd (inOrden i)&amp;quot;  by (simp add: Aux_ej12)&lt;br /&gt;
    also have &amp;quot;… = extremo_izquierda i&amp;quot; using h1 h2 by simp&lt;br /&gt;
    also have &amp;quot;… = extremo_izquierda (N x i d)&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis .&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* ferrenseg *)&lt;br /&gt;
theorem &amp;quot;hd (inOrden a) = extremo_izquierda a&amp;quot; (is &amp;quot;?P a&amp;quot;)&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix x&lt;br /&gt;
  show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x l r&lt;br /&gt;
  assume HI: &amp;quot;?P l&amp;quot;&lt;br /&gt;
  show &amp;quot;?P (N x l r)&amp;quot;&lt;br /&gt;
  proof - &lt;br /&gt;
    have &amp;quot;hd (inOrden (N x l r)) = &lt;br /&gt;
          hd (inOrden l @ [x] @ inOrden r)&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;… = hd (inOrden l)&amp;quot;  by (simp add: Aux_ej12)&lt;br /&gt;
    also have &amp;quot;… = extremo_izquierda l&amp;quot; using HI by simp&lt;br /&gt;
    also have &amp;quot;… = extremo_izquierda (N x l r)&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis .&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* fraortmoy *)&lt;br /&gt;
theorem &amp;quot;hd (inOrden a) = extremo_izquierda a&amp;quot; (is &amp;quot;?P a&amp;quot;)&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix x&lt;br /&gt;
  show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x i d&lt;br /&gt;
  assume h1: &amp;quot;?P i&amp;quot;&lt;br /&gt;
  assume h2: &amp;quot;?P d&amp;quot;&lt;br /&gt;
  show &amp;quot;?P (N x i d)&amp;quot; using h1 h2 by (simp add: Aux_ej12)&lt;br /&gt;
qed &lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 14. Demostrar o refutar&lt;br /&gt;
     hd (preOrden a) = last (postOrden a)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* danrodcha pabrodmac dancorgar *)&lt;br /&gt;
theorem &amp;quot;hd (preOrden a) = last (postOrden a)&amp;quot; (is &amp;quot;?P a&amp;quot;)&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix x&lt;br /&gt;
  show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
  fix x i d&lt;br /&gt;
  show &amp;quot;?P (N x i d)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* danrodcha *)&lt;br /&gt;
theorem &amp;quot;hd (preOrden1 a) = last (postOrden a)&amp;quot; (is &amp;quot;?P a&amp;quot;)&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix x&lt;br /&gt;
  show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
  fix x i d&lt;br /&gt;
  assume HIi: &amp;quot;?P i&amp;quot;&lt;br /&gt;
  assume HId: &amp;quot;?P d&amp;quot;&lt;br /&gt;
  have &amp;quot;hd (preOrden1 (N x i d)) = hd (x#preOrden1 i @ preOrden1 d)&amp;quot;&lt;br /&gt;
    by (simp only: preOrden1.simps(2))&lt;br /&gt;
  also have &amp;quot;… = x&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;… = last (postOrden i @ postOrden d @ [x])&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;… = last (postOrden (N x i d))&amp;quot; &lt;br /&gt;
    by (simp only: postOrden.simps(2))&lt;br /&gt;
  finally show &amp;quot;?P (N x i d)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* pablucoto crigomgom bowma marpoldia1 wilmorort lucnovdos juacabsou&lt;br /&gt;
   jeamacpov paupeddeg rubgonmar marcarmor13*) &lt;br /&gt;
(*Similar al anterior*) &lt;br /&gt;
theorem &amp;quot;hd (preOrden a) = last (postOrden a)&amp;quot; (is &amp;quot;?P a&amp;quot;)&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix x&lt;br /&gt;
  show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next   &lt;br /&gt;
  fix x i d&lt;br /&gt;
  assume HI1: &amp;quot;?P i&amp;quot;&lt;br /&gt;
  assume HI2: &amp;quot;?P d&amp;quot;&lt;br /&gt;
  have &amp;quot; hd (preOrden (N x i d)) = hd ([x] @ preOrden i @ preOrden d)&amp;quot;  &lt;br /&gt;
    by simp&lt;br /&gt;
  also have &amp;quot;... = x&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = last ( postOrden i @ postOrden d @ [x]) &amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = last ( postOrden (N x i d) )&amp;quot; by simp  &lt;br /&gt;
  finally show &amp;quot;?P (N x i d)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* migtermor *)&lt;br /&gt;
theorem &amp;quot;hd (preOrden a) = last (postOrden a)&amp;quot; (is &amp;quot;?P a&amp;quot;)&lt;br /&gt;
proof (induct a)&lt;br /&gt;
 fix h&lt;br /&gt;
 show &amp;quot;?P (H h)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
 fix n i d&lt;br /&gt;
 have &amp;quot;hd (preOrden (N n (i :: &amp;#039;a arbol) (d :: &amp;#039;a arbol))) = &lt;br /&gt;
       hd ([n]@preOrden i@preOrden d)&amp;quot; by simp&lt;br /&gt;
 (* Si no especifico que i y d son árboles, salta un error de tipo. &lt;br /&gt;
    Supongo que será por no haber asumido hipótesis sobre ellos *)&lt;br /&gt;
 also have &amp;quot;… = last (postOrden (N n i d))&amp;quot; by simp&lt;br /&gt;
 show &amp;quot;?P (N n i d)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* ivamenjim serrodcal *)&lt;br /&gt;
theorem &amp;quot;hd (preOrden a) = last (postOrden a)&amp;quot; (is &amp;quot;?P a&amp;quot;)&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix x &lt;br /&gt;
  show &amp;quot;?P (H x)&amp;quot; by simp &lt;br /&gt;
next&lt;br /&gt;
  fix x &lt;br /&gt;
  fix i assume h1: &amp;quot;?P i&amp;quot;&lt;br /&gt;
  fix d assume h2: &amp;quot;?P d&amp;quot;&lt;br /&gt;
  have &amp;quot;hd (preOrden (N x i d)) = hd ([x] @ (preOrden i) @ (preOrden d))&amp;quot; &lt;br /&gt;
    by simp&lt;br /&gt;
  also have &amp;quot;... = hd ([x])&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;hd (preOrden (N x i d)) = last (postOrden (N x i d))&amp;quot; &lt;br /&gt;
    by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* pabrodmac paupeddeg fraortmoy *)&lt;br /&gt;
theorem &amp;quot;hd (preOrden a) = last (postOrden a)&amp;quot;&lt;br /&gt;
by (induct a) auto  &lt;br /&gt;
&lt;br /&gt;
(* pabrodmac *)&lt;br /&gt;
lemma&lt;br /&gt;
  fixes a ::&amp;quot;&amp;#039;b arbol&amp;quot; &lt;br /&gt;
  shows &amp;quot;hd (preOrden a) = last (postOrden a)&amp;quot; (is &amp;quot;?P a&amp;quot;)&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix x &lt;br /&gt;
  show &amp;quot;?P (H x)&amp;quot; by simp &lt;br /&gt;
next&lt;br /&gt;
  fix x&lt;br /&gt;
  fix i assume h1: &amp;quot;?P i&amp;quot;&lt;br /&gt;
  fix d assume h2: &amp;quot;?P d&amp;quot;&lt;br /&gt;
  show &amp;quot;?P (N x i d)&amp;quot;   &lt;br /&gt;
  proof -               &lt;br /&gt;
    have &amp;quot;hd (preOrden (N x i d) )= x&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;… = last (postOrden (N x i d))&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis .&lt;br /&gt;
 qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* Me he dado cuenta que no es necesario asumir ninguna hipótesis de&lt;br /&gt;
   inducción puesto que no es necesario utilizarlas, así que no se si&lt;br /&gt;
   está bien hecho puesto que no se aplicaría inducción *)  &lt;br /&gt;
&lt;br /&gt;
(* ferrenseg *)&lt;br /&gt;
theorem &amp;quot;hd (preOrden a) = last (postOrden a)&amp;quot; (is &amp;quot;?P a&amp;quot;)&lt;br /&gt;
proof (cases a)&lt;br /&gt;
  fix x&lt;br /&gt;
  assume &amp;quot;a = H x&amp;quot;&lt;br /&gt;
  then show &amp;quot;?P a&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x l r&lt;br /&gt;
  assume H: &amp;quot;a = N x l r&amp;quot;&lt;br /&gt;
  show &amp;quot;?P a&amp;quot;&lt;br /&gt;
  proof - &lt;br /&gt;
    have &amp;quot;hd (preOrden a) = hd (preOrden (N x l r))&amp;quot; using H by simp&lt;br /&gt;
    also have &amp;quot;… = hd (x # (preOrden l @ preOrden r))&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;… = x&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;… = last (postOrden l @ postOrden r @ [x])&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;… = last (postOrden (N x l r))&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;… = last (postOrden a)&amp;quot; using H by simp&lt;br /&gt;
    finally show ?thesis .&lt;br /&gt;
  qed&lt;br /&gt;
qed  &lt;br /&gt;
&lt;br /&gt;
(* fraortmoy *)&lt;br /&gt;
theorem &amp;quot;hd (preOrden a) = last (postOrden a)&amp;quot;&lt;br /&gt;
apply (induct a)&lt;br /&gt;
apply simp&lt;br /&gt;
apply simp&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
(* fraortmoy *)&lt;br /&gt;
(* como ya se ha comentado antes, no se usan hipótesis de inducción *)&lt;br /&gt;
theorem &amp;quot;hd (preOrden a) = last (postOrden a)&amp;quot; (is &amp;quot;?P a&amp;quot;)&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix x&lt;br /&gt;
  show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x i d&lt;br /&gt;
  show &amp;quot;?P (N x i d)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 15. Demostrar o refutar&lt;br /&gt;
     hd (preOrden a) = raiz a&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* danrodcha *)&lt;br /&gt;
theorem &amp;quot;hd (preOrden1 a) = raiz a&amp;quot; (is &amp;quot;?P a&amp;quot;)&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix x&lt;br /&gt;
  show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next  &lt;br /&gt;
  fix x i d&lt;br /&gt;
  assume HIi: &amp;quot;?P i&amp;quot;&lt;br /&gt;
  assume HId: &amp;quot;?P d&amp;quot;&lt;br /&gt;
  have &amp;quot;hd (preOrden1 (N x i d)) = hd (x#preOrden1 i @ preOrden1 d)&amp;quot;&lt;br /&gt;
    by (simp only: preOrden1.simps(2))&lt;br /&gt;
  also have &amp;quot;… = x&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;… = raiz (N x i d)&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N x i d)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* danrodcha pabrodmac dancorgar *)&lt;br /&gt;
theorem &amp;quot;hd (preOrden a) = raiz a&amp;quot; (is &amp;quot;?P a&amp;quot;)&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix x&lt;br /&gt;
  show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
  fix x i d&lt;br /&gt;
  show &amp;quot;?P (N x i d)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* pablucoto crigomgom ivamenjim marpoldia1 wilmorort lucnovdos&lt;br /&gt;
   juacabsou serrodcal jeamacpov paupeddeg rubgonmar marcarmor13 *) &lt;br /&gt;
theorem &amp;quot;hd (preOrden a) = raiz a&amp;quot; (is &amp;quot;?P a&amp;quot;)&lt;br /&gt;
proof (induct a) &lt;br /&gt;
  fix x&lt;br /&gt;
  show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x i d&lt;br /&gt;
  assume HI1: &amp;quot; ?P i&amp;quot;&lt;br /&gt;
  assume HI2: &amp;quot; ?P d&amp;quot;&lt;br /&gt;
  have &amp;quot; hd (preOrden (N x i d)) = hd ([x] @ preOrden i @ preOrden d) &amp;quot; &lt;br /&gt;
    by simp&lt;br /&gt;
  also have &amp;quot;... = x&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = raiz (N x i d)&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot; ?P (N x i d)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* bowma *)&lt;br /&gt;
(* similar al anterior pero sin suponer &amp;quot;?p d&amp;quot; *)&lt;br /&gt;
theorem &amp;quot;hd (preOrden a) = last (postOrden a)&amp;quot; (is &amp;quot;?p a&amp;quot;)&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix t&lt;br /&gt;
  show &amp;quot;?p (H t)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix t i d&lt;br /&gt;
  assume HI: &amp;quot;?p i&amp;quot;&lt;br /&gt;
  have &amp;quot;hd (preOrden (N t i d)) = hd ([t] @ preOrden i @ preOrden d)&amp;quot; &lt;br /&gt;
    by simp&lt;br /&gt;
  also have &amp;quot;… = t&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;… = last (postOrden i @ postOrden d @ [t])&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;… = last (postOrden (N t i d))&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?p (N t i d)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* migtermor *)&lt;br /&gt;
theorem &amp;quot;hd (preOrden a) = raiz a&amp;quot; (is &amp;quot;?P a&amp;quot;)&lt;br /&gt;
proof (induct a)&lt;br /&gt;
 fix h&lt;br /&gt;
 show &amp;quot;?P (H h)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
 fix n i d&lt;br /&gt;
 have &amp;quot;hd (preOrden (N n (i :: &amp;#039;a arbol) (d :: &amp;#039;a arbol))) = &lt;br /&gt;
       hd ([n]@preOrden i@preOrden d)&amp;quot; by simp&lt;br /&gt;
 also have &amp;quot;… = raiz (N n i d)&amp;quot; by simp&lt;br /&gt;
 finally show &amp;quot;?P (N n i d)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* ivamenjim: sin usar patrones *)&lt;br /&gt;
theorem &amp;quot;hd (preOrden a) = raiz a&amp;quot; &lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix x ::&amp;quot;&amp;#039;a&amp;quot;&lt;br /&gt;
  show &amp;quot;hd (preOrden (H x)) = raiz (H x)&amp;quot; by simp &lt;br /&gt;
next&lt;br /&gt;
  fix x ::&amp;quot;&amp;#039;a&amp;quot;&lt;br /&gt;
  fix i ::&amp;quot;&amp;#039;a arbol&amp;quot; assume h1: &amp;quot;hd (preOrden i) = raiz i&amp;quot;&lt;br /&gt;
  fix d ::&amp;quot;&amp;#039;a arbol&amp;quot; assume h2: &amp;quot;hd (preOrden d) = raiz d&amp;quot;&lt;br /&gt;
  have &amp;quot;hd (preOrden (N x i d)) = hd ([x] @ (preOrden i) @ (preOrden d))&amp;quot; &lt;br /&gt;
    by simp&lt;br /&gt;
  also have &amp;quot;... = hd ([x])&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;hd (preOrden (N x i d)) = raiz (N x i d)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* pabrodmac paupeddeg fraortmoy *)&lt;br /&gt;
theorem &amp;quot;hd (preOrden a) = raiz a&amp;quot;&lt;br /&gt;
by (induct a) auto&lt;br /&gt;
&lt;br /&gt;
(* pabrodmac *)&lt;br /&gt;
lemma&lt;br /&gt;
  fixes a ::&amp;quot;&amp;#039;b arbol&amp;quot; &lt;br /&gt;
  shows &amp;quot;hd (preOrden a) = raiz a&amp;quot; (is &amp;quot;?P a&amp;quot;)&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix x &lt;br /&gt;
  show &amp;quot;?P (H x)&amp;quot; by simp &lt;br /&gt;
next&lt;br /&gt;
  fix x&lt;br /&gt;
  fix i assume h1: &amp;quot;?P i&amp;quot;&lt;br /&gt;
  fix d assume h2: &amp;quot;?P d&amp;quot;&lt;br /&gt;
  show &amp;quot;?P (N x i d)&amp;quot;   &lt;br /&gt;
  proof -               &lt;br /&gt;
    have &amp;quot;hd (preOrden (N x i d) )= x&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;… = raiz (N x i d)&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis .&lt;br /&gt;
 qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* Me he dado cuenta que no es necesario asumir ninguna hipótesis de&lt;br /&gt;
   inducción puesto que no es necesario utilizarlas, así que no se si&lt;br /&gt;
   está bien hecho puesto que no se aplicaría inducción *)  &lt;br /&gt;
&lt;br /&gt;
(* ferrenseg *)&lt;br /&gt;
theorem &amp;quot;hd (preOrden a) = raiz a&amp;quot; (is &amp;quot;?P a&amp;quot;)&lt;br /&gt;
proof (cases a)&lt;br /&gt;
  fix x&lt;br /&gt;
  assume &amp;quot;a = H x&amp;quot;&lt;br /&gt;
  then show &amp;quot;?P a&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x l r&lt;br /&gt;
  assume H: &amp;quot;a = N x l r&amp;quot;&lt;br /&gt;
  show &amp;quot;?P a&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;hd (preOrden a) = hd (preOrden (N x l r))&amp;quot; using H by simp&lt;br /&gt;
    also have &amp;quot;… = hd (x#(preOrden l @ preOrden r))&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;… = x&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;… = raiz (N x l r)&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;… = raiz a&amp;quot; using H by simp&lt;br /&gt;
    finally show ?thesis .&lt;br /&gt;
  qed&lt;br /&gt;
qed  &lt;br /&gt;
&lt;br /&gt;
(* fraortmoy *)&lt;br /&gt;
theorem &amp;quot;hd (preOrden a) = raiz a&amp;quot;&lt;br /&gt;
  apply (induct a)&lt;br /&gt;
  apply simp&lt;br /&gt;
  apply simp&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
(* fraortmoy *)&lt;br /&gt;
theorem &amp;quot;hd (preOrden a) = raiz  a&amp;quot; (is &amp;quot;?P a&amp;quot;)&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix x&lt;br /&gt;
  show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x i d&lt;br /&gt;
  show &amp;quot;?P (N x i d)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 16. Demostrar o refutar&lt;br /&gt;
     hd (inOrden a) = raiz a&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* crigomgom pablucoto bowma migtermor ivamenjim wilmorort lucnovdos&lt;br /&gt;
   juacabsou pabrodmac serrodcal ferrenseg jeamacpov paupeddeg rubgonmar&lt;br /&gt;
   marcarmor13 fraortmoy dancorgar *)  &lt;br /&gt;
theorem &amp;quot;hd (inOrden a) = raiz a&amp;quot;&lt;br /&gt;
quickcheck&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
(* danrodcha:&lt;br /&gt;
Auto Quickcheck found a counterexample:&lt;br /&gt;
  a = N a1 (H a2) (H a1)&lt;br /&gt;
Evaluated terms:&lt;br /&gt;
  hd (inOrden a) = a2&lt;br /&gt;
  raiz a = a1 *)&lt;br /&gt;
&lt;br /&gt;
(* ivamenjim marpoldia1 *)&lt;br /&gt;
theorem &amp;quot;hd (inOrden a) = raiz a&amp;quot; (is &amp;quot;?P a&amp;quot;)&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix x &lt;br /&gt;
  show &amp;quot;?P (H x)&amp;quot; by simp &lt;br /&gt;
next&lt;br /&gt;
  fix x &lt;br /&gt;
  fix i assume h1: &amp;quot;?P i&amp;quot;&lt;br /&gt;
  fix d assume h2: &amp;quot;?P d&amp;quot;&lt;br /&gt;
  have &amp;quot;hd (inOrden (N x i d)) = hd ((inOrden i) @ [x] @ (inOrden d))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = hd (inOrden i)&amp;quot; by (simp add: aux_ej12_1) &lt;br /&gt;
  (* Perdemos la x, luego se refuta el enunciado del teorema *)&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 17. Demostrar o refutar&lt;br /&gt;
     last (postOrden a) = raiz a&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* danrodcha pabrodmac dancorgar *)&lt;br /&gt;
theorem &amp;quot;last (postOrden a) = raiz a&amp;quot; (is &amp;quot;?P a&amp;quot;)&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix x&lt;br /&gt;
  show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
  fix x i d&lt;br /&gt;
  show &amp;quot;?P (N x i d)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* danrodcha *)&lt;br /&gt;
theorem &amp;quot;last (postOrden a) = raiz a&amp;quot; (is &amp;quot;?P a&amp;quot;)&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix x&lt;br /&gt;
  show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
  fix x i d&lt;br /&gt;
  assume HIi: &amp;quot;?P i&amp;quot;&lt;br /&gt;
  assume HId: &amp;quot;?P d&amp;quot;&lt;br /&gt;
  have &amp;quot;last (postOrden (N x i d)) = &lt;br /&gt;
        last (postOrden i @ postOrden d @ [x])&amp;quot;&lt;br /&gt;
    by (simp only: postOrden.simps(2))&lt;br /&gt;
  also have &amp;quot;… = x&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;… = raiz (N x i d)&amp;quot; by (simp only: raiz.simps(2))&lt;br /&gt;
  finally show &amp;quot;?P (N x i d)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* pablucoto crigomgom ivamenjim marpoldia1 wilmorort lucnovdos&lt;br /&gt;
   juacabsou serrodcal jeamacpov paupeddeg rubgonmar marcarmor13 *) &lt;br /&gt;
(* Similar al anterior *) &lt;br /&gt;
theorem &amp;quot;last (postOrden a) = raiz a&amp;quot; (is &amp;quot;?P a&amp;quot;)&lt;br /&gt;
proof (induct a )&lt;br /&gt;
  fix x&lt;br /&gt;
  show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next &lt;br /&gt;
  fix x i d&lt;br /&gt;
  assume HI1: &amp;quot;?P i&amp;quot;&lt;br /&gt;
  assume HI2: &amp;quot;?P d&amp;quot;&lt;br /&gt;
  have &amp;quot;last (postOrden (N x i d)) = &lt;br /&gt;
        last ( postOrden i @ postOrden d @ [x])&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = x&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = raiz (N x i d) &amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot; ?P (N x i d)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* bowma *)&lt;br /&gt;
(* También sin usar el supuesto &amp;quot;?p d&amp;quot; *)&lt;br /&gt;
theorem &amp;quot;last (postOrden a) = raiz a&amp;quot; (is &amp;quot;?p a&amp;quot;)&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix t&lt;br /&gt;
  show &amp;quot;?p (H t)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix t i d&lt;br /&gt;
  assume &amp;quot;?p i&amp;quot;&lt;br /&gt;
  (* si quito este supuesto, hay error pero no sé dónde se lo está&lt;br /&gt;
     usando *) &lt;br /&gt;
  have &amp;quot;last (postOrden (N t i d)) = &lt;br /&gt;
        last (postOrden i @ postOrden d @ [t])&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = t&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = raiz (N t i d)&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?p (N t i d)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* migtermor *)&lt;br /&gt;
theorem &amp;quot;last (postOrden a) = raiz a&amp;quot; (is &amp;quot;?P a&amp;quot;)&lt;br /&gt;
proof (induct a)&lt;br /&gt;
 fix h&lt;br /&gt;
 show &amp;quot;?P (H h)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
 fix n i d&lt;br /&gt;
 have &amp;quot;last (postOrden (N n (i :: &amp;#039;a arbol) (d :: &amp;#039;a arbol))) = &lt;br /&gt;
       last (postOrden i@postOrden d@[n])&amp;quot; by simp&lt;br /&gt;
 also have &amp;quot;… = raiz (N n i d)&amp;quot; by simp&lt;br /&gt;
 finally show &amp;quot;?P (N n i d)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* ivamenjim: sin usar patrones *)&lt;br /&gt;
theorem &amp;quot;last (postOrden a) = raiz a&amp;quot; &lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix x::&amp;quot;&amp;#039;a&amp;quot; &lt;br /&gt;
  show &amp;quot;last (postOrden (H x)) = raiz (H x)&amp;quot; by simp &lt;br /&gt;
next&lt;br /&gt;
  fix x::&amp;quot;&amp;#039;a&amp;quot;  &lt;br /&gt;
  fix i::&amp;quot;&amp;#039;a arbol&amp;quot; assume h1: &amp;quot;last (postOrden i) = raiz i&amp;quot;&lt;br /&gt;
  fix d::&amp;quot;&amp;#039;a arbol&amp;quot; assume h2: &amp;quot;last (postOrden d) = raiz d&amp;quot;&lt;br /&gt;
  have &amp;quot;last (postOrden (N x i d)) = &lt;br /&gt;
        last ((postOrden i) @ (postOrden d) @ [x])&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = last ([x])&amp;quot; by simp &lt;br /&gt;
  finally show &amp;quot;last (postOrden (N x i d)) = raiz (N x i d)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* pabrodmac paupeddeg fraortmoy *)&lt;br /&gt;
theorem &amp;quot;last (postOrden a) = raiz a&amp;quot;&lt;br /&gt;
by (induct a) auto&lt;br /&gt;
 &lt;br /&gt;
(* pabrodmac *)&lt;br /&gt;
lemma&lt;br /&gt;
  fixes a ::&amp;quot;&amp;#039;b arbol&amp;quot; &lt;br /&gt;
  shows &amp;quot;last (postOrden a) = raiz a&amp;quot; (is &amp;quot;?P a&amp;quot;)&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix x &lt;br /&gt;
  show &amp;quot;?P (H x)&amp;quot; by simp &lt;br /&gt;
next&lt;br /&gt;
  fix x&lt;br /&gt;
  fix i assume h1: &amp;quot;?P i&amp;quot;&lt;br /&gt;
  fix d assume h2: &amp;quot;?P d&amp;quot;&lt;br /&gt;
  show &amp;quot;?P (N x i d)&amp;quot;   &lt;br /&gt;
  proof -               &lt;br /&gt;
    have &amp;quot;last (postOrden (N x i d))= x&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;… = raiz (N x i d)&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis .&lt;br /&gt;
 qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* Me he dado cuenta que no es necesario asumir ninguna hipótesis de&lt;br /&gt;
   inducción puesto que no es necesario utilizarlas, así que no se si&lt;br /&gt;
   está bien hecho puesto que no se aplicaría inducción *)  &lt;br /&gt;
&lt;br /&gt;
(* ferrenseg *)&lt;br /&gt;
&lt;br /&gt;
theorem &amp;quot;last (postOrden a) = raiz a&amp;quot; (is &amp;quot;?P a&amp;quot;)&lt;br /&gt;
proof (cases a)&lt;br /&gt;
  fix x&lt;br /&gt;
  assume &amp;quot;a = H x&amp;quot;&lt;br /&gt;
  then show &amp;quot;?P a&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x l r&lt;br /&gt;
  assume H: &amp;quot;a = N x l r&amp;quot;&lt;br /&gt;
  show &amp;quot;?P a&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    have &amp;quot;last (postOrden a) = last (postOrden (N x l r))&amp;quot; using H by simp&lt;br /&gt;
    also have &amp;quot;… = last (postOrden l @ preOrden r @ [x])&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;… = x&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;… = raiz a&amp;quot; using H by simp&lt;br /&gt;
    finally show ?thesis .&lt;br /&gt;
  qed&lt;br /&gt;
qed  &lt;br /&gt;
&lt;br /&gt;
(* fraortmoy *)&lt;br /&gt;
theorem &amp;quot;last (postOrden a) = raiz a&amp;quot;&lt;br /&gt;
apply (induct a)&lt;br /&gt;
apply simp&lt;br /&gt;
apply simp&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
(* fraortmoy *)&lt;br /&gt;
theorem &amp;quot;last (postOrden a) = raiz a&amp;quot; (is &amp;quot;?P a&amp;quot;)&lt;br /&gt;
proof (induct a)&lt;br /&gt;
  fix x&lt;br /&gt;
  show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x i d&lt;br /&gt;
  show &amp;quot;?P (N x i d)&amp;quot; by simp&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>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2016/index.php?title=Relaci%C3%B3n_7&amp;diff=1093</id>
		<title>Relación 7</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2016/index.php?title=Relaci%C3%B3n_7&amp;diff=1093"/>
		<updated>2016-12-18T10:10:37Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: Página creada con &amp;#039;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt; chapter {* R7: Árboles binarios completos *}  theory R7_Arboles_binarios_completos imports Main  begin   text {*     En esta relación se piden demostracio...&amp;#039;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
chapter {* R7: Árboles binarios completos *}&lt;br /&gt;
&lt;br /&gt;
theory R7_Arboles_binarios_completos&lt;br /&gt;
imports Main &lt;br /&gt;
begin &lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  En esta relación se piden demostraciones automáticas (lo más cortas&lt;br /&gt;
  posibles). Para ello, en algunos casos es necesario incluir lemas&lt;br /&gt;
  auxiliares (que se demuestran automáticamente) y usar ejercicios&lt;br /&gt;
  anteriores. &lt;br /&gt;
&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. Definir el tipo de datos arbol para representar los&lt;br /&gt;
  árboles binarios que no tienen información ni en los nodos y ni en las&lt;br /&gt;
  hojas. Por ejemplo, el árbol&lt;br /&gt;
          ·&lt;br /&gt;
         / \&lt;br /&gt;
        /   \&lt;br /&gt;
       ·     ·&lt;br /&gt;
      / \   / \&lt;br /&gt;
     ·   · ·   · &lt;br /&gt;
  se representa por &amp;quot;N (N H H) (N H H)&amp;quot;.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
datatype arbol = H | N arbol arbol&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;N (N H H) (N H H) = (N (N H H) (N H H) :: arbol)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Definir la función&lt;br /&gt;
     hojas :: &amp;quot;arbol =&amp;gt; nat&amp;quot; &lt;br /&gt;
  tal que (hojas a) es el número de hojas del árbol a. Por ejemplo,&lt;br /&gt;
     hojas (N (N H H) (N H H)) = 4&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
fun hojas :: &amp;quot;arbol =&amp;gt; nat&amp;quot; where&lt;br /&gt;
  &amp;quot;hojas t = undefined&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;hojas (N (N H H) (N H H)) = 4&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Definir la función&lt;br /&gt;
     profundidad :: &amp;quot;arbol =&amp;gt; nat&amp;quot; &lt;br /&gt;
  tal que (profundidad a) es la profundidad del árbol a. Por ejemplo,&lt;br /&gt;
     profundidad (N (N H H) (N H H)) = 2&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
fun profundidad :: &amp;quot;arbol =&amp;gt; nat&amp;quot; where&lt;br /&gt;
  &amp;quot;profundidad t = undefined&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;profundidad (N (N H H) (N H H)) = 2&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. Definir la función&lt;br /&gt;
     abc :: &amp;quot;nat ⇒ arbol&amp;quot; &lt;br /&gt;
  tal que (abc n) es el árbol binario completo de profundidad n. Por&lt;br /&gt;
  ejemplo,  &lt;br /&gt;
     abc 3 = N (N (N H H) (N H H)) (N (N H H) (N H H))&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
fun abc :: &amp;quot;nat ⇒ arbol&amp;quot; where&lt;br /&gt;
  &amp;quot;abc 0 = undefined&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;abc 3 = N (N (N H H) (N H H)) (N (N H H) (N H H))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 6. Un árbol binario a es completo respecto de la medida f si&lt;br /&gt;
  a es una hoja o bien a es de la forma (N i d) y se cumple que tanto i&lt;br /&gt;
  como d son árboles binarios completos respecto de f y, además, &lt;br /&gt;
  f(i) = f(r).&lt;br /&gt;
&lt;br /&gt;
  Definir la función&lt;br /&gt;
     es_abc :: &amp;quot;(arbol =&amp;gt; &amp;#039;a) =&amp;gt; arbol =&amp;gt; bool&lt;br /&gt;
  tal que (es_abc f a) se verifica si a es un árbol binario completo&lt;br /&gt;
  respecto de f.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
fun es_abc :: &amp;quot;(arbol =&amp;gt; &amp;#039;a) =&amp;gt; arbol =&amp;gt; bool&amp;quot; where&lt;br /&gt;
  &amp;quot;es_abc f t = undefined&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Nota. (size a) es el número de nodos del árbol a. Por ejemplo,&lt;br /&gt;
     size (N (N H H) (N H H)) = 3&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;size (N (N H H) (N H H)) = 3&amp;quot;&lt;br /&gt;
value &amp;quot;size (N (N (N H H) (N H H)) (N (N H H) (N H H))) = 7&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Nota. Tenemos 3 funciones de medida sobre los árboles: número de&lt;br /&gt;
  hojas, número de nodos y profundidad. A cada una le corresponde un&lt;br /&gt;
  concepto de completitud. En los siguientes ejercicios demostraremos&lt;br /&gt;
  que los tres conceptos de completitud son iguales.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 7. Demostrar que un árbol binario a es completo respecto de&lt;br /&gt;
  la profundidad syss es completo respecto del número de hojas.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 8. Demostrar que un árbol binario a es completo respecto del&lt;br /&gt;
  número de hojas syss es completo respecto del número de nodos.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 9. Demostrar que un árbol binario a es completo respecto de&lt;br /&gt;
  la profundidad syss es completo respecto del número de nodos.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 10. Demostrar que (abc n) es un árbol binario completo.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 11. Demostrar que si a es un árbolo binario completo&lt;br /&gt;
  respecto de la profundidad, entonces a es igual a&lt;br /&gt;
  (abc (profundidad a)).&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 12. Encontrar una medida f tal que (es_abc f) es distinto de &lt;br /&gt;
  (es_abc size).&lt;br /&gt;
  --------------------------------------------------------------------- &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>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2016/index.php?title=R7&amp;diff=1092</id>
		<title>R7</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2016/index.php?title=R7&amp;diff=1092"/>
		<updated>2016-12-18T10:10:23Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: Protegió «R7» ([edit=sysop] (indefinido) [move=sysop] (indefinido))&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
chapter {* R7: Árboles binarios completos *}&lt;br /&gt;
&lt;br /&gt;
theory R7_Arboles_binarios_completos&lt;br /&gt;
imports Main &lt;br /&gt;
begin &lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  En esta relación se piden demostraciones automáticas (lo más cortas&lt;br /&gt;
  posibles). Para ello, en algunos casos es necesario incluir lemas&lt;br /&gt;
  auxiliares (que se demuestran automáticamente) y usar ejercicios&lt;br /&gt;
  anteriores. &lt;br /&gt;
&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. Definir el tipo de datos arbol para representar los&lt;br /&gt;
  árboles binarios que no tienen información ni en los nodos y ni en las&lt;br /&gt;
  hojas. Por ejemplo, el árbol&lt;br /&gt;
          ·&lt;br /&gt;
         / \&lt;br /&gt;
        /   \&lt;br /&gt;
       ·     ·&lt;br /&gt;
      / \   / \&lt;br /&gt;
     ·   · ·   · &lt;br /&gt;
  se representa por &amp;quot;N (N H H) (N H H)&amp;quot;.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
datatype arbol = H | N arbol arbol&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;N (N H H) (N H H) = (N (N H H) (N H H) :: arbol)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Definir la función&lt;br /&gt;
     hojas :: &amp;quot;arbol =&amp;gt; nat&amp;quot; &lt;br /&gt;
  tal que (hojas a) es el número de hojas del árbol a. Por ejemplo,&lt;br /&gt;
     hojas (N (N H H) (N H H)) = 4&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
fun hojas :: &amp;quot;arbol =&amp;gt; nat&amp;quot; where&lt;br /&gt;
  &amp;quot;hojas t = undefined&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;hojas (N (N H H) (N H H)) = 4&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Definir la función&lt;br /&gt;
     profundidad :: &amp;quot;arbol =&amp;gt; nat&amp;quot; &lt;br /&gt;
  tal que (profundidad a) es la profundidad del árbol a. Por ejemplo,&lt;br /&gt;
     profundidad (N (N H H) (N H H)) = 2&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
fun profundidad :: &amp;quot;arbol =&amp;gt; nat&amp;quot; where&lt;br /&gt;
  &amp;quot;profundidad t = undefined&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;profundidad (N (N H H) (N H H)) = 2&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. Definir la función&lt;br /&gt;
     abc :: &amp;quot;nat ⇒ arbol&amp;quot; &lt;br /&gt;
  tal que (abc n) es el árbol binario completo de profundidad n. Por&lt;br /&gt;
  ejemplo,  &lt;br /&gt;
     abc 3 = N (N (N H H) (N H H)) (N (N H H) (N H H))&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
fun abc :: &amp;quot;nat ⇒ arbol&amp;quot; where&lt;br /&gt;
  &amp;quot;abc 0 = undefined&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;abc 3 = N (N (N H H) (N H H)) (N (N H H) (N H H))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 6. Un árbol binario a es completo respecto de la medida f si&lt;br /&gt;
  a es una hoja o bien a es de la forma (N i d) y se cumple que tanto i&lt;br /&gt;
  como d son árboles binarios completos respecto de f y, además, &lt;br /&gt;
  f(i) = f(r).&lt;br /&gt;
&lt;br /&gt;
  Definir la función&lt;br /&gt;
     es_abc :: &amp;quot;(arbol =&amp;gt; &amp;#039;a) =&amp;gt; arbol =&amp;gt; bool&lt;br /&gt;
  tal que (es_abc f a) se verifica si a es un árbol binario completo&lt;br /&gt;
  respecto de f.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
fun es_abc :: &amp;quot;(arbol =&amp;gt; &amp;#039;a) =&amp;gt; arbol =&amp;gt; bool&amp;quot; where&lt;br /&gt;
  &amp;quot;es_abc f t = undefined&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Nota. (size a) es el número de nodos del árbol a. Por ejemplo,&lt;br /&gt;
     size (N (N H H) (N H H)) = 3&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;size (N (N H H) (N H H)) = 3&amp;quot;&lt;br /&gt;
value &amp;quot;size (N (N (N H H) (N H H)) (N (N H H) (N H H))) = 7&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Nota. Tenemos 3 funciones de medida sobre los árboles: número de&lt;br /&gt;
  hojas, número de nodos y profundidad. A cada una le corresponde un&lt;br /&gt;
  concepto de completitud. En los siguientes ejercicios demostraremos&lt;br /&gt;
  que los tres conceptos de completitud son iguales.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 7. Demostrar que un árbol binario a es completo respecto de&lt;br /&gt;
  la profundidad syss es completo respecto del número de hojas.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 8. Demostrar que un árbol binario a es completo respecto del&lt;br /&gt;
  número de hojas syss es completo respecto del número de nodos.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 9. Demostrar que un árbol binario a es completo respecto de&lt;br /&gt;
  la profundidad syss es completo respecto del número de nodos.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 10. Demostrar que (abc n) es un árbol binario completo.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 11. Demostrar que si a es un árbolo binario completo&lt;br /&gt;
  respecto de la profundidad, entonces a es igual a&lt;br /&gt;
  (abc (profundidad a)).&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 12. Encontrar una medida f tal que (es_abc f) es distinto de &lt;br /&gt;
  (es_abc size).&lt;br /&gt;
  --------------------------------------------------------------------- &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>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2016/index.php?title=R7&amp;diff=1091</id>
		<title>R7</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2016/index.php?title=R7&amp;diff=1091"/>
		<updated>2016-12-18T10:10:15Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: Página creada con &amp;#039;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt; chapter {* R7: Árboles binarios completos *}  theory R7_Arboles_binarios_completos imports Main  begin   text {*     En esta relación se piden demostracio...&amp;#039;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
chapter {* R7: Árboles binarios completos *}&lt;br /&gt;
&lt;br /&gt;
theory R7_Arboles_binarios_completos&lt;br /&gt;
imports Main &lt;br /&gt;
begin &lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  En esta relación se piden demostraciones automáticas (lo más cortas&lt;br /&gt;
  posibles). Para ello, en algunos casos es necesario incluir lemas&lt;br /&gt;
  auxiliares (que se demuestran automáticamente) y usar ejercicios&lt;br /&gt;
  anteriores. &lt;br /&gt;
&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. Definir el tipo de datos arbol para representar los&lt;br /&gt;
  árboles binarios que no tienen información ni en los nodos y ni en las&lt;br /&gt;
  hojas. Por ejemplo, el árbol&lt;br /&gt;
          ·&lt;br /&gt;
         / \&lt;br /&gt;
        /   \&lt;br /&gt;
       ·     ·&lt;br /&gt;
      / \   / \&lt;br /&gt;
     ·   · ·   · &lt;br /&gt;
  se representa por &amp;quot;N (N H H) (N H H)&amp;quot;.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
datatype arbol = H | N arbol arbol&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;N (N H H) (N H H) = (N (N H H) (N H H) :: arbol)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Definir la función&lt;br /&gt;
     hojas :: &amp;quot;arbol =&amp;gt; nat&amp;quot; &lt;br /&gt;
  tal que (hojas a) es el número de hojas del árbol a. Por ejemplo,&lt;br /&gt;
     hojas (N (N H H) (N H H)) = 4&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
fun hojas :: &amp;quot;arbol =&amp;gt; nat&amp;quot; where&lt;br /&gt;
  &amp;quot;hojas t = undefined&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;hojas (N (N H H) (N H H)) = 4&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Definir la función&lt;br /&gt;
     profundidad :: &amp;quot;arbol =&amp;gt; nat&amp;quot; &lt;br /&gt;
  tal que (profundidad a) es la profundidad del árbol a. Por ejemplo,&lt;br /&gt;
     profundidad (N (N H H) (N H H)) = 2&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
fun profundidad :: &amp;quot;arbol =&amp;gt; nat&amp;quot; where&lt;br /&gt;
  &amp;quot;profundidad t = undefined&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;profundidad (N (N H H) (N H H)) = 2&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. Definir la función&lt;br /&gt;
     abc :: &amp;quot;nat ⇒ arbol&amp;quot; &lt;br /&gt;
  tal que (abc n) es el árbol binario completo de profundidad n. Por&lt;br /&gt;
  ejemplo,  &lt;br /&gt;
     abc 3 = N (N (N H H) (N H H)) (N (N H H) (N H H))&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
fun abc :: &amp;quot;nat ⇒ arbol&amp;quot; where&lt;br /&gt;
  &amp;quot;abc 0 = undefined&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;abc 3 = N (N (N H H) (N H H)) (N (N H H) (N H H))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 6. Un árbol binario a es completo respecto de la medida f si&lt;br /&gt;
  a es una hoja o bien a es de la forma (N i d) y se cumple que tanto i&lt;br /&gt;
  como d son árboles binarios completos respecto de f y, además, &lt;br /&gt;
  f(i) = f(r).&lt;br /&gt;
&lt;br /&gt;
  Definir la función&lt;br /&gt;
     es_abc :: &amp;quot;(arbol =&amp;gt; &amp;#039;a) =&amp;gt; arbol =&amp;gt; bool&lt;br /&gt;
  tal que (es_abc f a) se verifica si a es un árbol binario completo&lt;br /&gt;
  respecto de f.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
fun es_abc :: &amp;quot;(arbol =&amp;gt; &amp;#039;a) =&amp;gt; arbol =&amp;gt; bool&amp;quot; where&lt;br /&gt;
  &amp;quot;es_abc f t = undefined&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Nota. (size a) es el número de nodos del árbol a. Por ejemplo,&lt;br /&gt;
     size (N (N H H) (N H H)) = 3&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;size (N (N H H) (N H H)) = 3&amp;quot;&lt;br /&gt;
value &amp;quot;size (N (N (N H H) (N H H)) (N (N H H) (N H H))) = 7&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Nota. Tenemos 3 funciones de medida sobre los árboles: número de&lt;br /&gt;
  hojas, número de nodos y profundidad. A cada una le corresponde un&lt;br /&gt;
  concepto de completitud. En los siguientes ejercicios demostraremos&lt;br /&gt;
  que los tres conceptos de completitud son iguales.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 7. Demostrar que un árbol binario a es completo respecto de&lt;br /&gt;
  la profundidad syss es completo respecto del número de hojas.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 8. Demostrar que un árbol binario a es completo respecto del&lt;br /&gt;
  número de hojas syss es completo respecto del número de nodos.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 9. Demostrar que un árbol binario a es completo respecto de&lt;br /&gt;
  la profundidad syss es completo respecto del número de nodos.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 10. Demostrar que (abc n) es un árbol binario completo.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 11. Demostrar que si a es un árbolo binario completo&lt;br /&gt;
  respecto de la profundidad, entonces a es igual a&lt;br /&gt;
  (abc (profundidad a)).&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 12. Encontrar una medida f tal que (es_abc f) es distinto de &lt;br /&gt;
  (es_abc size).&lt;br /&gt;
  --------------------------------------------------------------------- &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>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2016/index.php?title=Ejercicios&amp;diff=1090</id>
		<title>Ejercicios</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2016/index.php?title=Ejercicios&amp;diff=1090"/>
		<updated>2016-12-18T10:09:16Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Relaciones de ejercicios ==&lt;br /&gt;
&lt;br /&gt;
=== Relaciones de ejercicios propuestos ===&lt;br /&gt;
&lt;br /&gt;
En esta sección se publicarán las relaciones de ejercicios. Las soluciones se escriben de forma colaborativa por los alumnos del curso y no deben tomarse como definitivas.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 1&amp;#039;&amp;#039;&amp;#039;: Programación funcional en Isabelle/HOL. ([[R1 |Enunciado]] y [[Relación 1 | Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 2&amp;#039;&amp;#039;&amp;#039;: Razonamiento automático sobre programas en Isabelle/HOL. ([[R2 |Enunciado]] y [[Relación 2 | Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 3&amp;#039;&amp;#039;&amp;#039;: Razonamiento estructurado sobre programas en Isabelle/HOL. ([[R3 |Enunciado]] y [[Relación 3 | Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 4&amp;#039;&amp;#039;&amp;#039;: Cuantificadores sobre listas. ([[R4 |Enunciado]] y [[Relación 4 | Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 5&amp;#039;&amp;#039;&amp;#039;: Eliminación de duplicados. ([[R5 |Enunciado]] y [[Relación 5 | Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 6&amp;#039;&amp;#039;&amp;#039;: Recorridos de árboles. ([[R6 |Enunciado]] y [[Relación 6 | Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 7&amp;#039;&amp;#039;&amp;#039;: Árboles binarios completos. ([[R7 |Enunciado]] y [[Relación 7 | Solución colaborativa]]).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 9&amp;#039;&amp;#039;&amp;#039;: Deducción natural en Isabelle/HOL. ([[R9 |Enunciado]] y [[Relación 9 | Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 10&amp;#039;&amp;#039;&amp;#039;: Formalización y argumentación en Isabelle/HOL. ([[R10 |Enunciado]] y [[Relación 10 | Solución colaborativa]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 11&amp;#039;&amp;#039;&amp;#039;: Plegados de listas y de árboles. ([[R11 |Enunciado]] y [[Relación 11 | Solución colaborativa]]).&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Soluciones en GitHub ===&lt;br /&gt;
&lt;br /&gt;
Los siguientes repositorios de GitHub también contienen soluciones de alumnos del curso: [https://github.com/MULCIA/RAIsabelleHOL serrodcal].&lt;/div&gt;</summary>
		<author><name>Jalonso</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2016/index.php?title=Tema_6b:_Verificaci%C3%B3n_de_la_ordenaci%C3%B3n_por_mezcla&amp;diff=1089</id>
		<title>Tema 6b: Verificación de la ordenación por mezcla</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2016/index.php?title=Tema_6b:_Verificaci%C3%B3n_de_la_ordenaci%C3%B3n_por_mezcla&amp;diff=1089"/>
		<updated>2016-12-15T12:09:09Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: Página creada con &amp;#039;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt; chapter {* T6b: Verificación de la ordenación por mezcla *}  theory T6b_Verificacion_de_la_ordenacion_por_mezcla_sol imports Main begin  text {*   En esta...&amp;#039;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
chapter {* T6b: Verificación de la ordenación por mezcla *}&lt;br /&gt;
&lt;br /&gt;
theory T6b_Verificacion_de_la_ordenacion_por_mezcla_sol&lt;br /&gt;
imports Main&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  En esta relación de ejercicios se define el algoritmo de ordenación de&lt;br /&gt;
  listas por mezcla y se demuestra que es correcto.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
section {* Ordenación de listas *}&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. Definir la función&lt;br /&gt;
     menor :: int ⇒ int list ⇒ bool&lt;br /&gt;
  tal que (menor a xs) se verifica si a es menor o igual que todos los&lt;br /&gt;
  elementos de xs.Por ejemplo,  &lt;br /&gt;
     menor 2 [3,2,5] = True&lt;br /&gt;
     menor 2 [3,0,5] = False&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun menor :: &amp;quot;int ⇒ int list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;menor a []     = True&amp;quot;&lt;br /&gt;
| &amp;quot;menor a (x#xs) = (a ≤ x ∧ menor a xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;menor 2 [3,2,5] = True&amp;quot;&lt;br /&gt;
value &amp;quot;menor 2 [3,0,5] = False&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Definir la función&lt;br /&gt;
     ordenada :: int list ⇒ bool&lt;br /&gt;
  tal que (ordenada xs) se verifica si xs es una lista ordenada de&lt;br /&gt;
  manera creciente. Por ejemplo,  &lt;br /&gt;
     ordenada [2,3,3,5] = True &lt;br /&gt;
     ordenada [2,4,3,5] = False &lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun ordenada :: &amp;quot;int list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;ordenada []     = True&amp;quot;&lt;br /&gt;
| &amp;quot;ordenada (x#xs) = (menor x xs &amp;amp; ordenada xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;ordenada [2,3,3,5] = True&amp;quot; &lt;br /&gt;
value &amp;quot;ordenada [2,4,3,5] = False&amp;quot; &lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. Definir la función&lt;br /&gt;
     cuenta :: int list =&amp;gt; int =&amp;gt; nat&lt;br /&gt;
  tal que (cuenta xs y) es el número de veces que aparece el elemento y&lt;br /&gt;
  en la lista xs. Por ejemplo, &lt;br /&gt;
     cuenta [1,3,4,3,5] 3 = 2&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun cuenta :: &amp;quot;int list =&amp;gt; int =&amp;gt; nat&amp;quot; where&lt;br /&gt;
  &amp;quot;cuenta []     y = 0&amp;quot;&lt;br /&gt;
| &amp;quot;cuenta (x#xs) y = (if x=y &lt;br /&gt;
                      then Suc(cuenta xs y) &lt;br /&gt;
                      else cuenta xs y)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;cuenta [1,3,4,3,5] 3 = 2&amp;quot;&lt;br /&gt;
&lt;br /&gt;
section {* Ordenación por mezcla *}&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Definir la función&lt;br /&gt;
     mezcla :: int list ⇒ int list ⇒ int list&lt;br /&gt;
  tal que (mezcla xs ys) es la lista obtenida mezclando las listas&lt;br /&gt;
  ordenadas xs e ys. Por ejemplo, &lt;br /&gt;
     mezcla [1,2,5] [3,5,7] = [1,2,3,5,5,7]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun mezcla :: &amp;quot;int list ⇒ int list ⇒ int list&amp;quot; where&lt;br /&gt;
  &amp;quot;mezcla [] ys = ys&amp;quot; &lt;br /&gt;
| &amp;quot;mezcla xs [] = xs&amp;quot; &lt;br /&gt;
| &amp;quot;mezcla (x # xs) (y # ys) = (if x ≤ y&lt;br /&gt;
                               then x # mezcla xs (y # ys)&lt;br /&gt;
                               else y # mezcla (x # xs) ys)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;mezcla [1,2,5] [3,5,7] = [1,2,3,5,5,7]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. Definir la función&lt;br /&gt;
     ordenaM :: int list ⇒ int list&lt;br /&gt;
  tal que (ordenaM xs) es la lista obtenida ordenando la lista xs&lt;br /&gt;
  mediante mezclas; es decir, la divide en dos mitades, las ordena y las&lt;br /&gt;
  mezcla. Por ejemplo, &lt;br /&gt;
     ordenaM [3,2,5,2] = [2,2,3,5]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun ordenaM :: &amp;quot;int list ⇒ int list&amp;quot; where&lt;br /&gt;
  &amp;quot;ordenaM []  = []&amp;quot; &lt;br /&gt;
| &amp;quot;ordenaM [x] = [x]&amp;quot; &lt;br /&gt;
| &amp;quot;ordenaM xs = &lt;br /&gt;
     (let mitad = length xs div 2 in&lt;br /&gt;
      mezcla (ordenaM (take mitad xs)) &lt;br /&gt;
             (ordenaM (drop mitad xs)))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;ordenaM [3,2,5,2] = [2,2,3,5]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 6. Sea x ≤ y. Si y es menor o igual que todos los elementos&lt;br /&gt;
  de xs, entonces x es menor o igual que todos los elementos de xs&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma menor_menor: &lt;br /&gt;
  &amp;quot;x ≤ y ⟹ menor y xs ⟶ menor x xs&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 7. Demostrar que el número de veces que aparece n en la&lt;br /&gt;
  mezcla de dos listas es igual a la suma del número de apariciones en&lt;br /&gt;
  cada una de las listas&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma cuenta_mezcla: &lt;br /&gt;
  &amp;quot;cuenta (mezcla xs ys) n = cuenta xs n + cuenta ys n&amp;quot;&lt;br /&gt;
by (induct xs ys rule: mezcla.induct) auto&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 8. Demostrar que si x es menor que todos los elementos de&lt;br /&gt;
  ys y de zs, entonces también lo es de su mezcla.&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma menor_mezcla:&lt;br /&gt;
  assumes &amp;quot;menor x ys&amp;quot; &lt;br /&gt;
          &amp;quot;menor x zs&amp;quot; &lt;br /&gt;
  shows   &amp;quot;menor x (mezcla ys zs)&amp;quot;&lt;br /&gt;
using assms &lt;br /&gt;
by (induct ys zs rule: mezcla.induct) simp_all&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 9. Demostrar que la mezcla de dos listas ordenadas es una&lt;br /&gt;
  lista ordenada. &lt;br /&gt;
  Indicación: Usar los siguientes lemas&lt;br /&gt;
  · linorder_not_le: (¬ x ≤ y) = (y &amp;lt; x)&lt;br /&gt;
  · order_less_le:   (x &amp;lt; y) = (x ≤ y ∧ x ≠ y)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma ordenada_mezcla:&lt;br /&gt;
  assumes &amp;quot;ordenada xs&amp;quot; &lt;br /&gt;
          &amp;quot;ordenada ys&amp;quot; &lt;br /&gt;
  shows   &amp;quot;ordenada (mezcla xs ys)&amp;quot;&lt;br /&gt;
using assms &lt;br /&gt;
by (induct xs ys rule: mezcla.induct) &lt;br /&gt;
   (auto simp add: menor_mezcla&lt;br /&gt;
                   menor_menor&lt;br /&gt;
                   linorder_not_le &lt;br /&gt;
                   order_less_le)&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 10. Demostrar que si x es mayor que 1, entonces el mínimo de&lt;br /&gt;
  x y su mitad es menor que x.&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma min_mitad: &lt;br /&gt;
  &amp;quot;1 &amp;lt; x ⟹ min x (x div 2::int) &amp;lt; x&amp;quot;&lt;br /&gt;
by simp&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 11. Demostrar que si x es mayor que 1, entonces x menos su&lt;br /&gt;
  mitad es menor que x. &lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma menos_mitad: &lt;br /&gt;
  &amp;quot;1 &amp;lt; x ⟹ x - x div (2::int) &amp;lt; x&amp;quot;&lt;br /&gt;
by arith&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 11. Demostrar que (ordenaM xs) está ordenada.&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
theorem ordenada_ordenaM:&lt;br /&gt;
  &amp;quot;ordenada (ordenaM xs)&amp;quot;&lt;br /&gt;
by (induct xs rule: ordenaM.induct) &lt;br /&gt;
   (auto simp add: ordenada_mezcla)&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 12. Demostrar que el número de apariciones de un elemento en&lt;br /&gt;
  la concatenación de dos listas es la suma del número de apariciones en&lt;br /&gt;
  cada una.&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
lemma cuenta_conc: &lt;br /&gt;
  &amp;quot;cuenta (xs @ ys) x = cuenta xs x + cuenta ys x&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 13. Demostrar que las listas xs y (ordenaM xs) tienen los&lt;br /&gt;
  mismos elementos.&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
theorem cuenta_ordenaM: &lt;br /&gt;
  &amp;quot;cuenta (ordenaM xs) x = cuenta xs x&amp;quot;&lt;br /&gt;
by (induct xs rule: ordenaM.induct) &lt;br /&gt;
   (auto simp add: cuenta_mezcla &lt;br /&gt;
                   cuenta_conc [symmetric])&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>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2016/index.php?title=Tema_6a:_Verificaci%C3%B3n_de_la_ordenaci%C3%B3n_por_inserci%C3%B3n&amp;diff=1088</id>
		<title>Tema 6a: Verificación de la ordenación por inserción</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2016/index.php?title=Tema_6a:_Verificaci%C3%B3n_de_la_ordenaci%C3%B3n_por_inserci%C3%B3n&amp;diff=1088"/>
		<updated>2016-12-15T11:57:13Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
chapter {* T6a: Verificación de la ordenación por inserción *}&lt;br /&gt;
&lt;br /&gt;
theory T6a_Verificacion_de_la_ordenacion_por_insercion&lt;br /&gt;
imports Main&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  En este de tema se define el algoritmo de ordenación de listas &lt;br /&gt;
  por inserción y se demuestra que es correcto. *}&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. Definir la función&lt;br /&gt;
     inserta :: int ⇒ int list ⇒ int list&lt;br /&gt;
  tal que (inserta a xs) es la lista obtenida insertando a delante del&lt;br /&gt;
  primer elemento de xs que es mayor o igual que a. Por ejemplo,&lt;br /&gt;
     inserta 3 [2,5,1,7] = [2,3,5,1,7]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun inserta :: &amp;quot;int ⇒ int list ⇒ int list&amp;quot; where&lt;br /&gt;
  &amp;quot;inserta a []     = [a]&amp;quot;&lt;br /&gt;
| &amp;quot;inserta a (x#xs) = (if a ≤ x &lt;br /&gt;
                       then a # x # xs &lt;br /&gt;
                       else x # inserta a xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;inserta 3 [2,5,1,7] = [2,3,5,1,7]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Definir la función&lt;br /&gt;
     ordena :: int list ⇒ int list&lt;br /&gt;
  tal que (ordena xs) es la lista obtenida ordenando xs por inserción. &lt;br /&gt;
  Por ejemplo, &lt;br /&gt;
     ordena [3,2,5,3] = [2,3,3,5]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun ordena :: &amp;quot;int list ⇒ int list&amp;quot; where&lt;br /&gt;
  &amp;quot;ordena []     = []&amp;quot;&lt;br /&gt;
| &amp;quot;ordena (x#xs) = inserta x (ordena xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;ordena [3,2,5,3] = [2,3,3,5]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. Definir la función&lt;br /&gt;
     menor :: int ⇒ int list ⇒ bool&lt;br /&gt;
  tal que (menor a xs) se verifica si a es menor o igual que todos los&lt;br /&gt;
  elementos de xs.Por ejemplo,  &lt;br /&gt;
     menor 2 [3,2,5] = True&lt;br /&gt;
     menor 2 [3,0,5] = False&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun menor :: &amp;quot;int ⇒ int list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;menor a []     = True&amp;quot;&lt;br /&gt;
| &amp;quot;menor a (x#xs) = (a ≤ x ∧ menor a xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;menor 2 [3,2,5] = True&amp;quot;&lt;br /&gt;
value &amp;quot;menor 2 [3,0,5] = False&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Definir la función&lt;br /&gt;
     ordenada :: int list ⇒ bool&lt;br /&gt;
  tal que (ordenada xs) se verifica si xs es una lista ordenada de&lt;br /&gt;
  manera creciente. Por ejemplo,  &lt;br /&gt;
     ordenada [2,3,3,5] = True &lt;br /&gt;
     ordenada [2,4,3,5] = False &lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun ordenada :: &amp;quot;int list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;ordenada []     = True&amp;quot;&lt;br /&gt;
| &amp;quot;ordenada (x#xs) = (menor x xs &amp;amp; ordenada xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;ordenada [2,3,3,5] = True&amp;quot; &lt;br /&gt;
value &amp;quot;ordenada [2,4,3,5] = False&amp;quot; &lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. Demostrar que si y es una cota inferior de zs y x ≤ y,&lt;br /&gt;
  entonces x es una cota inferior de zs.&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma menor_menor: &lt;br /&gt;
  assumes &amp;quot;x ≤ y&amp;quot;  &lt;br /&gt;
  shows   &amp;quot;menor y zs ⟶ menor x zs&amp;quot;&lt;br /&gt;
using assms&lt;br /&gt;
by (induct zs) auto&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma menor_menor_2: &lt;br /&gt;
  assumes &amp;quot;x ≤ y&amp;quot;  &lt;br /&gt;
  shows   &amp;quot;menor y zs ⟶ menor x zs&amp;quot;&lt;br /&gt;
proof (induct zs)&lt;br /&gt;
  show &amp;quot;menor y [] ⟶ menor x []&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix z zs&lt;br /&gt;
  assume HI: &amp;quot;menor y zs ⟶ menor x zs&amp;quot;  &lt;br /&gt;
  show &amp;quot;menor y (z # zs) ⟶ menor x (z # zs)&amp;quot;&lt;br /&gt;
  proof&lt;br /&gt;
    assume sup: &amp;quot;menor y (z # zs)&amp;quot;&lt;br /&gt;
    show &amp;quot;menor x (z # zs)&amp;quot;&lt;br /&gt;
    proof (simp only: menor.simps(2))&lt;br /&gt;
      show &amp;quot;x ≤ z ∧ menor x zs&amp;quot;&lt;br /&gt;
      proof&lt;br /&gt;
          have &amp;quot;x ≤ y&amp;quot; using assms .&lt;br /&gt;
          also have &amp;quot;y ≤ z&amp;quot; using sup by simp&lt;br /&gt;
          finally show &amp;quot;x ≤ z&amp;quot; .&lt;br /&gt;
      next&lt;br /&gt;
        have &amp;quot;menor y zs&amp;quot; using sup by simp&lt;br /&gt;
        with HI show &amp;quot;menor x zs&amp;quot; by simp&lt;br /&gt;
      qed&lt;br /&gt;
    qed&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 6. Demostrar el siguiente teorema de corrección: x es una&lt;br /&gt;
  cota inferior de la lista obtenida insertando y en zs syss x ≤ y y x&lt;br /&gt;
  es una cota inferior de zs.&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma menor_inserta:&lt;br /&gt;
  &amp;quot;menor x (inserta y zs) = (x ≤ y ∧ menor x zs)&amp;quot;&lt;br /&gt;
by (induct zs) auto&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma menor_inserta_2: &lt;br /&gt;
  &amp;quot;menor x (inserta y zs) = (x ≤ y ∧ menor x zs)&amp;quot;&lt;br /&gt;
proof (induct zs)&lt;br /&gt;
  show &amp;quot;menor x (inserta y []) = (x ≤ y ∧ menor x [])&amp;quot; by simp&lt;br /&gt;
next &lt;br /&gt;
  fix z zs&lt;br /&gt;
  assume HI: &amp;quot;menor x (inserta y zs) = (x ≤ y ∧ menor x zs)&amp;quot;&lt;br /&gt;
  show &amp;quot;menor x (inserta y (z#zs)) = (x ≤ y ∧ menor x (z#zs))&amp;quot; &lt;br /&gt;
  proof (cases &amp;quot;y ≤ z&amp;quot;)&lt;br /&gt;
    assume &amp;quot;y ≤ z&amp;quot;&lt;br /&gt;
    hence &amp;quot;menor x (inserta y (z#zs)) = menor x (y#z#zs)&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;… = (x ≤ y ∧ menor x (z#zs))&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis by simp&lt;br /&gt;
  next&lt;br /&gt;
    assume &amp;quot;¬(y ≤ z)&amp;quot;&lt;br /&gt;
    hence &amp;quot;menor x (inserta y (z#zs)) = &lt;br /&gt;
           menor x (z # inserta y zs)&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;… = (x ≤ z ∧ menor x (inserta y zs))&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;… = (x ≤ z ∧ x ≤ y ∧ menor x zs)&amp;quot; using HI by simp&lt;br /&gt;
    also have &amp;quot;… = (x ≤ y ∧ menor x (z#zs))&amp;quot; by auto&lt;br /&gt;
    finally show ?thesis by simp&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 6. Demostrar que al insertar un elemento la lista obtenida&lt;br /&gt;
  está ordenada syss lo estaba la original.&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma ordenada_inserta:&lt;br /&gt;
  &amp;quot;ordenada (inserta a xs) = ordenada xs&amp;quot;&lt;br /&gt;
by (induct xs) (auto simp add: menor_menor menor_inserta)&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma ordenada_inserta_2:&lt;br /&gt;
  &amp;quot;ordenada (inserta a xs) = ordenada xs&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;ordenada (inserta a []) = ordenada []&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x xs&lt;br /&gt;
  assume HI: &amp;quot;ordenada (inserta a xs) = ordenada xs&amp;quot; &lt;br /&gt;
  show &amp;quot;ordenada (inserta a (x # xs)) = ordenada (x # xs)&amp;quot; &lt;br /&gt;
  proof (cases &amp;quot;a ≤ x&amp;quot;)&lt;br /&gt;
    assume &amp;quot;a ≤ x&amp;quot;&lt;br /&gt;
    hence &amp;quot;ordenada (inserta a (x # xs)) = &lt;br /&gt;
           ordenada (a # x # xs)&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;… = (menor a (x#xs) ∧ ordenada (x # xs))&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;… = ordenada (x # xs)&amp;quot;  &lt;br /&gt;
      using `a ≤ x`  by (auto simp add: menor_menor)&lt;br /&gt;
    finally show &amp;quot;ordenada (inserta a (x # xs)) = ordenada (x # xs)&amp;quot; &lt;br /&gt;
      by simp&lt;br /&gt;
  next&lt;br /&gt;
    assume &amp;quot;¬(a ≤ x)&amp;quot;&lt;br /&gt;
    hence &amp;quot;ordenada (inserta a (x # xs)) = &lt;br /&gt;
           ordenada (x # inserta a xs)&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;… = (menor x (inserta a xs) ∧ ordenada (inserta a xs))&amp;quot; &lt;br /&gt;
      by simp&lt;br /&gt;
    also have &amp;quot;… = (menor x (inserta a xs) ∧ ordenada xs)&amp;quot; &lt;br /&gt;
      using HI by simp&lt;br /&gt;
    also have &amp;quot;… = (menor x xs ∧ ordenada xs)&amp;quot; &lt;br /&gt;
      using `¬(a ≤ x)` by (simp add: menor_inserta)&lt;br /&gt;
    also have &amp;quot;… = ordenada (x # xs)&amp;quot; by simp&lt;br /&gt;
    finally show &amp;quot;ordenada (inserta a (x # xs)) = ordenada (x # xs)&amp;quot; &lt;br /&gt;
      by simp&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 7. Demostrar que, para toda lista xs, (ordena xs) está&lt;br /&gt;
  ordenada. &lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
theorem ordenada_ordena:&lt;br /&gt;
  &amp;quot;ordenada (ordena xs)&amp;quot;&lt;br /&gt;
by (induct xs) (auto simp add: ordenada_inserta)&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
theorem ordenada_ordena_2:&lt;br /&gt;
  &amp;quot;ordenada (ordena xs)&amp;quot;&lt;br /&gt;
proof (induct xs) &lt;br /&gt;
  show &amp;quot;ordenada (ordena [])&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x xs&lt;br /&gt;
  assume &amp;quot;ordenada (ordena xs)&amp;quot; &lt;br /&gt;
  then have &amp;quot;ordenada (inserta x (ordena xs))&amp;quot; &lt;br /&gt;
    by (simp add: ordenada_inserta)  &lt;br /&gt;
  then show &amp;quot;ordenada (ordena (x # xs))&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Nota. El teorema anterior no garantiza que ordena sea correcta, ya que&lt;br /&gt;
  puede que (ordena xs) no tenga los mismos elementos que xs. Por&lt;br /&gt;
  ejemplo, si se define (ordena xs) como [] se tiene que (ordena xs)&lt;br /&gt;
  está ordenada pero no es una ordenación de xs. &lt;br /&gt;
&lt;br /&gt;
  Para garantizarlo, definimos la función cuenta.&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 8. Definir la función&lt;br /&gt;
     cuenta :: int list ⇒ int ⇒ nat&lt;br /&gt;
  tal que (cuenta xs y) es el número de veces que aparece el elemento y&lt;br /&gt;
  en la lista xs. Por ejemplo, &lt;br /&gt;
     cuenta [1,3,4,3,5] 3 = 2&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun cuenta :: &amp;quot;int list ⇒ int ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;cuenta []     y = 0&amp;quot;&lt;br /&gt;
| &amp;quot;cuenta (x#xs) y = (if x=y &lt;br /&gt;
                      then Suc (cuenta xs y) &lt;br /&gt;
                      else cuenta xs y)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;cuenta [1,3,4,3,5] 3 = 2&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 9. Demostrar que el número de veces que aparece y en &lt;br /&gt;
  (inserta x xs) es &lt;br /&gt;
  * uno más el número de veces que aparece en xs, si y = x; &lt;br /&gt;
  * el número de veces que aparece en xs, si y ≠ x; &lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma cuenta_inserta:&lt;br /&gt;
  &amp;quot;cuenta (inserta x xs) y =&lt;br /&gt;
   (if x=y then Suc (cuenta xs y) else cuenta xs y)&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 10. Demostrar que el número de veces que aparece y en &lt;br /&gt;
  (ordena xs) es el número de veces que aparece en xs.&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
theorem cuenta_ordena:&lt;br /&gt;
  &amp;quot;cuenta (ordena xs) y = cuenta xs y&amp;quot;&lt;br /&gt;
by (induct xs) (auto simp add: cuenta_inserta)&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
theorem cuenta_ordena_2:&lt;br /&gt;
  &amp;quot;cuenta (ordena xs) y = cuenta xs y&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;cuenta (ordena []) y = cuenta [] y&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x xs&lt;br /&gt;
  assume HI: &amp;quot;cuenta (ordena xs) y = cuenta xs y&amp;quot;&lt;br /&gt;
  show &amp;quot;cuenta (ordena (x # xs)) y = cuenta (x # xs) y&amp;quot; &lt;br /&gt;
  proof (cases &amp;quot;x = y&amp;quot;)&lt;br /&gt;
    assume &amp;quot;x = y&amp;quot;&lt;br /&gt;
    have &amp;quot;cuenta (ordena (x # xs)) y = cuenta (inserta x (ordena xs)) y&amp;quot; &lt;br /&gt;
      by simp&lt;br /&gt;
    also have &amp;quot;… = Suc (cuenta (ordena xs) y)&amp;quot; using `x = y` &lt;br /&gt;
      by (simp add: cuenta_inserta) &lt;br /&gt;
    also have &amp;quot;… = Suc (cuenta xs y)&amp;quot; using HI by simp&lt;br /&gt;
    also have &amp;quot;… = cuenta (x # xs) y&amp;quot; using `x = y` by simp&lt;br /&gt;
    finally show &amp;quot;cuenta (ordena (x # xs)) y = cuenta (x # xs) y&amp;quot; by simp&lt;br /&gt;
  next&lt;br /&gt;
    assume &amp;quot;x ≠ y&amp;quot;&lt;br /&gt;
    have &amp;quot;cuenta (ordena (x # xs)) y = cuenta (inserta x (ordena xs)) y&amp;quot; &lt;br /&gt;
      by simp&lt;br /&gt;
    also have &amp;quot;… = cuenta (ordena xs) y&amp;quot; using `x ≠ y` &lt;br /&gt;
      by (simp add: cuenta_inserta) &lt;br /&gt;
    also have &amp;quot;… = cuenta xs y&amp;quot; using HI by simp&lt;br /&gt;
    also have &amp;quot;… = cuenta (x # xs) y&amp;quot; using `x ≠ y` by simp&lt;br /&gt;
    finally show &amp;quot;cuenta (ordena (x # xs)) y = cuenta (x # xs) y&amp;quot; &lt;br /&gt;
      by simp&lt;br /&gt;
  qed&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>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2016/index.php?title=Tema_6a:_Verificaci%C3%B3n_de_la_ordenaci%C3%B3n_por_inserci%C3%B3n&amp;diff=1087</id>
		<title>Tema 6a: Verificación de la ordenación por inserción</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2016/index.php?title=Tema_6a:_Verificaci%C3%B3n_de_la_ordenaci%C3%B3n_por_inserci%C3%B3n&amp;diff=1087"/>
		<updated>2016-12-15T11:56:53Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: Página creada con &amp;#039;&amp;lt;source language=&amp;quot;isar&amp;quot;&amp;gt; chapter {* T6a: Verificación de la ordenación por inserción *}  theory T6a_Verificacion_de_la_ordenacion_por_insercion imports Main begin  text {*   ...&amp;#039;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source language=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
chapter {* T6a: Verificación de la ordenación por inserción *}&lt;br /&gt;
&lt;br /&gt;
theory T6a_Verificacion_de_la_ordenacion_por_insercion&lt;br /&gt;
imports Main&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  En este de tema se define el algoritmo de ordenación de listas &lt;br /&gt;
  por inserción y se demuestra que es correcto. *}&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. Definir la función&lt;br /&gt;
     inserta :: int ⇒ int list ⇒ int list&lt;br /&gt;
  tal que (inserta a xs) es la lista obtenida insertando a delante del&lt;br /&gt;
  primer elemento de xs que es mayor o igual que a. Por ejemplo,&lt;br /&gt;
     inserta 3 [2,5,1,7] = [2,3,5,1,7]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun inserta :: &amp;quot;int ⇒ int list ⇒ int list&amp;quot; where&lt;br /&gt;
  &amp;quot;inserta a []     = [a]&amp;quot;&lt;br /&gt;
| &amp;quot;inserta a (x#xs) = (if a ≤ x &lt;br /&gt;
                       then a # x # xs &lt;br /&gt;
                       else x # inserta a xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;inserta 3 [2,5,1,7] = [2,3,5,1,7]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Definir la función&lt;br /&gt;
     ordena :: int list ⇒ int list&lt;br /&gt;
  tal que (ordena xs) es la lista obtenida ordenando xs por inserción. &lt;br /&gt;
  Por ejemplo, &lt;br /&gt;
     ordena [3,2,5,3] = [2,3,3,5]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun ordena :: &amp;quot;int list ⇒ int list&amp;quot; where&lt;br /&gt;
  &amp;quot;ordena []     = []&amp;quot;&lt;br /&gt;
| &amp;quot;ordena (x#xs) = inserta x (ordena xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;ordena [3,2,5,3] = [2,3,3,5]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. Definir la función&lt;br /&gt;
     menor :: int ⇒ int list ⇒ bool&lt;br /&gt;
  tal que (menor a xs) se verifica si a es menor o igual que todos los&lt;br /&gt;
  elementos de xs.Por ejemplo,  &lt;br /&gt;
     menor 2 [3,2,5] = True&lt;br /&gt;
     menor 2 [3,0,5] = False&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun menor :: &amp;quot;int ⇒ int list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;menor a []     = True&amp;quot;&lt;br /&gt;
| &amp;quot;menor a (x#xs) = (a ≤ x ∧ menor a xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;menor 2 [3,2,5] = True&amp;quot;&lt;br /&gt;
value &amp;quot;menor 2 [3,0,5] = False&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Definir la función&lt;br /&gt;
     ordenada :: int list ⇒ bool&lt;br /&gt;
  tal que (ordenada xs) se verifica si xs es una lista ordenada de&lt;br /&gt;
  manera creciente. Por ejemplo,  &lt;br /&gt;
     ordenada [2,3,3,5] = True &lt;br /&gt;
     ordenada [2,4,3,5] = False &lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun ordenada :: &amp;quot;int list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;ordenada []     = True&amp;quot;&lt;br /&gt;
| &amp;quot;ordenada (x#xs) = (menor x xs &amp;amp; ordenada xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;ordenada [2,3,3,5] = True&amp;quot; &lt;br /&gt;
value &amp;quot;ordenada [2,4,3,5] = False&amp;quot; &lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. Demostrar que si y es una cota inferior de zs y x ≤ y,&lt;br /&gt;
  entonces x es una cota inferior de zs.&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma menor_menor: &lt;br /&gt;
  assumes &amp;quot;x ≤ y&amp;quot;  &lt;br /&gt;
  shows   &amp;quot;menor y zs ⟶ menor x zs&amp;quot;&lt;br /&gt;
using assms&lt;br /&gt;
by (induct zs) auto&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma menor_menor_2: &lt;br /&gt;
  assumes &amp;quot;x ≤ y&amp;quot;  &lt;br /&gt;
  shows   &amp;quot;menor y zs ⟶ menor x zs&amp;quot;&lt;br /&gt;
proof (induct zs)&lt;br /&gt;
  show &amp;quot;menor y [] ⟶ menor x []&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix z zs&lt;br /&gt;
  assume HI: &amp;quot;menor y zs ⟶ menor x zs&amp;quot;  &lt;br /&gt;
  show &amp;quot;menor y (z # zs) ⟶ menor x (z # zs)&amp;quot;&lt;br /&gt;
  proof&lt;br /&gt;
    assume sup: &amp;quot;menor y (z # zs)&amp;quot;&lt;br /&gt;
    show &amp;quot;menor x (z # zs)&amp;quot;&lt;br /&gt;
    proof (simp only: menor.simps(2))&lt;br /&gt;
      show &amp;quot;x ≤ z ∧ menor x zs&amp;quot;&lt;br /&gt;
      proof&lt;br /&gt;
          have &amp;quot;x ≤ y&amp;quot; using assms .&lt;br /&gt;
          also have &amp;quot;y ≤ z&amp;quot; using sup by simp&lt;br /&gt;
          finally show &amp;quot;x ≤ z&amp;quot; .&lt;br /&gt;
      next&lt;br /&gt;
        have &amp;quot;menor y zs&amp;quot; using sup by simp&lt;br /&gt;
        with HI show &amp;quot;menor x zs&amp;quot; by simp&lt;br /&gt;
      qed&lt;br /&gt;
    qed&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 6. Demostrar el siguiente teorema de corrección: x es una&lt;br /&gt;
  cota inferior de la lista obtenida insertando y en zs syss x ≤ y y x&lt;br /&gt;
  es una cota inferior de zs.&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma menor_inserta:&lt;br /&gt;
  &amp;quot;menor x (inserta y zs) = (x ≤ y ∧ menor x zs)&amp;quot;&lt;br /&gt;
by (induct zs) auto&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma menor_inserta_2: &lt;br /&gt;
  &amp;quot;menor x (inserta y zs) = (x ≤ y ∧ menor x zs)&amp;quot;&lt;br /&gt;
proof (induct zs)&lt;br /&gt;
  show &amp;quot;menor x (inserta y []) = (x ≤ y ∧ menor x [])&amp;quot; by simp&lt;br /&gt;
next &lt;br /&gt;
  fix z zs&lt;br /&gt;
  assume HI: &amp;quot;menor x (inserta y zs) = (x ≤ y ∧ menor x zs)&amp;quot;&lt;br /&gt;
  show &amp;quot;menor x (inserta y (z#zs)) = (x ≤ y ∧ menor x (z#zs))&amp;quot; &lt;br /&gt;
  proof (cases &amp;quot;y ≤ z&amp;quot;)&lt;br /&gt;
    assume &amp;quot;y ≤ z&amp;quot;&lt;br /&gt;
    hence &amp;quot;menor x (inserta y (z#zs)) = menor x (y#z#zs)&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;… = (x ≤ y ∧ menor x (z#zs))&amp;quot; by simp&lt;br /&gt;
    finally show ?thesis by simp&lt;br /&gt;
  next&lt;br /&gt;
    assume &amp;quot;¬(y ≤ z)&amp;quot;&lt;br /&gt;
    hence &amp;quot;menor x (inserta y (z#zs)) = &lt;br /&gt;
           menor x (z # inserta y zs)&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;… = (x ≤ z ∧ menor x (inserta y zs))&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;… = (x ≤ z ∧ x ≤ y ∧ menor x zs)&amp;quot; using HI by simp&lt;br /&gt;
    also have &amp;quot;… = (x ≤ y ∧ menor x (z#zs))&amp;quot; by auto&lt;br /&gt;
    finally show ?thesis by simp&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 6. Demostrar que al insertar un elemento la lista obtenida&lt;br /&gt;
  está ordenada syss lo estaba la original.&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma ordenada_inserta:&lt;br /&gt;
  &amp;quot;ordenada (inserta a xs) = ordenada xs&amp;quot;&lt;br /&gt;
by (induct xs) (auto simp add: menor_menor menor_inserta)&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
lemma ordenada_inserta_2:&lt;br /&gt;
  &amp;quot;ordenada (inserta a xs) = ordenada xs&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;ordenada (inserta a []) = ordenada []&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x xs&lt;br /&gt;
  assume HI: &amp;quot;ordenada (inserta a xs) = ordenada xs&amp;quot; &lt;br /&gt;
  show &amp;quot;ordenada (inserta a (x # xs)) = ordenada (x # xs)&amp;quot; &lt;br /&gt;
  proof (cases &amp;quot;a ≤ x&amp;quot;)&lt;br /&gt;
    assume &amp;quot;a ≤ x&amp;quot;&lt;br /&gt;
    hence &amp;quot;ordenada (inserta a (x # xs)) = &lt;br /&gt;
           ordenada (a # x # xs)&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;… = (menor a (x#xs) ∧ ordenada (x # xs))&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;… = ordenada (x # xs)&amp;quot;  &lt;br /&gt;
      using `a ≤ x`  by (auto simp add: menor_menor)&lt;br /&gt;
    finally show &amp;quot;ordenada (inserta a (x # xs)) = ordenada (x # xs)&amp;quot; &lt;br /&gt;
      by simp&lt;br /&gt;
  next&lt;br /&gt;
    assume &amp;quot;¬(a ≤ x)&amp;quot;&lt;br /&gt;
    hence &amp;quot;ordenada (inserta a (x # xs)) = &lt;br /&gt;
           ordenada (x # inserta a xs)&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;… = (menor x (inserta a xs) ∧ ordenada (inserta a xs))&amp;quot; &lt;br /&gt;
      by simp&lt;br /&gt;
    also have &amp;quot;… = (menor x (inserta a xs) ∧ ordenada xs)&amp;quot; &lt;br /&gt;
      using HI by simp&lt;br /&gt;
    also have &amp;quot;… = (menor x xs ∧ ordenada xs)&amp;quot; &lt;br /&gt;
      using `¬(a ≤ x)` by (simp add: menor_inserta)&lt;br /&gt;
    also have &amp;quot;… = ordenada (x # xs)&amp;quot; by simp&lt;br /&gt;
    finally show &amp;quot;ordenada (inserta a (x # xs)) = ordenada (x # xs)&amp;quot; &lt;br /&gt;
      by simp&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 7. Demostrar que, para toda lista xs, (ordena xs) está&lt;br /&gt;
  ordenada. &lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
theorem ordenada_ordena:&lt;br /&gt;
  &amp;quot;ordenada (ordena xs)&amp;quot;&lt;br /&gt;
by (induct xs) (auto simp add: ordenada_inserta)&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
theorem ordenada_ordena_2:&lt;br /&gt;
  &amp;quot;ordenada (ordena xs)&amp;quot;&lt;br /&gt;
proof (induct xs) &lt;br /&gt;
  show &amp;quot;ordenada (ordena [])&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x xs&lt;br /&gt;
  assume &amp;quot;ordenada (ordena xs)&amp;quot; &lt;br /&gt;
  then have &amp;quot;ordenada (inserta x (ordena xs))&amp;quot; &lt;br /&gt;
    by (simp add: ordenada_inserta)  &lt;br /&gt;
  then show &amp;quot;ordenada (ordena (x # xs))&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Nota. El teorema anterior no garantiza que ordena sea correcta, ya que&lt;br /&gt;
  puede que (ordena xs) no tenga los mismos elementos que xs. Por&lt;br /&gt;
  ejemplo, si se define (ordena xs) como [] se tiene que (ordena xs)&lt;br /&gt;
  está ordenada pero no es una ordenación de xs. &lt;br /&gt;
&lt;br /&gt;
  Para garantizarlo, definimos la función cuenta.&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 8. Definir la función&lt;br /&gt;
     cuenta :: int list ⇒ int ⇒ nat&lt;br /&gt;
  tal que (cuenta xs y) es el número de veces que aparece el elemento y&lt;br /&gt;
  en la lista xs. Por ejemplo, &lt;br /&gt;
     cuenta [1,3,4,3,5] 3 = 2&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun cuenta :: &amp;quot;int list ⇒ int ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;cuenta []     y = 0&amp;quot;&lt;br /&gt;
| &amp;quot;cuenta (x#xs) y = (if x=y &lt;br /&gt;
                      then Suc (cuenta xs y) &lt;br /&gt;
                      else cuenta xs y)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;cuenta [1,3,4,3,5] 3 = 2&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 9. Demostrar que el número de veces que aparece y en &lt;br /&gt;
  (inserta x xs) es &lt;br /&gt;
  * uno más el número de veces que aparece en xs, si y = x; &lt;br /&gt;
  * el número de veces que aparece en xs, si y ≠ x; &lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
lemma cuenta_inserta:&lt;br /&gt;
  &amp;quot;cuenta (inserta x xs) y =&lt;br /&gt;
   (if x=y then Suc (cuenta xs y) else cuenta xs y)&amp;quot;&lt;br /&gt;
by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 10. Demostrar que el número de veces que aparece y en &lt;br /&gt;
  (ordena xs) es el número de veces que aparece en xs.&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración automática es&amp;quot;&lt;br /&gt;
theorem cuenta_ordena:&lt;br /&gt;
  &amp;quot;cuenta (ordena xs) y = cuenta xs y&amp;quot;&lt;br /&gt;
by (induct xs) (auto simp add: cuenta_inserta)&lt;br /&gt;
&lt;br /&gt;
-- &amp;quot;La demostración estructurada es&amp;quot;&lt;br /&gt;
theorem cuenta_ordena_2:&lt;br /&gt;
  &amp;quot;cuenta (ordena xs) y = cuenta xs y&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;cuenta (ordena []) y = cuenta [] y&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x xs&lt;br /&gt;
  assume HI: &amp;quot;cuenta (ordena xs) y = cuenta xs y&amp;quot;&lt;br /&gt;
  show &amp;quot;cuenta (ordena (x # xs)) y = cuenta (x # xs) y&amp;quot; &lt;br /&gt;
  proof (cases &amp;quot;x = y&amp;quot;)&lt;br /&gt;
    assume &amp;quot;x = y&amp;quot;&lt;br /&gt;
    have &amp;quot;cuenta (ordena (x # xs)) y = cuenta (inserta x (ordena xs)) y&amp;quot; &lt;br /&gt;
      by simp&lt;br /&gt;
    also have &amp;quot;… = Suc (cuenta (ordena xs) y)&amp;quot; using `x = y` &lt;br /&gt;
      by (simp add: cuenta_inserta) &lt;br /&gt;
    also have &amp;quot;… = Suc (cuenta xs y)&amp;quot; using HI by simp&lt;br /&gt;
    also have &amp;quot;… = cuenta (x # xs) y&amp;quot; using `x = y` by simp&lt;br /&gt;
    finally show &amp;quot;cuenta (ordena (x # xs)) y = cuenta (x # xs) y&amp;quot; by simp&lt;br /&gt;
  next&lt;br /&gt;
    assume &amp;quot;x ≠ y&amp;quot;&lt;br /&gt;
    have &amp;quot;cuenta (ordena (x # xs)) y = cuenta (inserta x (ordena xs)) y&amp;quot; &lt;br /&gt;
      by simp&lt;br /&gt;
    also have &amp;quot;… = cuenta (ordena xs) y&amp;quot; using `x ≠ y` &lt;br /&gt;
      by (simp add: cuenta_inserta) &lt;br /&gt;
    also have &amp;quot;… = cuenta xs y&amp;quot; using HI by simp&lt;br /&gt;
    also have &amp;quot;… = cuenta (x # xs) y&amp;quot; using `x ≠ y` by simp&lt;br /&gt;
    finally show &amp;quot;cuenta (ordena (x # xs)) y = cuenta (x # xs) y&amp;quot; &lt;br /&gt;
      by simp&lt;br /&gt;
  qed&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>