<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="es">
	<id>https://www.glc.us.es/~jalonso/RA2018/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Jalonso</id>
	<title>Razonamiento automático (2018-19) - Contribuciones del usuario [es]</title>
	<link rel="self" type="application/atom+xml" href="https://www.glc.us.es/~jalonso/RA2018/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Jalonso"/>
	<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2018/index.php/Especial:Contribuciones/Jalonso"/>
	<updated>2026-07-18T02:56:27Z</updated>
	<subtitle>Contribuciones del usuario</subtitle>
	<generator>MediaWiki 1.31.14</generator>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2018/index.php?title=Sistemas&amp;diff=459</id>
		<title>Sistemas</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2018/index.php?title=Sistemas&amp;diff=459"/>
		<updated>2022-02-08T17:30:14Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: /* Editores de pruebas por secuentes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;En esta página se irá escribiendo enlaces a los sistemas utilizados en el curso&lt;br /&gt;
&lt;br /&gt;
== Asistentes de demostración ==&lt;br /&gt;
* [http://www.cl.cam.ac.uk/research/hvg/Isabelle/index.html Isabelle/HOL].&lt;br /&gt;
&lt;br /&gt;
== Editores de pruebas por deducción natural ==&lt;br /&gt;
* [http://www.doc.ic.ac.uk/pandora/newpandora Pandora].&lt;br /&gt;
&lt;br /&gt;
== Editores de pruebas por secuentes ==&lt;br /&gt;
* [http://logitext.mit.edu/main Logitext] (un demostrador interactivo basado en el cálculo de secuentes).&lt;br /&gt;
&lt;br /&gt;
== Formalización ==&lt;br /&gt;
* [http://protosmart.uhu.es/apli2/login 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/RA2018/index.php?title=Sistemas&amp;diff=458</id>
		<title>Sistemas</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2018/index.php?title=Sistemas&amp;diff=458"/>
		<updated>2022-02-08T17:29:54Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: /* Editores de pruebas por deducción natural */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;En esta página se irá escribiendo enlaces a los sistemas utilizados en el curso&lt;br /&gt;
&lt;br /&gt;
== Asistentes de demostración ==&lt;br /&gt;
* [http://www.cl.cam.ac.uk/research/hvg/Isabelle/index.html Isabelle/HOL].&lt;br /&gt;
&lt;br /&gt;
== Editores de pruebas por deducción natural ==&lt;br /&gt;
* [http://www.doc.ic.ac.uk/pandora/newpandora Pandora].&lt;br /&gt;
&lt;br /&gt;
== Editores de pruebas por secuentes ==&lt;br /&gt;
* [http://www.uni-kassel.de/eecs/fachgebiete/fmv/projects/sequent-calculus-trainer.html Sequent Calculus Trainer] (un demostrador para el cálculo de secuentes).&lt;br /&gt;
* [http://logitext.mit.edu/main Logitext] (un demostrador interactivo basado en el cálculo de secuentes).&lt;br /&gt;
&lt;br /&gt;
== Formalización ==&lt;br /&gt;
* [http://protosmart.uhu.es/apli2/login 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/RA2018/index.php?title=Sistemas&amp;diff=457</id>
		<title>Sistemas</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2018/index.php?title=Sistemas&amp;diff=457"/>
		<updated>2022-02-08T17:29:24Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: /* Editores de pruebas por deducción natural */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;En esta página se irá escribiendo enlaces a los sistemas utilizados en el curso&lt;br /&gt;
&lt;br /&gt;
== Asistentes de demostración ==&lt;br /&gt;
* [http://www.cl.cam.ac.uk/research/hvg/Isabelle/index.html Isabelle/HOL].&lt;br /&gt;
&lt;br /&gt;
== Editores de pruebas por deducción natural ==&lt;br /&gt;
* [http://www.doc.ic.ac.uk/pandora/newpandora Pandora].&lt;br /&gt;
* [http://web.student.chalmers.se/~jespolss/Conan.html Conan] (y su [https://t.co/8aNC1H9MvD descripción])&lt;br /&gt;
&lt;br /&gt;
== Editores de pruebas por secuentes ==&lt;br /&gt;
* [http://www.uni-kassel.de/eecs/fachgebiete/fmv/projects/sequent-calculus-trainer.html Sequent Calculus Trainer] (un demostrador para el cálculo de secuentes).&lt;br /&gt;
* [http://logitext.mit.edu/main Logitext] (un demostrador interactivo basado en el cálculo de secuentes).&lt;br /&gt;
&lt;br /&gt;
== Formalización ==&lt;br /&gt;
* [http://protosmart.uhu.es/apli2/login 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/RA2018/index.php?title=Documentaci%C3%B3n&amp;diff=456</id>
		<title>Documentación</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2018/index.php?title=Documentaci%C3%B3n&amp;diff=456"/>
		<updated>2022-02-08T17:24:28Z</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 &amp;quot;Razonamiento automático&amp;quot;. 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;
== Vídeos ==&lt;br /&gt;
&lt;br /&gt;
* Vídeos de deducción natural con Pandora: [http://bit.ly/1tqZIOe ejemplo 1] y [http://bit.ly/1nWAVp4 ejemplo 2].&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/article/fulltext/sadh/034/01/0003-0025 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 [http://www.bcs.org/server.php?show=ConWebDoc.4364 Computers and the sociology of mathematical proof].&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, [http://mizar.org/trybulec65/8.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 [http://dream.inf.ed.ac.uk/projects/isabelle/Isabelle_Primer.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 [http://isabelle.in.tum.de/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;
# M. Wenzel [http://isabelle.in.tum.de/doc/isar-ref.pdf The Isabelle/Isar Reference Manual]. &lt;br /&gt;
# M. Wenzel [http://typessummerschool07.cs.unibo.it/courses/wenzel-isar-quickref.pdf The Isabelle/Isar quick reference].&lt;br /&gt;
# J. Siek [http://ecee.colorado.edu/~siek/ecen3703/spring10/quick-ref.pdf Quick Reference for Isabelle/Isar Propositional Logic].&lt;br /&gt;
# J. Siek [http://ecee.colorado.edu/~siek/ecen3703/spring10/quick-ref2.pdf Quick Reference for Isabelle/Isar More Proof Techniques].&lt;br /&gt;
# J. Siek [http://ecee.colorado.edu/~siek/ecen3703/spring10/quick-ref3.pdf Quick Reference for Isabelle/Isar First-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 [https://www.cs.us.es/~jalonso/cursos/i1m-16/temas/2016-17-IM-temas-PF.pdf  Temas de &amp;quot;Programación funcional&amp;quot;]. Publicaciones del Grupo de Lógica Computacional. Universidad de Sevilla, 2016.&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 [https://www.cs.us.es/~jalonso/cursos/li-15/temas/temas-LI-2015-16.pdf Temas de &amp;quot;Lógica informática&amp;quot; (2015-16)]. Publicaciones del Grupo de Lógica Computacional. Universidad de Sevilla, 2015.&lt;br /&gt;
# K. Broda, S. Eisenbach, H. Khoshnevisan y S. Vickers [http://pubs.doc.ic.ac.uk/reasoned-programming/reasoned-programming.pdf Reasoned programming]. Imperial College, 1994.&lt;br /&gt;
# K. Doets y J. van Eijck [http://www.ldc.usb.ve/~astorga/Haskell.Road.pdf The Haskell Road to Logic, Maths and Programming].&lt;br /&gt;
# M. Huth y M. Ryan [http://bit.ly/2e8dFEm 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;
# Jeremy Avigad. [http://www.phil.cmu.edu/~avigad/formal/ Logic and Formal Verification]. (Carnegie Mellon, 2009).&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. [http://www4.in.tum.de/~ballarin/belgrade08-tut/ Introduction to the Isabelle Proof Assistant]. (Belgrado, 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;
# Jasmin Blanchette, Mathias Fleury y Daniel Wand [http://people.mpi-inf.mpg.de/~jblanche/cswi/ss2015/ Concrete semantics with Isabelle/HOL]. (Univ. del Sarre, 2015-16).&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. [http://www.inf.ed.ac.uk/teaching/courses/ar Automated reasoning]. (Univ. de Edimburgo, 2016-17).&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. [http://www21.in.tum.de/teaching/semantik/WS1617/ 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;
# Arnd Poetzsch-Heffter. [https://softech.informatik.uni-kl.de/homepage/de/teaching/SVHOL14/ Specification and Verification with Higher-Order Logic]. &lt;br /&gt;
# Jeremy G. Siek. [http://www.cs.colorado.edu/~siek/7000/spring07/ Practical Theorem Proving with Isabelle/Isar]. (Univ. de Colorado, 2007).&lt;br /&gt;
# Jeremy G. Siek. [http://ecee.colorado.edu/~siek/ecen5013/spring11/ Theorem proving in Isabelle]. (Univ. de Colorado, 2011).&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;
=== Cursos con Coq ===&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;
# Adam Chlipala [http://stellar.mit.edu/S/course/6/fa11/6.892/ Interactive computer theorem proving]. (MIT, 2012-13).&lt;br /&gt;
# Adam Chlipala y Armando Solar Lezama [https://stellar.mit.edu/S/course/6/fa13/6.820/index.html Foundations of program analysis]. (MIT, 2013-14).&lt;br /&gt;
# M. Greenberg [http://www.cs.pomona.edu/~michael/courses/csci054s18/ Discrete mathematics and functional programming]. &lt;br /&gt;
# Benjamin C. Pierce et als. [https://softwarefoundations.cis.upenn.edu/lf-current/index.html Software foundations (Vol. 1: Logical foundations)].&lt;br /&gt;
# Benjamin C. Pierce [https://www.seas.upenn.edu/~cis500/current/index.html Software foundations] (Univ. de Pensilvania, 2018).&lt;br /&gt;
# G. Smolka [https://courses.ps.uni-saarland.de/icl_18/2/Resources Introduction to computational logic] (Univ. de Sarre, 2018).&lt;br /&gt;
&lt;br /&gt;
=== Otros cursos ===&lt;br /&gt;
# José A. Alonso [http://www.cs.us.es/~jalonso/cursos/li/ Lógica informática] (Univ. de Sevilla, 2012-13).&lt;br /&gt;
# Thorsten Altenkirch y Peter Morris [http://www.cs.nott.ac.uk/~txa/g52ifr Introduction to formal reasoning] (Univ. de Nottingham, 2010-11).&lt;br /&gt;
# J. Blanchette y J. Höltz [https://lean-forward.github.io/logical-verification/2018 Logical verification]. (Vrije Universiteit Amsterdam, 2018-19). &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;
# Robby Findler [http://www.eecs.northwestern.edu/~robby/courses/395-495-2013-fall Certified programming with dependent types]. (Northwestern, 2013-14).&lt;br /&gt;
# Carlos Luna y Gustavo Betarte. [https://eva.fing.edu.uy/course/view.php?id=363 Construcción formal de programas en teoría de tipos]. (Univ. de la República, Uruguay, 2013-14).&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;
# David Pichardie [http://www.irisa.fr/celtique/pichardie/teaching/M2/MDV/ Méthode de vérification] (Universidad de Rennes, 2006-07).&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;br /&gt;
# [http://automatedreasoning.net/ Larry Wos&amp;#039; Notebooks].&lt;br /&gt;
# [http://www.cs.miami.edu/~tptp/ The TPTP Problem Library for Automated Theorem Proving].&lt;br /&gt;
# [http://www.macs.hw.ac.uk/vstte10/Competition.html The 1st Verified Software Competition].&lt;br /&gt;
# [https://sites.google.com/site/vstte2012/compet The 2nd Verified Software Competition].&lt;br /&gt;
# [http://verifythis.cost-ic0701.org VerifyThis (A collection of verification benchmarks].&lt;br /&gt;
&lt;br /&gt;
== Artículos recientes ==&lt;br /&gt;
&lt;br /&gt;
Hay dos listas de artículos recientes:&lt;br /&gt;
&lt;br /&gt;
* en [https://twitter.com/search?f=tweets&amp;amp;q=%23ITP%20OR%20%23IsabelleHOL%20OR%20%23Coq%20OR%20%23Agda%20OR%20%23LeanProver%20OR%20%23MULCIA%20from%3AJose_A_Alonso&amp;amp;src=typd Twitter] que contiene enlaces a los artículos de razonamiento automático y demostración asistida por ordenador que se están publicando y&lt;br /&gt;
* en [https://www.glc.us.es/~jalonso/vestigium/category/resena/ Vestigium] que contiene una reseña de los más destacados.&lt;br /&gt;
&lt;br /&gt;
== Ofertas de trabajo ==&lt;br /&gt;
&lt;br /&gt;
En [https://github.com/jaalonso/Trabajos-MULCIA GitHub] se encuentra una recopilaciónn las ofertas de trabajo de interés para los estudiantes del Máster Universitario en Lógica, Computación e Inteligencia Artificial de la Universidad de Sevilla.&lt;br /&gt;
&lt;br /&gt;
Están en orden cronológico inverso por la fecha de su publicación en [https://twitter.com/search?l=&amp;amp;q=%23MULCIA%20from%3AJose_A_Alonso&amp;amp;src=typd&amp;amp;lang=es Twitter].&lt;/div&gt;</summary>
		<author><name>Jalonso</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2018/index.php?title=Documentaci%C3%B3n&amp;diff=455</id>
		<title>Documentación</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2018/index.php?title=Documentaci%C3%B3n&amp;diff=455"/>
		<updated>2019-10-26T13:51:59Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: /* Visiones generales de la DAO */&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 &amp;quot;Razonamiento automático&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Vídeos ==&lt;br /&gt;
&lt;br /&gt;
* Vídeos de deducción natural con Pandora: [http://bit.ly/1tqZIOe ejemplo 1] y [http://bit.ly/1nWAVp4 ejemplo 2].&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/article/fulltext/sadh/034/01/0003-0025 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 [http://www.bcs.org/server.php?show=ConWebDoc.4364 Computers and the sociology of mathematical proof].&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, [http://mizar.org/trybulec65/8.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 [http://dream.inf.ed.ac.uk/projects/isabelle/Isabelle_Primer.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 [http://isabelle.in.tum.de/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;
# M. Wenzel [http://isabelle.in.tum.de/doc/isar-ref.pdf The Isabelle/Isar Reference Manual]. &lt;br /&gt;
# M. Wenzel [http://typessummerschool07.cs.unibo.it/courses/wenzel-isar-quickref.pdf The Isabelle/Isar quick reference].&lt;br /&gt;
# J. Siek [http://ecee.colorado.edu/~siek/ecen3703/spring10/quick-ref.pdf Quick Reference for Isabelle/Isar Propositional Logic].&lt;br /&gt;
# J. Siek [http://ecee.colorado.edu/~siek/ecen3703/spring10/quick-ref2.pdf Quick Reference for Isabelle/Isar More Proof Techniques].&lt;br /&gt;
# J. Siek [http://ecee.colorado.edu/~siek/ecen3703/spring10/quick-ref3.pdf Quick Reference for Isabelle/Isar First-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 [https://www.cs.us.es/~jalonso/cursos/i1m-16/temas/2016-17-IM-temas-PF.pdf  Temas de &amp;quot;Programación funcional&amp;quot;]. Publicaciones del Grupo de Lógica Computacional. Universidad de Sevilla, 2016.&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 [https://www.cs.us.es/~jalonso/cursos/li-15/temas/temas-LI-2015-16.pdf Temas de &amp;quot;Lógica informática&amp;quot; (2015-16)]. Publicaciones del Grupo de Lógica Computacional. Universidad de Sevilla, 2015.&lt;br /&gt;
# K. Broda, S. Eisenbach, H. Khoshnevisan y S. Vickers [http://pubs.doc.ic.ac.uk/reasoned-programming/reasoned-programming.pdf Reasoned programming]. Imperial College, 1994.&lt;br /&gt;
# K. Doets y J. van Eijck [http://www.ldc.usb.ve/~astorga/Haskell.Road.pdf The Haskell Road to Logic, Maths and Programming].&lt;br /&gt;
# M. Huth y M. Ryan [http://bit.ly/2e8dFEm 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;
# Jeremy Avigad. [http://www.phil.cmu.edu/~avigad/formal/ Logic and Formal Verification]. (Carnegie Mellon, 2009).&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. [http://www4.in.tum.de/~ballarin/belgrade08-tut/ Introduction to the Isabelle Proof Assistant]. (Belgrado, 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;
# Jasmin Blanchette, Mathias Fleury y Daniel Wand [http://people.mpi-inf.mpg.de/~jblanche/cswi/ss2015/ Concrete semantics with Isabelle/HOL]. (Univ. del Sarre, 2015-16).&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. [http://www.inf.ed.ac.uk/teaching/courses/ar Automated reasoning]. (Univ. de Edimburgo, 2016-17).&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. [http://www21.in.tum.de/teaching/semantik/WS1617/ 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;
# Arnd Poetzsch-Heffter. [https://softech.informatik.uni-kl.de/homepage/de/teaching/SVHOL14/ Specification and Verification with Higher-Order Logic]. &lt;br /&gt;
# Jeremy G. Siek. [http://www.cs.colorado.edu/~siek/7000/spring07/ Practical Theorem Proving with Isabelle/Isar]. (Univ. de Colorado, 2007).&lt;br /&gt;
# Jeremy G. Siek. [http://ecee.colorado.edu/~siek/ecen5013/spring11/ Theorem proving in Isabelle]. (Univ. de Colorado, 2011).&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;
=== Cursos con Coq ===&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;
# Adam Chlipala [http://stellar.mit.edu/S/course/6/fa11/6.892/ Interactive computer theorem proving]. (MIT, 2012-13).&lt;br /&gt;
# Adam Chlipala y Armando Solar Lezama [https://stellar.mit.edu/S/course/6/fa13/6.820/index.html Foundations of program analysis]. (MIT, 2013-14).&lt;br /&gt;
# M. Greenberg [http://www.cs.pomona.edu/~michael/courses/csci054s18/ Discrete mathematics and functional programming]. &lt;br /&gt;
# Benjamin C. Pierce et als. [https://softwarefoundations.cis.upenn.edu/lf-current/index.html Software foundations (Vol. 1: Logical foundations)].&lt;br /&gt;
# Benjamin C. Pierce [https://www.seas.upenn.edu/~cis500/current/index.html Software foundations] (Univ. de Pensilvania, 2018).&lt;br /&gt;
# G. Smolka [https://courses.ps.uni-saarland.de/icl_18/2/Resources Introduction to computational logic] (Univ. de Sarre, 2018).&lt;br /&gt;
&lt;br /&gt;
=== Otros cursos ===&lt;br /&gt;
# José A. Alonso [http://www.cs.us.es/~jalonso/cursos/li/ Lógica informática] (Univ. de Sevilla, 2012-13).&lt;br /&gt;
# Thorsten Altenkirch y Peter Morris [http://www.cs.nott.ac.uk/~txa/g52ifr Introduction to formal reasoning] (Univ. de Nottingham, 2010-11).&lt;br /&gt;
# J. Blanchette y J. Höltz [https://lean-forward.github.io/logical-verification/2018 Logical verification]. (Vrije Universiteit Amsterdam, 2018-19). &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;
# Robby Findler [http://www.eecs.northwestern.edu/~robby/courses/395-495-2013-fall Certified programming with dependent types]. (Northwestern, 2013-14).&lt;br /&gt;
# Carlos Luna y Gustavo Betarte. [https://eva.fing.edu.uy/course/view.php?id=363 Construcción formal de programas en teoría de tipos]. (Univ. de la República, Uruguay, 2013-14).&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;
# David Pichardie [http://www.irisa.fr/celtique/pichardie/teaching/M2/MDV/ Méthode de vérification] (Universidad de Rennes, 2006-07).&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;br /&gt;
# [http://automatedreasoning.net/ Larry Wos&amp;#039; Notebooks].&lt;br /&gt;
# [http://www.cs.miami.edu/~tptp/ The TPTP Problem Library for Automated Theorem Proving].&lt;br /&gt;
# [http://www.macs.hw.ac.uk/vstte10/Competition.html The 1st Verified Software Competition].&lt;br /&gt;
# [https://sites.google.com/site/vstte2012/compet The 2nd Verified Software Competition].&lt;br /&gt;
# [http://verifythis.cost-ic0701.org VerifyThis (A collection of verification benchmarks].&lt;br /&gt;
&lt;br /&gt;
== Artículos recientes ==&lt;br /&gt;
&lt;br /&gt;
Hay dos listas de artículos recientes:&lt;br /&gt;
&lt;br /&gt;
* en [https://twitter.com/search?f=tweets&amp;amp;q=%23ITP%20OR%20%23IsabelleHOL%20OR%20%23Coq%20OR%20%23Agda%20OR%20%23LeanProver%20OR%20%23MULCIA%20from%3AJose_A_Alonso&amp;amp;src=typd Twitter] que contiene enlaces a los artículos de razonamiento automático y demostración asistida por ordenador que se están publicando y&lt;br /&gt;
* en [https://www.glc.us.es/~jalonso/vestigium/category/resena/ Vestigium] que contiene una reseña de los más destacados.&lt;br /&gt;
&lt;br /&gt;
== Ofertas de trabajo ==&lt;br /&gt;
&lt;br /&gt;
En [https://github.com/jaalonso/Trabajos-MULCIA GitHub] se encuentra una recopilaciónn las ofertas de trabajo de interés para los estudiantes del Máster Universitario en Lógica, Computación e Inteligencia Artificial de la Universidad de Sevilla.&lt;br /&gt;
&lt;br /&gt;
Están en orden cronológico inverso por la fecha de su publicación en [https://twitter.com/search?l=&amp;amp;q=%23MULCIA%20from%3AJose_A_Alonso&amp;amp;src=typd&amp;amp;lang=es Twitter].&lt;/div&gt;</summary>
		<author><name>Jalonso</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2018/index.php?title=Documentaci%C3%B3n&amp;diff=454</id>
		<title>Documentación</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2018/index.php?title=Documentaci%C3%B3n&amp;diff=454"/>
		<updated>2019-10-26T13:48:34Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: /* Visiones generales de la DAO */&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 &amp;quot;Razonamiento automático&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Vídeos ==&lt;br /&gt;
&lt;br /&gt;
* Vídeos de deducción natural con Pandora: [http://bit.ly/1tqZIOe ejemplo 1] y [http://bit.ly/1nWAVp4 ejemplo 2].&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/article/fulltext/sadh/034/01/0003-0025 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 [http://www.bcs.org/server.php?show=ConWebDoc.4364 Computers and the sociology of mathematical proof].&lt;br /&gt;
# G. Sutcliffe. [http://www.cs.miami.edu/~tptp/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, [http://mizar.org/trybulec65/8.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 [http://dream.inf.ed.ac.uk/projects/isabelle/Isabelle_Primer.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 [http://isabelle.in.tum.de/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;
# M. Wenzel [http://isabelle.in.tum.de/doc/isar-ref.pdf The Isabelle/Isar Reference Manual]. &lt;br /&gt;
# M. Wenzel [http://typessummerschool07.cs.unibo.it/courses/wenzel-isar-quickref.pdf The Isabelle/Isar quick reference].&lt;br /&gt;
# J. Siek [http://ecee.colorado.edu/~siek/ecen3703/spring10/quick-ref.pdf Quick Reference for Isabelle/Isar Propositional Logic].&lt;br /&gt;
# J. Siek [http://ecee.colorado.edu/~siek/ecen3703/spring10/quick-ref2.pdf Quick Reference for Isabelle/Isar More Proof Techniques].&lt;br /&gt;
# J. Siek [http://ecee.colorado.edu/~siek/ecen3703/spring10/quick-ref3.pdf Quick Reference for Isabelle/Isar First-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 [https://www.cs.us.es/~jalonso/cursos/i1m-16/temas/2016-17-IM-temas-PF.pdf  Temas de &amp;quot;Programación funcional&amp;quot;]. Publicaciones del Grupo de Lógica Computacional. Universidad de Sevilla, 2016.&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 [https://www.cs.us.es/~jalonso/cursos/li-15/temas/temas-LI-2015-16.pdf Temas de &amp;quot;Lógica informática&amp;quot; (2015-16)]. Publicaciones del Grupo de Lógica Computacional. Universidad de Sevilla, 2015.&lt;br /&gt;
# K. Broda, S. Eisenbach, H. Khoshnevisan y S. Vickers [http://pubs.doc.ic.ac.uk/reasoned-programming/reasoned-programming.pdf Reasoned programming]. Imperial College, 1994.&lt;br /&gt;
# K. Doets y J. van Eijck [http://www.ldc.usb.ve/~astorga/Haskell.Road.pdf The Haskell Road to Logic, Maths and Programming].&lt;br /&gt;
# M. Huth y M. Ryan [http://bit.ly/2e8dFEm 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;
# Jeremy Avigad. [http://www.phil.cmu.edu/~avigad/formal/ Logic and Formal Verification]. (Carnegie Mellon, 2009).&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. [http://www4.in.tum.de/~ballarin/belgrade08-tut/ Introduction to the Isabelle Proof Assistant]. (Belgrado, 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;
# Jasmin Blanchette, Mathias Fleury y Daniel Wand [http://people.mpi-inf.mpg.de/~jblanche/cswi/ss2015/ Concrete semantics with Isabelle/HOL]. (Univ. del Sarre, 2015-16).&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. [http://www.inf.ed.ac.uk/teaching/courses/ar Automated reasoning]. (Univ. de Edimburgo, 2016-17).&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. [http://www21.in.tum.de/teaching/semantik/WS1617/ 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;
# Arnd Poetzsch-Heffter. [https://softech.informatik.uni-kl.de/homepage/de/teaching/SVHOL14/ Specification and Verification with Higher-Order Logic]. &lt;br /&gt;
# Jeremy G. Siek. [http://www.cs.colorado.edu/~siek/7000/spring07/ Practical Theorem Proving with Isabelle/Isar]. (Univ. de Colorado, 2007).&lt;br /&gt;
# Jeremy G. Siek. [http://ecee.colorado.edu/~siek/ecen5013/spring11/ Theorem proving in Isabelle]. (Univ. de Colorado, 2011).&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;
=== Cursos con Coq ===&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;
# Adam Chlipala [http://stellar.mit.edu/S/course/6/fa11/6.892/ Interactive computer theorem proving]. (MIT, 2012-13).&lt;br /&gt;
# Adam Chlipala y Armando Solar Lezama [https://stellar.mit.edu/S/course/6/fa13/6.820/index.html Foundations of program analysis]. (MIT, 2013-14).&lt;br /&gt;
# M. Greenberg [http://www.cs.pomona.edu/~michael/courses/csci054s18/ Discrete mathematics and functional programming]. &lt;br /&gt;
# Benjamin C. Pierce et als. [https://softwarefoundations.cis.upenn.edu/lf-current/index.html Software foundations (Vol. 1: Logical foundations)].&lt;br /&gt;
# Benjamin C. Pierce [https://www.seas.upenn.edu/~cis500/current/index.html Software foundations] (Univ. de Pensilvania, 2018).&lt;br /&gt;
# G. Smolka [https://courses.ps.uni-saarland.de/icl_18/2/Resources Introduction to computational logic] (Univ. de Sarre, 2018).&lt;br /&gt;
&lt;br /&gt;
=== Otros cursos ===&lt;br /&gt;
# José A. Alonso [http://www.cs.us.es/~jalonso/cursos/li/ Lógica informática] (Univ. de Sevilla, 2012-13).&lt;br /&gt;
# Thorsten Altenkirch y Peter Morris [http://www.cs.nott.ac.uk/~txa/g52ifr Introduction to formal reasoning] (Univ. de Nottingham, 2010-11).&lt;br /&gt;
# J. Blanchette y J. Höltz [https://lean-forward.github.io/logical-verification/2018 Logical verification]. (Vrije Universiteit Amsterdam, 2018-19). &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;
# Robby Findler [http://www.eecs.northwestern.edu/~robby/courses/395-495-2013-fall Certified programming with dependent types]. (Northwestern, 2013-14).&lt;br /&gt;
# Carlos Luna y Gustavo Betarte. [https://eva.fing.edu.uy/course/view.php?id=363 Construcción formal de programas en teoría de tipos]. (Univ. de la República, Uruguay, 2013-14).&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;
# David Pichardie [http://www.irisa.fr/celtique/pichardie/teaching/M2/MDV/ Méthode de vérification] (Universidad de Rennes, 2006-07).&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;br /&gt;
# [http://automatedreasoning.net/ Larry Wos&amp;#039; Notebooks].&lt;br /&gt;
# [http://www.cs.miami.edu/~tptp/ The TPTP Problem Library for Automated Theorem Proving].&lt;br /&gt;
# [http://www.macs.hw.ac.uk/vstte10/Competition.html The 1st Verified Software Competition].&lt;br /&gt;
# [https://sites.google.com/site/vstte2012/compet The 2nd Verified Software Competition].&lt;br /&gt;
# [http://verifythis.cost-ic0701.org VerifyThis (A collection of verification benchmarks].&lt;br /&gt;
&lt;br /&gt;
== Artículos recientes ==&lt;br /&gt;
&lt;br /&gt;
Hay dos listas de artículos recientes:&lt;br /&gt;
&lt;br /&gt;
* en [https://twitter.com/search?f=tweets&amp;amp;q=%23ITP%20OR%20%23IsabelleHOL%20OR%20%23Coq%20OR%20%23Agda%20OR%20%23LeanProver%20OR%20%23MULCIA%20from%3AJose_A_Alonso&amp;amp;src=typd Twitter] que contiene enlaces a los artículos de razonamiento automático y demostración asistida por ordenador que se están publicando y&lt;br /&gt;
* en [https://www.glc.us.es/~jalonso/vestigium/category/resena/ Vestigium] que contiene una reseña de los más destacados.&lt;br /&gt;
&lt;br /&gt;
== Ofertas de trabajo ==&lt;br /&gt;
&lt;br /&gt;
En [https://github.com/jaalonso/Trabajos-MULCIA GitHub] se encuentra una recopilaciónn las ofertas de trabajo de interés para los estudiantes del Máster Universitario en Lógica, Computación e Inteligencia Artificial de la Universidad de Sevilla.&lt;br /&gt;
&lt;br /&gt;
Están en orden cronológico inverso por la fecha de su publicación en [https://twitter.com/search?l=&amp;amp;q=%23MULCIA%20from%3AJose_A_Alonso&amp;amp;src=typd&amp;amp;lang=es Twitter].&lt;/div&gt;</summary>
		<author><name>Jalonso</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2018/index.php?title=Ejercicios&amp;diff=453</id>
		<title>Ejercicios</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2018/index.php?title=Ejercicios&amp;diff=453"/>
		<updated>2019-08-21T09:38:50Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&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]]).&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]]). &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]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 4&amp;#039;&amp;#039;&amp;#039;: Cuantificadores sobre listas. ([[R4 |Enunciado]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 5&amp;#039;&amp;#039;&amp;#039;: Recorridos de árboles. ([[R5 |Enunciado]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 6&amp;#039;&amp;#039;&amp;#039;: Deducción natural proposicional en Isabelle/HOL. ([[R6 |Enunciado]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 7&amp;#039;&amp;#039;&amp;#039;: Deducción natural LPO en Isabelle/HOL. ([[R7 |Enunciado]]).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Relación 8&amp;#039;&amp;#039;&amp;#039;: Gramáticas libres de contexto. ([[R8 |Enunciado]]).&lt;/div&gt;</summary>
		<author><name>Jalonso</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2018/index.php?title=Documentaci%C3%B3n&amp;diff=452</id>
		<title>Documentación</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2018/index.php?title=Documentaci%C3%B3n&amp;diff=452"/>
		<updated>2019-05-31T09:43:17Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: /* Ofertas de trabajo */&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 &amp;quot;Razonamiento automático&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Vídeos ==&lt;br /&gt;
&lt;br /&gt;
* Vídeos de deducción natural con Pandora: [http://bit.ly/1tqZIOe ejemplo 1] y [http://bit.ly/1nWAVp4 ejemplo 2].&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/article/fulltext/sadh/034/01/0003-0025 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;
# J. Gross [https://blogs.ams.org/mathgradblog/2017/10/15/machine-checked-proof Machine-checked proof]. &amp;#039;&amp;#039;AMS Notices&amp;#039;&amp;#039;, 15 de octubre de 2017.&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 [http://www.bcs.org/server.php?show=ConWebDoc.4364 Computers and the sociology of mathematical proof].&lt;br /&gt;
# G. Sutcliffe. [http://www.cs.miami.edu/~tptp/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, [http://mizar.org/trybulec65/8.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 [http://dream.inf.ed.ac.uk/projects/isabelle/Isabelle_Primer.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 [http://isabelle.in.tum.de/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;
# M. Wenzel [http://isabelle.in.tum.de/doc/isar-ref.pdf The Isabelle/Isar Reference Manual]. &lt;br /&gt;
# M. Wenzel [http://typessummerschool07.cs.unibo.it/courses/wenzel-isar-quickref.pdf The Isabelle/Isar quick reference].&lt;br /&gt;
# J. Siek [http://ecee.colorado.edu/~siek/ecen3703/spring10/quick-ref.pdf Quick Reference for Isabelle/Isar Propositional Logic].&lt;br /&gt;
# J. Siek [http://ecee.colorado.edu/~siek/ecen3703/spring10/quick-ref2.pdf Quick Reference for Isabelle/Isar More Proof Techniques].&lt;br /&gt;
# J. Siek [http://ecee.colorado.edu/~siek/ecen3703/spring10/quick-ref3.pdf Quick Reference for Isabelle/Isar First-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 [https://www.cs.us.es/~jalonso/cursos/i1m-16/temas/2016-17-IM-temas-PF.pdf  Temas de &amp;quot;Programación funcional&amp;quot;]. Publicaciones del Grupo de Lógica Computacional. Universidad de Sevilla, 2016.&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 [https://www.cs.us.es/~jalonso/cursos/li-15/temas/temas-LI-2015-16.pdf Temas de &amp;quot;Lógica informática&amp;quot; (2015-16)]. Publicaciones del Grupo de Lógica Computacional. Universidad de Sevilla, 2015.&lt;br /&gt;
# K. Broda, S. Eisenbach, H. Khoshnevisan y S. Vickers [http://pubs.doc.ic.ac.uk/reasoned-programming/reasoned-programming.pdf Reasoned programming]. Imperial College, 1994.&lt;br /&gt;
# K. Doets y J. van Eijck [http://www.ldc.usb.ve/~astorga/Haskell.Road.pdf The Haskell Road to Logic, Maths and Programming].&lt;br /&gt;
# M. Huth y M. Ryan [http://bit.ly/2e8dFEm 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;
# Jeremy Avigad. [http://www.phil.cmu.edu/~avigad/formal/ Logic and Formal Verification]. (Carnegie Mellon, 2009).&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. [http://www4.in.tum.de/~ballarin/belgrade08-tut/ Introduction to the Isabelle Proof Assistant]. (Belgrado, 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;
# Jasmin Blanchette, Mathias Fleury y Daniel Wand [http://people.mpi-inf.mpg.de/~jblanche/cswi/ss2015/ Concrete semantics with Isabelle/HOL]. (Univ. del Sarre, 2015-16).&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. [http://www.inf.ed.ac.uk/teaching/courses/ar Automated reasoning]. (Univ. de Edimburgo, 2016-17).&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. [http://www21.in.tum.de/teaching/semantik/WS1617/ 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;
# Arnd Poetzsch-Heffter. [https://softech.informatik.uni-kl.de/homepage/de/teaching/SVHOL14/ Specification and Verification with Higher-Order Logic]. &lt;br /&gt;
# Jeremy G. Siek. [http://www.cs.colorado.edu/~siek/7000/spring07/ Practical Theorem Proving with Isabelle/Isar]. (Univ. de Colorado, 2007).&lt;br /&gt;
# Jeremy G. Siek. [http://ecee.colorado.edu/~siek/ecen5013/spring11/ Theorem proving in Isabelle]. (Univ. de Colorado, 2011).&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;
=== Cursos con Coq ===&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;
# Adam Chlipala [http://stellar.mit.edu/S/course/6/fa11/6.892/ Interactive computer theorem proving]. (MIT, 2012-13).&lt;br /&gt;
# Adam Chlipala y Armando Solar Lezama [https://stellar.mit.edu/S/course/6/fa13/6.820/index.html Foundations of program analysis]. (MIT, 2013-14).&lt;br /&gt;
# M. Greenberg [http://www.cs.pomona.edu/~michael/courses/csci054s18/ Discrete mathematics and functional programming]. &lt;br /&gt;
# Benjamin C. Pierce et als. [https://softwarefoundations.cis.upenn.edu/lf-current/index.html Software foundations (Vol. 1: Logical foundations)].&lt;br /&gt;
# Benjamin C. Pierce [https://www.seas.upenn.edu/~cis500/current/index.html Software foundations] (Univ. de Pensilvania, 2018).&lt;br /&gt;
# G. Smolka [https://courses.ps.uni-saarland.de/icl_18/2/Resources Introduction to computational logic] (Univ. de Sarre, 2018).&lt;br /&gt;
&lt;br /&gt;
=== Otros cursos ===&lt;br /&gt;
# José A. Alonso [http://www.cs.us.es/~jalonso/cursos/li/ Lógica informática] (Univ. de Sevilla, 2012-13).&lt;br /&gt;
# Thorsten Altenkirch y Peter Morris [http://www.cs.nott.ac.uk/~txa/g52ifr Introduction to formal reasoning] (Univ. de Nottingham, 2010-11).&lt;br /&gt;
# J. Blanchette y J. Höltz [https://lean-forward.github.io/logical-verification/2018 Logical verification]. (Vrije Universiteit Amsterdam, 2018-19). &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;
# Robby Findler [http://www.eecs.northwestern.edu/~robby/courses/395-495-2013-fall Certified programming with dependent types]. (Northwestern, 2013-14).&lt;br /&gt;
# Carlos Luna y Gustavo Betarte. [https://eva.fing.edu.uy/course/view.php?id=363 Construcción formal de programas en teoría de tipos]. (Univ. de la República, Uruguay, 2013-14).&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;
# David Pichardie [http://www.irisa.fr/celtique/pichardie/teaching/M2/MDV/ Méthode de vérification] (Universidad de Rennes, 2006-07).&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;br /&gt;
# [http://automatedreasoning.net/ Larry Wos&amp;#039; Notebooks].&lt;br /&gt;
# [http://www.cs.miami.edu/~tptp/ The TPTP Problem Library for Automated Theorem Proving].&lt;br /&gt;
# [http://www.macs.hw.ac.uk/vstte10/Competition.html The 1st Verified Software Competition].&lt;br /&gt;
# [https://sites.google.com/site/vstte2012/compet The 2nd Verified Software Competition].&lt;br /&gt;
# [http://verifythis.cost-ic0701.org VerifyThis (A collection of verification benchmarks].&lt;br /&gt;
&lt;br /&gt;
== Artículos recientes ==&lt;br /&gt;
&lt;br /&gt;
Hay dos listas de artículos recientes:&lt;br /&gt;
&lt;br /&gt;
* en [https://twitter.com/search?f=tweets&amp;amp;q=%23ITP%20OR%20%23IsabelleHOL%20OR%20%23Coq%20OR%20%23Agda%20OR%20%23LeanProver%20OR%20%23MULCIA%20from%3AJose_A_Alonso&amp;amp;src=typd Twitter] que contiene enlaces a los artículos de razonamiento automático y demostración asistida por ordenador que se están publicando y&lt;br /&gt;
* en [https://www.glc.us.es/~jalonso/vestigium/category/resena/ Vestigium] que contiene una reseña de los más destacados.&lt;br /&gt;
&lt;br /&gt;
== Ofertas de trabajo ==&lt;br /&gt;
&lt;br /&gt;
En [https://github.com/jaalonso/Trabajos-MULCIA GitHub] se encuentra una recopilaciónn las ofertas de trabajo de interés para los estudiantes del Máster Universitario en Lógica, Computación e Inteligencia Artificial de la Universidad de Sevilla.&lt;br /&gt;
&lt;br /&gt;
Están en orden cronológico inverso por la fecha de su publicación en [https://twitter.com/search?l=&amp;amp;q=%23MULCIA%20from%3AJose_A_Alonso&amp;amp;src=typd&amp;amp;lang=es Twitter].&lt;/div&gt;</summary>
		<author><name>Jalonso</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2018/index.php?title=Relaci%C3%B3n_8&amp;diff=451</id>
		<title>Relación 8</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2018/index.php?title=Relaci%C3%B3n_8&amp;diff=451"/>
		<updated>2019-03-06T18:51:05Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: Protegió «Relación 8» ([Editar=Solo administradores] (indefinido) [Trasladar=Solo administradores] (indefinido))&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isabelle&amp;quot;&amp;gt;&lt;br /&gt;
chapter {* R8: Gramáticas libres de contexto *}&lt;br /&gt;
&lt;br /&gt;
theory R8_Gramaticas_libre_de_contexto&lt;br /&gt;
imports Main&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  En esta relación se definen dos gramáticas libres de contexto y se&lt;br /&gt;
  demuestra que son equivalentes. Además, se define por recursión una&lt;br /&gt;
  función para reconocer las palabras de la gramática y se demuestra que&lt;br /&gt;
  es correcta y completa. *}&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. Una gramática libre de contexto para las expresiones&lt;br /&gt;
  parentizadas es&lt;br /&gt;
     S ⟶ ε | &amp;#039;(&amp;#039; S &amp;#039;)&amp;#039; | SS&lt;br /&gt;
  definir inductivamente la gramática S usando A y B para &amp;#039;(&amp;#039; y &amp;#039;)&amp;#039;,&lt;br /&gt;
  respectivamente. &lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
datatype alfabeto = A | B&lt;br /&gt;
&lt;br /&gt;
inductive_set S :: &amp;quot;alfabeto list set&amp;quot; where&lt;br /&gt;
  S1: &amp;quot;[] ∈ S&amp;quot; &lt;br /&gt;
| S2: &amp;quot;w ∈ S ⟹ [A] @ w @ [B] ∈ S&amp;quot; &lt;br /&gt;
| S3: &amp;quot;v ∈ S ⟹ w ∈ S ⟹ v @ w ∈ S&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Otra gramática libre de contexto para las expresiones&lt;br /&gt;
  parentizadas es&lt;br /&gt;
     T ⟶ ε | T &amp;#039;(&amp;#039; T &amp;#039;)&amp;#039;&lt;br /&gt;
  definir inductivamente la gramática T usando A y B para &amp;#039;(&amp;#039; y &amp;#039;)&amp;#039;,&lt;br /&gt;
  respectivamente. &lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
inductive_set T :: &amp;quot;alfabeto list set&amp;quot; where&lt;br /&gt;
  T1: &amp;quot;[] ∈ T&amp;quot; &lt;br /&gt;
| T2: &amp;quot;v ∈ T ⟹ w ∈ T ⟹ v @ [A] @ w @ [B] ∈ T&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. Demostrar que T está contenido en S. &lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* benber alfmarcua antramhur josgomrom4 juacanrod giafus1 gleherlop *)&lt;br /&gt;
lemma T_en_S: &lt;br /&gt;
  assumes &amp;quot;w ∈ T&amp;quot;  &lt;br /&gt;
  shows   &amp;quot;w ∈ S&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;w ∈ T ⟹ w ∈ S&amp;quot;&lt;br /&gt;
  proof (induction rule: T.induct)&lt;br /&gt;
    show &amp;quot;[] ∈ S&amp;quot; by (rule S1)&lt;br /&gt;
  next&lt;br /&gt;
    fix v w&lt;br /&gt;
    assume &amp;quot;w ∈ S&amp;quot;&lt;br /&gt;
    hence &amp;quot;[A] @ w @ [B] ∈ S&amp;quot; by (rule S2)&lt;br /&gt;
    moreover assume &amp;quot;v ∈ S&amp;quot;&lt;br /&gt;
    ultimately show &amp;quot;v @ [A] @ w @ [B] ∈ S&amp;quot; using S3 by simp&lt;br /&gt;
  qed&lt;br /&gt;
  thus ?thesis using assms .&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* cammonagu *)&lt;br /&gt;
declare S1 [iff] S2[intro!,simp]&lt;br /&gt;
&lt;br /&gt;
(* cammonagu *)&lt;br /&gt;
declare T1 [iff]&lt;br /&gt;
&lt;br /&gt;
(* cammonagu *)&lt;br /&gt;
lemma T2ImpS: &amp;quot;w ∈ T ⟹ w ∈ S&amp;quot;&lt;br /&gt;
  apply (erule T.induct)&lt;br /&gt;
    apply simp&lt;br /&gt;
  apply (blast intro: S3)&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
(* cammonagu *)&lt;br /&gt;
lemma T_en_S1: &lt;br /&gt;
  assumes &amp;quot;w ∈ T&amp;quot;  &lt;br /&gt;
  shows   &amp;quot;w ∈ S&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;w ∈ T ⟹ w ∈ S&amp;quot; using assms by (rule T2ImpS)&lt;br /&gt;
  thus ?thesis using assms .&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* pabalagon marfruman1 pabbergue *)&lt;br /&gt;
lemma T_en_S2:&lt;br /&gt;
  assumes &amp;quot;w ∈ T&amp;quot;  &lt;br /&gt;
  shows   &amp;quot;w ∈ S&amp;quot;&lt;br /&gt;
using assms(1) apply (induction rule: T.induct) apply (rule S1) proof -&lt;br /&gt;
  fix v w&lt;br /&gt;
  assume HI1: &amp;quot;v ∈ S&amp;quot; and HI2: &amp;quot;w ∈ S&amp;quot;&lt;br /&gt;
  have &amp;quot;[A] @ w @ [B] ∈ S&amp;quot; using HI2 by (rule S2)&lt;br /&gt;
  thus &amp;quot;v @ [A] @ w @ [B] ∈ S&amp;quot; using HI1 S3 by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Demostrar que S está contenido en T. &lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* benber *)&lt;br /&gt;
lemma S_en_T: &lt;br /&gt;
  &amp;quot;w ∈ S ⟹ w ∈ T&amp;quot;&lt;br /&gt;
proof (induction rule: S.induct)&lt;br /&gt;
  show &amp;quot;[] ∈ T&amp;quot; by (rule T1)&lt;br /&gt;
next&lt;br /&gt;
  fix w&lt;br /&gt;
&lt;br /&gt;
  have &amp;quot;[] ∈ T&amp;quot; by (rule T1)&lt;br /&gt;
  moreover assume &amp;quot;w ∈ T&amp;quot;&lt;br /&gt;
  ultimately have &amp;quot;[] @ [A] @ w @ [B] ∈ T&amp;quot; by (rule T2)&lt;br /&gt;
  thus &amp;quot;[A] @ w @ [B] ∈ T&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix v w&lt;br /&gt;
  assume &amp;quot;v ∈ T&amp;quot;&lt;br /&gt;
  moreover assume &amp;quot;w ∈ T&amp;quot;&lt;br /&gt;
  moreover have &amp;quot;⟦v ∈ T; w ∈ T⟧ ⟹ v @ w ∈ T&amp;quot; for v w&lt;br /&gt;
  proof (induction &amp;quot;length w + length v&amp;quot; &lt;br /&gt;
         arbitrary: w v &lt;br /&gt;
         rule: less_induct)&lt;br /&gt;
    case IH: less&lt;br /&gt;
&lt;br /&gt;
    show &amp;quot;v @ w ∈ T&amp;quot;&lt;br /&gt;
    proof (cases w rule: T.cases)&lt;br /&gt;
      show &amp;quot;w ∈ T&amp;quot; using `w ∈ T`.&lt;br /&gt;
    next&lt;br /&gt;
      assume &amp;quot;w = []&amp;quot;&lt;br /&gt;
      thus &amp;quot;v @ w ∈ T&amp;quot; using `v ∈ T` by simp&lt;br /&gt;
    next&lt;br /&gt;
      fix w1 w2&lt;br /&gt;
      assume &amp;quot;w1 ∈ T&amp;quot; and &amp;quot;w2 ∈ T&amp;quot;&lt;br /&gt;
      assume &amp;quot;w = w1 @ [A] @ w2 @ [B]&amp;quot;&lt;br /&gt;
      hence 1: &amp;quot;v @ w = v @ w1 @ [A] @ w2 @ [B]&amp;quot; by simp&lt;br /&gt;
&lt;br /&gt;
      have &amp;quot;length w1 &amp;lt; length w&amp;quot; using `w = w1 @ [A] @ w2 @ [B]` &lt;br /&gt;
        by simp&lt;br /&gt;
      hence &amp;quot;length v + length w1 &amp;lt; length v + length w&amp;quot; by simp&lt;br /&gt;
      moreover note `v ∈ T`&lt;br /&gt;
      moreover note `w1 ∈ T`&lt;br /&gt;
      ultimately have &amp;quot;v @ w1 ∈ T&amp;quot; using IH by simp&lt;br /&gt;
      moreover note `w2 ∈ T`&lt;br /&gt;
      ultimately have &amp;quot;(v @ w1) @ [A] @ w2 @ [B] ∈ T&amp;quot; by (rule T2)&lt;br /&gt;
      thus &amp;quot;v @ w ∈ T&amp;quot; using 1 by simp&lt;br /&gt;
    qed&lt;br /&gt;
  qed&lt;br /&gt;
  ultimately show &amp;quot;v @ w ∈ T&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* alfmarcua antramhur josgomrom4 juacanrod gleherlop *)&lt;br /&gt;
lemma S_en_T_2: &lt;br /&gt;
  &amp;quot;w ∈ S ⟹ w ∈ T&amp;quot;&lt;br /&gt;
proof (induction rule: S.induct)&lt;br /&gt;
  show &amp;quot;[] ∈ T&amp;quot; by (rule T1)&lt;br /&gt;
next&lt;br /&gt;
  fix w&lt;br /&gt;
  assume &amp;quot;w ∈ T&amp;quot;&lt;br /&gt;
  have &amp;quot;[] @ [A] @ w @ [B] ∈ T&amp;quot; using T1 `w ∈ T` by (rule T2)&lt;br /&gt;
  then show &amp;quot;[A] @ w @ [B] ∈ T&amp;quot; by (simp only: List.append.append_Nil)&lt;br /&gt;
next&lt;br /&gt;
  fix w v&lt;br /&gt;
  assume &amp;quot;v ∈ T&amp;quot;&lt;br /&gt;
  show &amp;quot;w ∈ T ⟹ v @ w ∈ T&amp;quot;&lt;br /&gt;
  proof (induction rule: T.induct)&lt;br /&gt;
    show &amp;quot;v @ [] ∈ T&amp;quot; using `v ∈ T` &lt;br /&gt;
      by (simp only: List.append.right_neutral)&lt;br /&gt;
  next&lt;br /&gt;
    fix va w&lt;br /&gt;
    have &amp;quot;v @ va ∈ T ⟹ w ∈ T ⟹ (v @ va) @ [A] @ w @ [B] ∈ T &amp;quot; &lt;br /&gt;
      by (rule T2)&lt;br /&gt;
    then show &amp;quot;v @ va ∈ T ⟹ w ∈ T ⟹ v @ va @ [A] @ w @ [B] ∈ T &amp;quot; &lt;br /&gt;
      by (simp only: List.append_assoc)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* pabalagon giafus1 marfruman1 pabbergue *)&lt;br /&gt;
lemma S_en_T3:   &lt;br /&gt;
  &amp;quot;w ∈ S ⟹ w ∈ T&amp;quot;&lt;br /&gt;
apply (induction rule: S.induct) apply (rule T1) proof -&lt;br /&gt;
  fix w&lt;br /&gt;
  assume &amp;quot;w ∈ T&amp;quot;&lt;br /&gt;
  with T1 have &amp;quot;[] @ [A] @ w @ [B] ∈ T&amp;quot; by (rule T2)&lt;br /&gt;
  thus &amp;quot;[A] @ w @ [B] ∈ T&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix v w&lt;br /&gt;
  assume HI1: &amp;quot;v ∈ T&amp;quot; and HI2: &amp;quot;w ∈ T&amp;quot;&lt;br /&gt;
  show &amp;quot;w ∈ T ⟹ v @ w ∈ T&amp;quot; apply (induction rule: T.induct) apply (simp add: HI1)&lt;br /&gt;
  proof -&lt;br /&gt;
    fix va wa&lt;br /&gt;
    assume &amp;quot;v @ va ∈ T&amp;quot;&lt;br /&gt;
    moreover assume &amp;quot;wa ∈ T&amp;quot;&lt;br /&gt;
    ultimately have &amp;quot;(v @ va) @ [A] @ wa @ [B] ∈ T&amp;quot; by (rule T2)&lt;br /&gt;
    thus &amp;quot;v @ va @ [A] @ wa @ [B] ∈ T&amp;quot; by simp&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Demostrar que S y T son iguales. &lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* benber cammonagu antramhur josgomrom4 pabbergue *)&lt;br /&gt;
lemma S_igual_T:&lt;br /&gt;
  &amp;quot;S = T&amp;quot;&lt;br /&gt;
  using T_en_S S_en_T by auto&lt;br /&gt;
&lt;br /&gt;
(* alfmarcua pabalagon giafus1 gleherlop marfruman1*)&lt;br /&gt;
lemma S_igual_T_2:&lt;br /&gt;
  &amp;quot;S = T&amp;quot;&lt;br /&gt;
proof (rule equalityI)&lt;br /&gt;
  show &amp;quot;S ⊆ T&amp;quot; using S_en_T by (rule subsetI)&lt;br /&gt;
next&lt;br /&gt;
  show &amp;quot;T ⊆ S&amp;quot; using T_en_S by (rule subsetI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. En lugar de una gramática, se puede usar el siguiente&lt;br /&gt;
  procedimiento para determinar si la cadena es una sucesión de&lt;br /&gt;
  paréntesis bien balanceada: se recorre la cadena de izquierda a&lt;br /&gt;
  derecha contando cuántos paréntesis de necesitan para que esté bien&lt;br /&gt;
  balanceada. Si el contador al final de la cadena es 0, la cadena está&lt;br /&gt;
  bien balanceada.&lt;br /&gt;
&lt;br /&gt;
  Definir la función&lt;br /&gt;
     balanceada :: alfabeto list ⇒ bool&lt;br /&gt;
  tal que (balanceada w) se verifica si w está bien balanceada. Por&lt;br /&gt;
  ejemplo, &lt;br /&gt;
     balanceada [A,A,B,B] = True&lt;br /&gt;
     balanceada [A,B,A,B] = True&lt;br /&gt;
     balanceada [A,B,B,A] = False&lt;br /&gt;
  Indicación: Definir balanceada  usando la función auxiliar &lt;br /&gt;
     balanceada_aux :: alfabeto list ⇒ nat ⇒ bool&lt;br /&gt;
  tal que (balanceada_aux w 0) se verifica si w está bien balanceada.&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* benber alfmarcua antramhur josgomrom4 pabalagon gleherlop giafus1 marfruman1 pabbergue *)&lt;br /&gt;
(* balanceada_aux w n = True si y solo si ([A]*n) @ w es balanceada *)&lt;br /&gt;
fun balanceada_aux :: &amp;quot;alfabeto list ⇒ nat ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;balanceada_aux [] 0 = True&amp;quot;&lt;br /&gt;
| &amp;quot;balanceada_aux [] (Suc n) = False&amp;quot;&lt;br /&gt;
| &amp;quot;balanceada_aux (B#w) 0 = False&amp;quot;&lt;br /&gt;
| &amp;quot;balanceada_aux (B#w) (Suc n) = balanceada_aux w n&amp;quot;&lt;br /&gt;
| &amp;quot;balanceada_aux (A#w) n = balanceada_aux w (Suc n)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
fun balanceada :: &amp;quot;alfabeto list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;balanceada w = balanceada_aux w 0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 6. Demostrar que balanceada es un reconocedor correcto de la&lt;br /&gt;
  gramática S; es decir, &lt;br /&gt;
     w ∈ S ⟹ balanceada w&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* benber *)&lt;br /&gt;
lemma balanceada_correcto_aux1: &lt;br /&gt;
  &amp;quot;balanceada_aux w n ⟹ balanceada_aux (w @ [B]) (Suc n)&amp;quot;&lt;br /&gt;
proof (induction w arbitrary: n)&lt;br /&gt;
  case Nil&lt;br /&gt;
  assume &amp;quot;balanceada_aux [] n&amp;quot;&lt;br /&gt;
  thus ?case by simp&lt;br /&gt;
next&lt;br /&gt;
  case IS: (Cons x w)&lt;br /&gt;
  show ?case&lt;br /&gt;
  proof (cases x)&lt;br /&gt;
    case A&lt;br /&gt;
    note `balanceada_aux (x#w) n`&lt;br /&gt;
    hence &amp;quot;balanceada_aux (A#w) n&amp;quot; using `x = A` by simp&lt;br /&gt;
    hence &amp;quot;balanceada_aux w (Suc n)&amp;quot; by simp&lt;br /&gt;
    hence &amp;quot;balanceada_aux (w@[B]) (Suc (Suc n))&amp;quot; using IS.IH by simp&lt;br /&gt;
    hence &amp;quot;balanceada_aux ((A#w)@[B]) (Suc n)&amp;quot; by simp&lt;br /&gt;
    thus ?thesis using `x = A` by simp&lt;br /&gt;
  next&lt;br /&gt;
    case B&lt;br /&gt;
    hence 1: &amp;quot;balanceada_aux (B#w) n&amp;quot; using IS.prems by simp&lt;br /&gt;
&lt;br /&gt;
    show ?thesis&lt;br /&gt;
    proof (cases n)&lt;br /&gt;
      case 0&lt;br /&gt;
      hence &amp;quot;balanceada_aux (B#w) 0&amp;quot; using 1 by simp&lt;br /&gt;
      hence &amp;quot;False&amp;quot; by simp&lt;br /&gt;
      thus ?thesis ..&lt;br /&gt;
    next&lt;br /&gt;
      case (Suc m)&lt;br /&gt;
      hence &amp;quot;balanceada_aux (B#w) (Suc m)&amp;quot; using 1 by simp&lt;br /&gt;
      hence &amp;quot;balanceada_aux w m&amp;quot; by simp&lt;br /&gt;
      hence &amp;quot;balanceada_aux (w@[B]) (Suc m)&amp;quot; using IS.IH by simp&lt;br /&gt;
      hence &amp;quot;balanceada_aux (w@[B]) n&amp;quot; using `n = Suc m` by simp&lt;br /&gt;
      hence &amp;quot;balanceada_aux (B#(w@[B])) (Suc n)&amp;quot; by simp&lt;br /&gt;
      thus ?thesis using `x = B` by simp&lt;br /&gt;
    qed&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma balanceada_correcto_aux2:&lt;br /&gt;
  assumes &amp;quot;balanceada v&amp;quot;&lt;br /&gt;
  shows &amp;quot;balanceada_aux w n ⟹ balanceada_aux (w @ v) n&amp;quot;&lt;br /&gt;
proof (induction w arbitrary: n)&lt;br /&gt;
  case Nil&lt;br /&gt;
  hence &amp;quot;n = 0&amp;quot; using balanceada_aux.elims by auto&lt;br /&gt;
  thus ?case using assms by simp&lt;br /&gt;
next&lt;br /&gt;
  case IS: (Cons x w)&lt;br /&gt;
  show &amp;quot;balanceada_aux ((x#w)@v) n&amp;quot;&lt;br /&gt;
  proof (cases x)&lt;br /&gt;
    case A&lt;br /&gt;
    hence &amp;quot;balanceada_aux (A#w) n&amp;quot; using IS.prems by simp&lt;br /&gt;
    hence &amp;quot;balanceada_aux w (Suc n)&amp;quot; by simp&lt;br /&gt;
    hence &amp;quot;balanceada_aux (w@v) (Suc n)&amp;quot; using IS.IH by simp&lt;br /&gt;
    hence &amp;quot;balanceada_aux (A#(w@v)) n&amp;quot; by simp&lt;br /&gt;
    thus ?thesis using `x = A` by simp&lt;br /&gt;
  next&lt;br /&gt;
    case B&lt;br /&gt;
    hence 1: &amp;quot;balanceada_aux (B#w) n&amp;quot; using IS.prems by simp&lt;br /&gt;
&lt;br /&gt;
    show ?thesis&lt;br /&gt;
    proof (cases n)&lt;br /&gt;
      case 0&lt;br /&gt;
      hence &amp;quot;balanceada_aux (B#w) 0&amp;quot; using 1 by simp&lt;br /&gt;
      hence &amp;quot;False&amp;quot; by simp&lt;br /&gt;
      thus ?thesis ..&lt;br /&gt;
    next&lt;br /&gt;
      case (Suc m)&lt;br /&gt;
      hence &amp;quot;balanceada_aux (B#w) (Suc m)&amp;quot; using 1 by simp&lt;br /&gt;
      hence &amp;quot;balanceada_aux w m&amp;quot; by simp&lt;br /&gt;
      hence &amp;quot;balanceada_aux (w@v) m&amp;quot; using IS.IH by simp&lt;br /&gt;
      hence &amp;quot;balanceada_aux (B#(w@v)) (Suc m)&amp;quot; by simp&lt;br /&gt;
      thus ?thesis using `x = B` `n = Suc m` by simp&lt;br /&gt;
    qed&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma balanceada_correcto:&lt;br /&gt;
  &amp;quot;w ∈ S ⟹ balanceada w&amp;quot;&lt;br /&gt;
proof (induction rule: S.induct)&lt;br /&gt;
  case S1&lt;br /&gt;
  have &amp;quot;balanceada [] = balanceada_aux [] 0&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;...&amp;quot; by simp&lt;br /&gt;
  finally show ?case.&lt;br /&gt;
next&lt;br /&gt;
  case S2&lt;br /&gt;
  fix w&lt;br /&gt;
  assume &amp;quot;balanceada w&amp;quot;&lt;br /&gt;
  hence &amp;quot;balanceada_aux w 0&amp;quot; by simp&lt;br /&gt;
  hence &amp;quot;balanceada_aux (w@[B]) 1&amp;quot; using balanceada_correcto_aux1 &lt;br /&gt;
    by simp&lt;br /&gt;
  hence &amp;quot;balanceada_aux ([A] @ w @ [B]) 0&amp;quot; by simp&lt;br /&gt;
  thus &amp;quot;balanceada ([A] @ w @ [B])&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  case S3&lt;br /&gt;
  thus ?case using balanceada_correcto_aux2 by auto&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* alfmarcua antramhur josgomrom4 giafus1 pabbergue *)&lt;br /&gt;
lemma balanceada_correcto_aux3:&lt;br /&gt;
  shows &amp;quot;balanceada_aux v m ⟹ &lt;br /&gt;
         balanceada_aux w n ⟹ &lt;br /&gt;
         balanceada_aux (v @ w) (m+n)&amp;quot;&lt;br /&gt;
proof (induction v arbitrary: n m)&lt;br /&gt;
  case Nil&lt;br /&gt;
  then show ?case &lt;br /&gt;
  proof (cases m)&lt;br /&gt;
    case 0&lt;br /&gt;
    then have &amp;quot;balanceada_aux w (m + n)&amp;quot; using Nil.prems(2) &lt;br /&gt;
      by (simp only:Groups.monoid_add_class.add.left_neutral)&lt;br /&gt;
    then show ?thesis  by (simp only:List.append.append_Nil)&lt;br /&gt;
  next&lt;br /&gt;
    case (Suc mm)&lt;br /&gt;
    then have &amp;quot;False&amp;quot; using Nil.prems(1) &lt;br /&gt;
      by (simp only: balanceada_aux.simps(2))&lt;br /&gt;
    then show ?thesis ..&lt;br /&gt;
  qed&lt;br /&gt;
next&lt;br /&gt;
  case IS:(Cons a v)&lt;br /&gt;
  show &amp;quot;balanceada_aux ((a # v) @ w) (m + n)&amp;quot;&lt;br /&gt;
  proof (cases a)&lt;br /&gt;
    define k :: nat where &amp;quot;k = m + 1&amp;quot;&lt;br /&gt;
    case A&lt;br /&gt;
    then have &amp;quot;balanceada_aux v k&amp;quot; using `k = m + 1` IS.prems(1) &lt;br /&gt;
      by simp&lt;br /&gt;
    then have &amp;quot;balanceada_aux (v @ w) (k + n)&amp;quot; using IS.prems(2)  &lt;br /&gt;
      by (rule IS.IH)&lt;br /&gt;
    then have &amp;quot;balanceada_aux (v @ w) (Suc(m + n))&amp;quot; using `k = m + 1` &lt;br /&gt;
      by simp&lt;br /&gt;
    then have &amp;quot;balanceada_aux (A # (v @ w)) (m + n)&amp;quot; &lt;br /&gt;
      by (simp only: balanceada_aux.simps(5))&lt;br /&gt;
    then show ?thesis using `a = A` &lt;br /&gt;
      by (simp only:List.append.append_Cons)&lt;br /&gt;
  next&lt;br /&gt;
    case B&lt;br /&gt;
    then show ?thesis&lt;br /&gt;
    proof (cases m)&lt;br /&gt;
      case 0&lt;br /&gt;
      then have &amp;quot;False&amp;quot; using IS.prems(1) `a = B` &lt;br /&gt;
        by (simp only: balanceada_aux.simps(3))&lt;br /&gt;
      then show ?thesis ..&lt;br /&gt;
    next&lt;br /&gt;
      case (Suc mm)&lt;br /&gt;
      hence &amp;quot;balanceada_aux v mm&amp;quot; using IS.prems(1) `a = B` &lt;br /&gt;
        by (simp only: balanceada_aux.simps(4))&lt;br /&gt;
      then have &amp;quot;balanceada_aux (v @ w) (mm + n)&amp;quot; using IS.prems(2) &lt;br /&gt;
        by (rule IS.IH)&lt;br /&gt;
      then have &amp;quot;balanceada_aux (B # (v @ w)) (Suc (mm + n))&amp;quot; &lt;br /&gt;
        by (simp only: balanceada_aux.simps(4))&lt;br /&gt;
      then have &amp;quot;balanceada_aux (B # (v @ w)) (m + n)&amp;quot; &lt;br /&gt;
        using `m = Suc mm` by (simp only: Nat.plus_nat.add_Suc)&lt;br /&gt;
      then show ?thesis using `a=B`  &lt;br /&gt;
        by (simp only:List.append.append_Cons)&lt;br /&gt;
    qed&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma balanceada_correcto_2:&lt;br /&gt;
  &amp;quot;w ∈ S ⟹ balanceada w&amp;quot;&lt;br /&gt;
proof (induction rule: S.induct)&lt;br /&gt;
  case S1&lt;br /&gt;
  have &amp;quot;balanceada_aux [] 0&amp;quot; by (simp only: balanceada_aux.simps(1))&lt;br /&gt;
  then show ?case by (simp only: balanceada.simps)&lt;br /&gt;
next&lt;br /&gt;
  case (S2 w)&lt;br /&gt;
  then have 1:&amp;quot;balanceada_aux w 0&amp;quot; by (simp only: balanceada.simps)&lt;br /&gt;
  have &amp;quot;balanceada_aux [] 0&amp;quot; by (simp only: balanceada_aux.simps(1))&lt;br /&gt;
  then have 2:&amp;quot;balanceada_aux (B#[]) (Suc 0)&amp;quot; &lt;br /&gt;
    by (simp only: balanceada_aux.simps(4))&lt;br /&gt;
  have &amp;quot;balanceada_aux w 0 ⟹ &lt;br /&gt;
        balanceada_aux [B] (Suc 0) ⟹  &lt;br /&gt;
        balanceada_aux (w @ [B]) (0+Suc 0)&amp;quot; &lt;br /&gt;
    by (rule balanceada_correcto_aux3)&lt;br /&gt;
  then have &amp;quot;balanceada_aux (w @ [B]) (Suc 0)&amp;quot; using 1 2 &lt;br /&gt;
    by (simp only:Groups.monoid_add_class.add.left_neutral)&lt;br /&gt;
  then have &amp;quot;balanceada_aux (A # (w @ [B])) 0&amp;quot; &lt;br /&gt;
    by (simp only: balanceada_aux.simps(5))&lt;br /&gt;
  then have &amp;quot;balanceada_aux ([A] @ w @ [B]) 0&amp;quot; &lt;br /&gt;
    by (simp only: List.append_Cons List.append_Nil)&lt;br /&gt;
  then show ?case by (simp only: balanceada.simps)&lt;br /&gt;
next&lt;br /&gt;
  case (S3 v w)&lt;br /&gt;
  then have 1:&amp;quot;balanceada_aux w 0&amp;quot; by (simp only: balanceada.simps)&lt;br /&gt;
  have 2:&amp;quot;balanceada_aux v 0&amp;quot; using S3(3) &lt;br /&gt;
    by (simp only: balanceada.simps)&lt;br /&gt;
  have &amp;quot;balanceada_aux v 0 ⟹ &lt;br /&gt;
        balanceada_aux w 0 ⟹  &lt;br /&gt;
        balanceada_aux (v @ w) (0+0)&amp;quot; &lt;br /&gt;
    by (rule balanceada_correcto_aux3)&lt;br /&gt;
  then have &amp;quot;balanceada_aux (v @ w) 0&amp;quot; using 1 2 &lt;br /&gt;
    by (simp only:Groups.monoid_add_class.add.right_neutral)&lt;br /&gt;
  then show ?case by (simp only: balanceada.simps)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* pabalagon *)&lt;br /&gt;
lemma balanceada_correcto_aux4:&lt;br /&gt;
  &amp;quot;⟦balanceada_aux v m; balanceada_aux w n⟧ ⟹ balanceada_aux (v@w) (m+n)&amp;quot;&lt;br /&gt;
proof (induction v arbitrary: m n)&lt;br /&gt;
  fix m n&lt;br /&gt;
  case Nil&lt;br /&gt;
  hence &amp;quot;m = 0&amp;quot; proof (induct m)&lt;br /&gt;
    case 0 thus ?case by simp&lt;br /&gt;
  next&lt;br /&gt;
    case Suc hence False using Nil(1) by simp thus ?case by (rule FalseE)&lt;br /&gt;
  qed&lt;br /&gt;
  have &amp;quot;balanceada_aux ([] @ w) n&amp;quot; using Nil(2) by simp&lt;br /&gt;
  thus &amp;quot;balanceada_aux ([] @ w) (m + n)&amp;quot; using `m=0` by simp&lt;br /&gt;
next&lt;br /&gt;
  fix m n&lt;br /&gt;
  case (Cons a v)&lt;br /&gt;
  show &amp;quot;balanceada_aux ((a#v)@w) (m+n)&amp;quot; using Cons(2) Cons(3)&lt;br /&gt;
  proof (cases a)&lt;br /&gt;
    define k where &amp;quot;k = Suc m&amp;quot;&lt;br /&gt;
    case A&lt;br /&gt;
    hence &amp;quot;balanceada_aux (A#v) m&amp;quot; using Cons(2) by simp&lt;br /&gt;
    hence &amp;quot;balanceada_aux v k&amp;quot; using k_def by simp&lt;br /&gt;
    hence &amp;quot;balanceada_aux (v@w) (k + n)&amp;quot; using Cons(1,3) by simp&lt;br /&gt;
    hence &amp;quot;balanceada_aux (A # (v@w)) (m+n)&amp;quot; using k_def by simp&lt;br /&gt;
    thus ?thesis using A by simp&lt;br /&gt;
  next&lt;br /&gt;
    case B thus ?thesis proof (cases m)&lt;br /&gt;
      case 0&lt;br /&gt;
      hence False using Cons(2) B by simp&lt;br /&gt;
      thus ?thesis by (rule FalseE)&lt;br /&gt;
    next&lt;br /&gt;
      case (Suc mm)&lt;br /&gt;
      hence &amp;quot;balanceada_aux (B#v) (Suc mm)&amp;quot; using Cons(2) B by simp&lt;br /&gt;
      hence &amp;quot;balanceada_aux v mm&amp;quot; by simp&lt;br /&gt;
      hence &amp;quot;balanceada_aux (v@w) (mm + n)&amp;quot; using Cons(1, 3) by simp&lt;br /&gt;
      hence &amp;quot;balanceada_aux (B#v@w) (Suc (mm+n))&amp;quot; by simp&lt;br /&gt;
      thus ?thesis using B Suc by simp&lt;br /&gt;
    qed&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma balanceada_correcto3:&lt;br /&gt;
  &amp;quot;w ∈ S ⟹ balanceada w&amp;quot;&lt;br /&gt;
  apply (induction rule: S.induct) apply simp proof -&lt;br /&gt;
  fix w n&lt;br /&gt;
  assume HI: &amp;quot;balanceada w&amp;quot;&lt;br /&gt;
  hence &amp;quot;balanceada_aux w 0&amp;quot; by simp&lt;br /&gt;
  moreover have &amp;quot;balanceada_aux [B] 1&amp;quot; by simp&lt;br /&gt;
  ultimately have &amp;quot;balanceada_aux (w@[B]) (0+1)&amp;quot; by (rule balanceada_correcto_aux4)&lt;br /&gt;
  thus &amp;quot;balanceada ([A] @ w @ [B])&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix v w&lt;br /&gt;
  assume &amp;quot;balanceada v&amp;quot;&lt;br /&gt;
  hence 1: &amp;quot;balanceada_aux v 0&amp;quot; by simp&lt;br /&gt;
  assume &amp;quot;balanceada w&amp;quot;&lt;br /&gt;
  hence &amp;quot;balanceada_aux w 0&amp;quot; by simp&lt;br /&gt;
  with 1 have &amp;quot;balanceada_aux (v@w) (0+0)&amp;quot; by (rule balanceada_correcto_aux4)&lt;br /&gt;
  thus &amp;quot;balanceada (v@w)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 7. Demostrar que balanceada es un reconocedor completo de &lt;br /&gt;
  la gramática S; es decir, &lt;br /&gt;
     balanceada w ⟹ w ∈ S &lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* benber antramhur pabalagon pabbergue *)&lt;br /&gt;
lemma balanceada_aux_unico: &lt;br /&gt;
  &amp;quot;⟦balanceada_aux w k; balanceada_aux w l⟧ ⟹ k = l&amp;quot; for w k l&lt;br /&gt;
proof (induction w arbitrary: k l)&lt;br /&gt;
  case Nil&lt;br /&gt;
  hence &amp;quot;k = 0 ∧ l = 0&amp;quot; using balanceada_aux.elims by auto&lt;br /&gt;
  thus ?case by simp&lt;br /&gt;
next&lt;br /&gt;
  case IS: (Cons x w&amp;#039;)&lt;br /&gt;
  show ?case&lt;br /&gt;
  proof (cases x)&lt;br /&gt;
    case A&lt;br /&gt;
    thus ?thesis using IS by auto&lt;br /&gt;
  next&lt;br /&gt;
    case B&lt;br /&gt;
    show ?thesis&lt;br /&gt;
    proof (cases k)&lt;br /&gt;
      case 0&lt;br /&gt;
      hence &amp;quot;False&amp;quot; using IS.prems `x = B` by simp&lt;br /&gt;
      thus ?thesis ..&lt;br /&gt;
    next&lt;br /&gt;
      case (Suc k&amp;#039;)&lt;br /&gt;
      hence &amp;quot;balanceada_aux w&amp;#039; k&amp;#039;&amp;quot; using IS.prems `x = B` by simp&lt;br /&gt;
&lt;br /&gt;
      show ?thesis&lt;br /&gt;
      proof (cases l)&lt;br /&gt;
        case 0&lt;br /&gt;
        hence &amp;quot;False&amp;quot; using IS.prems `x = B` by simp&lt;br /&gt;
        thus ?thesis ..&lt;br /&gt;
      next&lt;br /&gt;
        case (Suc l&amp;#039;)&lt;br /&gt;
        hence &amp;quot;balanceada_aux w&amp;#039; l&amp;#039;&amp;quot; using IS.prems `x = B` by simp&lt;br /&gt;
        thus ?thesis &lt;br /&gt;
          using `balanceada_aux w&amp;#039; k&amp;#039;` IS.IH `k = Suc k&amp;#039;` `l = Suc l&amp;#039;` &lt;br /&gt;
          by auto&lt;br /&gt;
      qed&lt;br /&gt;
    qed&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma balanceada_completo_aux1:&lt;br /&gt;
  &amp;quot;⟦balanceada (x # w @ [y]); &lt;br /&gt;
    ⋀u v. u ≠ [] ∧ v ≠ [] ∧ u @ v = x # w @ [y] ⟶ ¬ (balanceada v)⟧&lt;br /&gt;
    ⟹ x = A ∧ y = B ∧ balanceada w&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  assume &amp;quot;balanceada (x # w @ [y])&amp;quot;&lt;br /&gt;
  hence bal: &amp;quot;balanceada_aux ( x # w @ [y] ) 0&amp;quot; by simp&lt;br /&gt;
&lt;br /&gt;
  assume postfix_con: &amp;quot;⋀u v. u ≠ [] ∧ v ≠ [] ∧ u @ v = x # w @ [y] ⟶ &lt;br /&gt;
                             ¬ (balanceada v)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  have &amp;quot;x = A&amp;quot;&lt;br /&gt;
  proof (rule ccontr)&lt;br /&gt;
    assume &amp;quot;x ≠ A&amp;quot;&lt;br /&gt;
    hence &amp;quot;x = B&amp;quot; using alfabeto.exhaust by blast&lt;br /&gt;
    thus &amp;quot;False&amp;quot; using bal by simp&lt;br /&gt;
  qed&lt;br /&gt;
&lt;br /&gt;
  have hl1: &amp;quot;balanceada_aux (w @ [y]) n ⟹ y = B&amp;quot; for w y n&lt;br /&gt;
  proof (induction w arbitrary: n)&lt;br /&gt;
    case IB: Nil&lt;br /&gt;
    show &amp;quot;y = B&amp;quot;&lt;br /&gt;
    proof (rule ccontr)&lt;br /&gt;
      assume &amp;quot;y ≠ B&amp;quot;&lt;br /&gt;
      hence &amp;quot;y = A&amp;quot; using alfabeto.exhaust by blast&lt;br /&gt;
      thus &amp;quot;False&amp;quot; using IB by simp&lt;br /&gt;
    qed&lt;br /&gt;
  next&lt;br /&gt;
    case IS: (Cons x w)&lt;br /&gt;
    hence &amp;quot;balanceada_aux (x # w @ [y]) n&amp;quot; by simp&lt;br /&gt;
    hence &amp;quot;∃m. balanceada_aux (w @ [y]) m&amp;quot; using balanceada_aux.elims(2) &lt;br /&gt;
      by blast (* SH&amp;#039;d *)&lt;br /&gt;
    thus &amp;quot;y = B&amp;quot; using IS.IH by auto&lt;br /&gt;
  qed&lt;br /&gt;
&lt;br /&gt;
  have &amp;quot;y = B&amp;quot; using bal hl1[of &amp;quot;(x#w)&amp;quot;] by simp&lt;br /&gt;
  hence &amp;quot;balanceada_aux (w @ [B]) 1&amp;quot; using bal `x = A` by simp&lt;br /&gt;
&lt;br /&gt;
  have hl2: &amp;quot;balanceada_aux (x#w) n ⟹ ∃m. balanceada_aux w m&amp;quot; &lt;br /&gt;
    for x w n&lt;br /&gt;
  proof (cases x)&lt;br /&gt;
    case A&lt;br /&gt;
    moreover assume &amp;quot;balanceada_aux (x#w) n&amp;quot;&lt;br /&gt;
    ultimately show ?thesis by auto&lt;br /&gt;
  next&lt;br /&gt;
    case B&lt;br /&gt;
    moreover assume &amp;quot;balanceada_aux (x#w) n&amp;quot;&lt;br /&gt;
    ultimately have &amp;quot;balanceada_aux (B#w) n&amp;quot; by simp&lt;br /&gt;
    thus ?thesis by (cases n) auto&lt;br /&gt;
  qed&lt;br /&gt;
&lt;br /&gt;
  have &amp;quot;⟦balanceada_aux w n; u @ v = w⟧ ⟹ ∃ m. balanceada_aux v m&amp;quot; &lt;br /&gt;
    for u v w n&lt;br /&gt;
  proof (induction w arbitrary: u v n)&lt;br /&gt;
    case Nil&lt;br /&gt;
    hence &amp;quot;v = []&amp;quot; by simp&lt;br /&gt;
    hence &amp;quot;balanceada_aux v 0&amp;quot; by simp&lt;br /&gt;
    thus ?case ..&lt;br /&gt;
  next&lt;br /&gt;
    case IS: (Cons x w&amp;#039;)&lt;br /&gt;
    then obtain m where mDef: &amp;quot;balanceada_aux w&amp;#039; m&amp;quot; using hl2 by blast&lt;br /&gt;
&lt;br /&gt;
    show ?case&lt;br /&gt;
    proof (cases u)&lt;br /&gt;
      case Nil&lt;br /&gt;
      hence &amp;quot;balanceada_aux v n&amp;quot; using IS by simp&lt;br /&gt;
      thus ?thesis ..&lt;br /&gt;
    next&lt;br /&gt;
      case (Cons y u&amp;#039;)&lt;br /&gt;
      hence &amp;quot;w&amp;#039; = u&amp;#039; @ v&amp;quot; using IS.prems by simp&lt;br /&gt;
      thus ?thesis using IS.IH mDef by simp&lt;br /&gt;
    qed&lt;br /&gt;
  qed&lt;br /&gt;
  moreover have &amp;quot;balanceada_aux (w @ [B]) 1&amp;quot; using bal `x = A` `y = B` &lt;br /&gt;
    by simp&lt;br /&gt;
  ultimately have &amp;quot;u @ v = (w @ [B]) ⟹ ∃m. balanceada_aux v m&amp;quot; &lt;br /&gt;
    for u v by auto&lt;br /&gt;
  moreover {&lt;br /&gt;
    fix u v&lt;br /&gt;
    have 1: &amp;quot;⟦u&amp;#039; ≠ []; v ≠ []; u&amp;#039; @ v = (x # w @ [y])⟧ ⟹ &lt;br /&gt;
             ¬(balanceada v)&amp;quot; for u&amp;#039;&lt;br /&gt;
      using postfix_con by auto&lt;br /&gt;
    have &amp;quot;⟦v ≠ []; (x#u) @ v = (x # w @ [y])⟧ ⟹ ¬(balanceada v)&amp;quot; &lt;br /&gt;
      using 1[of &amp;quot;x#u&amp;quot;] by simp&lt;br /&gt;
    hence &amp;quot;⟦v ≠ []; u @ v = (w @ [B])⟧ ⟹ ¬(balanceada_aux v 0)&amp;quot; &lt;br /&gt;
      using `y = B` by simp&lt;br /&gt;
  }&lt;br /&gt;
  ultimately have hl3: &amp;quot;⟦v ≠ []; u @ v = (w @ [B])⟧ ⟹ &lt;br /&gt;
                        ∃m. balanceada_aux v (Suc m)&amp;quot; for u v&lt;br /&gt;
    by (metis zero_induct) (* SH&amp;#039;d *)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  have hl4: &amp;quot;⟦balanceada_aux (v @ [B]) (Suc n); ⋀s t. v = s @ t ⟹ &lt;br /&gt;
              ∃m. balanceada_aux (t @ [B]) (Suc m)⟧&lt;br /&gt;
             ⟹ balanceada_aux v n&amp;quot; for v n&lt;br /&gt;
  proof (induction v arbitrary: n)&lt;br /&gt;
    case Nil&lt;br /&gt;
    hence &amp;quot;balanceada_aux [B] (Suc n)&amp;quot; by simp&lt;br /&gt;
    thus &amp;quot;balanceada_aux [] n&amp;quot; by simp&lt;br /&gt;
  next&lt;br /&gt;
    case IS: (Cons x v&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
    have &amp;quot;x#v&amp;#039; = [x] @ v&amp;#039;&amp;quot; by simp&lt;br /&gt;
    then obtain m where mDef: &amp;quot;balanceada_aux (v&amp;#039; @ [B]) (Suc m)&amp;quot; &lt;br /&gt;
      using IS.prems by blast&lt;br /&gt;
    moreover have v&amp;#039;Postf: &amp;quot;⋀s t. v&amp;#039; = s @ t ⟹ &lt;br /&gt;
                                  ∃m. balanceada_aux (t @ [B]) (Suc m)&amp;quot;&lt;br /&gt;
      using IS.prems by auto&lt;br /&gt;
    ultimately have &amp;quot;balanceada_aux v&amp;#039; m&amp;quot; using IS.IH by simp&lt;br /&gt;
&lt;br /&gt;
    show ?case&lt;br /&gt;
    proof (cases x)&lt;br /&gt;
      case A&lt;br /&gt;
      hence &amp;quot;balanceada_aux ((A # v&amp;#039;) @ [B]) (Suc n)&amp;quot; using IS.prems &lt;br /&gt;
        by simp&lt;br /&gt;
      hence &amp;quot;balanceada_aux (v&amp;#039; @ [B]) (Suc (Suc n))&amp;quot; by simp&lt;br /&gt;
      hence &amp;quot;balanceada_aux v&amp;#039; (Suc n)&amp;quot; using IS.IH v&amp;#039;Postf by simp&lt;br /&gt;
      thus ?thesis using `x = A` by simp&lt;br /&gt;
    next&lt;br /&gt;
      case B&lt;br /&gt;
      hence &amp;quot;balanceada_aux ((B # v&amp;#039;) @ [B]) (Suc n)&amp;quot; using IS.prems &lt;br /&gt;
        by simp&lt;br /&gt;
      hence 1: &amp;quot;balanceada_aux ( v&amp;#039; @ [B]) n&amp;quot; using IS.prems by simp&lt;br /&gt;
&lt;br /&gt;
      have &amp;quot;n = Suc m&amp;quot; using 1 mDef balanceada_aux_unico by simp&lt;br /&gt;
      thus &amp;quot;balanceada_aux (x # v&amp;#039;) n&amp;quot; &lt;br /&gt;
        using `balanceada_aux v&amp;#039; m` `x = B` by simp&lt;br /&gt;
    qed&lt;br /&gt;
  qed&lt;br /&gt;
  moreover note `balanceada_aux (w @ [B]) 1`&lt;br /&gt;
  moreover have &amp;quot;w = s @ t ⟹ ∃m. balanceada_aux (t @ [B]) (Suc m)&amp;quot; &lt;br /&gt;
    for s t using hl3 by simp&lt;br /&gt;
  ultimately have &amp;quot;balanceada_aux w 0&amp;quot; by simp&lt;br /&gt;
  thus &amp;quot;x = A ∧ y = B ∧ balanceada w&amp;quot; using `x = A` `y = B`by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma balanceada_completo_aux2: &lt;br /&gt;
  assumes &amp;quot;balanceada (u @ v)&amp;quot; and &amp;quot;¬ balanceada u&amp;quot;&lt;br /&gt;
  shows &amp;quot;¬ balanceada v&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;⟦balanceada_aux (u @ v) n; balanceada v⟧ ⟹ balanceada_aux u n&amp;quot; &lt;br /&gt;
    for n&lt;br /&gt;
  proof (induction u arbitrary: n)&lt;br /&gt;
    case Nil&lt;br /&gt;
    hence &amp;quot;n = 0&amp;quot; using balanceada_aux_unico by simp&lt;br /&gt;
    thus ?case by simp&lt;br /&gt;
  next&lt;br /&gt;
    case IS: (Cons x u&amp;#039;)&lt;br /&gt;
    show ?case&lt;br /&gt;
    proof (cases x)&lt;br /&gt;
      case A&lt;br /&gt;
      hence &amp;quot;balanceada_aux (A # u&amp;#039; @ v) n&amp;quot; using IS.prems by simp&lt;br /&gt;
      hence &amp;quot;balanceada_aux (u&amp;#039; @ v) (Suc n)&amp;quot; by simp&lt;br /&gt;
      hence &amp;quot;balanceada_aux u&amp;#039; (Suc n)&amp;quot; using `balanceada v` IS.IH &lt;br /&gt;
        by simp&lt;br /&gt;
      thus ?thesis using `x = A` by simp&lt;br /&gt;
    next&lt;br /&gt;
      case B&lt;br /&gt;
      hence 1: &amp;quot;balanceada_aux (B # u&amp;#039; @ v) n&amp;quot; using IS.prems by simp&lt;br /&gt;
      then obtain m where &amp;quot;Suc m = n&amp;quot; by (cases n) auto&lt;br /&gt;
      hence &amp;quot;balanceada_aux (B # u&amp;#039; @ v) (Suc m)&amp;quot; using 1 by simp&lt;br /&gt;
      hence &amp;quot;balanceada_aux u&amp;#039; m&amp;quot; using `balanceada v` IS.IH by simp&lt;br /&gt;
      hence &amp;quot;balanceada_aux (B # u&amp;#039;) n&amp;quot; using `Suc m = n` by auto&lt;br /&gt;
      thus ?thesis using `x = B` by simp&lt;br /&gt;
    qed&lt;br /&gt;
  qed&lt;br /&gt;
  thus ?thesis using assms by auto&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma balanceada_completo:&lt;br /&gt;
  assumes &amp;quot;balanceada w&amp;quot;&lt;br /&gt;
  shows   &amp;quot;w ∈ S&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;balanceada w ⟹ w ∈ S&amp;quot;&lt;br /&gt;
  proof (induction &amp;quot;length w&amp;quot; arbitrary: w rule: less_induct)&lt;br /&gt;
    case IS: less&lt;br /&gt;
  &lt;br /&gt;
    show ?case&lt;br /&gt;
    proof (cases w)&lt;br /&gt;
      case Nil&lt;br /&gt;
      thus ?thesis using S1 by simp&lt;br /&gt;
    next&lt;br /&gt;
      case (Cons x w&amp;#039;)&lt;br /&gt;
      show ?thesis&lt;br /&gt;
      proof (cases w&amp;#039;)&lt;br /&gt;
        case Nil&lt;br /&gt;
        hence &amp;quot;¬ balanceada (x#w&amp;#039;)&amp;quot; by (cases x) auto&lt;br /&gt;
        hence &amp;quot;False&amp;quot; using `w = x # w&amp;#039;`IS.prems by simp&lt;br /&gt;
        thus ?thesis ..&lt;br /&gt;
      next&lt;br /&gt;
        case (Cons y w&amp;#039;&amp;#039;)&lt;br /&gt;
        show ?thesis&lt;br /&gt;
        proof cases&lt;br /&gt;
          assume &amp;quot;∃u v. w = u @ v ∧ u ≠ [] ∧ v ≠ [] ∧ &lt;br /&gt;
                        balanceada u ∧ balanceada v&amp;quot;&lt;br /&gt;
          then obtain u v where &amp;quot;w = u @ v&amp;quot; and &lt;br /&gt;
                                &amp;quot;u ≠ []&amp;quot; and &lt;br /&gt;
                                &amp;quot;v ≠ []&amp;quot; and &lt;br /&gt;
                                &amp;quot;balanceada u&amp;quot;&lt;br /&gt;
            and &amp;quot;balanceada v&amp;quot; by blast&lt;br /&gt;
&lt;br /&gt;
          have &amp;quot;u ∈ S&amp;quot; using `w = u @ v` `v ≠ []` `balanceada u` IS &lt;br /&gt;
            by simp&lt;br /&gt;
          moreover have &amp;quot;v ∈ S&amp;quot; &lt;br /&gt;
            using `w = u @ v` `u ≠ []` `balanceada v` IS by simp&lt;br /&gt;
          ultimately show &amp;quot;w ∈ S&amp;quot; using S3 `w = u @ v` by simp&lt;br /&gt;
        next&lt;br /&gt;
          assume &amp;quot;∄u v. w = u @ v ∧ u ≠ [] ∧ v ≠ [] ∧ &lt;br /&gt;
                        balanceada u ∧ balanceada v&amp;quot;&lt;br /&gt;
          hence 1: &amp;quot;⟦u @ v = w; u ≠ []; v ≠ []; balanceada u⟧ ⟹ &lt;br /&gt;
                    ¬ balanceada v&amp;quot; for u v by auto&lt;br /&gt;
&lt;br /&gt;
          have &amp;quot;w = x # y # w&amp;#039;&amp;#039;&amp;quot; using `w = x # w&amp;#039;` `w&amp;#039; = y # w&amp;#039;&amp;#039;` &lt;br /&gt;
            by simp&lt;br /&gt;
          moreover have &amp;quot;∃ u z. y # w&amp;#039;&amp;#039; = u @ [z]&amp;quot;&lt;br /&gt;
          proof -&lt;br /&gt;
            have &amp;quot;∃ u y. (x :: alfabeto) # v = u @ [y]&amp;quot; for x v&lt;br /&gt;
            proof (induction v arbitrary: x)&lt;br /&gt;
              case Nil&lt;br /&gt;
              have &amp;quot;x # [] = [] @ [x]&amp;quot; by simp&lt;br /&gt;
              thus ?case by simp&lt;br /&gt;
            next&lt;br /&gt;
              case IS: (Cons z v&amp;#039;)&lt;br /&gt;
              then obtain u&amp;#039; y&amp;#039; where &amp;quot;z # v&amp;#039; = u&amp;#039; @ [y&amp;#039;]&amp;quot; by blast&lt;br /&gt;
              hence &amp;quot;x # z # v&amp;#039; = x # u&amp;#039; @ [y&amp;#039;]&amp;quot; using IS by simp&lt;br /&gt;
              thus ?case by simp&lt;br /&gt;
            qed&lt;br /&gt;
            thus ?thesis by simp&lt;br /&gt;
          qed&lt;br /&gt;
          ultimately have &amp;quot;∃ u z. w = x # u @ [z]&amp;quot; by auto&lt;br /&gt;
          then obtain u z where &amp;quot;w = x # u @ [z]&amp;quot; by blast&lt;br /&gt;
          hence &amp;quot;balanceada (x # u @ [z])&amp;quot; using `balanceada w` by simp&lt;br /&gt;
          moreover have &amp;quot;⟦s ≠ []; t ≠ []; s @ t = x # u @ [z]⟧ ⟹ &lt;br /&gt;
                         ¬ balanceada t&amp;quot; for s t&lt;br /&gt;
          proof (cases &amp;quot;balanceada s&amp;quot;)&lt;br /&gt;
            case True&lt;br /&gt;
            moreover assume &amp;quot;s ≠ []&amp;quot;&lt;br /&gt;
            moreover assume &amp;quot;t ≠ []&amp;quot;&lt;br /&gt;
            moreover assume &amp;quot;s @ t = x # u @ [z]&amp;quot;&lt;br /&gt;
            ultimately show ?thesis using 1 `w = x # u @ [z]` by auto&lt;br /&gt;
          next&lt;br /&gt;
            case False&lt;br /&gt;
&lt;br /&gt;
            assume &amp;quot;s @ t = x # u @ [z]&amp;quot;&lt;br /&gt;
            hence &amp;quot;x # u @ [z] = s @ t&amp;quot; ..&lt;br /&gt;
            thus ?thesis&lt;br /&gt;
              using balanceada_completo_aux2 &lt;br /&gt;
                    `balanceada w` &lt;br /&gt;
                    `¬ balanceada s` &lt;br /&gt;
                    `w = x # u @ [z]` &lt;br /&gt;
              by simp&lt;br /&gt;
          qed&lt;br /&gt;
          ultimately have &amp;quot;x = A&amp;quot; and &amp;quot;z = B&amp;quot; and &amp;quot;balanceada u&amp;quot;&lt;br /&gt;
            using balanceada_completo_aux1[of x u z] by auto&lt;br /&gt;
          moreover have &amp;quot;u ∈ S&amp;quot; &lt;br /&gt;
            using `w = x # u @ [z]` IS `balanceada u` by simp&lt;br /&gt;
          hence &amp;quot;x # u @ [z] ∈ S&amp;quot; using S2 `u ∈ S` `x = A` `z = B` &lt;br /&gt;
            by simp&lt;br /&gt;
          thus &amp;quot;w ∈ S&amp;quot; using `w = x # u @ [z]` by simp&lt;br /&gt;
        qed&lt;br /&gt;
      qed&lt;br /&gt;
    qed&lt;br /&gt;
  qed&lt;br /&gt;
  thus ?thesis using assms .&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/RA2018/index.php?title=Relaci%C3%B3n_7&amp;diff=450</id>
		<title>Relación 7</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2018/index.php?title=Relaci%C3%B3n_7&amp;diff=450"/>
		<updated>2019-03-06T18:50:45Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: Protegió «Relación 7» ([Editar=Solo administradores] (indefinido) [Trasladar=Solo administradores] (indefinido))&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isabelle&amp;quot;&amp;gt;&lt;br /&gt;
chapter {* R7: Deducción natural de primer orden *}&lt;br /&gt;
&lt;br /&gt;
theory R7_Deduccion_natural_de_primer_orden_alu&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 &lt;br /&gt;
  continuación. *}&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;
(* benber *)&lt;br /&gt;
lemma&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 (rule ccontr)&lt;br /&gt;
  assume &amp;quot;∄x. P a ⟶ Q x&amp;quot;&lt;br /&gt;
  have &amp;quot;P a ⟶ (∃x. P a ⟶ Q x)&amp;quot;&lt;br /&gt;
  proof&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;
    moreover have &amp;quot;⋀x. Q x ⟹ ∃x&amp;#039;. P a ⟶ Q x&amp;#039;&amp;quot;&lt;br /&gt;
    proof -&lt;br /&gt;
      fix x&lt;br /&gt;
      assume &amp;quot;Q x&amp;quot;&lt;br /&gt;
      hence &amp;quot;P a ⟶ Q x&amp;quot; by (rule impI)&lt;br /&gt;
      thus &amp;quot;∃x&amp;#039;. P a ⟶ Q x&amp;#039;&amp;quot; by (rule exI)&lt;br /&gt;
    qed&lt;br /&gt;
    ultimately show &amp;quot;∃x. P a ⟶ Q x&amp;quot; by (rule exE)&lt;br /&gt;
  qed&lt;br /&gt;
  moreover note `∄x. P a ⟶ Q x`&lt;br /&gt;
  ultimately have &amp;quot;¬(P a)&amp;quot; by (rule mt)&lt;br /&gt;
  have &amp;quot;¬(P a) ⟶ (∃x. P a ⟶ Q x)&amp;quot;&lt;br /&gt;
  proof &lt;br /&gt;
    fix x&lt;br /&gt;
    assume &amp;quot;¬(P a)&amp;quot;&lt;br /&gt;
    have &amp;quot;P a ⟶ Q x&amp;quot;&lt;br /&gt;
    proof&lt;br /&gt;
      assume &amp;quot;P a&amp;quot;&lt;br /&gt;
      with `¬(P a)` have &amp;quot;False&amp;quot; by (rule notE)&lt;br /&gt;
      thus &amp;quot;Q x&amp;quot; by (rule FalseE)&lt;br /&gt;
    qed&lt;br /&gt;
    thus &amp;quot;∃x. P a ⟶ Q x&amp;quot; by (rule exI)&lt;br /&gt;
  qed&lt;br /&gt;
  moreover note `∄x. P a ⟶ Q x`&lt;br /&gt;
  ultimately have &amp;quot;¬¬(P a)&amp;quot; by (rule mt)&lt;br /&gt;
  moreover note `¬(P a)`&lt;br /&gt;
  ultimately show &amp;quot;False&amp;quot; by (rule notE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* alfmarcua *)&lt;br /&gt;
lemma ejercicio_52:&lt;br /&gt;
  &amp;quot;p ∨ ¬p&amp;quot;&lt;br /&gt;
proof (rule ccontr)&lt;br /&gt;
  assume 1: &amp;quot;¬(p ∨ ¬p)&amp;quot;&lt;br /&gt;
  have 2: &amp;quot;¬p&amp;quot; proof (rule notI)&lt;br /&gt;
    assume p hence 3: &amp;quot;p ∨ ¬p&amp;quot; by (rule disjI1)&lt;br /&gt;
    show &amp;quot;False&amp;quot; using 1 3 by (rule notE)&lt;br /&gt;
  qed&lt;br /&gt;
  have 4: &amp;quot;p ∨ ¬p&amp;quot; using 2 by (rule disjI2)&lt;br /&gt;
  show &amp;quot;False&amp;quot; using 1 4 by (rule notE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_1:&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 (rule disjE)&lt;br /&gt;
  show &amp;quot;P a ∨ ¬ P a&amp;quot; by (rule ejercicio_52)&lt;br /&gt;
next&lt;br /&gt;
  assume &amp;quot;P a&amp;quot;&lt;br /&gt;
  have &amp;quot;∃x. Q x&amp;quot; using assms `P a` by (rule mp)&lt;br /&gt;
  then obtain b where &amp;quot;Q b&amp;quot; by (rule exE)&lt;br /&gt;
  have &amp;quot;P a ⟹ Q b&amp;quot; using `P a` `Q b` by simp&lt;br /&gt;
  have &amp;quot;P a ⟶ Q b&amp;quot; using `P a ⟹ Q b` 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 &amp;quot;¬ P a&amp;quot;&lt;br /&gt;
  fix b&lt;br /&gt;
  have &amp;quot;P a ⟶ Q b&amp;quot;&lt;br /&gt;
  proof (rule impI)&lt;br /&gt;
    assume &amp;quot;P a&amp;quot;&lt;br /&gt;
    with `¬(P a)` have &amp;quot;False&amp;quot; by (rule notE)&lt;br /&gt;
    then show &amp;quot;Q b&amp;quot; by (rule FalseE)&lt;br /&gt;
  qed&lt;br /&gt;
  thus &amp;quot;∃x. P a ⟶ Q x&amp;quot; by (rule exI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim josgomrom4 gleherlop marfruman1 raffergon2&lt;br /&gt;
   hugrubsan pabbergue enrparalv giafus1 antramhur *) &lt;br /&gt;
lemma ejercicio_1b:&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 (rule disjE)&lt;br /&gt;
  show &amp;quot;¬P a ∨ P a&amp;quot; by (rule excluded_middle)&lt;br /&gt;
next&lt;br /&gt;
  fix b&lt;br /&gt;
  assume 3: &amp;quot;¬P a&amp;quot;&lt;br /&gt;
  have &amp;quot;P a ⟶ Q b&amp;quot; proof (rule impI)&lt;br /&gt;
    assume 4: &amp;quot;P a&amp;quot; show &amp;quot;Q b&amp;quot; using 3 4 by (rule notE)&lt;br /&gt;
  qed&lt;br /&gt;
  thus ?thesis by (rule exI)&lt;br /&gt;
next&lt;br /&gt;
  assume 1: &amp;quot;P a&amp;quot;&lt;br /&gt;
  have &amp;quot;∃x. Q x&amp;quot; using assms(1) 1 by (rule mp)&lt;br /&gt;
  then obtain b where 2: &amp;quot;Q b&amp;quot; by (rule exE)&lt;br /&gt;
  have &amp;quot;P a ⟶ Q b&amp;quot; proof (rule impI)&lt;br /&gt;
    assume &amp;quot;P a&amp;quot; show &amp;quot;Q b&amp;quot; using 2 .&lt;br /&gt;
  qed&lt;br /&gt;
  thus ?thesis by (rule exI)&lt;br /&gt;
qed&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;
(* benber *)&lt;br /&gt;
lemma&lt;br /&gt;
  assumes A1: &amp;quot;∀x y z. R x y ∧ R y z ⟶ R x z&amp;quot;&lt;br /&gt;
    and A2: &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 -&lt;br /&gt;
  {&lt;br /&gt;
    fix x y&lt;br /&gt;
    {&lt;br /&gt;
      assume &amp;quot;R x y&amp;quot;&lt;br /&gt;
      have &amp;quot;¬ (R y x)&amp;quot;&lt;br /&gt;
      proof (rule ccontr)&lt;br /&gt;
        assume &amp;quot;¬ ¬ (R y x)&amp;quot;&lt;br /&gt;
        hence &amp;quot;R y x&amp;quot; by (rule notnotD)&lt;br /&gt;
&lt;br /&gt;
        note `∀x y z. R x y ∧ R y z ⟶ R x z`&lt;br /&gt;
        moreover have &amp;quot;∀ y z. R x y ∧ R y z ⟶ R x z ⟹ False&amp;quot;&lt;br /&gt;
        proof -&lt;br /&gt;
          assume &amp;quot;∀ y z. R x y ∧ R y z ⟶ R x z&amp;quot;&lt;br /&gt;
          moreover have &amp;quot;∀ z. R x y ∧ R y z ⟶ R x z ⟹ False&amp;quot;&lt;br /&gt;
          proof -&lt;br /&gt;
            assume &amp;quot;∀ z. R x y ∧ R y z ⟶ R x z&amp;quot;&lt;br /&gt;
            moreover have &amp;quot;R x y ∧ R y x ⟶ R x x ⟹ False&amp;quot;&lt;br /&gt;
            proof -&lt;br /&gt;
              assume &amp;quot;R x y ∧ R y x ⟶ R x x&amp;quot;&lt;br /&gt;
              moreover {&lt;br /&gt;
                note `R x y`&lt;br /&gt;
                moreover note `R y x`&lt;br /&gt;
                ultimately have &amp;quot;R x y ∧ R y x&amp;quot; by (rule conjI)&lt;br /&gt;
              }&lt;br /&gt;
              ultimately have &amp;quot;R x x&amp;quot; by (rule mp)&lt;br /&gt;
&lt;br /&gt;
              note `∀x. ¬(R x x)`&lt;br /&gt;
              moreover {&lt;br /&gt;
                assume &amp;quot;¬(R x x)&amp;quot;&lt;br /&gt;
                moreover note `R x x`&lt;br /&gt;
                ultimately have &amp;quot;False&amp;quot; by (rule notE)&lt;br /&gt;
              }&lt;br /&gt;
              ultimately show &amp;quot;False&amp;quot; by (rule allE)&lt;br /&gt;
            qed&lt;br /&gt;
            ultimately show &amp;quot;False&amp;quot; by (rule allE)&lt;br /&gt;
          qed&lt;br /&gt;
          ultimately show &amp;quot;False&amp;quot; by (rule allE)&lt;br /&gt;
        qed&lt;br /&gt;
        ultimately show &amp;quot;False&amp;quot; by (rule allE)&lt;br /&gt;
      qed&lt;br /&gt;
    }&lt;br /&gt;
    hence &amp;quot;R x y ⟶ ¬ (R y x)&amp;quot; by (rule impI)&lt;br /&gt;
  }&lt;br /&gt;
  hence &amp;quot;⋀x. ∀y. R x y ⟶ ¬ (R y x)&amp;quot; by (rule allI)&lt;br /&gt;
  thus ?thesis by (rule allI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* alfmarcua marfruman1 enrparalv*)&lt;br /&gt;
lemma ejercicio_2:&lt;br /&gt;
  assumes &amp;quot;∀x y z. R x y ∧ R y z ⟶ R x z&amp;quot;&lt;br /&gt;
          &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 a&lt;br /&gt;
  show &amp;quot;∀y. R a y ⟶ ¬ R y a&amp;quot;&lt;br /&gt;
  proof (rule allI, rule impI)&lt;br /&gt;
    fix b&lt;br /&gt;
    assume &amp;quot;R a b&amp;quot;&lt;br /&gt;
    show &amp;quot;¬ R b a&amp;quot;&lt;br /&gt;
    proof (rule notI)&lt;br /&gt;
      assume &amp;quot;R b a&amp;quot;&lt;br /&gt;
      have &amp;quot;R a b ∧ R b a&amp;quot; using `R a b` `R b a` by (rule conjI)&lt;br /&gt;
      have &amp;quot;∀y z. R a y ∧ R y z ⟶ R a z&amp;quot; using assms(1) by (rule allE)&lt;br /&gt;
      then have &amp;quot;∀z. R a b ∧ R b z ⟶ R a z&amp;quot; by (rule allE)&lt;br /&gt;
      then have &amp;quot;R a b ∧ R b a ⟶ R a a&amp;quot; by (rule allE)&lt;br /&gt;
      then have &amp;quot;R a a&amp;quot; using `R a b ∧ R b a` by (rule mp)&lt;br /&gt;
      have &amp;quot;¬ (R a a)&amp;quot; using assms(2) by (rule allE)&lt;br /&gt;
      then show False using `R a a` by (rule notE)&lt;br /&gt;
    qed&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim josgomrom4 gleherlop raffergon2 hugrubsan&lt;br /&gt;
   pabbergue giafus1 antramhur *) &lt;br /&gt;
lemma ejercicio_2b:&lt;br /&gt;
  assumes &amp;quot;∀x y z. R x y ∧ R y z ⟶ R x z&amp;quot;&lt;br /&gt;
          &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 a&lt;br /&gt;
  show &amp;quot;∀y. R a y ⟶ ¬(R y a)&amp;quot;&lt;br /&gt;
  proof (rule allI)&lt;br /&gt;
    fix b&lt;br /&gt;
    have &amp;quot;∀y z. R a y ∧ R y z ⟶ R a z&amp;quot; using assms(1) by (rule allE)&lt;br /&gt;
    hence &amp;quot;∀z. R a b ∧ R b z ⟶ R a z&amp;quot; by (rule allE)&lt;br /&gt;
    hence 1: &amp;quot;R a b ∧ R b a ⟶ R a a&amp;quot; by (rule allE)&lt;br /&gt;
    have 2: &amp;quot;¬(R a a)&amp;quot; using assms(2) by (rule allE)&lt;br /&gt;
    show &amp;quot;R a b ⟶ ¬(R b a)&amp;quot; proof (rule impI)&lt;br /&gt;
      assume 3: &amp;quot;R a b&amp;quot;&lt;br /&gt;
      show &amp;quot;¬(R b a)&amp;quot;&lt;br /&gt;
      proof (rule ccontr)&lt;br /&gt;
        assume &amp;quot;¬¬R b a&amp;quot;&lt;br /&gt;
        hence 4: &amp;quot;R b a&amp;quot; by (rule notnotD)&lt;br /&gt;
        have 5: &amp;quot;R a b ∧ R b a&amp;quot; using 3 4 by (rule conjI)&lt;br /&gt;
        have 6: &amp;quot;R a a&amp;quot; using 1 5 by (rule mp)&lt;br /&gt;
        show False using 2 6 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;
(* pabalagon *)&lt;br /&gt;
lemma ejercicio_2_2: &lt;br /&gt;
  assumes &amp;quot;∀x y z. R x y ∧ R y z ⟶ R x z&amp;quot;&lt;br /&gt;
          &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 -&lt;br /&gt;
  { fix a&lt;br /&gt;
    { fix b&lt;br /&gt;
      have &amp;quot;∀y z. R a y ∧ R y z ⟶ R a z&amp;quot; using assms(1) by (rule allE)&lt;br /&gt;
      hence &amp;quot;∀z. R a b ∧ R b z ⟶ R a z&amp;quot; by (rule allE)&lt;br /&gt;
      hence 1: &amp;quot;R a b ∧ R b a ⟶ R a a&amp;quot; by (rule allE)&lt;br /&gt;
      have 2: &amp;quot;¬(R a a)&amp;quot; using assms(2) by (rule allE)&lt;br /&gt;
      have &amp;quot;R a b ⟶ ¬(R b a)&amp;quot; proof (rule impI)&lt;br /&gt;
        assume 3: &amp;quot;R a b&amp;quot;&lt;br /&gt;
        show &amp;quot;¬(R b a)&amp;quot;&lt;br /&gt;
        proof (rule ccontr)&lt;br /&gt;
          assume &amp;quot;¬¬R b a&amp;quot;&lt;br /&gt;
          hence 4: &amp;quot;R b a&amp;quot; by (rule notnotD)&lt;br /&gt;
          have 5: &amp;quot;R a b ∧ R b a&amp;quot; using 3 4 by (rule conjI)&lt;br /&gt;
          have 6: &amp;quot;R a a&amp;quot; using 1 5 by (rule mp)&lt;br /&gt;
          show False using 2 6 by (rule notE)&lt;br /&gt;
        qed&lt;br /&gt;
      qed}&lt;br /&gt;
    hence &amp;quot;∀y. R a y ⟶ ¬(R y a)&amp;quot; by (rule allI)}&lt;br /&gt;
  thus &amp;quot;∀x y. R x y ⟶ ¬(R y x)&amp;quot; by (rule allI)&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;
(* benber pabbergue*)&lt;br /&gt;
(* No es cierto si el universo consiste en más que un objeto. En ese&lt;br /&gt;
   caso, asignar la igualdad (=) a P es un contraejemplo. *)&lt;br /&gt;
&lt;br /&gt;
(* alfmarcua marfruman1 raffergon2 enrparalv*)&lt;br /&gt;
lemma ejercicio_3:&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;
(* pabalagon manperjim pabbergue josgomrom4 gleherlop hugrubsan giafus1&lt;br /&gt;
   antramhur *) &lt;br /&gt;
text{*&lt;br /&gt;
  Contraejemplo en los naturales, para todo x existe y tal que x &amp;lt; y, pero no&lt;br /&gt;
  existe y tal que para todo x, x &amp;lt; y&lt;br /&gt;
*}&lt;br /&gt;
lemma ejercicio_3: &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;
       (∃y. ∀x. P x y) ⟶ (∀x. ∃y. P x y)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* benber *)&lt;br /&gt;
lemma &amp;quot;(∃y. ∀x. P x y) ⟶ (∀x. ∃y. P x y)&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume &amp;quot;∃y. ∀x. P x y&amp;quot;&lt;br /&gt;
  moreover have &amp;quot;⋀y. ∀x. P x y ⟹ ∀x. ∃y&amp;#039;. P x y&amp;#039;&amp;quot;&lt;br /&gt;
  proof&lt;br /&gt;
    fix x y&lt;br /&gt;
    assume &amp;quot;∀x&amp;#039;. P x&amp;#039; y&amp;quot;&lt;br /&gt;
    hence &amp;quot;P x y&amp;quot; by (rule allE)&lt;br /&gt;
    thus &amp;quot;∃y&amp;#039;. P x y&amp;#039;&amp;quot; by (rule exI)&lt;br /&gt;
  qed&lt;br /&gt;
  ultimately show &amp;quot;∀x. ∃y. P x y&amp;quot; by (rule exE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* alfmarcua marfruman1 raffergon2 enrparalv *)&lt;br /&gt;
lemma ejercicio_4: &lt;br /&gt;
  &amp;quot;(∃y. ∀x. P x y) ⟶ (∀x. ∃y. P x y)&amp;quot;&lt;br /&gt;
proof (rule impI, rule allI)&lt;br /&gt;
  fix a&lt;br /&gt;
  assume &amp;quot;∃y. ∀x. P x y&amp;quot;&lt;br /&gt;
  then obtain b where &amp;quot;∀x. P x b&amp;quot; by (rule exE)&lt;br /&gt;
  then have &amp;quot;P a b&amp;quot; by (rule allE)&lt;br /&gt;
  then show &amp;quot;∃y. P a y&amp;quot; by (rule exI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim josgomrom4 gleherlop hugrubsan pabbergue&lt;br /&gt;
   antramhur *) &lt;br /&gt;
lemma ejercicio_4_2: &amp;quot;(∃y. ∀x. P x y) ⟶ (∀x. ∃y. P x y)&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume &amp;quot;∃y. ∀x. P x y&amp;quot;&lt;br /&gt;
  moreover have &amp;quot;⋀y. ∀x. P x y ⟹ ∀x. ∃y. P x y&amp;quot;&lt;br /&gt;
  proof&lt;br /&gt;
    fix x0 y0&lt;br /&gt;
    assume &amp;quot;∀x. P x y0&amp;quot;&lt;br /&gt;
    hence &amp;quot;P x0 y0&amp;quot; by (rule allE)&lt;br /&gt;
    thus &amp;quot;∃y. P x0 y&amp;quot; by (rule exI)&lt;br /&gt;
  qed&lt;br /&gt;
  ultimately show &amp;quot;∀x. ∃y. P x y&amp;quot; by (rule exE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. 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;
(* benber *)&lt;br /&gt;
lemma&lt;br /&gt;
  assumes A1: &amp;quot;∀ x. P a x x&amp;quot;&lt;br /&gt;
    and A2: &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;
  from A2&lt;br /&gt;
  have &amp;quot;∀y z. P a y z ⟶ P (f a) y (f z)&amp;quot; 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;
  moreover have &amp;quot;P a (f a) (f a)&amp;quot; using A1 by (rule allE)&lt;br /&gt;
  ultimately show &amp;quot;P (f a) (f a) (f (f a))&amp;quot; by (rule mp)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* alfmarcua enrparalv *)&lt;br /&gt;
lemma ejercicio_5:&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 (rule exI, rule mp)&lt;br /&gt;
  show &amp;quot;P a (f a) (f a)&amp;quot; using assms(1) by (rule allE)&lt;br /&gt;
next&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;
  then have &amp;quot;∀z. P a (f a) z ⟶ P (f a) (f a) (f z)&amp;quot; by (rule allE)&lt;br /&gt;
  then show &amp;quot;P a (f a) (f a) ⟶ P (f a) (f a) (f (f a))&amp;quot; by (rule allE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim josgomrom4 gleherlop marfruman1 raffergon2&lt;br /&gt;
   hugrubsan pabbergue giafus1 antramhur *) &lt;br /&gt;
lemma ejercicio_5_2:&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 (rule exI)&lt;br /&gt;
  have &amp;quot;∀y z. P a y z ⟶ P (f a) y (f z)&amp;quot; using assms(2) ..&lt;br /&gt;
  hence &amp;quot;∀z. P a (f a) z ⟶ P (f a) (f a) (f z)&amp;quot; ..&lt;br /&gt;
  hence &amp;quot;P a (f a) (f a) ⟶ P (f a) (f a) (f (f a))&amp;quot; ..&lt;br /&gt;
  moreover have &amp;quot;P a (f a) (f a)&amp;quot; using assms(1) by (rule allE)&lt;br /&gt;
  ultimately show &amp;quot;P (f a) (f a) (f (f a))&amp;quot; by (rule mp)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 6. 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;
(* benber alfmarcua giafus1 *)&lt;br /&gt;
lemma&lt;br /&gt;
  assumes &amp;quot;∀y. Q a y&amp;quot;&lt;br /&gt;
      and &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;Q a a&amp;quot; using `∀y. Q a y` by (rule allE)&lt;br /&gt;
  moreover have &amp;quot;Q a (s (s a))&amp;quot; using `∀y. Q a y` by (rule allE)&lt;br /&gt;
  ultimately show &amp;quot;Q a a ∧ Q a (s (s a))&amp;quot; by (rule conjI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim josgomrom4 gleherlop marfruman1 raffergon2&lt;br /&gt;
   hugrubsan pabbergue enrparalv antramhur *) &lt;br /&gt;
lemma ejercicio_6:&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 (rule exI)&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;
  moreover have &amp;quot;Q a (s a)&amp;quot; using assms(1) by (rule allE)&lt;br /&gt;
  ultimately have &amp;quot;Q (s a) (s (s a))&amp;quot; by (rule mp)&lt;br /&gt;
  with `Q a (s a)` show &amp;quot;Q a (s a) ∧ Q (s a) (s (s a))&amp;quot; by (rule conjI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 7. (En APLI2 el ejercicio 13 de LP) Formalizar, y demostrar&lt;br /&gt;
  la corrección, del siguiente 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;
       Or : Se aceptan órdenes del operador.&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* benber manperjim alfmarcua pabalagon marfruman1 josgomrom4 gleherlop&lt;br /&gt;
   raffergon2 hugrubsan pabbergue enrparalv giafus1 antramhur *)&lt;br /&gt;
lemma&lt;br /&gt;
  assumes &amp;quot;A ∨ P ⟶ R ∧ F&amp;quot;&lt;br /&gt;
    and &amp;quot;F ∨ N ⟶ Or&amp;quot;&lt;br /&gt;
  shows &amp;quot;A ⟶ Or&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume &amp;quot;A&amp;quot;&lt;br /&gt;
  hence &amp;quot;A ∨ P&amp;quot; by (rule disjI1)&lt;br /&gt;
  with `A ∨ P ⟶ R ∧ F` have &amp;quot;R ∧ F&amp;quot; by (rule mp)&lt;br /&gt;
  hence &amp;quot;F&amp;quot; by (rule conjunct2)&lt;br /&gt;
  hence &amp;quot;F ∨ N&amp;quot; by (rule disjI1)&lt;br /&gt;
  with `F ∨ N ⟶ Or` show &amp;quot;Or&amp;quot; by (rule mp)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 8. (En APLI2 el ejercicio 5 de LP) Formalizar, y demostrar&lt;br /&gt;
  la corrección, del siguiente argumento &lt;br /&gt;
     En cierto experimento, cuando hemos empleado un fármaco A, el&lt;br /&gt;
     paciente ha mejorado considerablemente en el caso, y sólo en el&lt;br /&gt;
     caso, en que no se haya empleado también un fármaco B. Además, o se&lt;br /&gt;
     ha empleado el fármaco A o se ha empleado el fármaco B. En&lt;br /&gt;
     consecuencia, podemos afirmar que si no hemos empleado el fármaco&lt;br /&gt;
     B, el paciente ha mejorado considerablemente. &lt;br /&gt;
  Usar A: Hemos empleado el fármaco A.&lt;br /&gt;
       B: Hemos empleado el fármaco B.&lt;br /&gt;
       M: El paciente ha mejorado notablemente.&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* benber *)&lt;br /&gt;
lemma&lt;br /&gt;
  assumes &amp;quot;A ⟶ (M ⟷ ¬B)&amp;quot;&lt;br /&gt;
    and &amp;quot;A ∨ B&amp;quot;&lt;br /&gt;
  shows &amp;quot;¬B ⟶ M&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume &amp;quot;¬B&amp;quot;&lt;br /&gt;
  note `A ∨ B`&lt;br /&gt;
  moreover {&lt;br /&gt;
    assume &amp;quot;A&amp;quot;&lt;br /&gt;
    with `A ⟶ (M ⟷ ¬B)` have &amp;quot;M ⟷ ¬B&amp;quot; by (rule mp)&lt;br /&gt;
    hence &amp;quot;¬B ⟹ M&amp;quot; by (rule iffD2)&lt;br /&gt;
    hence &amp;quot;M&amp;quot; using `¬B` .&lt;br /&gt;
  }&lt;br /&gt;
  moreover {&lt;br /&gt;
    note `¬B`&lt;br /&gt;
    moreover assume &amp;quot;B&amp;quot;&lt;br /&gt;
    ultimately have &amp;quot;M&amp;quot; by (rule notE)&lt;br /&gt;
  }&lt;br /&gt;
  ultimately show &amp;quot;M&amp;quot; by (rule disjE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* alfmarcua marfruman1 *)&lt;br /&gt;
lemma ejercicio_8:&lt;br /&gt;
  assumes &amp;quot;A ∧ ¬ B ⟶ M&amp;quot;&lt;br /&gt;
          &amp;quot;A ∨ B&amp;quot;&lt;br /&gt;
  shows &amp;quot;¬ B ⟶ M&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume &amp;quot;¬B&amp;quot;&lt;br /&gt;
  show &amp;quot;M&amp;quot; using assms(2)&lt;br /&gt;
  proof (rule disjE)&lt;br /&gt;
    assume &amp;quot;A&amp;quot;&lt;br /&gt;
    then have &amp;quot;A ∧ ¬ B&amp;quot; using `¬ B` by (rule conjI)&lt;br /&gt;
    show &amp;quot;M&amp;quot; using assms(1) `A ∧ ¬ B` by (rule mp)&lt;br /&gt;
  next&lt;br /&gt;
    assume &amp;quot;B&amp;quot;&lt;br /&gt;
    show &amp;quot;M&amp;quot; using `¬ B` `B` by (rule notE)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim josgomrom4 gleherlop raffergon2 hugrubsan&lt;br /&gt;
   pabbergue enrparalv giafus1 antramhur *) &lt;br /&gt;
lemma ejercicio_8_2:&lt;br /&gt;
  assumes &amp;quot;A ⟶ (M ⟷ ¬B)&amp;quot;&lt;br /&gt;
          &amp;quot;A ∨ B&amp;quot;&lt;br /&gt;
        shows &amp;quot;¬B ⟶ M&amp;quot;&lt;br /&gt;
using assms(2) proof (rule disjE)&lt;br /&gt;
  assume 1: A&lt;br /&gt;
  have 2: &amp;quot;M ⟷ ¬B&amp;quot; using assms(1) 1 by (rule mp)&lt;br /&gt;
  show &amp;quot;¬B ⟶ M&amp;quot; proof (rule impI)&lt;br /&gt;
    assume 3: &amp;quot;¬B&amp;quot; show M using 2 3 by (rule iffD2)&lt;br /&gt;
  qed&lt;br /&gt;
next&lt;br /&gt;
  assume 4: B&lt;br /&gt;
  show ?thesis proof (rule impI)&lt;br /&gt;
    assume &amp;quot;¬B&amp;quot; thus M using 4 by (rule notE)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 9. (En APLI2 el ejercicio 13 de LPO) Formalizar, y decidir&lt;br /&gt;
  la corrección, del siguiente argumento &lt;br /&gt;
     Toda persona pobre tiene un padre rico. Por tanto, existe una&lt;br /&gt;
     persona rica que tiene un abuelo rico.&lt;br /&gt;
  Usar R(x) para x es rico&lt;br /&gt;
       p(x) para el padre de x&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* benber *)&lt;br /&gt;
lemma&lt;br /&gt;
  assumes &amp;quot;∀x. ¬ R x ⟶ R (p x)&amp;quot;&lt;br /&gt;
  shows &amp;quot;∃x. R x ∧ R (p (p x))&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have 0: &amp;quot;p ∨ ¬ p&amp;quot; for p&lt;br /&gt;
  proof (rule ccontr)&lt;br /&gt;
    assume &amp;quot;¬ (p ∨ ¬ p)&amp;quot;&lt;br /&gt;
    moreover {&lt;br /&gt;
      have &amp;quot;p&amp;quot;&lt;br /&gt;
      proof (rule ccontr)&lt;br /&gt;
        assume &amp;quot;¬ p&amp;quot;&lt;br /&gt;
        hence &amp;quot;p ∨ ¬ p&amp;quot; by (rule disjI2)&lt;br /&gt;
        with `¬ (p ∨ ¬ p)` show &amp;quot;False&amp;quot; by (rule notE)&lt;br /&gt;
      qed&lt;br /&gt;
      hence &amp;quot;p ∨ ¬ p&amp;quot; by (rule disjI1)&lt;br /&gt;
    }&lt;br /&gt;
    ultimately show &amp;quot;False&amp;quot; by (rule notE)&lt;br /&gt;
  qed&lt;br /&gt;
&lt;br /&gt;
  have &amp;quot;¬ R x ⟶ R (p x)&amp;quot; for x using assms(1) by (rule allE)&lt;br /&gt;
  hence 1: &amp;quot;¬ R x ⟹ R (p x)&amp;quot; for x by (rule mp)&lt;br /&gt;
&lt;br /&gt;
  have 2: &amp;quot;⟦R y; ¬ R (p y)⟧ ⟹ ?thesis&amp;quot; for y&lt;br /&gt;
  proof&lt;br /&gt;
    assume &amp;quot;R y&amp;quot;&lt;br /&gt;
    assume &amp;quot;¬ R (p y)&amp;quot;&lt;br /&gt;
    hence &amp;quot;R (p (p y))&amp;quot; by (rule 1)&lt;br /&gt;
    with `R y` show &amp;quot;R y ∧ R (p (p y))&amp;quot; by (rule conjI)&lt;br /&gt;
  qed&lt;br /&gt;
&lt;br /&gt;
  have 3: &amp;quot;R y ⟹ ?thesis&amp;quot; for y&lt;br /&gt;
  proof -&lt;br /&gt;
    assume &amp;quot;R y&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    have &amp;quot;R (p y) ∨ ¬ R (p y)&amp;quot; by (rule 0)&lt;br /&gt;
    moreover {&lt;br /&gt;
      assume &amp;quot;R (p y)&amp;quot;&lt;br /&gt;
      have &amp;quot;R (p (p y)) ∨ ¬ R (p (p y))&amp;quot; by (rule 0)&lt;br /&gt;
      moreover {&lt;br /&gt;
        assume &amp;quot;R (p (p y))&amp;quot;&lt;br /&gt;
        with `R y` have &amp;quot;R y ∧ R (p (p y))&amp;quot; by (rule conjI)&lt;br /&gt;
        hence ?thesis by (rule exI)&lt;br /&gt;
      }&lt;br /&gt;
      moreover {&lt;br /&gt;
        assume &amp;quot;¬ R (p (p y))&amp;quot;&lt;br /&gt;
        with `R (p y)` have ?thesis by (rule 2)&lt;br /&gt;
      }&lt;br /&gt;
      ultimately have ?thesis by (rule disjE)&lt;br /&gt;
    }&lt;br /&gt;
    moreover {&lt;br /&gt;
      assume &amp;quot;¬ R (p y)&amp;quot;&lt;br /&gt;
      with `R y` have ?thesis by (rule 2)&lt;br /&gt;
    }&lt;br /&gt;
    ultimately show ?thesis by (rule disjE)&lt;br /&gt;
  qed&lt;br /&gt;
&lt;br /&gt;
  fix y&lt;br /&gt;
  have &amp;quot;R y ∨ ¬ R y&amp;quot; by (rule 0)&lt;br /&gt;
  moreover {&lt;br /&gt;
    assume &amp;quot;R y&amp;quot;&lt;br /&gt;
    hence ?thesis by (rule 3)&lt;br /&gt;
  }&lt;br /&gt;
  moreover {&lt;br /&gt;
    assume &amp;quot;¬ R y&amp;quot;&lt;br /&gt;
    hence &amp;quot;R (p y)&amp;quot; by (rule 1)&lt;br /&gt;
    hence ?thesis by (rule 3)&lt;br /&gt;
  }&lt;br /&gt;
  ultimately show ?thesis by (rule disjE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* alfmarcua *)&lt;br /&gt;
lemma ejercicio_9_2:&lt;br /&gt;
  assumes &amp;quot;∀ x. ¬ R x ⟶ R (p x)&amp;quot;&lt;br /&gt;
  shows &amp;quot;∃x. R x ∧ R (p (p x))&amp;quot;&lt;br /&gt;
proof (rule disjE, rule ejercicio_52)&lt;br /&gt;
  have prelemma:&amp;quot;(∃y. ¬ R (p y)) ⟶ ?thesis&amp;quot;&lt;br /&gt;
  proof (rule impI)&lt;br /&gt;
    assume &amp;quot;∃y. ¬ R (p y)&amp;quot;&lt;br /&gt;
    then obtain b where  &amp;quot;¬ R (p b)&amp;quot; by (rule exE)&lt;br /&gt;
    have &amp;quot;¬ R (p b) ⟶ R (p (p b))&amp;quot; using assms by (rule allE)&lt;br /&gt;
    then have &amp;quot;R (p (p b))&amp;quot; using `¬ R (p b)` by (rule mp)&lt;br /&gt;
    have &amp;quot;¬ R b ⟶ R (p b)&amp;quot; using assms by (rule allE)&lt;br /&gt;
    then have &amp;quot;¬¬ R b&amp;quot; using `¬ R (p b)` by (rule mt)&lt;br /&gt;
    then have &amp;quot;R b&amp;quot; by (rule notnotD)&lt;br /&gt;
    then have &amp;quot;R b ∧ R (p (p b))&amp;quot; using `R (p (p b))` by (rule conjI)&lt;br /&gt;
    then show &amp;quot;∃x. R x ∧ R (p (p x))&amp;quot; by (rule exI)&lt;br /&gt;
  qed&lt;br /&gt;
  &lt;br /&gt;
  fix a&lt;br /&gt;
  show &amp;quot;R (p a) ⟹ ?thesis&amp;quot;&lt;br /&gt;
  proof (rule disjE, rule ejercicio_52)&lt;br /&gt;
    assume &amp;quot;R (p a)&amp;quot;&lt;br /&gt;
    show &amp;quot;R (p (p a)) ⟹ ?thesis&amp;quot;&lt;br /&gt;
    proof (rule disjE, rule ejercicio_52)&lt;br /&gt;
      assume &amp;quot;R (p (p (p a)))&amp;quot;&lt;br /&gt;
      have &amp;quot;R (p a) ∧ R (p (p (p a)))&amp;quot; using `R (p a)` `R (p (p (p a)))`  by (rule conjI)&lt;br /&gt;
      then show ?thesis by (rule exI)&lt;br /&gt;
    next&lt;br /&gt;
      assume &amp;quot;¬ R (p (p (p a)))&amp;quot;&lt;br /&gt;
      then have &amp;quot;∃y. ¬ R (p y)&amp;quot; by (rule exI)&lt;br /&gt;
      show ?thesis using prelemma `∃y. ¬ R (p y)` by (rule mp)&lt;br /&gt;
    qed&lt;br /&gt;
  next&lt;br /&gt;
    assume &amp;quot;¬ R (p (p a))&amp;quot;&lt;br /&gt;
    then have &amp;quot;∃y. ¬ R (p y)&amp;quot; by (rule exI)&lt;br /&gt;
    show ?thesis using prelemma `∃y. ¬ R (p y)` by (rule mp)&lt;br /&gt;
  qed&lt;br /&gt;
&lt;br /&gt;
  assume &amp;quot;¬ R (p a)&amp;quot;&lt;br /&gt;
  then have &amp;quot;∃y. ¬ R (p y)&amp;quot; by (rule exI)&lt;br /&gt;
  show ?thesis using prelemma `∃y. ¬ R (p y)` by (rule mp)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim marfruman1 josgomrom4 gleherlop raffergon2&lt;br /&gt;
   hugrubsan pabbergue enrparalv giafus1 antramhur *) &lt;br /&gt;
lemma ejercicio_9_3:&lt;br /&gt;
  assumes &amp;quot;∀x. ¬R x ⟶ R (p x)&amp;quot;&lt;br /&gt;
  shows &amp;quot;∃x. R x ∧ R (p (p x))&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  fix y&lt;br /&gt;
  have s1: &amp;quot;⟦¬R (p y)⟧ ⟹ ?thesis&amp;quot; for y proof (rule exI)&lt;br /&gt;
    assume 2: &amp;quot;¬R (p y)&amp;quot;&lt;br /&gt;
    have &amp;quot;¬R (p y) ⟶ R (p (p y))&amp;quot; using assms(1) by (rule allE)&lt;br /&gt;
    hence 3: &amp;quot;R (p (p y))&amp;quot; using 2 by (rule mp)&lt;br /&gt;
    have &amp;quot;¬R y ⟶ R (p y)&amp;quot; using assms(1) by (rule allE)&lt;br /&gt;
    hence &amp;quot;¬¬R y&amp;quot; using 2 by (rule mt)&lt;br /&gt;
    hence &amp;quot;R y&amp;quot; by (rule notnotD)&lt;br /&gt;
    thus &amp;quot;R y ∧ R (p (p y))&amp;quot; using 3 by (rule conjI)&lt;br /&gt;
  qed&lt;br /&gt;
  have s2: &amp;quot;R y ⟹ ?thesis&amp;quot; for y proof -&lt;br /&gt;
    assume 2: &amp;quot;R y&amp;quot;&lt;br /&gt;
    have &amp;quot;¬R (p y) ∨ R (p y)&amp;quot; by (rule excluded_middle)&lt;br /&gt;
    thus ?thesis proof (rule disjE)&lt;br /&gt;
      assume 3: &amp;quot;¬R (p y)&amp;quot; thus ?thesis by (rule s1)&lt;br /&gt;
    next&lt;br /&gt;
      assume 4: &amp;quot;R (p y)&amp;quot;&lt;br /&gt;
      have &amp;quot;¬R (p (p y)) ∨ R (p (p y))&amp;quot; by (rule excluded_middle)&lt;br /&gt;
      thus ?thesis proof (rule disjE)&lt;br /&gt;
        assume &amp;quot;¬R (p (p y))&amp;quot; thus ?thesis by (rule s1)&lt;br /&gt;
      next&lt;br /&gt;
        assume &amp;quot;R (p (p y))&amp;quot;&lt;br /&gt;
        with `R y` have &amp;quot;R y ∧ R (p (p y))&amp;quot; by (rule conjI)&lt;br /&gt;
        thus ?thesis by (rule exI)&lt;br /&gt;
      qed&lt;br /&gt;
    qed&lt;br /&gt;
  qed&lt;br /&gt;
  have &amp;quot;¬R y ∨ R y&amp;quot; by (rule excluded_middle)&lt;br /&gt;
  thus ?thesis proof (rule disjE)&lt;br /&gt;
    assume 2: &amp;quot;R y&amp;quot; thus ?thesis by (rule s2)&lt;br /&gt;
  next&lt;br /&gt;
    assume 4: &amp;quot;¬R y&amp;quot;&lt;br /&gt;
    have &amp;quot;¬R y ⟶ R (p y)&amp;quot; using assms(1) by (rule allE)&lt;br /&gt;
    hence &amp;quot;R (p y)&amp;quot; using 4 by (rule mp)&lt;br /&gt;
    thus ?thesis by (rule s2)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 10. (En APLI2 el ejercicio 10 de LPO) Formalizar, y decidir&lt;br /&gt;
  la corrección, del siguiente 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;
(* benber *)&lt;br /&gt;
lemma&lt;br /&gt;
  assumes &amp;quot;∀x. Af x ⟶ (∀y. E y ⟶ Ap x y)&amp;quot;&lt;br /&gt;
    and &amp;quot;∀x. E x ⟶ ¬ Ap j x&amp;quot;&lt;br /&gt;
  shows &amp;quot;(∃x. E x ∧ N x) ⟶ ¬ Af j&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume &amp;quot;∃x. E x ∧ N x&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  show &amp;quot;¬ Af j&amp;quot;&lt;br /&gt;
  proof (rule ccontr)&lt;br /&gt;
    assume &amp;quot;¬ ¬ Af j&amp;quot;&lt;br /&gt;
    hence &amp;quot;Af j&amp;quot; by (rule notnotD)&lt;br /&gt;
&lt;br /&gt;
    note `∀x. Af x ⟶ (∀y. E y ⟶ Ap x y)`&lt;br /&gt;
    hence &amp;quot;Af j ⟶ (∀x. E x ⟶ Ap j x)&amp;quot; by (rule allE)&lt;br /&gt;
    moreover note `Af j`&lt;br /&gt;
    ultimately have &amp;quot;∀x. E x ⟶ Ap j x&amp;quot; by (rule mp)&lt;br /&gt;
&lt;br /&gt;
    note `∃x. E x ∧ N x`&lt;br /&gt;
    moreover have &amp;quot;E x ∧ N x ⟹ False&amp;quot; for x&lt;br /&gt;
    proof -&lt;br /&gt;
      assume &amp;quot;E x ∧ N x&amp;quot;&lt;br /&gt;
      hence &amp;quot;E x&amp;quot; by (rule conjunct1)&lt;br /&gt;
&lt;br /&gt;
      note `∀x. E x ⟶ Ap j x`&lt;br /&gt;
      hence &amp;quot;E x ⟶ Ap j x&amp;quot; by (rule allE)&lt;br /&gt;
      hence &amp;quot;Ap j x&amp;quot; using `E x`  by (rule mp)&lt;br /&gt;
&lt;br /&gt;
      note `∀x. E x ⟶ ¬ Ap j x`&lt;br /&gt;
      hence &amp;quot;E x ⟶ ¬ Ap j x&amp;quot; by (rule allE)&lt;br /&gt;
      hence &amp;quot;¬ Ap j x&amp;quot; using `E x` by (rule mp)&lt;br /&gt;
      thus &amp;quot;False&amp;quot; using `Ap j x` by (rule notE)&lt;br /&gt;
    qed&lt;br /&gt;
    ultimately show &amp;quot;False&amp;quot; by (rule exE)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* alfmarcua marfruman1 *)&lt;br /&gt;
lemma ejercicio_10_2:&lt;br /&gt;
  assumes &amp;quot;∀x y. Af x ∧ E y ⟶ Ap x y&amp;quot;&lt;br /&gt;
          &amp;quot;∀y. E y ⟶ ¬ Ap j y&amp;quot;&lt;br /&gt;
  shows &amp;quot;(∃y. E y ∧ N y) ⟶ ¬ Af j&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume &amp;quot;∃x. E x ∧ N x&amp;quot;&lt;br /&gt;
  then obtain a where &amp;quot;E a ∧ N a&amp;quot; by (rule exE)&lt;br /&gt;
  then have &amp;quot;E a&amp;quot; by (rule conjunct1)&lt;br /&gt;
  show &amp;quot;¬ Af j&amp;quot;&lt;br /&gt;
  proof (rule notI, rule notE)&lt;br /&gt;
    assume &amp;quot;Af j&amp;quot;&lt;br /&gt;
    then show &amp;quot;Af j ∧ E a&amp;quot; using `E a` by (rule conjI)&lt;br /&gt;
  next&lt;br /&gt;
    have &amp;quot;E a ⟶ ¬ Ap j a&amp;quot; using assms(2) by (rule allE)&lt;br /&gt;
    then have &amp;quot;¬ Ap j a&amp;quot; using `E a` by (rule mp)&lt;br /&gt;
    have &amp;quot;∀y. Af j ∧ E y ⟶ Ap j y&amp;quot; using assms(1) by (rule allE)&lt;br /&gt;
    then have &amp;quot;Af j ∧ E a ⟶ Ap j a&amp;quot; by (rule allE)&lt;br /&gt;
    then show &amp;quot;¬ (Af j ∧ E a)&amp;quot; using `¬ Ap j a` by (rule mt)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim josgomrom4 gleherlop raffergon2 hugrubsan&lt;br /&gt;
   pabbergue enrparalv giafus1 antramhur *) &lt;br /&gt;
lemma ejercicio_10_3:&lt;br /&gt;
  assumes &amp;quot;∀x y. Af x ∧ E y ⟶ Ap x y&amp;quot;&lt;br /&gt;
          &amp;quot;∀x y. x = j ∧ E y ⟶ ¬(Ap x y)&amp;quot;&lt;br /&gt;
  shows &amp;quot;(∃ x. (E x ∧ N x)) ⟶ ¬(Af j)&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume 1: &amp;quot;∃x. E x ∧ N x&amp;quot;&lt;br /&gt;
  show &amp;quot;¬(Af j)&amp;quot; proof (rule ccontr)&lt;br /&gt;
    fix a&lt;br /&gt;
    assume &amp;quot;¬¬Af j&amp;quot; hence 2: &amp;quot;Af j&amp;quot; by (rule notnotD)&lt;br /&gt;
    obtain a where 3: &amp;quot;E a ∧ N a&amp;quot; using 1 by (rule exE)&lt;br /&gt;
    hence 4: &amp;quot;E a&amp;quot; by (rule conjunct1)&lt;br /&gt;
    have 5: &amp;quot;N a&amp;quot; using 3 by (rule conjunct2)&lt;br /&gt;
    have &amp;quot;∀y. Af j ∧ E y ⟶ Ap j y&amp;quot; using assms(1) by (rule allE)&lt;br /&gt;
    hence 6: &amp;quot;Af j ∧ E a ⟶ Ap j a&amp;quot; by (rule allE)&lt;br /&gt;
    have 7: &amp;quot;Af j ∧ E a&amp;quot; using 2 4 by (rule conjI)&lt;br /&gt;
    have 8: &amp;quot;Ap j a&amp;quot; using 6 7 by (rule mp)&lt;br /&gt;
    have &amp;quot;∀y. j = j ∧ E y ⟶ ¬(Ap j y)&amp;quot; using assms(2) by (rule allE)&lt;br /&gt;
    hence 9: &amp;quot;j = j ∧ E a ⟶ ¬(Ap j a)&amp;quot; by (rule allE)&lt;br /&gt;
    have &amp;quot;j = j&amp;quot; by (rule refl)&lt;br /&gt;
    hence 10: &amp;quot;j = j ∧ E a&amp;quot; using 4 by (rule conjI)&lt;br /&gt;
    have &amp;quot;¬(Ap j a)&amp;quot; using 9 10 by (rule mp)&lt;br /&gt;
    thus False using 8 by (rule notE)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 11. Formalizar, y decidir la corrección, del siguiente&lt;br /&gt;
  argumento&lt;br /&gt;
     Ningún socio del club está en deuda con el tesorero del club. Si&lt;br /&gt;
     un socio del club no paga su cuota está en deuda con el tesorero&lt;br /&gt;
     del club. Por tanto, si el tesorero del club es socio del club,&lt;br /&gt;
     entonces paga su cuota. &lt;br /&gt;
  Usar P(x) para x es socio del club&lt;br /&gt;
       Q(x) para x paga su cuota&lt;br /&gt;
       R(x) para x está en deuda con el tesorero&lt;br /&gt;
       a    para el tesorero del club&lt;br /&gt;
   ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* benber *)&lt;br /&gt;
lemma&lt;br /&gt;
  assumes A1: &amp;quot;∀x. P x ⟶ R x&amp;quot;&lt;br /&gt;
    and A2: &amp;quot;∀x. P x ⟶ (¬(Q x) ⟶ R x)&amp;quot;&lt;br /&gt;
    and &amp;quot;¬(R a)&amp;quot;&lt;br /&gt;
  shows &amp;quot;P a ⟶ Q a&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  have &amp;quot;P a ⟶ (¬(Q a) ⟶ R a)&amp;quot; using A2 by (rule allE)&lt;br /&gt;
  moreover assume &amp;quot;P a&amp;quot;&lt;br /&gt;
  ultimately have &amp;quot;¬(Q a) ⟶ R a&amp;quot; by (rule mp)&lt;br /&gt;
&lt;br /&gt;
  show &amp;quot;Q a&amp;quot;&lt;br /&gt;
  proof (rule ccontr)&lt;br /&gt;
    assume &amp;quot;¬(Q a)&amp;quot;&lt;br /&gt;
    with `¬(Q a) ⟶ R a` have &amp;quot;R a&amp;quot; by (rule mp)&lt;br /&gt;
    with `¬(R a)` show &amp;quot;False&amp;quot; by (rule notE)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* alfmarcua *)&lt;br /&gt;
lemma ejercicio_11:&lt;br /&gt;
  assumes &amp;quot;∄x. P x ∧ R x&amp;quot;&lt;br /&gt;
          &amp;quot;∀x. P x ∧ (¬ Q x) ⟶ R x&amp;quot;&lt;br /&gt;
  shows &amp;quot;P a ⟶ Q a&amp;quot;&lt;br /&gt;
proof (rule impI, rule ccontr)&lt;br /&gt;
  assume &amp;quot;P a&amp;quot; &amp;quot;¬ Q a&amp;quot;&lt;br /&gt;
  then have &amp;quot;P a ∧ (¬ Q a)&amp;quot; by (rule conjI)&lt;br /&gt;
  have &amp;quot;P a ∧ (¬ Q a) ⟶ R a&amp;quot; using assms(2) by (rule allE)&lt;br /&gt;
  then have &amp;quot;R a&amp;quot; using `P a ∧ (¬ Q a)` by (rule mp)&lt;br /&gt;
  have &amp;quot;P a ∧ R a&amp;quot; using `P a` `R a` by (rule conjI)&lt;br /&gt;
  then have &amp;quot;∃x. P x ∧ R x&amp;quot; by (rule exI)&lt;br /&gt;
  show False using assms(1) `∃x. P x ∧ R x` by (rule notE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim marfruman1 josgomrom4 gleherlop hugrubsan&lt;br /&gt;
   pabbergue enrparalv giafus1 antramhur *) &lt;br /&gt;
lemma ejercicio_11_2:&lt;br /&gt;
  assumes &amp;quot;¬(∃x. P x ∧ R x)&amp;quot;&lt;br /&gt;
          &amp;quot;∀x. P x ∧ ¬Q x ⟶ R x&amp;quot;&lt;br /&gt;
  shows &amp;quot;P a ⟶ Q a&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume 1: &amp;quot;P a&amp;quot;&lt;br /&gt;
  show &amp;quot;Q a&amp;quot; proof (rule ccontr)&lt;br /&gt;
    assume 2: &amp;quot;¬Q a&amp;quot;&lt;br /&gt;
    have 3: &amp;quot;P a ∧ ¬Q a&amp;quot; using 1 2 by (rule conjI)&lt;br /&gt;
    have 4: &amp;quot;P a ∧ ¬ Q a ⟶R a&amp;quot; using assms(2) by (rule allE)&lt;br /&gt;
    hence 5: &amp;quot;R a&amp;quot; using 3 by (rule mp)&lt;br /&gt;
    have 6: &amp;quot;P a ∧ R a&amp;quot; using 1 5 by (rule conjI)&lt;br /&gt;
    hence 7: &amp;quot;∃x. P x ∧ R x&amp;quot; by (rule exI)&lt;br /&gt;
    show False using assms(1) 7 by (rule notE)&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/RA2018/index.php?title=Relaci%C3%B3n_6&amp;diff=449</id>
		<title>Relación 6</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2018/index.php?title=Relaci%C3%B3n_6&amp;diff=449"/>
		<updated>2019-03-06T18:50:20Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: Protegió «Relación 6» ([Editar=Solo administradores] (indefinido) [Trasladar=Solo administradores] (indefinido))&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isabelle&amp;quot;&amp;gt;&lt;br /&gt;
chapter {* R6: Deducción natural proposicional *}&lt;br /&gt;
&lt;br /&gt;
theory R6_Deduccion_natural_proposicional&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 relación es demostrar cada uno de los ejercicios&lt;br /&gt;
  usando sólo las reglas básicas de deducción natural de la lógica&lt;br /&gt;
  proposicional (sin usar el método auto).&lt;br /&gt;
&lt;br /&gt;
  Las reglas básicas de la deducción natural son las siguientes:&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;
  · notnotI:    P ⟹ ¬¬ P&lt;br /&gt;
  · mp:         ⟦P ⟶ Q; P⟧ ⟹ Q &lt;br /&gt;
  · mt:         ⟦F ⟶ G; ¬G⟧ ⟹ ¬F &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;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Se usarán las reglas notnotI y mt que demostramos a continuación. *}&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;
section {* Implicaciones *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. Demostrar&lt;br /&gt;
       p ⟶ q, p ⊢ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim josgomrom4 cammonagu raffergon2 chrgencar&lt;br /&gt;
   gleherlop giafus1 marfruman1 enrparalv pabbergue antramhur alikan&lt;br /&gt;
   juacanrod hugrubsan aribatval*) &lt;br /&gt;
lemma ejercicio_1:&lt;br /&gt;
  assumes 1: &amp;quot;p ⟶ q&amp;quot; and&lt;br /&gt;
          2: &amp;quot;p&amp;quot;&lt;br /&gt;
  shows &amp;quot;q&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  show &amp;quot;q&amp;quot; using 1 2 by (rule mp)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber alfmarcua *)&lt;br /&gt;
lemma ejercicio_1_1:&lt;br /&gt;
  assumes &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
          &amp;quot;p&amp;quot;&lt;br /&gt;
  shows &amp;quot;q&amp;quot;&lt;br /&gt;
  using assms by (rule mp)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Demostrar&lt;br /&gt;
     p ⟶ q, q ⟶ r, p ⊢ r&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim josgomrom4 cammonagu gleherlop raffergon2&lt;br /&gt;
   chrgencar giafus1 marfruman1 alfmarcua enrparalv pabbergue antramhur&lt;br /&gt;
   alikan juacanrod hugrubsan  aribatval*) &lt;br /&gt;
lemma ejercicio_2:&lt;br /&gt;
  assumes 1: &amp;quot;p ⟶ q&amp;quot; and&lt;br /&gt;
          2: &amp;quot;q ⟶ r&amp;quot; and&lt;br /&gt;
          3: &amp;quot;p&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 1 3 by (rule mp)&lt;br /&gt;
  show &amp;quot;r&amp;quot; using 2 4 by (rule mp)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber *)&lt;br /&gt;
lemma ejercicio_2_1:&lt;br /&gt;
  assumes &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
          &amp;quot;q ⟶ r&amp;quot;&lt;br /&gt;
          &amp;quot;p&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 `p ⟶ q` `p` by (rule mp)&lt;br /&gt;
  with `q ⟶ r` show &amp;quot;r&amp;quot; by (rule mp)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. Demostrar&lt;br /&gt;
     p ⟶ (q ⟶ r), p ⟶ q, p ⊢ r&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim josgomrom4 cammonagu gleherlop raffergon2&lt;br /&gt;
   chrgencar giafus1 marfruman1 alfmarcua enrparalv pabbergue antramhur&lt;br /&gt;
   alikan juacanrod hugrubsan  aribatval*) &lt;br /&gt;
lemma ejercicio_3:&lt;br /&gt;
  assumes 1: &amp;quot;p ⟶ (q ⟶ r)&amp;quot; and&lt;br /&gt;
          2: &amp;quot;p ⟶ q&amp;quot; and&lt;br /&gt;
          3: &amp;quot;p&amp;quot;&lt;br /&gt;
  shows &amp;quot;r&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have 4: &amp;quot;q ⟶ r&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 &amp;quot;r&amp;quot; using 4 5 by (rule mp)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber *)&lt;br /&gt;
lemma ejercicio_3_1:&lt;br /&gt;
  assumes &amp;quot;p ⟶ (q ⟶ r)&amp;quot;&lt;br /&gt;
          &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
          &amp;quot;p&amp;quot;&lt;br /&gt;
  shows &amp;quot;r&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;q ⟶ r&amp;quot; using `p ⟶ (q ⟶ r)` `p` by (rule mp)&lt;br /&gt;
  moreover have &amp;quot;q&amp;quot; using `p ⟶ q` `p` by (rule mp)&lt;br /&gt;
  ultimately show &amp;quot;r&amp;quot; by (rule mp)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Demostrar&lt;br /&gt;
     p ⟶ q, q ⟶ r ⊢ p ⟶ r&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim josgomrom4 cammonagu chrgencar raffergon2&lt;br /&gt;
   gleherlop giafus1 marfruman1 alfmarcua enrparalv pabbergue antramhur&lt;br /&gt;
   alikan juacanrod hugrubsan  aribatval*) &lt;br /&gt;
lemma ejercicio_4:&lt;br /&gt;
  assumes 1: &amp;quot;p ⟶ q&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;
  { 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;r&amp;quot; using 2 4 by (rule mp)}&lt;br /&gt;
  thus &amp;quot;p ⟶ r&amp;quot; by (rule impI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber *)&lt;br /&gt;
lemma ejercicio_4_1:&lt;br /&gt;
  assumes &amp;quot;p ⟶ q&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;
  assume p&lt;br /&gt;
  with `p ⟶ q` have &amp;quot;q&amp;quot; by (rule mp)&lt;br /&gt;
  with `q ⟶ r` show &amp;quot;r&amp;quot; by (rule mp)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. Demostrar&lt;br /&gt;
     p ⟶ (q ⟶ r) ⊢ q ⟶ (p ⟶ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim raffergon2 giafus1 gleherlop marfruman1 alfmarcua&lt;br /&gt;
   enrparalv chrgencar pabbergue antramhur alikan hugrubsan  aribatval*) &lt;br /&gt;
lemma ejercicio_5:&lt;br /&gt;
  assumes 1: &amp;quot;p ⟶ (q ⟶ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;q ⟶ (p ⟶ r)&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume 2: &amp;quot;q&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;q ⟶ r&amp;quot; using 1 3 by (rule mp)&lt;br /&gt;
    show &amp;quot;r&amp;quot; using 4 2 by (rule mp)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber josgomrom4 juacanrod cammonagu  *)&lt;br /&gt;
lemma ejercicio_5_1:&lt;br /&gt;
  assumes &amp;quot;p ⟶ (q ⟶ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;q ⟶ (p ⟶ r)&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume &amp;quot;q&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;
    with `p ⟶ (q ⟶ r)` have &amp;quot;q ⟶ r&amp;quot; by (rule mp)&lt;br /&gt;
    thus &amp;quot;r&amp;quot; using `q` by (rule mp)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* pabalagon *)&lt;br /&gt;
lemma ejercicio_5_2:&lt;br /&gt;
  assumes 1: &amp;quot;p ⟶ (q ⟶ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;q ⟶ (p ⟶ r)&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  { assume 2: &amp;quot;q&amp;quot;&lt;br /&gt;
    { assume 3: &amp;quot;p&amp;quot;&lt;br /&gt;
      have 4: &amp;quot;q ⟶ r&amp;quot; using 1 3 by (rule mp)&lt;br /&gt;
      have 5: &amp;quot;r&amp;quot; using 4 2 by (rule mp)}&lt;br /&gt;
    hence &amp;quot;p ⟶ r&amp;quot; by (rule impI)&lt;br /&gt;
  }&lt;br /&gt;
  thus &amp;quot;q ⟶ (p ⟶ r)&amp;quot; by (rule impI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 6. Demostrar&lt;br /&gt;
     p ⟶ (q ⟶ r) ⊢ (p ⟶ q) ⟶ (p ⟶ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim cammonagu chrgencar raffergon2 gleherlop giafus1 &lt;br /&gt;
   marfruman1 alfmarcua enrparalv pabbergue  antramhur alikan juacanrod&lt;br /&gt;
   hugrubsan  aribatval*) &lt;br /&gt;
lemma ejercicio_6:&lt;br /&gt;
  assumes 1: &amp;quot;p ⟶ (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;
  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;q ⟶ r&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 &amp;quot;r&amp;quot; using 4 5 by (rule mp)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber josgomrom4 *)&lt;br /&gt;
lemma ejercicio_6_1:&lt;br /&gt;
  assumes &amp;quot;p ⟶ (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;
  show &amp;quot;p ⟶ r&amp;quot;&lt;br /&gt;
  proof&lt;br /&gt;
    assume &amp;quot;p&amp;quot;&lt;br /&gt;
    with `p ⟶ (q ⟶ r)` have &amp;quot;q ⟶ r&amp;quot; by (rule mp)&lt;br /&gt;
    moreover from `p ⟶ q` `p` have &amp;quot;q&amp;quot; by (rule mp)&lt;br /&gt;
    ultimately show &amp;quot;r&amp;quot; by (rule mp)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 7. Demostrar&lt;br /&gt;
     p ⊢ q ⟶ p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim josgomrom4 raffergon2 giafus1 gleherlop&lt;br /&gt;
   marfruman1 enrparalv pabbergue antramhur alikan hugrubsan  aribatval*) &lt;br /&gt;
lemma ejercicio_7:&lt;br /&gt;
  assumes 1: &amp;quot;p&amp;quot;  &lt;br /&gt;
  shows   &amp;quot;q ⟶ p&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume 2: &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;
&lt;br /&gt;
(* benber cammonagu juacanrod chrgencar *)&lt;br /&gt;
lemma ejercicio_7_1:&lt;br /&gt;
  assumes &amp;quot;p&amp;quot;  &lt;br /&gt;
  shows   &amp;quot;q ⟶ p&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  show &amp;quot;p&amp;quot; using `p` .&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* alfmarcua *)&lt;br /&gt;
lemma ejercicio_7_2:&lt;br /&gt;
  assumes &amp;quot;p&amp;quot;  &lt;br /&gt;
  shows   &amp;quot;q ⟶ p&amp;quot;&lt;br /&gt;
  using assms by (rule impI)&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 8. Demostrar&lt;br /&gt;
     ⊢ p ⟶ (q ⟶ p)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim josgomrom4 raffergon2 giafus1 marfruman1&lt;br /&gt;
   enrparalv pabbergue antramhur alikan hugrubsan  aribatval*) &lt;br /&gt;
lemma ejercicio_8:&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 2: &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;
(* benber cammonagu gleherlop chrgencar juacanrod alfmarcua *)&lt;br /&gt;
lemma ejercicio_8_1:&lt;br /&gt;
  &amp;quot;p ⟶ (q ⟶ p)&amp;quot;&lt;br /&gt;
  using ejercicio_7_1 by (rule impI)&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 9. Demostrar&lt;br /&gt;
     p ⟶ q ⊢ (q ⟶ r) ⟶ (p ⟶ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim raffergon2 giafus1 marfruman1 alfmarcua enrparalv&lt;br /&gt;
   gleherlop antramhur alikan hugrubsan  aribatval*) &lt;br /&gt;
lemma ejercicio_9:&lt;br /&gt;
  assumes 1: &amp;quot;p ⟶ q&amp;quot; &lt;br /&gt;
  shows   &amp;quot;(q ⟶ r) ⟶ (p ⟶ r)&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume 2: &amp;quot;q ⟶ r&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;q&amp;quot; using 1 3 by (rule mp)&lt;br /&gt;
    show &amp;quot;r&amp;quot; using 2 4 by (rule mp)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber josgomrom4 cammonagu chrgencar juacanrod pabbergue *)&lt;br /&gt;
lemma ejercicio_9_1:&lt;br /&gt;
  assumes &amp;quot;p ⟶ q&amp;quot; &lt;br /&gt;
  shows   &amp;quot;(q ⟶ r) ⟶ (p ⟶ r)&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume &amp;quot;q ⟶ r&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;
    with `p ⟶ q` have &amp;quot;q&amp;quot; by (rule mp)&lt;br /&gt;
    with `q ⟶ r` show &amp;quot;r&amp;quot; by (rule mp)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 10. Demostrar&lt;br /&gt;
     p ⟶ (q ⟶ (r ⟶ s)) ⊢ r ⟶ (q ⟶ (p ⟶ s))&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim raffergon2 marfruman1 gleherlop alfmarcua&lt;br /&gt;
   enrparalv pabbergue antramhur alikan juacanrod hugrubsan  aribatval*) &lt;br /&gt;
lemma ejercicio_10:&lt;br /&gt;
  assumes 1: &amp;quot;p ⟶ (q ⟶ (r ⟶ s))&amp;quot; &lt;br /&gt;
  shows   &amp;quot;r ⟶ (q ⟶ (p ⟶ s))&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume 2: &amp;quot;r&amp;quot;&lt;br /&gt;
  show &amp;quot;q ⟶ (p ⟶ s)&amp;quot;&lt;br /&gt;
  proof (rule impI)&lt;br /&gt;
    assume 3: &amp;quot;q&amp;quot;&lt;br /&gt;
    show &amp;quot;p ⟶ s&amp;quot;&lt;br /&gt;
    proof (rule impI)&lt;br /&gt;
      assume 4: &amp;quot;p&amp;quot;&lt;br /&gt;
      have 5: &amp;quot;q ⟶ (r ⟶ s)&amp;quot; using 1 4 by (rule mp)&lt;br /&gt;
      have 6: &amp;quot;r ⟶ s&amp;quot; using 5 3 by (rule mp)&lt;br /&gt;
      show &amp;quot;s&amp;quot; using 6 2 by (rule mp)&lt;br /&gt;
    qed&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber josgomrom4 cammonagu chrgencar giafus1 *)&lt;br /&gt;
lemma ejercicio_10_1:&lt;br /&gt;
  assumes &amp;quot;p ⟶ (q ⟶ (r ⟶ s))&amp;quot; &lt;br /&gt;
  shows   &amp;quot;r ⟶ (q ⟶ (p ⟶ s))&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume &amp;quot;r&amp;quot;&lt;br /&gt;
  show &amp;quot;q ⟶ (p ⟶ s)&amp;quot;&lt;br /&gt;
  proof&lt;br /&gt;
    assume &amp;quot;q&amp;quot;&lt;br /&gt;
    show &amp;quot;p ⟶ s&amp;quot;&lt;br /&gt;
    proof&lt;br /&gt;
      assume &amp;quot;p&amp;quot;&lt;br /&gt;
      with `p ⟶ (q ⟶ (r ⟶ s))`&lt;br /&gt;
        have &amp;quot;q ⟶ (r ⟶ s)&amp;quot; by (rule mp)&lt;br /&gt;
      hence &amp;quot;r ⟶ s&amp;quot; using `q` by (rule mp)&lt;br /&gt;
      thus &amp;quot;s&amp;quot; using `r` by (rule mp)&lt;br /&gt;
    qed&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 11. Demostrar&lt;br /&gt;
     ⊢ (p ⟶ (q ⟶ r)) ⟶ ((p ⟶ q) ⟶ (p ⟶ r))&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim josgomrom4 gleherlop cammonagu giafus1 alfmarcua&lt;br /&gt;
   chrgencar pabbergue alikan juacanrod hugrubsan  aribatval*) &lt;br /&gt;
lemma ejercicio_11:&lt;br /&gt;
  &amp;quot;(p ⟶ (q ⟶ r)) ⟶ ((p ⟶ q) ⟶ (p ⟶ r))&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume 1: &amp;quot;p ⟶ (q ⟶ r)&amp;quot;&lt;br /&gt;
  show &amp;quot;(p ⟶ q) ⟶ (p ⟶ r)&amp;quot; using 1 ejercicio_6 by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* pabalagon raffergon2 marfruman1 enrparalv antramhur *)&lt;br /&gt;
lemma ejercicio_11_2:&lt;br /&gt;
  &amp;quot;(p ⟶ (q ⟶ r)) ⟶ ((p ⟶ q) ⟶ (p ⟶ r))&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume 1: &amp;quot;p ⟶ (q ⟶ r)&amp;quot;&lt;br /&gt;
  show &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;
    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;q ⟶ r&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 &amp;quot;r&amp;quot; using 4 5 by (rule mp)&lt;br /&gt;
    qed&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber *)&lt;br /&gt;
lemma ejercicio_11_1:&lt;br /&gt;
  &amp;quot;(p ⟶ (q ⟶ r)) ⟶ ((p ⟶ q) ⟶ (p ⟶ r))&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume &amp;quot;p ⟶ (q ⟶ r)&amp;quot;&lt;br /&gt;
  show &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;
    show &amp;quot;p ⟶ r&amp;quot;&lt;br /&gt;
    proof&lt;br /&gt;
      assume p&lt;br /&gt;
      with `p ⟶ (q ⟶ r)` have &amp;quot;q ⟶ r&amp;quot; by (rule mp)&lt;br /&gt;
      moreover have &amp;quot;q&amp;quot; using `p ⟶ q` `p` by (rule mp)&lt;br /&gt;
      ultimately show r by (rule mp)&lt;br /&gt;
    qed&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 12. Demostrar&lt;br /&gt;
     (p ⟶ q) ⟶ r ⊢ p ⟶ (q ⟶ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim raffergon2 marfruman1 gleherlop enrparalv&lt;br /&gt;
   pabbergue antramhur alikan juacanrod hugrubsan  aribatval*) &lt;br /&gt;
lemma ejercicio_12:&lt;br /&gt;
  assumes 1: &amp;quot;(p ⟶ q) ⟶ r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ⟶ (q ⟶ r)&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume 2: &amp;quot;p&amp;quot;&lt;br /&gt;
  show &amp;quot;q ⟶ r&amp;quot;&lt;br /&gt;
  proof (rule impI)&lt;br /&gt;
    assume 3: &amp;quot;q&amp;quot;&lt;br /&gt;
    have 4: &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
    proof (rule impI)&lt;br /&gt;
      assume 5: &amp;quot;p&amp;quot;&lt;br /&gt;
      show &amp;quot;q&amp;quot; using 3 by this&lt;br /&gt;
    qed&lt;br /&gt;
    show &amp;quot;r&amp;quot; using 1 4 by (rule mp)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber  josgomrom4 cammonagu giafus1 alfmarcua chrgencar *)&lt;br /&gt;
lemma ejercicio_12_1:&lt;br /&gt;
  assumes &amp;quot;(p ⟶ q) ⟶ r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ⟶ (q ⟶ r)&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume &amp;quot;p&amp;quot;&lt;br /&gt;
  show &amp;quot;q ⟶ r&amp;quot;&lt;br /&gt;
  proof&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;
    with `(p ⟶ q) ⟶ r` show &amp;quot;r&amp;quot; by (rule mp)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
section {* Conjunciones *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 13. Demostrar&lt;br /&gt;
     p, q ⊢  p ∧ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon *)&lt;br /&gt;
lemma ejercicio_13:&lt;br /&gt;
  assumes &amp;quot;p&amp;quot;&lt;br /&gt;
          &amp;quot;q&amp;quot; &lt;br /&gt;
  shows &amp;quot;p ∧ q&amp;quot;&lt;br /&gt;
using assms(1, 2) by (rule conjI)&lt;br /&gt;
&lt;br /&gt;
(* benber manperjim josgomrom4 cammonagu raffergon2 marfruman1 alfmarcua&lt;br /&gt;
   enrparalv chrgencar gleherlop pabbergue antramhur juacanrod hugrubsan  &lt;br /&gt;
   alikan  aribatval*)&lt;br /&gt;
lemma ejercicio_13_1:&lt;br /&gt;
  assumes &amp;quot;p&amp;quot;&lt;br /&gt;
          &amp;quot;q&amp;quot; &lt;br /&gt;
  shows &amp;quot;p ∧ q&amp;quot;&lt;br /&gt;
  using assms by (rule conjI)&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 14. Demostrar&lt;br /&gt;
     p ∧ q ⊢ p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon  josgomrom4 *)&lt;br /&gt;
lemma ejercicio_14:&lt;br /&gt;
  assumes &amp;quot;p ∧ q&amp;quot;  &lt;br /&gt;
  shows   &amp;quot;p&amp;quot;&lt;br /&gt;
  using assms(1) by (rule conjunct1)&lt;br /&gt;
&lt;br /&gt;
(* benber manperjim cammonagu raffergon2 marfruman1 alfmarcua enrparalv&lt;br /&gt;
   chrgencar pabbergue gleherlop antramhur hugrubsan juacanrod alikan *) &lt;br /&gt;
lemma ejercicio_14_1:&lt;br /&gt;
  assumes &amp;quot;p ∧ q&amp;quot;  &lt;br /&gt;
  shows   &amp;quot;p&amp;quot;&lt;br /&gt;
  using assms by (rule conjunct1)&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 15. Demostrar&lt;br /&gt;
     p ∧ q ⊢ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim juacanrod josgomrom4 *)&lt;br /&gt;
lemma ejercicio_15:&lt;br /&gt;
  assumes &amp;quot;p ∧ q&amp;quot; &lt;br /&gt;
  shows   &amp;quot;q&amp;quot;&lt;br /&gt;
  using assms(1) by (rule conjunct2)&lt;br /&gt;
&lt;br /&gt;
(* benber cammonagu raffergon2 marfruman1 alfmarcua enrparalv chrgencar&lt;br /&gt;
   pabbergue antramhur gleherlop hugrubsan alikan  aribatval*) &lt;br /&gt;
lemma ejercicio_15_1:&lt;br /&gt;
  assumes &amp;quot;p ∧ q&amp;quot; &lt;br /&gt;
  shows   &amp;quot;q&amp;quot;&lt;br /&gt;
  using assms by (rule conjunct2)&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 16. Demostrar&lt;br /&gt;
     p ∧ (q ∧ r) ⊢ (p ∧ q) ∧ r&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim josgomrom4 raffergon2 marfruman1 alfmarcua&lt;br /&gt;
   cammmonagu enrparalv chrgencar gleherlop pabbergue antramhur&lt;br /&gt;
   hugrubsan alikan juacanrod cammonagu  aribatval*)  &lt;br /&gt;
lemma ejercicio_16:&lt;br /&gt;
  assumes &amp;quot;p ∧ (q ∧ r)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;(p ∧ q) ∧ r&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have 1: &amp;quot;p&amp;quot; using assms(1) by (rule conjunct1)&lt;br /&gt;
  have 2: &amp;quot;q ∧ r&amp;quot; using assms(1) by (rule conjunct2)&lt;br /&gt;
  have 3: &amp;quot;q&amp;quot; using 2 by (rule conjunct1)&lt;br /&gt;
  have 4: &amp;quot;r&amp;quot; using 2 by (rule conjunct2)&lt;br /&gt;
  have 5: &amp;quot;p ∧ q&amp;quot; using 1 3 by (rule conjI)&lt;br /&gt;
  show &amp;quot;(p ∧ q) ∧ r&amp;quot; using 5 4 by (rule conjI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber *)&lt;br /&gt;
lemma ejercicio_16_1:&lt;br /&gt;
  assumes &amp;quot;p ∧ (q ∧ r)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;(p ∧ q) ∧ r&amp;quot;&lt;br /&gt;
proof - (* TODO? *)&lt;br /&gt;
  have &amp;quot;q ∧ r&amp;quot; using assms by (rule conjunct2)&lt;br /&gt;
  have &amp;quot;p&amp;quot; using assms by (rule conjunct1)&lt;br /&gt;
  moreover have &amp;quot;q&amp;quot; using `q ∧ r` by (rule conjunct1)&lt;br /&gt;
  ultimately have &amp;quot;p ∧ q&amp;quot; by (rule conjI)&lt;br /&gt;
  moreover have &amp;quot;r&amp;quot; using `q ∧ r` by (rule conjunct2)&lt;br /&gt;
  ultimately show &amp;quot;(p ∧ q) ∧ r&amp;quot; by (rule conjI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 17. Demostrar&lt;br /&gt;
     (p ∧ q) ∧ r ⊢ p ∧ (q ∧ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim josgomrom4 raffergon2 marfruman1 alfmarcua&lt;br /&gt;
   cammonagu chrgencar gleherlop pabbergue antramhur enrparalv hugrubsan&lt;br /&gt;
   juacanrod alikan  aribatval*)  &lt;br /&gt;
lemma ejercicio_17:&lt;br /&gt;
  assumes 1: &amp;quot;(p ∧ q) ∧ r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ∧ (q ∧ r)&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have 2: &amp;quot;r&amp;quot; using 1 by (rule conjunct2)&lt;br /&gt;
  have 3: &amp;quot;p ∧ q&amp;quot; using 1 by (rule conjunct1)&lt;br /&gt;
  have 4: &amp;quot;p&amp;quot; using 3 by (rule conjunct1)&lt;br /&gt;
  have 5: &amp;quot;q&amp;quot; using 3 by (rule conjunct2)&lt;br /&gt;
  have 6: &amp;quot;q ∧ r&amp;quot; using 5 2 by (rule conjI)&lt;br /&gt;
  show ?thesis using 4 6 by (rule conjI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber *)&lt;br /&gt;
lemma ejercicio_17_1:&lt;br /&gt;
  assumes &amp;quot;(p ∧ q) ∧ r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ∧ (q ∧ r)&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;p ∧ q&amp;quot; using assms by (rule conjunct1)&lt;br /&gt;
  have &amp;quot;p&amp;quot; using `p ∧ q` by (rule conjunct1)&lt;br /&gt;
  moreover have &amp;quot;q ∧ r&amp;quot;&lt;br /&gt;
  proof (rule conjI)&lt;br /&gt;
    show &amp;quot;q&amp;quot; using `p ∧ q` by (rule conjunct2)&lt;br /&gt;
  next&lt;br /&gt;
    show &amp;quot;r&amp;quot; using assms by (rule conjunct2)&lt;br /&gt;
  qed&lt;br /&gt;
  ultimately show ?thesis by (rule conjI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 18. Demostrar&lt;br /&gt;
     p ∧ q ⊢ p ⟶ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon raffergon2 marfruman1 juacanrod alikan *)&lt;br /&gt;
lemma ejercicio_18:&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 impI)&lt;br /&gt;
  assume &amp;quot;p&amp;quot;&lt;br /&gt;
  show &amp;quot;q&amp;quot; using assms(1) by (rule conjunct2)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber manperjim josgomrom4 cammonagu alfmarcua chrgencar pabbergue&lt;br /&gt;
   gleherlop antramhur enrparalv hugrubsan  aribatval*) &lt;br /&gt;
lemma ejercicio_18_1:&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;q&amp;quot; using assms by (rule conjunct2)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 19. Demostrar&lt;br /&gt;
     (p ⟶ q) ∧ (p ⟶ r) ⊢ p ⟶ q ∧ r   &lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim josgomrom4 raffergon2 marfruman1 alfmarcua&lt;br /&gt;
   cammonagu chrgencar gleherlop pabbergue antramhur enrparalv juacanrod&lt;br /&gt;
   hugrubsan alikan  aribatval*)  &lt;br /&gt;
lemma ejercicio_19:&lt;br /&gt;
  assumes 1: &amp;quot;(p ⟶ q) ∧ (p ⟶ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ⟶ q ∧ r&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume 2: &amp;quot;p&amp;quot;&lt;br /&gt;
  have 3: &amp;quot;p ⟶ q&amp;quot; using 1 by (rule conjunct1)&lt;br /&gt;
  have 4: &amp;quot;p ⟶ r&amp;quot; using 1 by (rule conjunct2)&lt;br /&gt;
  have 5: &amp;quot;q&amp;quot; using 3 2 by (rule mp)&lt;br /&gt;
  have 6: &amp;quot;r&amp;quot; using 4 2 by (rule mp)&lt;br /&gt;
  show &amp;quot;q ∧ r&amp;quot; using 5 6 by (rule conjI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber cammonagu *)&lt;br /&gt;
lemma ejercicio_19_1:&lt;br /&gt;
  assumes &amp;quot;(p ⟶ q) ∧ (p ⟶ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ⟶ q ∧ r&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume p&lt;br /&gt;
  show &amp;quot;q ∧ r&amp;quot;&lt;br /&gt;
  proof&lt;br /&gt;
    have &amp;quot;p ⟶ q&amp;quot; using assms by (rule conjunct1)&lt;br /&gt;
    thus &amp;quot;q&amp;quot; using `p` by (rule mp)&lt;br /&gt;
  next&lt;br /&gt;
    have &amp;quot;p ⟶ r&amp;quot; using assms by (rule conjunct2)&lt;br /&gt;
    thus &amp;quot;r&amp;quot; using `p` by (rule mp)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 20. Demostrar&lt;br /&gt;
     p ⟶ q ∧ r ⊢ (p ⟶ q) ∧ (p ⟶ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim josgomrom4 raffergon2 marfruman1 alfmarcua&lt;br /&gt;
   cammonagu chrgencar gleherlop pabbergue antramhur enrparalv juacanrod&lt;br /&gt;
   hugrubsan alikan  aribatval*)  &lt;br /&gt;
lemma ejercicio_20:&lt;br /&gt;
  assumes 1: &amp;quot;p ⟶ q ∧ r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;(p ⟶ q) ∧ (p ⟶ r)&amp;quot;&lt;br /&gt;
proof (rule conjI)&lt;br /&gt;
  show &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;
    have 3: &amp;quot;q ∧ r&amp;quot; using 1 2 by (rule mp)&lt;br /&gt;
    show 4: &amp;quot;q&amp;quot; using 3 by (rule conjunct1)&lt;br /&gt;
  qed&lt;br /&gt;
  show &amp;quot;p ⟶ r&amp;quot;&lt;br /&gt;
  proof (rule impI)&lt;br /&gt;
    assume 2: &amp;quot;p&amp;quot;&lt;br /&gt;
    have 3: &amp;quot;q ∧ r&amp;quot; using 1 2 by (rule mp)&lt;br /&gt;
    show 4: &amp;quot;r&amp;quot; using 3 by (rule conjunct2)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber *)&lt;br /&gt;
lemma ejercicio_20_1:&lt;br /&gt;
  assumes &amp;quot;p ⟶ q ∧ r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;(p ⟶ q) ∧ (p ⟶ r)&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  show &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
  proof&lt;br /&gt;
    assume &amp;quot;p&amp;quot;&lt;br /&gt;
    with assms have &amp;quot;q ∧ r&amp;quot; by (rule mp)&lt;br /&gt;
    thus &amp;quot;q&amp;quot; by (rule conjunct1)&lt;br /&gt;
  qed&lt;br /&gt;
next&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;
    with assms have &amp;quot;q ∧ r&amp;quot; by (rule mp)&lt;br /&gt;
    thus &amp;quot;r&amp;quot; by (rule conjunct2)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 21. Demostrar&lt;br /&gt;
     p ⟶ (q ⟶ r) ⊢ p ∧ q ⟶ r&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim josgomrom4 raffergon2 marfruman1 alfmarcua&lt;br /&gt;
   cammonagu chrgencar pabbergue gleherlop antramhur enrparalv juacanrod&lt;br /&gt;
   hugrubsan alikan  aribatval*)  &lt;br /&gt;
lemma ejercicio_21:&lt;br /&gt;
  assumes 1: &amp;quot;p ⟶ (q ⟶ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ∧ q ⟶ r&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume 2: &amp;quot;p ∧ q&amp;quot;&lt;br /&gt;
  have 3: &amp;quot;p&amp;quot; using 2 by (rule conjunct1)&lt;br /&gt;
  have 4: &amp;quot;q ⟶ r&amp;quot; using 1 3 by (rule mp)&lt;br /&gt;
  have 5: &amp;quot;q&amp;quot; using 2 by (rule conjunct2)&lt;br /&gt;
  show &amp;quot;r&amp;quot; using 4 5 by (rule mp)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber *)&lt;br /&gt;
lemma ejercicio_21_1:&lt;br /&gt;
  assumes &amp;quot;p ⟶ (q ⟶ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ∧ q ⟶ r&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume &amp;quot;p ∧ q&amp;quot;&lt;br /&gt;
  hence &amp;quot;p&amp;quot; by (rule conjunct1)&lt;br /&gt;
  with `p ⟶ (q ⟶ r)` have &amp;quot;q ⟶ r&amp;quot; by (rule mp)&lt;br /&gt;
  moreover from `p ∧ q` have &amp;quot;q&amp;quot; by (rule conjunct2)&lt;br /&gt;
  ultimately show &amp;quot;r&amp;quot; by (rule mp)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 22. Demostrar&lt;br /&gt;
     p ∧ q ⟶ r ⊢ p ⟶ (q ⟶ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim josgomrom4 raffergon2 marfruman1 alfmarcua&lt;br /&gt;
   chrgencar pabbergue gleherlop antramhur enrparalv juacanrod hugrubsan&lt;br /&gt;
   alikan  aribatval*)  &lt;br /&gt;
lemma ejercicio_22:&lt;br /&gt;
  assumes 1: &amp;quot;p ∧ q ⟶ r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ⟶ (q ⟶ r)&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume 2: &amp;quot;p&amp;quot;&lt;br /&gt;
  show &amp;quot;q ⟶ r&amp;quot;&lt;br /&gt;
  proof (rule impI)&lt;br /&gt;
    assume 3: &amp;quot;q&amp;quot;&lt;br /&gt;
    have 4: &amp;quot;p ∧ q&amp;quot; using 2 3 by (rule conjI)&lt;br /&gt;
    show &amp;quot;r&amp;quot; using 1 4 by (rule mp)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber cammonagu *)&lt;br /&gt;
lemma ejercicio_22_1:&lt;br /&gt;
  assumes &amp;quot;p ∧ q ⟶ r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ⟶ (q ⟶ r)&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume &amp;quot;p&amp;quot;&lt;br /&gt;
  show &amp;quot;q ⟶ r&amp;quot;&lt;br /&gt;
  proof&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 `p ∧ q ⟶ r` show &amp;quot;r&amp;quot; by (rule mp)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 23. Demostrar&lt;br /&gt;
     (p ⟶ q) ⟶ r ⊢ p ∧ q ⟶ r&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim josgomrom4 raffergon2 marfruman1 alfmarcua&lt;br /&gt;
   chrgencar pabbergue gleherlop antramhur enrparalv juacanrod hugrubsan&lt;br /&gt;
   alikan aribatval*)  &lt;br /&gt;
lemma ejercicio_23:&lt;br /&gt;
  assumes 1: &amp;quot;(p ⟶ q) ⟶ r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ∧ q ⟶ r&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume 2: &amp;quot;p ∧ q&amp;quot;&lt;br /&gt;
  have 3: &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
  proof (rule impI)&lt;br /&gt;
    assume &amp;quot;p&amp;quot;&lt;br /&gt;
    show &amp;quot;q&amp;quot; using 2 by (rule conjunct2)&lt;br /&gt;
  qed&lt;br /&gt;
  show &amp;quot;r&amp;quot; using 1 3 by (rule mp)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber cammonagu *)&lt;br /&gt;
lemma ejercicio_23_1:&lt;br /&gt;
  assumes &amp;quot;(p ⟶ q) ⟶ r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ∧ q ⟶ r&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume &amp;quot;p ∧ q&amp;quot;&lt;br /&gt;
  hence &amp;quot;q&amp;quot; by (rule conjunct2)&lt;br /&gt;
  hence &amp;quot;p ⟶ q&amp;quot; by (rule impI)&lt;br /&gt;
  with `(p ⟶ q) ⟶ r` show &amp;quot;r&amp;quot; by (rule mp)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 24. Demostrar&lt;br /&gt;
     p ∧ (q ⟶ r) ⊢ (p ⟶ q) ⟶ r&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim josgomrom4 raffergon2 marfruman1 alfmarcua&lt;br /&gt;
   chrgencar pabbergue gleherlop antramhur enrparalv hugrubsan juacanrod&lt;br /&gt;
   cammonagu alikan aribatval*)  &lt;br /&gt;
lemma ejercicio_24:&lt;br /&gt;
  assumes 1: &amp;quot;p ∧ (q ⟶ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;(p ⟶ q) ⟶ r&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume 2: &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
  have 3: &amp;quot;p&amp;quot; using 1 by (rule conjunct1)&lt;br /&gt;
  have 4: &amp;quot;q ⟶ r&amp;quot; using 1 by (rule conjunct2)&lt;br /&gt;
  have 5: &amp;quot;q&amp;quot; using 2 3 by (rule mp)&lt;br /&gt;
  show 6: &amp;quot;r&amp;quot; using 4 5 by (rule mp)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber *)&lt;br /&gt;
lemma ejercicio_24_1:&lt;br /&gt;
  assumes &amp;quot;p ∧ (q ⟶ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;(p ⟶ q) ⟶ r&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  have &amp;quot;q ⟶ r&amp;quot; using assms by (rule conjunct2)&lt;br /&gt;
  assume &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
  moreover have &amp;quot;p&amp;quot; using assms by (rule conjunct1)&lt;br /&gt;
  ultimately have &amp;quot;q&amp;quot; by (rule mp)&lt;br /&gt;
  with `q ⟶ r` show r by (rule mp)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
section {* Disyunciones *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 25. Demostrar&lt;br /&gt;
     p ⊢ p ∨ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim josgomrom4 benber cammonagu raffergon2 marfruman1&lt;br /&gt;
   alfmarcua chrgencar gleherlop pabbergue antramhur enrparalv juacanrod&lt;br /&gt;
   hugrubsan alikan aribatval*)  &lt;br /&gt;
lemma ejercicio_25:&lt;br /&gt;
  assumes &amp;quot;p&amp;quot;&lt;br /&gt;
  shows   &amp;quot;p ∨ q&amp;quot;&lt;br /&gt;
  using assms(1) by (rule disjI1)&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 26. Demostrar&lt;br /&gt;
     q ⊢ p ∨ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim josgomrom4 benber cammonagu marfruman1 alfmarcua&lt;br /&gt;
   chrgencar pabbergue gleherlop antramhur enrparalv juacanrod hugrubsan&lt;br /&gt;
   alikan aribatval*)  &lt;br /&gt;
lemma ejercicio_26:&lt;br /&gt;
  assumes &amp;quot;q&amp;quot;&lt;br /&gt;
  shows   &amp;quot;p ∨ q&amp;quot;&lt;br /&gt;
  using assms(1) by (rule disjI2)&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 27. Demostrar&lt;br /&gt;
     p ∨ q ⊢ q ∨ p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim josgomrom4 raffergon2 marfruman1 chrgencar&lt;br /&gt;
   pabbergue antramhur enrparalv juacanrod hugrubsan cammonagu alikan aribatval*) &lt;br /&gt;
lemma ejercicio_27:&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 proof (rule disjE)&lt;br /&gt;
  assume 2: &amp;quot;p&amp;quot; thus &amp;quot;q ∨ p&amp;quot; by (rule disjI2)&lt;br /&gt;
next&lt;br /&gt;
  assume 3: &amp;quot;q&amp;quot; thus &amp;quot;q ∨ p&amp;quot; by (rule disjI1)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber alfmarcua gleherlop *)&lt;br /&gt;
lemma ejercicio_27_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 .&lt;br /&gt;
  moreover have &amp;quot;p ⟹ q ∨ p&amp;quot; by (rule disjI2)&lt;br /&gt;
  moreover have &amp;quot;q ⟹ q ∨ p&amp;quot; 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;
  Ejercicio 28. Demostrar&lt;br /&gt;
     q ⟶ r ⊢ p ∨ q ⟶ p ∨ r&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim josgomrom4 raffergon2 marfruman1 chrgencar&lt;br /&gt;
   gleherlop alfmarcua pabbergue antramhur enrparalv juacanrod hugrubsan&lt;br /&gt;
   cammonagu alikan aribatval*) &lt;br /&gt;
lemma ejercicio_28:&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; show &amp;quot;p ∨ r&amp;quot; using 2&lt;br /&gt;
  proof (rule disjE)&lt;br /&gt;
    assume 3: p thus &amp;quot;p ∨ r&amp;quot; by (rule disjI1)&lt;br /&gt;
  next&lt;br /&gt;
    assume 4: q have r using 1 4 by (rule mp)&lt;br /&gt;
    thus &amp;quot;p ∨ r&amp;quot; by (rule disjI2)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber *)&lt;br /&gt;
lemma ejercicio_28_1:&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;
  moreover have &amp;quot;p ⟹ p ∨ r&amp;quot; by (rule disjI1)&lt;br /&gt;
  moreover have &amp;quot;q ⟹ p ∨ r&amp;quot;&lt;br /&gt;
  proof (rule disjI2)&lt;br /&gt;
    assume &amp;quot;q&amp;quot;&lt;br /&gt;
    with `q ⟶ r` show &amp;quot;r&amp;quot; by (rule mp)&lt;br /&gt;
  qed&lt;br /&gt;
  ultimately show &amp;quot;p ∨ r&amp;quot; by (rule disjE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 29. Demostrar&lt;br /&gt;
     p ∨ p ⊢ p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon juacanrod marfruman1 *)&lt;br /&gt;
lemma ejercicio_29:&lt;br /&gt;
  assumes 1: &amp;quot;p ∨ p&amp;quot;&lt;br /&gt;
  shows   &amp;quot;p&amp;quot;&lt;br /&gt;
using 1 proof (rule disjE)&lt;br /&gt;
  assume &amp;quot;p&amp;quot; thus &amp;quot;p&amp;quot; .&lt;br /&gt;
next&lt;br /&gt;
  assume &amp;quot;p&amp;quot; thus &amp;quot;p&amp;quot; .&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber manperjim cammonagu josgomrom4 raffergon2 chrgencar alfmarcua&lt;br /&gt;
   gleherlop pabbergue antramhur enrparalv hugrubsan alikan aribatval*) &lt;br /&gt;
lemma ejercicio_29_1:&lt;br /&gt;
  assumes &amp;quot;p ∨ p&amp;quot;&lt;br /&gt;
  shows   &amp;quot;p&amp;quot;&lt;br /&gt;
  using assms by (rule disjE)&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 30. Demostrar&lt;br /&gt;
     p ⊢ p ∨ p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim  benber josgomrom4 raffergon2 marfruman1&lt;br /&gt;
   chrgencar alfmarcua pabbergue gleherlop antramhur enrparalv hugrubsan&lt;br /&gt;
   juacanrod cammonagu alikan aribatval*)  &lt;br /&gt;
lemma ejercicio_30:&lt;br /&gt;
  assumes &amp;quot;p&amp;quot;&lt;br /&gt;
  shows   &amp;quot;p ∨ p&amp;quot;&lt;br /&gt;
  using assms(1) by (rule disjI1)&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 31. Demostrar&lt;br /&gt;
     p ∨ (q ∨ r) ⊢ (p ∨ q) ∨ r&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim marfruman1 josgomrom4 alfmarcua pabbergue&lt;br /&gt;
   gleherlop antramhur enrparalv juacanrod hugrubsan alikan aribatval*) &lt;br /&gt;
lemma ejercicio_31:&lt;br /&gt;
  assumes 1: &amp;quot;p ∨ (q ∨ r)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;(p ∨ q) ∨ r&amp;quot; (is &amp;quot;?R&amp;quot;)&lt;br /&gt;
using 1 proof (rule disjE)&lt;br /&gt;
  assume &amp;quot;p&amp;quot; hence &amp;quot;p ∨ q&amp;quot; by (rule disjI1)&lt;br /&gt;
  thus ?R by (rule disjI1)&lt;br /&gt;
next&lt;br /&gt;
  assume &amp;quot;q ∨ r&amp;quot; thus ?R&lt;br /&gt;
  proof (rule disjE)&lt;br /&gt;
    assume &amp;quot;q&amp;quot; hence &amp;quot;p ∨ q&amp;quot; by (rule disjI2)&lt;br /&gt;
    thus &amp;quot;(p ∨ q) ∨ r&amp;quot; by (rule disjI1)&lt;br /&gt;
  next&lt;br /&gt;
    assume &amp;quot;r&amp;quot; thus ?thesis by (rule disjI2)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber cammonagu *)&lt;br /&gt;
lemma ejercicio_31_1:&lt;br /&gt;
  assumes &amp;quot;p ∨ (q ∨ r)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;(p ∨ q) ∨ r&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;p ∨ (q ∨ r)&amp;quot; using assms .&lt;br /&gt;
  moreover {&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) ∨ r&amp;quot; by (rule disjI1)&lt;br /&gt;
  }&lt;br /&gt;
  moreover {&lt;br /&gt;
    assume &amp;quot;q ∨ r&amp;quot;&lt;br /&gt;
    moreover {&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;
      hence &amp;quot;(p ∨ q) ∨ r&amp;quot; by (rule disjI1)&lt;br /&gt;
    }&lt;br /&gt;
    moreover {&lt;br /&gt;
      assume &amp;quot;r&amp;quot;&lt;br /&gt;
      hence &amp;quot;(p ∨ q) ∨ r&amp;quot; by (rule disjI2)&lt;br /&gt;
    }&lt;br /&gt;
    ultimately have &amp;quot;(p ∨ q) ∨ r&amp;quot; by (rule disjE)&lt;br /&gt;
  }&lt;br /&gt;
  ultimately show &amp;quot;(p ∨ q) ∨ r&amp;quot; by (rule disjE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 32. Demostrar&lt;br /&gt;
     (p ∨ q) ∨ r ⊢ p ∨ (q ∨ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim marfruman1 josgomrom4 alfmarcua gleherlop&lt;br /&gt;
   pabbergue antramhur enrparalv juacanrod hugrubsan alikan aribatval*) &lt;br /&gt;
lemma ejercicio_32:&lt;br /&gt;
  assumes 1: &amp;quot;(p ∨ q) ∨ r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ∨ (q ∨ r)&amp;quot;&lt;br /&gt;
using 1 proof (rule disjE)&lt;br /&gt;
  assume &amp;quot;p ∨ q&amp;quot; thus ?thesis&lt;br /&gt;
  proof (rule disjE)&lt;br /&gt;
    assume p thus ?thesis by (rule disjI1)&lt;br /&gt;
  next&lt;br /&gt;
    assume q hence &amp;quot;q ∨ r&amp;quot; by (rule disjI1)&lt;br /&gt;
    thus ?thesis by (rule disjI2)&lt;br /&gt;
  qed&lt;br /&gt;
next&lt;br /&gt;
  assume r hence &amp;quot;q ∨ r&amp;quot; by (rule disjI2)&lt;br /&gt;
  thus ?thesis by (rule disjI2)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber cammonagu *)&lt;br /&gt;
lemma ejercicio_32_1:&lt;br /&gt;
  assumes &amp;quot;(p ∨ q) ∨ r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ∨ (q ∨ r)&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;(p ∨ q) ∨ r&amp;quot; using assms .&lt;br /&gt;
  moreover {&lt;br /&gt;
    assume &amp;quot;p ∨ q&amp;quot;&lt;br /&gt;
    moreover {&lt;br /&gt;
      assume &amp;quot;p&amp;quot;&lt;br /&gt;
      hence ?thesis by (rule disjI1)&lt;br /&gt;
    }&lt;br /&gt;
    moreover {&lt;br /&gt;
      assume &amp;quot;q&amp;quot;&lt;br /&gt;
      hence &amp;quot;q ∨ r&amp;quot; by (rule disjI1)&lt;br /&gt;
      hence ?thesis by (rule disjI2)&lt;br /&gt;
    }&lt;br /&gt;
    ultimately have ?thesis by (rule disjE)&lt;br /&gt;
  }&lt;br /&gt;
  moreover {&lt;br /&gt;
    assume &amp;quot;r&amp;quot;&lt;br /&gt;
    hence &amp;quot;q ∨ r&amp;quot; by (rule disjI2)&lt;br /&gt;
    hence ?thesis by (rule disjI2)&lt;br /&gt;
  }&lt;br /&gt;
  ultimately show ?thesis by (rule disjE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 33. Demostrar&lt;br /&gt;
     p ∧ (q ∨ r) ⊢ (p ∧ q) ∨ (p ∧ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim marfruman1 josgomrom4 chrgencar gleherlop&lt;br /&gt;
   alfmarcua pabbergue antramhur enrparalv juacanrod hugrubsan alikan aribatval*) &lt;br /&gt;
lemma ejercicio_33:&lt;br /&gt;
  assumes 1: &amp;quot;p ∧ (q ∨ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;(p ∧ q) ∨ (p ∧ r)&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have 2: p using 1 by (rule conjunct1)&lt;br /&gt;
  show ?thesis&lt;br /&gt;
  proof (rule disjE)&lt;br /&gt;
    assume 3: q have &amp;quot;p ∧ q&amp;quot; using 2 3 by (rule conjI)&lt;br /&gt;
    thus ?thesis by (rule disjI1)&lt;br /&gt;
  next&lt;br /&gt;
    assume 4: r have &amp;quot;p ∧ r&amp;quot; using 2 4 by (rule conjI)&lt;br /&gt;
    thus ?thesis by (rule disjI2)&lt;br /&gt;
  next&lt;br /&gt;
    show &amp;quot;q ∨ r&amp;quot; using 1 by (rule conjunct2)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber cammonagu *)&lt;br /&gt;
lemma ejercicio_33_1:&lt;br /&gt;
  assumes &amp;quot;p ∧ (q ∨ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;(p ∧ q) ∨ (p ∧ r)&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;p&amp;quot; using assms by (rule conjunct1)&lt;br /&gt;
  have &amp;quot;q ∨ r&amp;quot; using assms by (rule conjunct2)&lt;br /&gt;
  moreover {&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;
    hence ?thesis by (rule disjI1)&lt;br /&gt;
  }&lt;br /&gt;
  moreover {&lt;br /&gt;
    assume &amp;quot;r&amp;quot;&lt;br /&gt;
    with `p` have &amp;quot;p ∧ r&amp;quot; by (rule conjI)&lt;br /&gt;
    hence ?thesis by (rule disjI2)&lt;br /&gt;
  }&lt;br /&gt;
  ultimately show ?thesis by (rule disjE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 34. Demostrar&lt;br /&gt;
     (p ∧ q) ∨ (p ∧ r) ⊢ p ∧ (q ∨ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim marfruman1 josgomrom4 chrgencar alfmarcua&lt;br /&gt;
   gleherlop pabbergue antramhur enrparalv juacanrod hugrubsan alikan aribatval*) &lt;br /&gt;
lemma ejercicio_34:&lt;br /&gt;
  assumes &amp;quot;(p ∧ q) ∨ (p ∧ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ∧ (q ∨ r)&amp;quot;&lt;br /&gt;
using assms(1) proof (rule disjE)&lt;br /&gt;
  assume 2: &amp;quot;p ∧ q&amp;quot; hence q by (rule conjunct2)&lt;br /&gt;
  hence 3: &amp;quot;q ∨ r&amp;quot; by (rule disjI1)&lt;br /&gt;
  have p using 2 by (rule conjunct1)&lt;br /&gt;
  thus ?thesis using 3 by (rule conjI)&lt;br /&gt;
next&lt;br /&gt;
  assume 4: &amp;quot;p ∧ r&amp;quot; hence r by (rule conjunct2)&lt;br /&gt;
  hence 5: &amp;quot;q ∨ r&amp;quot; by (rule disjI2)&lt;br /&gt;
  have p using 4 by (rule conjunct1)&lt;br /&gt;
  thus ?thesis using 5 by (rule conjI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber cammonagu *)&lt;br /&gt;
lemma ejercicio_34_1:&lt;br /&gt;
  assumes &amp;quot;(p ∧ q) ∨ (p ∧ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ∧ (q ∨ r)&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;(p ∧ q) ∨ (p ∧ r)&amp;quot; using assms .&lt;br /&gt;
  moreover {&lt;br /&gt;
    assume &amp;quot;p ∧ q&amp;quot;&lt;br /&gt;
    hence &amp;quot;p&amp;quot; by (rule conjunct1)&lt;br /&gt;
    moreover {&lt;br /&gt;
      have &amp;quot;q&amp;quot; using `p ∧ q` by (rule conjunct2)&lt;br /&gt;
      hence &amp;quot;q ∨ r&amp;quot; by (rule disjI1)&lt;br /&gt;
    }&lt;br /&gt;
    ultimately have ?thesis by (rule conjI)&lt;br /&gt;
  }&lt;br /&gt;
  moreover {&lt;br /&gt;
    assume &amp;quot;p ∧ r&amp;quot;&lt;br /&gt;
    hence &amp;quot;p&amp;quot; by (rule conjunct1)&lt;br /&gt;
    moreover {&lt;br /&gt;
      have &amp;quot;r&amp;quot; using `p ∧ r` by (rule conjunct2)&lt;br /&gt;
      hence &amp;quot;q ∨ r&amp;quot; by (rule disjI2)&lt;br /&gt;
    }&lt;br /&gt;
    ultimately have ?thesis by (rule conjI)&lt;br /&gt;
  }&lt;br /&gt;
  ultimately show ?thesis by (rule disjE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 35. Demostrar&lt;br /&gt;
     p ∨ (q ∧ r) ⊢ (p ∨ q) ∧ (p ∨ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim marfruman1 josgomrom4 chrgencar alfmarcua&lt;br /&gt;
   gleherlop pabbergue antramhur enrparalv juacanrod hugrubsan alikan aribatval*) &lt;br /&gt;
lemma ejercicio_35:&lt;br /&gt;
  assumes &amp;quot;p ∨ (q ∧ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;(p ∨ q) ∧ (p ∨ r)&amp;quot;&lt;br /&gt;
using assms(1) proof (rule disjE)&lt;br /&gt;
  assume 1: p hence 2: &amp;quot;p ∨ r&amp;quot; by (rule disjI1)&lt;br /&gt;
  have &amp;quot;p ∨ q&amp;quot; using 1 by (rule disjI1)&lt;br /&gt;
  thus ?thesis using 2 by (rule conjI)&lt;br /&gt;
next&lt;br /&gt;
  assume 3: &amp;quot;q ∧ r&amp;quot; hence r by (rule conjunct2)&lt;br /&gt;
  hence 4: &amp;quot;p ∨ r&amp;quot; by (rule disjI2)&lt;br /&gt;
  have q using 3 by (rule conjunct1)&lt;br /&gt;
  hence &amp;quot;p ∨ q&amp;quot; by (rule disjI2)&lt;br /&gt;
  thus ?thesis using 4 by (rule conjI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber cammonagu *)&lt;br /&gt;
lemma ejercicio_35_1:&lt;br /&gt;
  assumes &amp;quot;p ∨ (q ∧ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;(p ∨ q) ∧ (p ∨ r)&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;p ∨ (q ∧ r)&amp;quot; using assms .&lt;br /&gt;
  moreover {&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;
    moreover have &amp;quot;p ∨ r&amp;quot; using `p` by (rule disjI1)&lt;br /&gt;
    ultimately have ?thesis by (rule conjI)&lt;br /&gt;
  }&lt;br /&gt;
  moreover {&lt;br /&gt;
    assume &amp;quot;q ∧ r&amp;quot;&lt;br /&gt;
    {&lt;br /&gt;
      have &amp;quot;q&amp;quot; using `q ∧ r` by (rule conjunct1)&lt;br /&gt;
      hence &amp;quot;p ∨ q&amp;quot; by (rule disjI2)&lt;br /&gt;
    }&lt;br /&gt;
    moreover {&lt;br /&gt;
      have &amp;quot;r&amp;quot; using `q ∧ r` by (rule conjunct2)&lt;br /&gt;
      hence &amp;quot;p ∨ r&amp;quot; by (rule disjI2)&lt;br /&gt;
    }&lt;br /&gt;
    ultimately have ?thesis by (rule conjI)&lt;br /&gt;
  }&lt;br /&gt;
  ultimately show ?thesis by (rule disjE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 36. Demostrar&lt;br /&gt;
     (p ∨ q) ∧ (p ∨ r) ⊢ p ∨ (q ∧ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim marfruman1 josgomrom4 chrgencar alfmarcua&lt;br /&gt;
   gleherlop pabbergue antramhur enrparalv juacanrod hugrubsan alikan aribatval*) &lt;br /&gt;
lemma ejercicio_36:&lt;br /&gt;
  assumes 1: &amp;quot;(p ∨ q) ∧ (p ∨ r)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;p ∨ (q ∧ r)&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have 2: &amp;quot;p ∨ q&amp;quot; using 1 by (rule conjunct1)&lt;br /&gt;
  have 3: &amp;quot;p ∨ r&amp;quot; using 1 by (rule conjunct2)&lt;br /&gt;
  show ?thesis using 2&lt;br /&gt;
  proof (rule disjE)&lt;br /&gt;
    assume p thus ?thesis by (rule disjI1)&lt;br /&gt;
  next&lt;br /&gt;
    assume 4: q show ?thesis using 3&lt;br /&gt;
    proof (rule disjE)&lt;br /&gt;
      assume p thus ?thesis by (rule disjI1)&lt;br /&gt;
    next&lt;br /&gt;
      assume 5: r have &amp;quot;q ∧ r&amp;quot; using 4 5 by (rule conjI)&lt;br /&gt;
      thus ?thesis by (rule disjI2)&lt;br /&gt;
    qed&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber cammonagu *)&lt;br /&gt;
lemma ejercicio_36_1:&lt;br /&gt;
  assumes &amp;quot;(p ∨ q) ∧ (p ∨ r)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;p ∨ (q ∧ r)&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;p ∨ q&amp;quot; using assms by (rule conjunct1)&lt;br /&gt;
  moreover {&lt;br /&gt;
    assume &amp;quot;p&amp;quot;&lt;br /&gt;
    hence ?thesis by (rule disjI1)&lt;br /&gt;
  }&lt;br /&gt;
  moreover {&lt;br /&gt;
    assume &amp;quot;q&amp;quot;&lt;br /&gt;
    have &amp;quot;p ∨ r&amp;quot; using assms by (rule conjunct2)&lt;br /&gt;
    moreover {&lt;br /&gt;
      assume &amp;quot;p&amp;quot;&lt;br /&gt;
      hence ?thesis by (rule disjI1)&lt;br /&gt;
    }&lt;br /&gt;
    moreover {&lt;br /&gt;
      assume &amp;quot;r&amp;quot;&lt;br /&gt;
      with `q` have &amp;quot;q ∧ r&amp;quot; by (rule conjI)&lt;br /&gt;
      hence ?thesis by (rule disjI2)&lt;br /&gt;
    }&lt;br /&gt;
    ultimately have ?thesis by (rule disjE)&lt;br /&gt;
  }&lt;br /&gt;
  ultimately show ?thesis by (rule disjE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 37. Demostrar&lt;br /&gt;
     (p ⟶ r) ∧ (q ⟶ r) ⊢ p ∨ q ⟶ r&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim marfruman1 josgomrom4 alfmarcua gleherlop&lt;br /&gt;
   pabbergue antramhur enrparalv juacanrod hugrubsan alikan aribatval*) &lt;br /&gt;
lemma ejercicio_37:&lt;br /&gt;
  assumes 1: &amp;quot;(p ⟶ r) ∧ (q ⟶ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ∨ q ⟶ r&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  have 2: &amp;quot;p ⟶ r&amp;quot; using 1 by (rule conjunct1)&lt;br /&gt;
  have 3: &amp;quot;q ⟶ r&amp;quot; using 1 by (rule conjunct2)&lt;br /&gt;
  assume 4: &amp;quot;p ∨ q&amp;quot; show &amp;quot;r&amp;quot; using 4&lt;br /&gt;
  proof (rule disjE)&lt;br /&gt;
    assume 5: &amp;quot;p&amp;quot; show &amp;quot;r&amp;quot; using 2 5 by (rule mp)&lt;br /&gt;
  next&lt;br /&gt;
    assume 6: &amp;quot;q&amp;quot; show &amp;quot;r&amp;quot; using 3 6 by (rule mp)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber cammonagu *)&lt;br /&gt;
lemma ejercicio_37_1:&lt;br /&gt;
  assumes &amp;quot;(p ⟶ r) ∧ (q ⟶ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ∨ q ⟶ r&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume &amp;quot;p ∨ q&amp;quot;&lt;br /&gt;
  moreover {&lt;br /&gt;
    have &amp;quot;p ⟶ r&amp;quot; using assms by (rule conjunct1)&lt;br /&gt;
    moreover assume &amp;quot;p&amp;quot;&lt;br /&gt;
    ultimately have &amp;quot;r&amp;quot; by (rule mp)&lt;br /&gt;
  }&lt;br /&gt;
  moreover {&lt;br /&gt;
    have &amp;quot;q ⟶ r&amp;quot; using assms by (rule conjunct2)&lt;br /&gt;
    moreover assume &amp;quot;q&amp;quot;&lt;br /&gt;
    ultimately have &amp;quot;r&amp;quot; by (rule mp)&lt;br /&gt;
  }&lt;br /&gt;
  ultimately show &amp;quot;r&amp;quot; by (rule disjE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 38. Demostrar&lt;br /&gt;
     p ∨ q ⟶ r ⊢ (p ⟶ r) ∧ (q ⟶ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim marfruman1 josgomrom4 alfmarcua gleherlop&lt;br /&gt;
   pabbergue antramhur enrparalv juacanrod hugrubsan alikan aribatval*) &lt;br /&gt;
lemma ejercicio_38:&lt;br /&gt;
  assumes &amp;quot;p ∨ q ⟶ r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;(p ⟶ r) ∧ (q ⟶ r)&amp;quot;&lt;br /&gt;
proof (rule conjI)&lt;br /&gt;
  show &amp;quot;p ⟶ r&amp;quot;&lt;br /&gt;
  proof (rule impI)&lt;br /&gt;
    assume &amp;quot;p&amp;quot; hence 1: &amp;quot;p ∨ q&amp;quot; by (rule disjI1)&lt;br /&gt;
    show &amp;quot;r&amp;quot; using assms(1) 1 by (rule mp)&lt;br /&gt;
  qed&lt;br /&gt;
next&lt;br /&gt;
  show &amp;quot;q ⟶ r&amp;quot;&lt;br /&gt;
  proof (rule impI)&lt;br /&gt;
    assume q hence 2: &amp;quot;p ∨ q&amp;quot; by (rule disjI2)&lt;br /&gt;
    show r using assms(1) 2 by (rule mp)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber cammonagu*)&lt;br /&gt;
lemma ejercicio_38_1:&lt;br /&gt;
  assumes &amp;quot;p ∨ q ⟶ r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;(p ⟶ r) ∧ (q ⟶ r)&amp;quot;&lt;br /&gt;
proof&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 ∨ q&amp;quot; by (rule disjI1)&lt;br /&gt;
    with assms show &amp;quot;r&amp;quot; by (rule mp)&lt;br /&gt;
  qed&lt;br /&gt;
next&lt;br /&gt;
  show &amp;quot;q ⟶ r&amp;quot;&lt;br /&gt;
  proof&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 show &amp;quot;r&amp;quot; by (rule mp)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
section {* Negaciones *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 39. Demostrar&lt;br /&gt;
     p ⊢ ¬¬p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim  benber josgomrom4 raffergon2 gleherlop&lt;br /&gt;
   marfruman1 chrgencar alfmarcua pabbergue enrparalv juacanrod&lt;br /&gt;
   hugrubsan cammonagu alikan aribatval*)  &lt;br /&gt;
lemma ejercicio_39:&lt;br /&gt;
  assumes &amp;quot;p&amp;quot;&lt;br /&gt;
  shows   &amp;quot;¬¬p&amp;quot;&lt;br /&gt;
  using assms(1) by (rule notnotI)&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 40. Demostrar&lt;br /&gt;
     ¬p ⊢ p ⟶ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim marfruman1 josgomrom4 alfmarcua pabbergue&lt;br /&gt;
   gleherlop juacanrod enrparalv hugrubsan alikan chrgencar aribatval*) &lt;br /&gt;
lemma ejercicio_40:&lt;br /&gt;
  assumes 1: &amp;quot;¬p&amp;quot;&lt;br /&gt;
  shows   &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume 2: p show q using 1 2 by (rule notE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber cammonagu *)&lt;br /&gt;
lemma ejercicio_40_1:&lt;br /&gt;
  assumes &amp;quot;¬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;
  with `¬p` show &amp;quot;q&amp;quot; by (rule notE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 41. Demostrar&lt;br /&gt;
     p ⟶ q ⊢ ¬q ⟶ ¬p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim raffergon2 josgomrom4 marfruman1 alfmarcua&lt;br /&gt;
   pabbergue gleherlop enrparalv juacanrod hugrubsan alikan chrgencar aribatval*) &lt;br /&gt;
lemma ejercicio_41:&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 (rule impI)&lt;br /&gt;
  assume 2: &amp;quot;¬q&amp;quot; show &amp;quot;¬p&amp;quot; using 1 2 by (rule mt)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber cammonagu *)&lt;br /&gt;
lemma ejercicio_41_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;
  assume &amp;quot;¬q&amp;quot;&lt;br /&gt;
  with `p ⟶ q` show &amp;quot;¬p&amp;quot; by (rule mt)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 42. Demostrar&lt;br /&gt;
     p∨q, ¬q ⊢ p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim raffergon2 josgomrom4 marfruman1 alfmarcua&lt;br /&gt;
   pabbergue gleherlop enrparalv juacanrod hugrubsan chrgencar alikan aribatval*) &lt;br /&gt;
lemma ejercicio_42:&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;
using assms(1) proof (rule disjE)&lt;br /&gt;
  assume &amp;quot;p&amp;quot; thus &amp;quot;p&amp;quot; .&lt;br /&gt;
next&lt;br /&gt;
  assume 2: &amp;quot;q&amp;quot; show &amp;quot;p&amp;quot; using assms(2) 2 by (rule notE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber cammonagu *)&lt;br /&gt;
lemma ejercicio_42_1:&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;
  note `p ∨ q`&lt;br /&gt;
  moreover have &amp;quot;p ⟹ p&amp;quot; .&lt;br /&gt;
  moreover {&lt;br /&gt;
    assume &amp;quot;q&amp;quot;&lt;br /&gt;
    with `¬q` have &amp;quot;p&amp;quot; by (rule notE)&lt;br /&gt;
  }&lt;br /&gt;
  ultimately show &amp;quot;p&amp;quot; by (rule disjE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 43. Demostrar&lt;br /&gt;
     p ∨ q, ¬p ⊢ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim raffergon2 josgomrom4 marfruman1 alfmarcua&lt;br /&gt;
   pabbergue gleherlop chrgencar enrparalv juacanrod hugrubsan alikan aribatval*) &lt;br /&gt;
lemma ejercicio_43:&lt;br /&gt;
  assumes &amp;quot;p ∨ q&amp;quot;&lt;br /&gt;
          &amp;quot;¬p&amp;quot; &lt;br /&gt;
  shows   &amp;quot;q&amp;quot;&lt;br /&gt;
using assms(1) proof (rule disjE)&lt;br /&gt;
  assume 1: &amp;quot;p&amp;quot; show &amp;quot;q&amp;quot; using assms(2) 1 by (rule notE)&lt;br /&gt;
next&lt;br /&gt;
  assume &amp;quot;q&amp;quot; thus &amp;quot;q&amp;quot; .&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber cammonagu*)&lt;br /&gt;
lemma ejercicio_43_1:&lt;br /&gt;
  assumes &amp;quot;p ∨ q&amp;quot;&lt;br /&gt;
          &amp;quot;¬p&amp;quot; &lt;br /&gt;
  shows   &amp;quot;q&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;
    with `¬p` have &amp;quot;q&amp;quot; by (rule notE)&lt;br /&gt;
  }&lt;br /&gt;
  moreover have &amp;quot;q ⟹ q&amp;quot; .&lt;br /&gt;
  ultimately show &amp;quot;q&amp;quot; by (rule disjE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 44. Demostrar&lt;br /&gt;
     p ∨ q ⊢ ¬(¬p ∧ ¬q)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim gleherlop chrgencar josgomrom4 marfruman1 pabbergue&lt;br /&gt;
   juacanrod hugrubsan alikan aribatval*) &lt;br /&gt;
lemma ejercicio_44:&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 notI)&lt;br /&gt;
  assume 1: &amp;quot;¬p ∧ ¬q&amp;quot; hence 2: &amp;quot;¬p&amp;quot; by (rule conjunct1)&lt;br /&gt;
  have 3: &amp;quot;¬q&amp;quot; using 1 by (rule conjunct2)&lt;br /&gt;
  show &amp;quot;False&amp;quot;&lt;br /&gt;
  using assms(1) proof (rule disjE)&lt;br /&gt;
    assume 4: &amp;quot;p&amp;quot; show ?thesis using 2 4 by (rule notE)&lt;br /&gt;
  next&lt;br /&gt;
    assume 5: &amp;quot;q&amp;quot; show ?thesis using 3 5 by (rule notE)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber alfmarcua cammonagu *)&lt;br /&gt;
lemma ejercicio_44_1:&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;
  note `p ∨ q`&lt;br /&gt;
  moreover {&lt;br /&gt;
    from `¬p ∧ ¬q` have &amp;quot;¬p&amp;quot; by (rule conjunct1)&lt;br /&gt;
    moreover assume &amp;quot;p&amp;quot;&lt;br /&gt;
    ultimately have &amp;quot;False&amp;quot; by (rule notE)&lt;br /&gt;
  }&lt;br /&gt;
  moreover {&lt;br /&gt;
    from `¬p ∧ ¬q` have &amp;quot;¬q&amp;quot; by (rule conjunct2)&lt;br /&gt;
    moreover assume &amp;quot;q&amp;quot;&lt;br /&gt;
    ultimately have &amp;quot;False&amp;quot; by (rule notE)&lt;br /&gt;
  }&lt;br /&gt;
  ultimately show &amp;quot;False&amp;quot; by (rule disjE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 45. Demostrar&lt;br /&gt;
     p ∧ q ⊢ ¬(¬p ∨ ¬q)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim marfruman1 josgomrom4 gleherlop pabbergue&lt;br /&gt;
   juacanrod hugrubsan alikan chrgencar aribatval*) &lt;br /&gt;
lemma ejercicio_45:&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 notI)&lt;br /&gt;
  assume 2: &amp;quot;¬p ∨ ¬q&amp;quot; have 3: &amp;quot;p&amp;quot; using 1 by (rule conjunct1)&lt;br /&gt;
  have 4: &amp;quot;q&amp;quot; using 1 by (rule conjunct2)&lt;br /&gt;
  show &amp;quot;False&amp;quot; using 2&lt;br /&gt;
  proof (rule disjE)&lt;br /&gt;
    assume &amp;quot;¬p&amp;quot; thus ?thesis using 3 by (rule notE)&lt;br /&gt;
  next&lt;br /&gt;
    assume &amp;quot;¬q&amp;quot; thus ?thesis using 4 by (rule notE)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber alfmarcua cammonagu *)&lt;br /&gt;
lemma ejercicio_45_1:&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;
  moreover {&lt;br /&gt;
    assume &amp;quot;¬p&amp;quot;&lt;br /&gt;
    moreover have &amp;quot;p&amp;quot; using `p ∧ q` by (rule conjunct1)&lt;br /&gt;
    ultimately have &amp;quot;False&amp;quot; by (rule notE)&lt;br /&gt;
  }&lt;br /&gt;
  moreover {&lt;br /&gt;
    assume &amp;quot;¬q&amp;quot;&lt;br /&gt;
    moreover have &amp;quot;q&amp;quot; using `p ∧ q` by (rule conjunct2)&lt;br /&gt;
    ultimately have &amp;quot;False&amp;quot; by (rule notE)&lt;br /&gt;
  }&lt;br /&gt;
  ultimately show False by (rule disjE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 46. Demostrar&lt;br /&gt;
     ¬(p ∨ q) ⊢ ¬p ∧ ¬q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim marfruman1 josgomrom4 gleherlop pabbergue&lt;br /&gt;
   juacanrod hugrubsan alikan chrgencar aribatval*) &lt;br /&gt;
lemma ejercicio_46:&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 conjI)&lt;br /&gt;
  show &amp;quot;¬p&amp;quot;&lt;br /&gt;
  proof (rule notI)&lt;br /&gt;
    assume p hence 2: &amp;quot;p ∨ q&amp;quot; by (rule disjI1)&lt;br /&gt;
    show False using 1 2 by (rule notE)&lt;br /&gt;
  qed&lt;br /&gt;
  show &amp;quot;¬q&amp;quot;&lt;br /&gt;
  proof (rule notI)&lt;br /&gt;
    assume q hence 3: &amp;quot;p ∨ q&amp;quot; by (rule disjI2)&lt;br /&gt;
    show False using 1 3 by (rule notE)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber cammmonagu *)&lt;br /&gt;
lemma ejercicio_46_1:&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&amp;quot;&lt;br /&gt;
  proof (rule ccontr)&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;
    with assms show &amp;quot;False&amp;quot; by (rule notE)&lt;br /&gt;
  qed&lt;br /&gt;
next&lt;br /&gt;
  show &amp;quot;¬q&amp;quot;&lt;br /&gt;
  proof (rule ccontr)&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;
    with assms show &amp;quot;False&amp;quot; by (rule notE)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* alfmarcua *)&lt;br /&gt;
lemma ejercicio_46_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 (rule conjI)&lt;br /&gt;
  have &amp;quot;p ⟹ p ∨ q&amp;quot; by (rule disjI1)&lt;br /&gt;
  then have &amp;quot;p ⟶ p ∨ q&amp;quot; by (rule impI)&lt;br /&gt;
  then show &amp;quot;¬ p&amp;quot; using assms by (rule mt)&lt;br /&gt;
next&lt;br /&gt;
  have &amp;quot;q ⟹ p ∨ q&amp;quot; by (rule disjI2)&lt;br /&gt;
  then have &amp;quot;q ⟶ p ∨ q&amp;quot; by (rule impI)&lt;br /&gt;
  then show &amp;quot;¬ q&amp;quot; using assms by (rule mt)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 47. Demostrar&lt;br /&gt;
     ¬p ∧ ¬q ⊢ ¬(p ∨ q)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim marfruman1 josgomrom4 pabbregue juacanrod&lt;br /&gt;
   hugrubsan alikan aribatval*) &lt;br /&gt;
lemma ejercicio_47:&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 notI)&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;
  assume 4: &amp;quot;p ∨ q&amp;quot;&lt;br /&gt;
  show False&lt;br /&gt;
  using 4 proof (rule disjE)&lt;br /&gt;
    assume 5: p show ?thesis using 2 5 by (rule notE)&lt;br /&gt;
  next&lt;br /&gt;
    assume 6: q show ?thesis using 3 6 by (rule notE)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber gleherlop chrgencar cammonagu*)&lt;br /&gt;
lemma ejercicio_47_1:&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;
  hence &amp;quot;¬(¬p ∧ ¬q)&amp;quot; by (rule ejercicio_44_1)&lt;br /&gt;
  thus &amp;quot;False&amp;quot; using assms by (rule notE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* alfmarcua *)&lt;br /&gt;
lemma ejercicio_47_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 (rule notI)&lt;br /&gt;
  have &amp;quot;¬ p&amp;quot; using assms by (rule conjunct1)&lt;br /&gt;
  have &amp;quot;¬ q&amp;quot; using assms by (rule conjunct2)&lt;br /&gt;
  assume &amp;quot;p ∨ q&amp;quot;&lt;br /&gt;
  then have &amp;quot;q&amp;quot; using `¬ p` by (rule ejercicio_43)&lt;br /&gt;
  show False using `¬ q` `q` by (rule notE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 48. Demostrar&lt;br /&gt;
     ¬p ∨ ¬q ⊢ ¬(p ∧ q)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim marfruman1 josgomrom4 pabbergue juacanrod&lt;br /&gt;
   hugrubsan alikan aribatval*) &lt;br /&gt;
lemma ejercicio_48:&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 notI)&lt;br /&gt;
  assume 2: &amp;quot;p ∧ q&amp;quot; hence 3: p by (rule conjunct1)&lt;br /&gt;
  have 4: q using 2 by (rule conjunct2)&lt;br /&gt;
  show False&lt;br /&gt;
  using 1 proof (rule disjE)&lt;br /&gt;
    assume &amp;quot;¬p&amp;quot; thus ?thesis using 3 by (rule notE)&lt;br /&gt;
  next&lt;br /&gt;
    assume &amp;quot;¬q&amp;quot; thus ?thesis using 4 by (rule notE)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber alfmarcua gleherlop chrgencar cammonagu *)&lt;br /&gt;
lemma ejercicio_48_1:&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;
  hence &amp;quot;¬(¬p ∨ ¬q)&amp;quot; by (rule ejercicio_45_1)&lt;br /&gt;
  thus &amp;quot;False&amp;quot; using assms by (rule notE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 49. Demostrar&lt;br /&gt;
     ⊢ ¬(p ∧ ¬p)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim marfruman1 josgomrom4 alfmarcu gleherlop&lt;br /&gt;
   hugrubsan juacanrod cammonagu alikan chrgencar aribatval*) &lt;br /&gt;
lemma ejercicio_49:&lt;br /&gt;
  &amp;quot;¬(p ∧ ¬p)&amp;quot;&lt;br /&gt;
proof (rule notI)&lt;br /&gt;
  assume 1: &amp;quot;p ∧ ¬p&amp;quot; hence 2: p by (rule conjunct1)&lt;br /&gt;
  have &amp;quot;¬p&amp;quot; using 1 by (rule conjunct2)&lt;br /&gt;
  thus &amp;quot;False&amp;quot; using 2 by (rule notE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber *)&lt;br /&gt;
lemma ejercicio_49_1:&lt;br /&gt;
  &amp;quot;¬(p ∧ ¬p)&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume &amp;quot;p ∧ ¬p&amp;quot;&lt;br /&gt;
  hence &amp;quot;¬p&amp;quot; by (rule conjunct2)&lt;br /&gt;
  moreover have &amp;quot;p&amp;quot; using `p ∧ ¬p` by (rule conjunct1)&lt;br /&gt;
  ultimately show &amp;quot;False&amp;quot; by (rule notE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 50. Demostrar&lt;br /&gt;
     p ∧ ¬p ⊢ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim raffergon2 josgomrom4 marfruman1 gleherlop&lt;br /&gt;
   alfmarcua enrparalv pabbergue juacanrod hugrubsan alikan chrgencar aribatval*) &lt;br /&gt;
lemma ejercicio_50:&lt;br /&gt;
  assumes 1: &amp;quot;p ∧ ¬p&amp;quot;&lt;br /&gt;
  shows   &amp;quot;q&amp;quot;&lt;br /&gt;
proof (rule notE)&lt;br /&gt;
  show p using 1 by (rule conjunct1)&lt;br /&gt;
  show &amp;quot;¬p&amp;quot; using 1 by (rule conjunct2)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber cammonagu*)&lt;br /&gt;
lemma ejercicio_50_1:&lt;br /&gt;
  assumes &amp;quot;p ∧ ¬p&amp;quot; &lt;br /&gt;
  shows   &amp;quot;q&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;¬p&amp;quot; using `p ∧ ¬p` by (rule conjunct2)&lt;br /&gt;
  moreover have &amp;quot;p&amp;quot; using `p ∧ ¬p` by (rule conjunct1)&lt;br /&gt;
  ultimately show &amp;quot;q&amp;quot; by (rule notE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 51. Demostrar&lt;br /&gt;
     ¬¬p ⊢ p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim benber raffergon2 josgomrom4 marfruman1 gleherlop&lt;br /&gt;
   alfmarcua enrparalv pabbergue juacanrod hugrubsan cammmonagu alikan &lt;br /&gt;
   chrgencar aribatval*) &lt;br /&gt;
lemma ejercicio_51:&lt;br /&gt;
  assumes &amp;quot;¬¬p&amp;quot;&lt;br /&gt;
  shows   &amp;quot;p&amp;quot;&lt;br /&gt;
  using assms(1) by (rule notnotD)&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 52. Demostrar&lt;br /&gt;
     ⊢ p ∨ ¬p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim marfruman1 josgomrom4 juacanrod pabbergue alikan aribatval*)&lt;br /&gt;
lemma ejercicio_52:&lt;br /&gt;
  &amp;quot;p ∨ ¬p&amp;quot;&lt;br /&gt;
proof (rule ccontr)&lt;br /&gt;
  assume 1: &amp;quot;¬(p ∨ ¬p)&amp;quot;&lt;br /&gt;
  have 2: &amp;quot;¬p&amp;quot; proof (rule notI)&lt;br /&gt;
    assume p hence 3: &amp;quot;p ∨ ¬p&amp;quot; by (rule disjI1)&lt;br /&gt;
    show &amp;quot;False&amp;quot; using 1 3 by (rule notE)&lt;br /&gt;
  qed&lt;br /&gt;
  have 4: &amp;quot;p ∨ ¬p&amp;quot; using 2 by (rule disjI2)&lt;br /&gt;
  show &amp;quot;False&amp;quot; using 1 4 by (rule notE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber cammonagu *)&lt;br /&gt;
lemma ejercicio_52_1:&lt;br /&gt;
  &amp;quot;p ∨ ¬p&amp;quot;&lt;br /&gt;
proof (rule ccontr)&lt;br /&gt;
  assume &amp;quot;¬ (p ∨ ¬ p)&amp;quot;&lt;br /&gt;
  hence &amp;quot;¬p ∧ ¬¬p&amp;quot; by (rule ejercicio_46_1)&lt;br /&gt;
  hence &amp;quot;¬p&amp;quot; by (rule conjunct1)&lt;br /&gt;
  moreover {&lt;br /&gt;
    have &amp;quot;¬¬p&amp;quot; using `¬p ∧ ¬¬p` by (rule conjunct2)&lt;br /&gt;
    hence &amp;quot;p&amp;quot; by (rule notnotD)&lt;br /&gt;
  }&lt;br /&gt;
  ultimately show &amp;quot;False&amp;quot; by (rule notE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* alfmarcua *)&lt;br /&gt;
lemma ejercicio_52_2:&lt;br /&gt;
  &amp;quot;p ∨ ¬p&amp;quot;&lt;br /&gt;
proof (rule ccontr)&lt;br /&gt;
  assume &amp;quot;¬ (p ∨ ¬ p)&amp;quot;&lt;br /&gt;
  then have &amp;quot;¬ p ∧ ¬¬ p&amp;quot; by (rule ejercicio_46)&lt;br /&gt;
  then show False by (rule ejercicio_50)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 53. Demostrar&lt;br /&gt;
     ⊢ ((p ⟶ q) ⟶ p) ⟶ p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim marfruman1 josgomrom4 alfmarcua gleherlop&lt;br /&gt;
   juacanrod pabbergue alikan chrgencar aribatval*) &lt;br /&gt;
lemma ejercicio_53:&lt;br /&gt;
  &amp;quot;((p ⟶ q) ⟶ p) ⟶ p&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume 1: &amp;quot;(p ⟶ q) ⟶ p&amp;quot;&lt;br /&gt;
  show p proof (rule ccontr)&lt;br /&gt;
    assume 2: &amp;quot;¬p&amp;quot;&lt;br /&gt;
    have 3: &amp;quot;¬(p ⟶ q)&amp;quot; using 1 2 by (rule mt)&lt;br /&gt;
    have 4: &amp;quot;p ⟶ q&amp;quot; proof (rule impI)&lt;br /&gt;
      assume 5: p show q using 2 5 by (rule notE)&lt;br /&gt;
    qed&lt;br /&gt;
    show False using 3 4 by (rule notE)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber cammonagu *)&lt;br /&gt;
lemma ejercicio_53_1:&lt;br /&gt;
  &amp;quot;((p ⟶ q) ⟶ p) ⟶ p&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume &amp;quot;(p ⟶ q) ⟶ p&amp;quot;&lt;br /&gt;
  have &amp;quot;p ∨ ¬p&amp;quot; by (rule ejercicio_52_1)&lt;br /&gt;
  moreover have &amp;quot;p ⟹ p&amp;quot; .&lt;br /&gt;
  moreover {&lt;br /&gt;
    assume &amp;quot;¬ p&amp;quot;&lt;br /&gt;
    hence &amp;quot;p ⟶ q&amp;quot; by (rule ejercicio_40_1)&lt;br /&gt;
    with `(p ⟶ q) ⟶ p` have &amp;quot;p&amp;quot; by (rule mp)&lt;br /&gt;
  }&lt;br /&gt;
  ultimately show &amp;quot;p&amp;quot; by (rule disjE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 54. Demostrar&lt;br /&gt;
     ¬q ⟶ ¬p ⊢ p ⟶ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim marfruman1 josgomrom4 gleherlop juacanrod&lt;br /&gt;
   pabbergue chrgencar alikan aribatval*) &lt;br /&gt;
lemma ejercicio_54:&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 (rule impI)&lt;br /&gt;
  assume 2: &amp;quot;p&amp;quot; hence 3: &amp;quot;¬¬p&amp;quot; by (rule notnotI)&lt;br /&gt;
  have &amp;quot;¬¬q&amp;quot; using 1 3 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;
(* benber alfmarcua  cammonagu *)&lt;br /&gt;
lemma ejercicio_54_1:&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;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 55. Demostrar&lt;br /&gt;
     ¬(¬p ∧ ¬q) ⊢ p ∨ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon marfruman1*)&lt;br /&gt;
lemma ejercicio_55:&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 2: &amp;quot;¬(p ∨ q)&amp;quot;&lt;br /&gt;
  have 3: &amp;quot;p&amp;quot;&lt;br /&gt;
  proof (rule ccontr)&lt;br /&gt;
    assume 4: &amp;quot;¬p&amp;quot;&lt;br /&gt;
    have 5: &amp;quot;q&amp;quot;&lt;br /&gt;
    proof (rule ccontr)&lt;br /&gt;
      assume 6: &amp;quot;¬q&amp;quot; have 7: &amp;quot;¬p ∧ ¬q&amp;quot; using 4 6 by (rule conjI)&lt;br /&gt;
      show False using 1 7 by (rule notE)&lt;br /&gt;
    qed&lt;br /&gt;
    have 8: &amp;quot;p ∨ q&amp;quot; using 5 by (rule disjI2)&lt;br /&gt;
    show False using 2 8 by (rule notE)&lt;br /&gt;
  qed&lt;br /&gt;
  have 9: &amp;quot;p ∨ q&amp;quot; using 3 by (rule disjI1)&lt;br /&gt;
  show False using 2 9 by (rule notE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber alfmarcua josgomrom4 manperjim pabbergue juacanrod cammonagu chrgencar alikan aribatval*)&lt;br /&gt;
lemma ejercicio_55_1:&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 ejercicio_46_1)&lt;br /&gt;
  with assms show False by (rule notE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 56. Demostrar&lt;br /&gt;
     ¬(¬p ∨ ¬q) ⊢ p ∧ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim marfruman1 josgomrom4 gleherlop juacanrod&lt;br /&gt;
   pabbergue chrgencar alikan aribatval*) &lt;br /&gt;
lemma ejercicio_56:&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 conjI)&lt;br /&gt;
  show 3: p&lt;br /&gt;
  proof (rule ccontr)&lt;br /&gt;
    assume &amp;quot;¬p&amp;quot; hence 4: &amp;quot;¬p ∨ ¬q&amp;quot; by (rule disjI1)&lt;br /&gt;
    show False using 1 4 by (rule notE)&lt;br /&gt;
  qed&lt;br /&gt;
  show 5: q&lt;br /&gt;
  proof (rule ccontr)&lt;br /&gt;
    assume &amp;quot;¬q&amp;quot; hence 6: &amp;quot;¬p ∨ ¬q&amp;quot; by (rule disjI2)&lt;br /&gt;
    show False using 1 6 by (rule notE)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber alfmarcua cammonagu *)&lt;br /&gt;
lemma ejercicio_56_1:&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 ejercicio_46_1)&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;
  moreover {&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;
  }&lt;br /&gt;
  ultimately show &amp;quot;p ∧ q&amp;quot; by (rule conjI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 57. Demostrar&lt;br /&gt;
     ¬(p ∧ q) ⊢ ¬p ∨ ¬q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim marfruman1 josgomrom4 chrgencar gleherlop &lt;br /&gt;
   juacanroz pabbergue alikan *) &lt;br /&gt;
lemma ejercicio_57:&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 2: &amp;quot;¬(¬p ∨ ¬q)&amp;quot;&lt;br /&gt;
  show False using 1&lt;br /&gt;
  proof (rule notE)&lt;br /&gt;
    show 3: &amp;quot;p ∧ q&amp;quot;&lt;br /&gt;
    proof (rule conjI)&lt;br /&gt;
      show p&lt;br /&gt;
      proof (rule ccontr)&lt;br /&gt;
        assume &amp;quot;¬p&amp;quot; hence 4: &amp;quot;¬p ∨ ¬q&amp;quot; by (rule disjI1)&lt;br /&gt;
        show False using 2 4 by (rule notE)&lt;br /&gt;
      qed&lt;br /&gt;
    next&lt;br /&gt;
      show q&lt;br /&gt;
      proof (rule ccontr)&lt;br /&gt;
        assume &amp;quot;¬q&amp;quot; hence 5: &amp;quot;¬p ∨ ¬q&amp;quot; by (rule disjI2)&lt;br /&gt;
        show False using 2 5 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;
(* benber alfmarcua cammonagu *)&lt;br /&gt;
lemma ejercicio_57_1:&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 ejercicio_56_1)&lt;br /&gt;
  with assms show &amp;quot;False&amp;quot; by (rule notE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 58. Demostrar&lt;br /&gt;
     ⊢ (p ⟶ q) ∨ (q ⟶ p)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim josgomrom4 marfruman1 juacanrod pabbergue alikan *)&lt;br /&gt;
lemma ejercicio_58:&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; proof (rule ccontr)&lt;br /&gt;
    assume 1: &amp;quot;¬((p ⟶ q) ∨ ¬(p ⟶ q))&amp;quot;&lt;br /&gt;
    have 2: &amp;quot;¬(p ⟶ q)&amp;quot; proof (rule notI)&lt;br /&gt;
      assume &amp;quot;p ⟶ q&amp;quot; &lt;br /&gt;
      hence 3: &amp;quot;(p ⟶ q) ∨ ¬(p ⟶ q)&amp;quot; by (rule disjI1)&lt;br /&gt;
      show False using 1 3 by (rule notE)&lt;br /&gt;
    qed&lt;br /&gt;
    hence 4: &amp;quot;(p ⟶ q) ∨ ¬(p ⟶ q)&amp;quot; by (rule disjI2)&lt;br /&gt;
    show &amp;quot;False&amp;quot; using 1 4 by (rule notE)&lt;br /&gt;
  qed&lt;br /&gt;
  thus ?thesis proof (rule disjE)&lt;br /&gt;
    assume &amp;quot;p ⟶ q&amp;quot; thus ?thesis by (rule disjI1)&lt;br /&gt;
  next&lt;br /&gt;
    assume 1: &amp;quot;¬(p ⟶ q)&amp;quot;&lt;br /&gt;
    have &amp;quot;q ⟶ p&amp;quot; proof (rule impI)&lt;br /&gt;
      assume 2: q&lt;br /&gt;
      have 3: &amp;quot;p ⟶ q&amp;quot; proof (rule impI)&lt;br /&gt;
        assume p show q using 2 .&lt;br /&gt;
      qed&lt;br /&gt;
      show p using 1 3 by (rule notE)&lt;br /&gt;
    qed&lt;br /&gt;
    thus ?thesis by (rule disjI2)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* pabalagon gleherlop chrgencar *)&lt;br /&gt;
lemma ejercicio_58_2:&lt;br /&gt;
  &amp;quot;(p ⟶ q) ∨ (q ⟶ p)&amp;quot;&lt;br /&gt;
proof (rule ccontr)&lt;br /&gt;
  assume 1: &amp;quot;¬((p ⟶ q) ∨ (q ⟶ p))&amp;quot;&lt;br /&gt;
  hence 1: &amp;quot;(p ∧ ¬q) ∧ (q ∧ ¬p)&amp;quot; by simp&lt;br /&gt;
  hence &amp;quot;p ∧ ¬q&amp;quot; ..&lt;br /&gt;
  hence 2: p ..&lt;br /&gt;
  have &amp;quot;q ∧ ¬p&amp;quot; using 1 ..&lt;br /&gt;
  hence 3: &amp;quot;¬p&amp;quot; ..&lt;br /&gt;
  show False using 3 2 by (rule notE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber cammonagu *)&lt;br /&gt;
lemma ejercicio_58_1:&lt;br /&gt;
  &amp;quot;(p ⟶ q) ∨ (q ⟶ p)&amp;quot;&lt;br /&gt;
proof (rule ccontr)&lt;br /&gt;
  assume &amp;quot;¬ ((p ⟶ q) ∨ (q ⟶ p))&amp;quot;&lt;br /&gt;
  hence 1: &amp;quot;¬(p ⟶ q) ∧ ¬(q ⟶ p)&amp;quot; by (rule ejercicio_46_1)&lt;br /&gt;
&lt;br /&gt;
  have &amp;quot;p ∨ ¬p&amp;quot; by (rule ejercicio_52_1)&lt;br /&gt;
  moreover {&lt;br /&gt;
    assume &amp;quot;p&amp;quot;&lt;br /&gt;
    hence &amp;quot;q ⟶ p&amp;quot; by (rule ejercicio_7_1)&lt;br /&gt;
&lt;br /&gt;
    have &amp;quot;¬(q ⟶ p)&amp;quot; using 1 by (rule conjunct2)&lt;br /&gt;
    hence &amp;quot;False&amp;quot; using `q ⟶ p` by (rule notE)&lt;br /&gt;
  }&lt;br /&gt;
  moreover {&lt;br /&gt;
    assume &amp;quot;¬p&amp;quot;&lt;br /&gt;
    hence &amp;quot;p ⟶ q&amp;quot; by (rule ejercicio_40_1)&lt;br /&gt;
&lt;br /&gt;
    have &amp;quot;¬(p ⟶ q)&amp;quot; using 1 by (rule conjunct1)&lt;br /&gt;
    hence &amp;quot;False&amp;quot; using `p ⟶ q` by (rule notE)&lt;br /&gt;
  }&lt;br /&gt;
  ultimately show &amp;quot;False&amp;quot; by (rule disjE)&lt;br /&gt;
  moreover {&lt;br /&gt;
    assume &amp;quot;p&amp;quot;&lt;br /&gt;
    hence &amp;quot;q ⟶ p&amp;quot; by (rule ejercicio_7_1)&lt;br /&gt;
&lt;br /&gt;
    have &amp;quot;¬(q ⟶ p)&amp;quot; using 1 by (rule conjunct2)&lt;br /&gt;
    hence &amp;quot;False&amp;quot; using `q ⟶ p` by (rule notE)&lt;br /&gt;
  }&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* alfmarcua *)&lt;br /&gt;
lemma ejercicio_58_3:&lt;br /&gt;
  &amp;quot;(p ⟶ q) ∨ (q ⟶ p)&amp;quot;&lt;br /&gt;
proof (rule disjE)&lt;br /&gt;
  show &amp;quot;p ∨ ¬ p&amp;quot; by (rule ejercicio_52)&lt;br /&gt;
next&lt;br /&gt;
  assume &amp;quot;¬p&amp;quot;&lt;br /&gt;
  then have &amp;quot;p ⟶ q&amp;quot; by (rule ejercicio_40)&lt;br /&gt;
  then show ?thesis by (rule disjI1)&lt;br /&gt;
next&lt;br /&gt;
  assume &amp;quot;p&amp;quot;&lt;br /&gt;
  then have &amp;quot;q ⟶ p&amp;quot; by (rule ejercicio_7)&lt;br /&gt;
  then show ?thesis by (rule disjI2)&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/RA2018/index.php?title=Relaci%C3%B3n_5&amp;diff=448</id>
		<title>Relación 5</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2018/index.php?title=Relaci%C3%B3n_5&amp;diff=448"/>
		<updated>2019-03-06T18:50:02Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: Protegió «Relación 5» ([Editar=Solo administradores] (indefinido) [Trasladar=Solo administradores] (indefinido))&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isabelle&amp;quot;&amp;gt;&lt;br /&gt;
chapter {* R5: Recorridos de árboles *}&lt;br /&gt;
&lt;br /&gt;
theory R5_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   h &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;
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;
(* pabalagon manperjim raffergon2 aribatval benber josgomrom4 hugrubsan&lt;br /&gt;
   cammonagu antramhur alfmarcua enrparalv marfruman1 gleherlop&lt;br /&gt;
   chrgencar giafus1 pabbergue alikan juacanrod *)  &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 x)     = [x]&amp;quot; |&lt;br /&gt;
  &amp;quot;preOrden (N x i d) = x # preOrden i @ preOrden 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;
&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;
(* pabalagon manperjim raffergon2 aribatval benber josgomrom4 hugrubsan&lt;br /&gt;
   cammonagu antramhur alfmarcua enrparalv marfruman1 gleherlop&lt;br /&gt;
   chrgencar giafus1 pabbergue alikan juacanrod *)  &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 x)     = [x]&amp;quot; |&lt;br /&gt;
  &amp;quot;postOrden (N x i d) = postOrden i @ postOrden d @ [x]&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;
(* pabalagon manperjim raffergon2 aribatval benber josgomrom4 hugrubsan&lt;br /&gt;
   gleherlop cammonagu alfmarcua enrparalv marfruman1 chrgencar giafus1&lt;br /&gt;
   pabbergue alikan juacanrod antramhur *)  &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 x)     = [x]&amp;quot; |&lt;br /&gt;
  &amp;quot;inOrden (N x i d) = inOrden i @ [x] @ inOrden 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;
&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;
(* pabalagon manperjim raffergon2 aribatval benber josgomrom4 hugrubsan&lt;br /&gt;
   gleherlop cammonagu alfmarcua enrparalv marfruman1 chrgencar giafus1&lt;br /&gt;
   pabbergue alikan juacanrod antramhur *)  &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 x)     = H x&amp;quot; |&lt;br /&gt;
  &amp;quot;espejo (N x i d) = N x (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;
(* pabalagon manperjim raffergon2 josgomrom4 hugrubsan cammonagu&lt;br /&gt;
   alfmarcua gleherlop enrparalv marfruman1 chrgencar pabbergue giafus1&lt;br /&gt;
  alikan juacanrod aribatval antramhur *) &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;... = rev (postOrden d @ [x]) @ rev (postOrden i)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = rev (postOrden i @ postOrden d @ [x])&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;
(* benber *)&lt;br /&gt;
lemma  &amp;quot;preOrden (espejo a) = rev (postOrden a)&amp;quot;&lt;br /&gt;
proof (induction a)&lt;br /&gt;
  case (H v)&lt;br /&gt;
  show ?case by simp&lt;br /&gt;
next&lt;br /&gt;
  case IS: (N v l r)&lt;br /&gt;
  have &amp;quot;preOrden (espejo (N v l r)) = &lt;br /&gt;
        preOrden (N v (espejo r) (espejo l))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = v # (preOrden (espejo r)) @ (preOrden (espejo l))&amp;quot; &lt;br /&gt;
    by simp&lt;br /&gt;
  also have &amp;quot;... = v # rev (postOrden r) @ rev (postOrden l)&amp;quot; &lt;br /&gt;
    using IS.IH by simp&lt;br /&gt;
  also have &amp;quot;... = rev ((postOrden l) @ (postOrden r) @ [v])&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = rev (postOrden (N v l r))&amp;quot; by simp&lt;br /&gt;
  finally show ?case .&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* cammonagu *)&lt;br /&gt;
lemma &amp;quot;preOrden (espejo a) = rev (postOrden a)&amp;quot;&lt;br /&gt;
  by (induction a) auto&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;
(* pabalagon manperjim josgomrom4 hugrubsan cammonagu enrparalv&lt;br /&gt;
   gleherlop chrgencar giafus1 pabbergue alikan aribatval *) &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; and 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 i @ preOrden d) @ rev [x]&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = rev (x # preOrden i @ preOrden 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;
(* raffergon2 alfmarcua marfruman1 juacanrod antramhur *)&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;
  finally show &amp;quot;?P (N x i d)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber cammonagu *)&lt;br /&gt;
lemma &amp;quot;postOrden (espejo a) = rev (preOrden a)&amp;quot;&lt;br /&gt;
  by (induction a) auto&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;
(* pabalagon manperjim josgomrom4 hugrubsan cammonagu enrparalv&lt;br /&gt;
   gleherlop chrgencar giafus1 pabbergue alikan juacanrod aribatval *) &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 H1: &amp;quot;?P i&amp;quot; and H2: &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;&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;
  also have &amp;quot;... = rev (inOrden i @ [x] @ inOrden 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;
(* raffergon2 alfmarcua marfruman1 antramhur *)&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 H1: &amp;quot;?P i&amp;quot;&lt;br /&gt;
  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;
  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;
  finally show &amp;quot;?P (N x i d)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber *)&lt;br /&gt;
theorem &amp;quot;inOrden (espejo a) = rev (inOrden a)&amp;quot;&lt;br /&gt;
proof (induction a)&lt;br /&gt;
  case (H v)&lt;br /&gt;
  show ?case by simp&lt;br /&gt;
next&lt;br /&gt;
  case IS: (N v l r)&lt;br /&gt;
  have &amp;quot;inOrden (espejo (N v l r)) = &lt;br /&gt;
        inOrden (N v (espejo r) (espejo l))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (inOrden (espejo r)) @ [v] @ (inOrden (espejo l))&amp;quot; &lt;br /&gt;
    by simp&lt;br /&gt;
  also have &amp;quot;... = (rev (inOrden r)) @ [v] @ (rev (inOrden l))&amp;quot; &lt;br /&gt;
    using IS.IH by simp&lt;br /&gt;
  also have &amp;quot;... = rev ((inOrden l) @ [v] @ (inOrden r))&amp;quot; by simp&lt;br /&gt;
  also have&amp;quot;... = rev (inOrden (N v l r))&amp;quot; by simp&lt;br /&gt;
  finally show ?case .&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* cammonagu*)&lt;br /&gt;
lemma &amp;quot;inOrden (espejo a) = rev (inOrden a)&amp;quot;&lt;br /&gt;
  by (induction a) auto&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;
(* pabalagon manperjim raffergon2 aribatval benber josgomrom4 hugrubsan&lt;br /&gt;
   cammonagu antramhur alfmarcua enrparalv marfruman1 gleherlop&lt;br /&gt;
   chrgencar giafus1 pabbergue alikan juacanrod *)  &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;
(* pabalagon manperjim raffergon2 benber josgomrom4 gleherlop hugrubsan&lt;br /&gt;
   cammonagu alfmarcua enrparalv marfruman1 chrgencar giafus1 pabbergue&lt;br /&gt;
   alikan juacanrod aribatval antramhur *) &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;
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;
(* pabalagon manperjim raffergon2 benber josgomrom4 hugrubsan cammonagu&lt;br /&gt;
   alfmarcua gleherlop enrparalv marfruman1 chrgencar giafus1 pabbergue&lt;br /&gt;
   alikan juacanrod antramhur *) &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;
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;
(* pabalagon manperjim josgomrom4 hugrubsan cammonagu alfmarcua&lt;br /&gt;
   enrparalv gleherlop chrgencar marfruman1 giafus1 pabbergue alikan&lt;br /&gt;
   juacanrod antramhur *)  &lt;br /&gt;
lemma inOrdenNotNil: &amp;quot;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;
  have &amp;quot;?P (N x i d) = ((inOrden i @ [x] @ inOrden d) ≠ [])&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = ((inOrden i ≠ []) ∨ ([x] ≠ []) ∨ (inOrden d ≠ []))&amp;quot; &lt;br /&gt;
    by simp&lt;br /&gt;
  also have &amp;quot;... = ([x] ≠ [])&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;
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 HI: &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&lt;br /&gt;
  also have &amp;quot;... = last (x # inOrden d)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = last (inOrden d)&amp;quot; by (simp add: inOrdenNotNil)&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;?P (N x i d)&amp;quot; .&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber *)&lt;br /&gt;
theorem &amp;quot;last (inOrden a) = extremo_derecha a&amp;quot;&lt;br /&gt;
proof (induction a)&lt;br /&gt;
  case (H v)&lt;br /&gt;
  show ?case by simp&lt;br /&gt;
next&lt;br /&gt;
  case IS: (N v l r)&lt;br /&gt;
  have 1: &amp;quot;last (xs@ys) = last ys&amp;quot; if &amp;quot;ys ≠ []&amp;quot; for xs ys :: &amp;quot;&amp;#039;a list&amp;quot;&lt;br /&gt;
  proof (induction xs)&lt;br /&gt;
    case Nil&lt;br /&gt;
    show ?case by simp&lt;br /&gt;
  next&lt;br /&gt;
    case IS: (Cons x xs)&lt;br /&gt;
    have &amp;quot;last ((x#xs)@ys) = last (x#(xs@ys))&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = last (xs @ ys)&amp;quot; using `ys ≠ []` by simp&lt;br /&gt;
    also have &amp;quot;... = last ys&amp;quot; using IS.IH by simp&lt;br /&gt;
    finally show ?case .&lt;br /&gt;
  qed&lt;br /&gt;
  have 2: &amp;quot;inOrden a ≠ []&amp;quot; for a :: &amp;quot;&amp;#039;a arbol&amp;quot;&lt;br /&gt;
    by (induction a) auto&lt;br /&gt;
  have &amp;quot;last (inOrden (N v l r)) = &lt;br /&gt;
        last ( (inOrden l) @ [v] @ (inOrden r) )&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = last (inOrden r)&amp;quot; using 1 2 by auto&lt;br /&gt;
  also have &amp;quot;... = extremo_derecha r&amp;quot; using IS.IH by simp&lt;br /&gt;
  also have &amp;quot;... = extremo_derecha (N v l r)&amp;quot; by simp&lt;br /&gt;
  finally show ?case .&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;
(* pabalagon manperjim josgomrom4 hugrubsan cammonagu alfmarcua&lt;br /&gt;
   gleherlop enrparalv marfruman1 chrgencar giafus1 pabbergue alikan&lt;br /&gt;
   juacanrod aribatval antramhur *) &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::&amp;#039;a&lt;br /&gt;
  have &amp;quot;hd (inOrden (H x)) = hd [x]&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = x&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = extremo_izquierda (H x)&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (H x)&amp;quot; .&lt;br /&gt;
next&lt;br /&gt;
  fix x i d&lt;br /&gt;
  assume HI: &amp;quot;?P i&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 @ [x]) @ inOrden d)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = hd (inOrden i)&amp;quot; by (simp add: inOrdenNotNil)&lt;br /&gt;
  also have &amp;quot;... = extremo_izquierda i&amp;quot; using HI 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; .&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber *)&lt;br /&gt;
theorem &amp;quot;hd (inOrden a) = extremo_izquierda a&amp;quot;&lt;br /&gt;
proof (induction a)&lt;br /&gt;
  case (H v)&lt;br /&gt;
  show ?case by simp&lt;br /&gt;
next&lt;br /&gt;
  case IS: (N v l r)&lt;br /&gt;
  moreover have &amp;quot;inOrden a ≠ []&amp;quot; for a :: &amp;quot;&amp;#039;a arbol&amp;quot;&lt;br /&gt;
    by (induction a) auto&lt;br /&gt;
  ultimately show ?case by simp&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;
(* pabalagon manperjim josgomrom4 hugrubsan cammonagu alfmarcua&lt;br /&gt;
   gleherlop marfruman1 chrgencar giafus1 pabbergue alikan juacanrod&lt;br /&gt;
   aribatval antramhur *)  &lt;br /&gt;
theorem hdPreOrden_lastPostOrden: &lt;br /&gt;
  &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::&amp;#039;a &lt;br /&gt;
  fix i d&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 [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;
  finally show &amp;quot;?P (N x i d)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* enrparalv *)&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::&amp;#039;a&lt;br /&gt;
  have &amp;quot;hd (preOrden (H x)) = hd [x]&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = x&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = last [x]&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = last (postOrden (H x))&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (H x)&amp;quot; by simp &lt;br /&gt;
next&lt;br /&gt;
  fix x i d&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] @ preOrden i)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = x&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = last [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;
oops&lt;br /&gt;
&lt;br /&gt;
(* benber cammonagu *)&lt;br /&gt;
theorem &amp;quot;hd (preOrden a) = last (postOrden a)&amp;quot;&lt;br /&gt;
  by (cases a) auto&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;
(* pabalagon manperjim josgomrom4 hugrubsan cammonagu alfmarcua&lt;br /&gt;
   gleherlop marfruman1 chrgencar giafus1 pabbergue alikan juacanrod&lt;br /&gt;
   aribatval antramhur *) &lt;br /&gt;
theorem hdPreOrden_raiz: &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::&amp;#039;a&lt;br /&gt;
  fix i d&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;
  finally show &amp;quot;?P (N x i d)&amp;quot; by (simp only: raiz.simps(2))&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* enrparalv *)&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::&amp;#039;a&lt;br /&gt;
  have &amp;quot;hd (preOrden (H x)) = hd [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 (H x)&amp;quot; by (simp only: raiz.simps(1))&lt;br /&gt;
  finally show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x i d&lt;br /&gt;
  have &amp;quot;hd (preOrden (N x i d)) = hd ([x] @ preOrden i @ preOrden d)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = hd (([x] @ preOrden i) @ preOrden d)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = hd ([x] @ preOrden i)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = hd ([x])&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = x&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N x i d)&amp;quot; by (simp only: raiz.simps(2))&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
(* benber cammonagu*)&lt;br /&gt;
theorem &amp;quot;hd (preOrden a) = raiz a&amp;quot;&lt;br /&gt;
  by (cases a) auto&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;
(* pabalagon manperjim cammonagu alfmarcua marfruman1 gleherlop&lt;br /&gt;
   chrgencar giafus1 pabbergue juacanrod hugrubsan alikan aribatval&lt;br /&gt;
   antramhur *) &lt;br /&gt;
theorem &amp;quot;hd (inOrden a) = raiz a&amp;quot;&lt;br /&gt;
  quickcheck&lt;br /&gt;
(*&lt;br /&gt;
Quickcheck found a counterexample:&lt;br /&gt;
  a = N a⇩1 (H a⇩2) (H a⇩1)&lt;br /&gt;
Evaluated terms:&lt;br /&gt;
  hd (inOrden a) = a⇩2&lt;br /&gt;
  raiz a = a⇩1 *)&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
(* benber josgomrom4 *)&lt;br /&gt;
(* El teorema no es cierto para arboles sobre numeros naturales *)&lt;br /&gt;
theorem &amp;quot;¬(∀ a :: nat arbol. hd (inOrden a) = raiz a)&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  let ?a = &amp;quot;(N 0 (H 1) (H 2)) :: nat arbol&amp;quot;&lt;br /&gt;
  have &amp;quot;hd (inOrden ?a) = 1&amp;quot; by simp&lt;br /&gt;
  moreover have &amp;quot;raiz ?a = 0&amp;quot; by simp&lt;br /&gt;
  ultimately have &amp;quot;hd (inOrden ?a) ≠ raiz ?a&amp;quot; by simp&lt;br /&gt;
  hence &amp;quot;∃ a :: nat arbol. hd (inOrden a) ≠ raiz a&amp;quot; by (simp only: exI)&lt;br /&gt;
  thus ?thesis by auto&lt;br /&gt;
qed&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;
(* pabalagon manperjim josgomrom4 cammonagu marfruman1 gleherlop&lt;br /&gt;
   chrgencar giafus1 pabbergue juacanrod hugrubsan aribatval antramhur *) &lt;br /&gt;
theorem &amp;quot;last (postOrden a) = raiz a&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;last (postOrden a) = hd (preOrden a)&amp;quot;&lt;br /&gt;
    by (simp add: hdPreOrden_lastPostOrden)&lt;br /&gt;
  also have &amp;quot;... = raiz a&amp;quot; by (simp add: hdPreOrden_raiz)&lt;br /&gt;
  finally show &amp;quot;?thesis&amp;quot; .&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber cammonagu*)&lt;br /&gt;
theorem &amp;quot;last (postOrden a) = raiz a&amp;quot;&lt;br /&gt;
  by (cases a) auto&lt;br /&gt;
&lt;br /&gt;
(* alfmarcua *)&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::&amp;#039;a&lt;br /&gt;
  fix i d&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;
  finally show &amp;quot;?P (N x i d)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* enrparalv *)&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::&amp;#039;a&lt;br /&gt;
  have &amp;quot;last (postOrden (H x)) = last [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 (H x)&amp;quot; by (simp only: raiz.simps(1))&lt;br /&gt;
  finally show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x i d&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 only: raiz.simps(2))&lt;br /&gt;
  finally show &amp;quot;?P (N x i d)&amp;quot; by simp&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/RA2018/index.php?title=Relaci%C3%B3n_4&amp;diff=447</id>
		<title>Relación 4</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2018/index.php?title=Relaci%C3%B3n_4&amp;diff=447"/>
		<updated>2019-03-06T18:49:39Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: Protegió «Relación 4» ([Editar=Solo administradores] (indefinido) [Trasladar=Solo administradores] (indefinido))&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isabelle&amp;quot;&amp;gt;&lt;br /&gt;
chapter {* R4: Cuantificadores sobre listas *}&lt;br /&gt;
&lt;br /&gt;
theory R4_Cuantificadores_sobre_listas&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 la función &lt;br /&gt;
     todos :: (&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (todos p xs) se verifica si todos los elementos de la lista &lt;br /&gt;
  xs cumplen la propiedad p. Por ejemplo, se verifica &lt;br /&gt;
     todos (λx. 1&amp;lt;length x) [[2,1,4],[1,3]]&lt;br /&gt;
     ¬todos (λx. 1&amp;lt;length x) [[2,1,4],[3]]&lt;br /&gt;
&lt;br /&gt;
  Nota: La función todos es equivalente a la predefinida list_all. &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* manperjim pabalagon alfmarcua josgomrom4 aribatval cammonagu&lt;br /&gt;
   raffergon2 enrparalv gleherlop chrgencar benber giafus1 pabbergue &lt;br /&gt;
   alikan marfruman1 antramhur juacanrod hugrubsan *) &lt;br /&gt;
fun todos :: &amp;quot;(&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;todos p [] = True&amp;quot; |&lt;br /&gt;
  &amp;quot;todos p (x#xs) = (p x ∧ todos p xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Definir la función &lt;br /&gt;
     algunos :: (&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (algunos p xs) se verifica si algunos elementos de la lista &lt;br /&gt;
  xs cumplen la propiedad p. Por ejemplo, se verifica &lt;br /&gt;
     algunos (λx. 1&amp;lt;length x) [[2,1,4],[3]]&lt;br /&gt;
     ¬algunos (λx. 1&amp;lt;length x) [[],[3]]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  Nota: La función algunos es equivalente a la predefinida list_ex. &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* manperjim pabalagon alfmarcua josgomrom4 cammonagu aribatval&lt;br /&gt;
   raffergon2 enrparalv gleherlop chrgencar benber giafus1 pabbergue&lt;br /&gt;
   alikan marfruman1 antramhur juacanrod hugrubsan *) &lt;br /&gt;
fun algunos  :: &amp;quot;(&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;algunos p [] = False&amp;quot; |&lt;br /&gt;
  &amp;quot;algunos p (x#xs) = (p x ∨ algunos p xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3.1. Demostrar o refutar automáticamente &lt;br /&gt;
     todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* manperjim pabalagon alfmarcua josgomrom4 cammonagu raffergon2&lt;br /&gt;
   enrparalv gleherlop chrgencar benber giafus1 pabbergue alikan &lt;br /&gt;
   marfruman1 antramhur juacanrod hugrubsan aribatval *) &lt;br /&gt;
lemma &amp;quot;todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)&amp;quot;&lt;br /&gt;
  by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3.2. Demostrar o refutar detalladamente&lt;br /&gt;
     todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon *)&lt;br /&gt;
lemma &amp;quot;todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)&amp;quot; (is &amp;quot;?P P Q xs&amp;quot;)&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  fix P Q&lt;br /&gt;
  show &amp;quot;?P P Q []&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume HI: &amp;quot;?P P Q xs&amp;quot;&lt;br /&gt;
  have &amp;quot;todos (λx. P x ∧ Q x) (a#xs) = &lt;br /&gt;
        ((P a ∧ Q a) ∧ todos (λx. P x ∧ Q x) xs)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (P a ∧ Q a ∧ todos P xs ∧ todos Q xs)&amp;quot; &lt;br /&gt;
    using HI by simp&lt;br /&gt;
  also have &amp;quot;... = ((P a ∧ todos P xs) ∧ (Q a ∧ todos Q xs))&amp;quot; &lt;br /&gt;
    by (simp add: HOL.conj_comms)&lt;br /&gt;
  also have &amp;quot;... = (todos P (a#xs) ∧ (Q a ∧ todos Q xs))&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;todos (λx. P x ∧ Q x) (a#xs) = &lt;br /&gt;
                (todos P (a#xs) ∧ todos Q (a#xs))&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* alfmarcua juacanrod *)&lt;br /&gt;
lemma &amp;quot;todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)&amp;quot; (is &amp;quot;?P xs&amp;quot;)&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  have &amp;quot;todos (λx. P x ∧ Q x) [] = (True)&amp;quot; &lt;br /&gt;
    by (simp only: todos.simps(1))&lt;br /&gt;
  also have &amp;quot;... = (True ∧ True)&amp;quot; by (simp only: conj_absorb)&lt;br /&gt;
  also have &amp;quot;... = (todos P [] ∧ todos Q [])&amp;quot; &lt;br /&gt;
    by (simp only: todos.simps(1))&lt;br /&gt;
  finally show &amp;quot;?P []&amp;quot; .&lt;br /&gt;
next&lt;br /&gt;
  fix x xs&lt;br /&gt;
  assume HI: &amp;quot;?P xs&amp;quot;&lt;br /&gt;
  have &amp;quot;todos (λx. P x ∧ Q x) (x # xs) = &lt;br /&gt;
        ((P x ∧ Q x) ∧ todos (λx. P x ∧ Q x) xs)&amp;quot;&lt;br /&gt;
    by (simp only: todos.simps(2))&lt;br /&gt;
  also have &amp;quot;... = ((P x ∧ Q x) ∧  (todos P xs ∧ todos Q xs))&amp;quot; &lt;br /&gt;
    by (simp only: HI)&lt;br /&gt;
  also have &amp;quot;... = ((P x ∧ todos P xs) ∧ (Q x ∧ todos Q xs))&amp;quot; &lt;br /&gt;
    by (simp only: HOL.conj_comms)&lt;br /&gt;
  also have &amp;quot;... = (todos P (x # xs) ∧ todos Q (x # xs))&amp;quot; &lt;br /&gt;
    by (simp only: todos.simps(2))&lt;br /&gt;
  finally show &amp;quot;?P (x#xs)&amp;quot; .&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* manperjim josgomrom4 raffergon2 cammonagu enrparalv gleherlop&lt;br /&gt;
   chrgencar giafus1 pabbergue alikan marfruman1 antramhur hugrubsan&lt;br /&gt;
   aribatval *)  &lt;br /&gt;
lemma &amp;quot;todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;todos (λx. P x ∧ Q x) [] = (todos P [] ∧ todos Q [])&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix n xs&lt;br /&gt;
  assume HI: &amp;quot;todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)&amp;quot; &lt;br /&gt;
  have &amp;quot;todos (λx. P x ∧ Q x) (n # xs) =  &lt;br /&gt;
        ((P n ∧ Q n) ∧ (todos P xs ∧ todos Q xs))&amp;quot; using HI by simp&lt;br /&gt;
  also have &amp;quot;... = ((P n ∧ todos P xs) ∧ (Q n ∧ todos Q xs))&amp;quot; by arith&lt;br /&gt;
  also have &amp;quot;... = ((todos P(n#xs)) ∧ (todos Q(n#xs)))&amp;quot; by simp&lt;br /&gt;
 finally show &amp;quot;todos (λx. P x ∧ Q x) (n#xs) = &lt;br /&gt;
               (todos P (n#xs) ∧ todos Q (n#xs))&amp;quot; by simp &lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber *)&lt;br /&gt;
lemma &amp;quot;todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  case Nil&lt;br /&gt;
  have &amp;quot;todos (λx. P x ∧ Q x) [] = True&amp;quot; by (simp only: todos.simps(1))&lt;br /&gt;
  also have &amp;quot;... = (todos P [] ∧ todos Q [])&amp;quot; &lt;br /&gt;
    by (simp only: todos.simps(1) conj_absorb)&lt;br /&gt;
  finally show ?case.&lt;br /&gt;
next&lt;br /&gt;
  case (Cons x xs)&lt;br /&gt;
  assume IH: &amp;quot;todos (λy. P y ∧ Q y) xs = (todos P xs ∧ todos Q xs)&amp;quot;&lt;br /&gt;
  have &amp;quot;todos (λy. P y ∧ Q y) (x # xs) = &lt;br /&gt;
       ( (P x ∧ Q x) ∧ todos (λy. P y ∧ Q y) xs )&amp;quot;&lt;br /&gt;
    by (simp only: todos.simps(2))&lt;br /&gt;
  also have &amp;quot;... = ( (P x ∧ Q x) ∧ todos P xs ∧ todos Q xs )&amp;quot; &lt;br /&gt;
    by (simp only: IH)&lt;br /&gt;
  also have &amp;quot;... = ( P x ∧ (Q x ∧ todos P xs) ∧ todos Q xs )&amp;quot; &lt;br /&gt;
    by (simp only: conj_assoc)&lt;br /&gt;
  also have &amp;quot;... = ( P x ∧ (todos P xs ∧ Q x) ∧ todos Q xs )&amp;quot; &lt;br /&gt;
    by (simp only: conj_commute)&lt;br /&gt;
  also have &amp;quot;... = ( (P x ∧ todos P xs) ∧ Q x ∧ todos Q xs )&amp;quot; &lt;br /&gt;
    by (simp only: conj_assoc)&lt;br /&gt;
  also have &amp;quot;... = ( todos P (x#xs) ∧ todos Q (x#xs) )&amp;quot; &lt;br /&gt;
    by (simp only: todos.simps(2))&lt;br /&gt;
  finally show ?case.&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4.1. Demostrar o refutar automáticamente&lt;br /&gt;
     todos P (x @ y) = (todos P x ∧ todos P y)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* manperjim pabalagon alfmarcua josgomrom4 aritbatval cammonagu&lt;br /&gt;
   raffergon2 enrparalv benber gleherlop chrgencar giafus1 pabbergue&lt;br /&gt;
   alikan marfruman1 antramhur juacanrod hugrubsan aribatval *) &lt;br /&gt;
lemma &amp;quot;todos P (x @ y) = (todos P x ∧ todos P y)&amp;quot;&lt;br /&gt;
  by (induct x) auto&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4.2. Demostrar o refutar detalladamente&lt;br /&gt;
     todos P (x @ y) = (todos P x ∧ todos P y)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* manperjim pabalagon josgomrom4 raffergon2 cammonagu enrparalv&lt;br /&gt;
   gleherlop chrgencar giafus1 pabbergue alikan antramhur juacanrod&lt;br /&gt;
   hugrubsan *)  &lt;br /&gt;
lemma todos_append:&lt;br /&gt;
  &amp;quot;todos P (x @ y) = (todos P x ∧ todos P y)&amp;quot;&lt;br /&gt;
proof (induct x)&lt;br /&gt;
  show &amp;quot;todos P ([] @ y) = (todos P [] ∧ todos P y)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a x&lt;br /&gt;
  assume HI: &amp;quot;todos P (x @ y) = (todos P x ∧ todos P y)&amp;quot;&lt;br /&gt;
  have &amp;quot;todos P ((a#x) @ y) = (P a ∧ todos P (x @ y))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (P a ∧ todos P x ∧ todos P y)&amp;quot; using HI by simp&lt;br /&gt;
  finally show &amp;quot;todos P ((a#x) @ y) = (todos P (a#x) ∧ todos P y)&amp;quot; &lt;br /&gt;
    by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* alfmarcua marfruman1 *)&lt;br /&gt;
lemma todos_append_2:&lt;br /&gt;
  &amp;quot;todos P (x @ y) = (todos P x ∧ todos P y)&amp;quot; (is &amp;quot;?P x&amp;quot;)&lt;br /&gt;
proof (induct x)&lt;br /&gt;
  have &amp;quot;todos P ([] @ y) = todos P y&amp;quot; by (simp only: append_Nil)&lt;br /&gt;
  also have &amp;quot;... = (True ∧ todos P y)&amp;quot; by (simp only: simp_thms(22))&lt;br /&gt;
  also have &amp;quot;... = (todos P [] ∧ todos P y)&amp;quot; &lt;br /&gt;
    by (simp only: todos.simps(1))&lt;br /&gt;
  finally show &amp;quot;?P []&amp;quot; .&lt;br /&gt;
next&lt;br /&gt;
  fix a x&lt;br /&gt;
  assume HI:&amp;quot;?P x&amp;quot;&lt;br /&gt;
  have &amp;quot;todos P ((a # x) @ y) = todos P (a # (x @ y))&amp;quot;&lt;br /&gt;
    by (simp only:List.append.append_Cons)&lt;br /&gt;
  also have &amp;quot;... = (P a ∧ todos P (x @ y))&amp;quot; &lt;br /&gt;
    by (simp only: todos.simps(2))&lt;br /&gt;
  also have &amp;quot;... = (P a ∧ todos P x ∧ todos P y)&amp;quot; by (simp only:HI)&lt;br /&gt;
  also have &amp;quot;... = ((P a ∧ todos P x) ∧ todos P y)&amp;quot;  &lt;br /&gt;
    by (simp only:HOL.conj_assoc)&lt;br /&gt;
  also have &amp;quot;... = (todos P (a#x) ∧ todos P y)&amp;quot; &lt;br /&gt;
    by (simp only: todos.simps(2))&lt;br /&gt;
  finally show &amp;quot;?P (a#x)&amp;quot; .&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber *)&lt;br /&gt;
lemma todos_append_3:&lt;br /&gt;
  &amp;quot;todos P (x @ y) = (todos P x ∧ todos P y)&amp;quot;&lt;br /&gt;
proof (induct x )&lt;br /&gt;
  case Nil&lt;br /&gt;
  have &amp;quot;todos P ( [] @ y ) = todos P y&amp;quot; &lt;br /&gt;
    by (simp only: List.append.left_neutral)&lt;br /&gt;
  also have &amp;quot;... = (todos P [] ∧ todos P y)&amp;quot; &lt;br /&gt;
    by (simp only: todos.simps(1) simp_thms(22))&lt;br /&gt;
  finally show ?case.&lt;br /&gt;
next&lt;br /&gt;
  case (Cons a x)&lt;br /&gt;
  assume IH: &amp;quot;todos P (x @ y) = (todos P x ∧ todos P y)&amp;quot;&lt;br /&gt;
  have &amp;quot;todos P ((a # x) @ y) = (P a ∧ todos P (x @ y))&amp;quot;&lt;br /&gt;
    by (simp only: todos.simps(2) List.append.append_Cons)&lt;br /&gt;
  also have &amp;quot;... = (P a ∧ todos P x ∧ todos P y)&amp;quot; by (simp only: IH)&lt;br /&gt;
  also have &amp;quot;... = (todos P (a#x) ∧ todos P y)&amp;quot; &lt;br /&gt;
    by (simp only: todos.simps(2) conj_assoc )&lt;br /&gt;
  finally show ?case.&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5.1. Demostrar o refutar automáticamente &lt;br /&gt;
     todos P (rev xs) = todos P xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* manperjim pabalagon josgomrom4 alfmarcua aribatval cammonagu&lt;br /&gt;
   raffergon2 giafus1 pabbergue enrparalv alikan antramhur juacanrod&lt;br /&gt;
   hugrubsan *)  &lt;br /&gt;
lemma &amp;quot;todos P (rev xs) = todos P xs&amp;quot;&lt;br /&gt;
  by (induct xs) (simp_all add: HOL.conj_comms todos_append)&lt;br /&gt;
&lt;br /&gt;
(* benber marfruman1*)&lt;br /&gt;
lemma &amp;quot;todos P (rev xs) = todos P xs&amp;quot;&lt;br /&gt;
  using todos_append by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5.2. Demostrar o refutar detalladamente&lt;br /&gt;
     todos P (rev xs) = todos P xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* manperjim pabalagon josgomrom4 raffergon2 cammonagu gleherlop giafus1&lt;br /&gt;
   pabbergue enrparalv marfruman1 alikan chrgencar antramhur juacanrod&lt;br /&gt;
   hugrubsan aribatval *)  &lt;br /&gt;
lemma &amp;quot;todos P (rev xs) = todos P xs&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;todos P (rev []) = todos P []&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume HI: &amp;quot;todos P (rev xs) = todos P xs&amp;quot;&lt;br /&gt;
  have &amp;quot;todos P (rev (a#xs)) = todos P ((rev xs) @ [a])&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (todos P (rev xs) ∧ todos P [a])&amp;quot; &lt;br /&gt;
    by (simp add: todos_append)&lt;br /&gt;
  also have &amp;quot;... = (todos P xs ∧ todos P [a])&amp;quot; using HI by simp&lt;br /&gt;
  also have &amp;quot;... = (todos P xs ∧ P a)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (P a ∧ todos P xs)&amp;quot; by (simp add: HOL.conj_comms)&lt;br /&gt;
  finally show &amp;quot;todos P (rev (a#xs)) = todos P (a#xs)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* alfmarcua *)&lt;br /&gt;
lemma &amp;quot;todos P (rev xs) = todos P xs&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 only: rev.simps(1))&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume HI:&amp;quot;?P xs&amp;quot;&lt;br /&gt;
  have &amp;quot;todos P (rev (a # xs)) = todos P (rev xs @ [a])&amp;quot; &lt;br /&gt;
    by (simp only: rev.simps(2))&lt;br /&gt;
  also have &amp;quot;... = (todos P (rev xs) ∧ todos P [a])&amp;quot; &lt;br /&gt;
    by (simp only: todos_append)&lt;br /&gt;
  also have &amp;quot;... = (todos P xs ∧ todos P [a])&amp;quot; by (simp only: HI)&lt;br /&gt;
  also have &amp;quot;... = (todos P (a#[]) ∧ todos P xs)&amp;quot; &lt;br /&gt;
    by (simp only: HOL.conj_comms)&lt;br /&gt;
  also have &amp;quot;... = ((P a ∧ True) ∧ todos P xs)&amp;quot; &lt;br /&gt;
    by (simp only: todos.simps)&lt;br /&gt;
  also have &amp;quot;... = (P a ∧ todos P xs)&amp;quot;  &lt;br /&gt;
    by (simp only: HOL.simp_thms(21))&lt;br /&gt;
  also have &amp;quot;... = todos P (a#xs)&amp;quot; by (simp only: todos.simps(2))&lt;br /&gt;
  finally show &amp;quot;?P (a#xs)&amp;quot; .&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber *)&lt;br /&gt;
lemma &amp;quot;todos P (rev xs) = todos P xs&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  case Nil&lt;br /&gt;
  show &amp;quot;todos P (rev []) = todos P []&amp;quot; by (simp only: rev.simps(1))&lt;br /&gt;
next&lt;br /&gt;
  case (Cons x xs)&lt;br /&gt;
  assume IH: &amp;quot;todos P (rev xs) = todos P xs&amp;quot;&lt;br /&gt;
  have &amp;quot;todos P (rev (x#xs)) = todos P (rev xs @ [x])&amp;quot; &lt;br /&gt;
    by (simp only: rev.simps(2))&lt;br /&gt;
  also have &amp;quot;... = (todos P (rev xs) ∧ todos P [x] )&amp;quot; &lt;br /&gt;
    by (simp only: todos_append)&lt;br /&gt;
  also have &amp;quot;... = (todos P (rev xs) ∧ P x ∧ todos P [])&amp;quot; &lt;br /&gt;
    by (simp only: todos.simps(2))&lt;br /&gt;
  also have &amp;quot;... = (todos P (rev xs) ∧ P x)&amp;quot; &lt;br /&gt;
    by (simp only: todos.simps(1) simp_thms(21))&lt;br /&gt;
  also have &amp;quot;... = (todos P xs ∧ P x)&amp;quot; by (simp only: IH)&lt;br /&gt;
  also have &amp;quot;... = (todos P (x#xs))&amp;quot; &lt;br /&gt;
    by (simp only: todos.simps(2) conj_commute)&lt;br /&gt;
  finally show ?case.&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 6. Demostrar o refutar:&lt;br /&gt;
    algunos (λx. P x ∧ Q x) xs = (algunos P xs ∧ algunos Q xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon *)&lt;br /&gt;
lemma &amp;quot;algunos (λx. P x ∧ Q x) xs = (algunos P xs ∧ algunos Q xs)&amp;quot;&lt;br /&gt;
  nitpick&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
(* Contraejemplo *)&lt;br /&gt;
value &amp;quot;algunos (λx. even x ∧ odd x) [1, 2::nat] ≠&lt;br /&gt;
  algunos even [1, 2::nat] ∧ algunos odd [1, 2::nat]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* manperjim alfmarcua raffergon2 gleherlop chrgencar cammonagu giafus1&lt;br /&gt;
   pabbergue marfruman1 alikan antramhur juacanrod hugrubsan &lt;br /&gt;
   aribatval *) &lt;br /&gt;
lemma &amp;quot;algunos (λx. P x ∧ Q x) xs = (algunos P xs ∧ algunos Q xs)&amp;quot;&lt;br /&gt;
  quickcheck&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
(* benber (demostración no completa) *)&lt;br /&gt;
fun is_zero :: &amp;quot;nat ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;is_zero n = (n = 0)&amp;quot;&lt;br /&gt;
fun is_one :: &amp;quot;nat ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;is_one n = (n = 1)&amp;quot;&lt;br /&gt;
lemma &amp;quot;¬( ∀P Q xs. algunos (λx. P x ∧ Q x) xs = (algunos P xs ∧ algunos Q xs) )&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  let ?P = is_one&lt;br /&gt;
  let ?Q = is_zero&lt;br /&gt;
  have &amp;quot;algunos (λx. ?P x ∧ ?Q x) [0,1] ≠ &lt;br /&gt;
       (algunos ?P [0,1] ∧ algunos ?Q [0,1])&amp;quot; by simp&lt;br /&gt;
  hence &amp;quot;∃ xs. algunos (λx. ?P x ∧ ?Q x) xs ≠ &lt;br /&gt;
         (algunos ?P xs ∧ algunos ?Q xs)&amp;quot; by (simp only: exI)&lt;br /&gt;
  hence &amp;quot;∃Q xs. algunos (λx. ?P x ∧ Q x) xs ≠ &lt;br /&gt;
         (algunos ?P xs ∧ algunos Q xs)&amp;quot;&lt;br /&gt;
    by  (simp only: exI[of &amp;quot;λQ. ∃ xs. algunos (λx. ?P x ∧ Q x) xs ≠ (algunos ?P xs ∧ algunos Q xs)&amp;quot;])&lt;br /&gt;
  hence &amp;quot;∃P Q xs. algunos (λx. P x ∧ Q x) xs ≠ (algunos P xs ∧ algunos Q xs)&amp;quot;&lt;br /&gt;
    (*&lt;br /&gt;
      No sé por qué esto no funciona:&lt;br /&gt;
      by (simp only: exI[of &amp;quot;λP Q xs. algunos (λx. P x ∧ Q x) xs ≠ (algunos P xs ∧ algunos Q xs)&amp;quot; ?P])&lt;br /&gt;
&lt;br /&gt;
      Parece que el problema es la expresión lambda.&lt;br /&gt;
    *)&lt;br /&gt;
    sorry&lt;br /&gt;
  thus ?thesis by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 7.1. Demostrar o refutar automáticamente &lt;br /&gt;
     algunos P (map f xs) = algunos (P ∘ f) xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* manperjim pabalagon josgomrom4 alfmarcua raffergon2 gleherlop&lt;br /&gt;
   cammonagu benber giafus1 pabbergue enrparalv marfruman1 alikan&lt;br /&gt;
   antramhur juacanrod hugrubsan aribatval *)  &lt;br /&gt;
lemma &amp;quot;algunos P (map f xs) = algunos (P o f) 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.2. Demostrar o refutar detalladamente&lt;br /&gt;
     algunos P (map f xs) = algunos (P ∘ f) xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* manperjim pabalagon cammonagu giafus1 gleherlop chrgencar pabbergue&lt;br /&gt;
   enrparalv marfruman1 alikan antramhur juacanrod hugrubsan *)&lt;br /&gt;
lemma &amp;quot;algunos P (map f xs) = algunos (P o f) xs&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;algunos P (map f []) = algunos (P ∘ f) []&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume HI: &amp;quot;algunos P (map f xs) = algunos (P ∘ f) xs&amp;quot;&lt;br /&gt;
  have &amp;quot;algunos P (map f (a#xs)) = (P (f a) ∨ algunos P (map f xs))&amp;quot; &lt;br /&gt;
    by simp&lt;br /&gt;
  also have &amp;quot;... = (P (f a) ∨ algunos (P ∘ f) xs)&amp;quot; using HI by simp&lt;br /&gt;
  also have &amp;quot;... = ((P ∘ f) a ∨ algunos (P ∘ f) xs)&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;algunos P (map f (a#xs)) = algunos (P ∘ f) (a#xs)&amp;quot; &lt;br /&gt;
    by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* josgomrom4 *)&lt;br /&gt;
lemma &amp;quot;algunos P (map f xs) = algunos (P o f) xs&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;algunos P (map f []) = algunos (P o f) []&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x xs&lt;br /&gt;
  assume HI: &amp;quot;algunos P (map f xs) = algunos (P o f) xs&amp;quot;&lt;br /&gt;
  have &amp;quot;algunos P (map f (x#xs)) = (P (f x) ∨ algunos P (map f xs))&amp;quot; &lt;br /&gt;
    by simp&lt;br /&gt;
  also have &amp;quot;... = (P (f x) ∨ algunos (P o f) xs)&amp;quot; using HI by simp&lt;br /&gt;
  finally show &amp;quot;algunos P (map f (x#xs)) = algunos (P o f) (x#xs)&amp;quot; &lt;br /&gt;
    by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* alfmarcua *)&lt;br /&gt;
lemma &amp;quot;algunos P (map f xs) = algunos (P o f) xs&amp;quot; (is &amp;quot;?P xs&amp;quot;)&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  have &amp;quot;algunos P (map f []) = algunos P []&amp;quot; &lt;br /&gt;
    by (simp only: List.list.map(1))&lt;br /&gt;
  also have &amp;quot;... =  algunos (P o f) []&amp;quot; by (simp only: algunos.simps(1))&lt;br /&gt;
  finally show &amp;quot;?P []&amp;quot; .&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume HI:&amp;quot;?P xs&amp;quot;&lt;br /&gt;
  have &amp;quot;algunos P (map f (a # xs)) =  algunos P (f a # map f xs)&amp;quot; &lt;br /&gt;
    by (simp only: List.list.map(2))&lt;br /&gt;
  also have &amp;quot;... = (P (f a) ∨ algunos P (map f xs))&amp;quot; &lt;br /&gt;
    by (simp only: algunos.simps(2))&lt;br /&gt;
  also have &amp;quot;... = (P (f a) ∨ algunos (P o f) xs)&amp;quot; by (simp only:HI)&lt;br /&gt;
  also have &amp;quot;... = ((P o f) a ∨ algunos (P o f) xs)&amp;quot; &lt;br /&gt;
    by (simp only: Fun.comp_apply)&lt;br /&gt;
  also have &amp;quot;... = algunos (P o f) (a#xs)&amp;quot; by (simp only: algunos.simps(2))&lt;br /&gt;
  finally show &amp;quot;?P (a#xs)&amp;quot; .&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber *)&lt;br /&gt;
lemma &amp;quot;algunos P (map f xs) = algunos (P o f) xs&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  case Nil&lt;br /&gt;
  have &amp;quot;algunos P (map f []) = algunos P []&amp;quot; by (simp only: list.map(1))&lt;br /&gt;
  also have &amp;quot;... = False&amp;quot; by (simp only: algunos.simps(1))&lt;br /&gt;
  also have &amp;quot;False = algunos (P ∘ f) []&amp;quot; by (simp only: algunos.simps(1))&lt;br /&gt;
  finally show ?case.&lt;br /&gt;
next&lt;br /&gt;
  case (Cons x xs)&lt;br /&gt;
  assume IH: &amp;quot;algunos P (map f xs) = algunos (P ∘ f) xs&amp;quot;&lt;br /&gt;
  have &amp;quot;algunos P (map f (x # xs)) = algunos P (f x # map f xs)&amp;quot; &lt;br /&gt;
    by (simp only: list.map(2))&lt;br /&gt;
  also have &amp;quot;... = ( (P ∘ f) x ∨ algunos P (map f xs) )&amp;quot; &lt;br /&gt;
    by (simp only: algunos.simps(2) o_apply)&lt;br /&gt;
  also have &amp;quot;... = ( (P ∘ f) x ∨ algunos (P ∘ f) xs )&amp;quot; &lt;br /&gt;
    by (simp only: IH)&lt;br /&gt;
  also have &amp;quot;... = algunos (P ∘ f) (x#xs)&amp;quot; &lt;br /&gt;
    by (simp only: algunos.simps(2))&lt;br /&gt;
  finally show ?case .&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 8.1. Demostrar o refutar automáticamente &lt;br /&gt;
     algunos P (xs @ ys) = (algunos P xs ∨ algunos P ys)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* manperjim pabalagon josgomrom4 alfmarcua raffergon2 cammonagu&lt;br /&gt;
   gleherlop chrgencar benber giafus1 pabbergue enrparalv marfruman1 &lt;br /&gt;
   alikan antramhur juacanrod hugrubsan aribatval *) &lt;br /&gt;
lemma &amp;quot;algunos P (xs @ ys) = (algunos P xs ∨ algunos P ys)&amp;quot;&lt;br /&gt;
  by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 8.2. Demostrar o refutar detalladamente&lt;br /&gt;
     algunos P (xs @ ys) = (algunos P xs ∨ algunos P ys)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* manperjim pabalagon josgomrom4 raffergon2 gleherlop cammonagu giafus1&lt;br /&gt;
   pabbergue enrparalv marfruman1 alikan antramhur juacanrod hugrubsan *) &lt;br /&gt;
lemma algunos_append:&lt;br /&gt;
  &amp;quot;algunos P (xs @ ys) = (algunos P xs ∨ algunos P ys)&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;algunos P ([] @ ys) = (algunos P [] ∨ algunos P ys)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume HI: &amp;quot;algunos P (xs @ ys) = (algunos P xs ∨ algunos P ys)&amp;quot;&lt;br /&gt;
  have &amp;quot;algunos P ((a#xs) @ ys) = (P a ∨ algunos P (xs @ ys))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (P a ∨ algunos P xs ∨ algunos P ys)&amp;quot; using HI by simp&lt;br /&gt;
  finally show  &amp;quot;algunos P ((a#xs) @ ys) = &lt;br /&gt;
                 (algunos P (a#xs) ∨ algunos P ys)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* alfmarcua *)&lt;br /&gt;
lemma algunos_append_2:&lt;br /&gt;
  &amp;quot;algunos P (xs @ ys) = (algunos P xs ∨ algunos P ys)&amp;quot; (is &amp;quot;?P xs&amp;quot;)&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  have &amp;quot;algunos P ([] @ ys) = algunos P ys&amp;quot; by (simp only: append_Nil)&lt;br /&gt;
  also have &amp;quot;... = (False ∨ algunos P ys)&amp;quot; by (simp only: simp_thms(32))&lt;br /&gt;
  also have &amp;quot;... = (algunos P [] ∨ algunos P ys)&amp;quot; &lt;br /&gt;
    by (simp only: algunos.simps(1))&lt;br /&gt;
  finally show &amp;quot;?P []&amp;quot; .&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume HI:&amp;quot;?P xs&amp;quot;&lt;br /&gt;
  have &amp;quot;algunos P ((a # xs) @ ys) = algunos P (a # (xs @ ys))&amp;quot;&lt;br /&gt;
    by (simp only:List.append.append_Cons)&lt;br /&gt;
  also have &amp;quot;... = (P a ∨ algunos P (xs @ ys))&amp;quot; &lt;br /&gt;
    by (simp only: algunos.simps(2))&lt;br /&gt;
  also have &amp;quot;... = (P a ∨ algunos P xs ∨ algunos P ys)&amp;quot; &lt;br /&gt;
    by (simp only:HI)&lt;br /&gt;
  also have &amp;quot;... = ((P a ∨ algunos P xs) ∨ algunos P ys)&amp;quot;  &lt;br /&gt;
    by (simp only:HOL.disj_assoc)&lt;br /&gt;
  also have &amp;quot;... = (algunos P (a#xs) ∨ algunos P ys)&amp;quot; &lt;br /&gt;
    by (simp only: algunos.simps(2))&lt;br /&gt;
  finally show &amp;quot;?P (a#xs)&amp;quot; .&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber *)&lt;br /&gt;
lemma algunos_append_3:&lt;br /&gt;
  &amp;quot;algunos P (xs @ ys) = (algunos P xs ∨ algunos P ys)&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  case Nil&lt;br /&gt;
  have &amp;quot;algunos P ([] @ ys) = algunos P ys&amp;quot; &lt;br /&gt;
    by (simp only: append.left_neutral)&lt;br /&gt;
  also have &amp;quot;... = ( algunos P [] ∨ algunos P ys )&amp;quot; &lt;br /&gt;
    by (simp only: algunos.simps(1) simp_thms(32))&lt;br /&gt;
  finally show ?case .&lt;br /&gt;
next&lt;br /&gt;
  case (Cons x xs)&lt;br /&gt;
  assume IH: &amp;quot;algunos P (xs @ ys) = ( algunos P xs ∨ algunos P ys )&amp;quot;&lt;br /&gt;
  have &amp;quot;algunos P ((x#xs) @ ys) = algunos P (x#(xs @ ys))&amp;quot; &lt;br /&gt;
    by (simp only: append_Cons)&lt;br /&gt;
  also have &amp;quot;... = ( P x ∨ algunos P (xs @ ys) )&amp;quot; &lt;br /&gt;
    by (simp only: algunos.simps(2))&lt;br /&gt;
  also have &amp;quot;... = ( P x ∨ algunos P xs ∨ algunos P ys )&amp;quot; &lt;br /&gt;
    by (simp only: IH)&lt;br /&gt;
  also have &amp;quot;... = ( algunos P (x#xs) ∨ algunos P ys )&amp;quot; &lt;br /&gt;
    by (simp only: algunos.simps(2) disj_assoc)&lt;br /&gt;
  finally show ?case .&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 9.1. Demostrar o refutar automáticamente&lt;br /&gt;
     algunos P (rev xs) = algunos P xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* manperjim pabalagon josgomrom4 alfmarcua raffergon2 gleherlop chrgencar &lt;br /&gt;
   cammonagu giafus1 pabbergue enrparalv alikan antramhur juacanrod&lt;br /&gt;
   hugrubsan aribatval *)  &lt;br /&gt;
lemma &amp;quot;algunos P (rev xs) = algunos P xs&amp;quot;&lt;br /&gt;
  by (induct xs) (simp_all add: HOL.disj_comms algunos_append)&lt;br /&gt;
&lt;br /&gt;
(* benber marfruman1 *)&lt;br /&gt;
lemma &amp;quot;algunos P (rev xs) = algunos P xs&amp;quot;&lt;br /&gt;
  using algunos_append by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 9.2. Demostrar o refutar detalladamente&lt;br /&gt;
     algunos P (rev xs) = algunos P xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon juacanrod *)&lt;br /&gt;
lemma &amp;quot;algunos P (rev xs) = algunos P xs&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;algunos P (rev []) = algunos P []&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume HI: &amp;quot;algunos P (rev xs) = algunos P xs&amp;quot;&lt;br /&gt;
  have &amp;quot;algunos P (rev (a#xs)) = algunos P (rev xs @ [a])&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (algunos P (rev xs) ∨ algunos P [a])&amp;quot; &lt;br /&gt;
    by (simp add: algunos_append)&lt;br /&gt;
  also have &amp;quot;... = (algunos P xs ∨ algunos P [a])&amp;quot; using HI by simp&lt;br /&gt;
  also have &amp;quot;... = (algunos P xs ∨ P a)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (P a ∨ algunos P xs)&amp;quot; by (simp add: HOL.disj_comms)&lt;br /&gt;
  finally show &amp;quot;algunos P (rev (a#xs)) = algunos P (a#xs)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* manperjim josgomrom4 raffergon2 gleherlop chrgencar cammonagu giafus1&lt;br /&gt;
   pabbergue enrparalv marfruman1 alikan antramhur hugrubsan *)&lt;br /&gt;
lemma &amp;quot;algunos P (rev xs) = algunos P xs&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;algunos P (rev []) = algunos P []&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume HI:&amp;quot;algunos P (rev xs) = algunos P xs&amp;quot;&lt;br /&gt;
  have &amp;quot;algunos P (rev (a # xs)) = algunos P ((rev xs) @ [a])&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = ((algunos P (rev xs)) ∨ (algunos P [a]))&amp;quot; &lt;br /&gt;
    by (simp add: algunos_append)&lt;br /&gt;
  also have &amp;quot;... = ((algunos P xs) ∨ (algunos P [a]))&amp;quot; using HI by simp&lt;br /&gt;
  also have &amp;quot;... = ((algunos P [a]) ∨ (algunos P xs))&amp;quot; by arith&lt;br /&gt;
  finally show &amp;quot;algunos P (rev (a # xs)) = algunos P (a # xs)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* alfmarcua *)&lt;br /&gt;
lemma &amp;quot;algunos P (rev xs) = algunos P xs&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 only: rev.simps(1))&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume HI:&amp;quot;?P xs&amp;quot;&lt;br /&gt;
  have &amp;quot;algunos P (rev (a # xs)) = algunos P (rev xs @ [a])&amp;quot; &lt;br /&gt;
    by (simp only: rev.simps(2))&lt;br /&gt;
  also have &amp;quot;... = (algunos P (rev xs) ∨ algunos P [a])&amp;quot; &lt;br /&gt;
    by (simp only: algunos_append)&lt;br /&gt;
  also have &amp;quot;... = (algunos P xs ∨ algunos P [a])&amp;quot; by (simp only: HI)&lt;br /&gt;
  also have &amp;quot;... = (algunos P (a#[]) ∨ algunos P xs)&amp;quot; &lt;br /&gt;
    by (simp only: HOL.disj_comms)&lt;br /&gt;
  also have &amp;quot;... = ((P a ∨ False) ∨ algunos P xs)&amp;quot; &lt;br /&gt;
    by (simp only: algunos.simps)&lt;br /&gt;
  also have &amp;quot;... = (P a ∨ algunos P xs)&amp;quot;  &lt;br /&gt;
    by (simp only: HOL.simp_thms(31))&lt;br /&gt;
  also have &amp;quot;... = algunos P (a#xs)&amp;quot; by (simp only: algunos.simps(2))&lt;br /&gt;
  finally show &amp;quot;?P (a#xs)&amp;quot; .&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber *)&lt;br /&gt;
lemma &amp;quot;algunos P (rev xs) = algunos P xs&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  case Nil&lt;br /&gt;
  show ?case by (simp only: algunos.simps(1) rev.simps(1))&lt;br /&gt;
next&lt;br /&gt;
  case (Cons x xs)&lt;br /&gt;
  assume IH: &amp;quot;algunos P (rev xs) = algunos P xs&amp;quot;&lt;br /&gt;
  have &amp;quot;algunos P (rev (x#xs)) = algunos P ( (rev xs) @ [x] )&amp;quot; &lt;br /&gt;
    by (simp only: rev.simps(2))&lt;br /&gt;
  also have &amp;quot;... = ( algunos P (rev xs) ∨ algunos P [x] )&amp;quot; &lt;br /&gt;
    by (simp only: algunos_append)&lt;br /&gt;
  also have &amp;quot;... = ( algunos P (rev xs) ∨ P x ∨ algunos P [] )&amp;quot; &lt;br /&gt;
    by (simp only: algunos.simps(2))&lt;br /&gt;
  also have &amp;quot;... = ( algunos P (rev xs) ∨ P x )&amp;quot; &lt;br /&gt;
    by (simp only: algunos.simps(1) simp_thms(31))&lt;br /&gt;
  also have &amp;quot;... = (algunos P xs ∨ P x)&amp;quot; by (simp only: IH)&lt;br /&gt;
  also have &amp;quot;... = algunos P (x#xs)&amp;quot; &lt;br /&gt;
    by (simp only: algunos.simps(2) disj_commute)&lt;br /&gt;
  finally show ?case.&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 10. Encontrar un término no trivial Z tal que sea cierta la &lt;br /&gt;
  siguiente ecuación:&lt;br /&gt;
     algunos (λx. P x ∨ Q x) xs = Z&lt;br /&gt;
  y demostrar la equivalencia de forma automática y detallada.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* manperjim pabalagon josgomrom4 alfmarcua raffergon2 cammonagu&lt;br /&gt;
   gleherlop chrgencar benber giafus1 enrparalv marfruman1 antramhur&lt;br /&gt;
   alikan hugrubsan aribatval *)  &lt;br /&gt;
lemma &amp;quot;algunos (λx. P x ∨ Q x) xs = (algunos P xs ∨ algunos Q xs)&amp;quot;&lt;br /&gt;
  by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
(* pabalagon josgomrom4 cammonagu pabbergue marfruman1 antramhur&lt;br /&gt;
   juacanrod alikan *) &lt;br /&gt;
lemma &amp;quot;algunos (λx. P x ∨ Q x) xs = (algunos P xs ∨ algunos Q xs)&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;algunos (λx. P x ∨ Q x) [] = (algunos P [] ∨ algunos Q [])&amp;quot; &lt;br /&gt;
    by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume HI: &amp;quot;algunos (λx. P x ∨ Q x) xs = &lt;br /&gt;
              (algunos P xs ∨ algunos Q xs)&amp;quot;&lt;br /&gt;
  have &amp;quot;algunos (λx. P x ∨ Q x) (a#xs) = &lt;br /&gt;
        (P a ∨ Q a ∨ algunos (λx. P x ∨ Q x) xs)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (P a ∨ Q a ∨ algunos P xs ∨ algunos Q xs)&amp;quot; &lt;br /&gt;
    using HI by simp&lt;br /&gt;
  also have &amp;quot;... = (P a ∨ algunos P xs ∨ Q a ∨ algunos Q xs)&amp;quot; &lt;br /&gt;
    by (simp add: HOL.disj_comms)&lt;br /&gt;
  finally show &amp;quot;algunos (λx. P x ∨ Q x) (a#xs) = &lt;br /&gt;
                (algunos P (a#xs) ∨ algunos Q (a#xs))&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* alfmarcua *)&lt;br /&gt;
lemma &amp;quot;algunos (λx. P x ∨ Q x) xs = (algunos P xs ∨ algunos Q xs)&amp;quot; &lt;br /&gt;
      (is &amp;quot;?P xs&amp;quot;)&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;?P []&amp;quot; by (simp only: algunos.simps(1) HOL.simp_thms(33))&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume HI:&amp;quot;?P xs&amp;quot;&lt;br /&gt;
  have &amp;quot;algunos (λx. P x ∨ Q x) (a # xs) = &lt;br /&gt;
        ((P a ∨ Q a) ∨ algunos (λx. P x ∨ Q x) xs)&amp;quot; &lt;br /&gt;
    by (simp only: algunos.simps(2))&lt;br /&gt;
  also have &amp;quot;... = ((P a ∨ Q a) ∨ algunos P xs ∨ algunos Q xs)&amp;quot; &lt;br /&gt;
    by (simp only: HI)&lt;br /&gt;
  also have &amp;quot;... = ((P a ∨ algunos P xs) ∨ Q a  ∨ algunos Q xs)&amp;quot; &lt;br /&gt;
    by (simp only: HOL.disj_assoc HOL.disj_comms)&lt;br /&gt;
  also have &amp;quot;... = (algunos P (a # xs) ∨ algunos Q (a # xs))&amp;quot; &lt;br /&gt;
    by (simp only: algunos.simps(2))&lt;br /&gt;
  finally show &amp;quot;?P (a#xs)&amp;quot; .&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber *)&lt;br /&gt;
lemma &amp;quot;algunos (λx. P x ∨ Q x) xs = ( algunos P xs ∨ algunos Q xs )&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  case Nil&lt;br /&gt;
  have &amp;quot;algunos (λx. P x ∨ Q x) [] = False&amp;quot; &lt;br /&gt;
    by (simp only: algunos.simps(1))&lt;br /&gt;
  also have &amp;quot;... = ( algunos P [] ∨ algunos Q [] )&amp;quot; &lt;br /&gt;
    by (simp only: algunos.simps(1) simp_thms(31))&lt;br /&gt;
  finally show ?case.&lt;br /&gt;
next&lt;br /&gt;
  case (Cons x xs)&lt;br /&gt;
  let ?R = &amp;quot;λx. P x ∨ Q x&amp;quot;&lt;br /&gt;
  assume IH: &amp;quot;algunos ?R xs = ( algunos P xs ∨ algunos Q xs )&amp;quot;&lt;br /&gt;
  have &amp;quot;algunos ?R (x#xs) = ( ?R x ∨ algunos ?R xs )&amp;quot; &lt;br /&gt;
    by (simp only: algunos.simps(2))&lt;br /&gt;
  also have &amp;quot;... = ( P x ∨ Q x ∨ algunos P xs ∨ algunos Q xs )&amp;quot; &lt;br /&gt;
    by (simp only: IH disj_assoc)&lt;br /&gt;
  also have &amp;quot;... = ( P x ∨ (Q x ∨ algunos P xs) ∨ algunos Q xs )&amp;quot; &lt;br /&gt;
    by (simp only: disj_assoc)&lt;br /&gt;
  also have &amp;quot;... = ( P x ∨ (algunos P xs ∨ Q x) ∨ algunos Q xs )&amp;quot; &lt;br /&gt;
    by (simp only: disj_commute)&lt;br /&gt;
  also have &amp;quot;... = ( algunos P (x#xs) ∨ algunos Q (x#xs) )&amp;quot; &lt;br /&gt;
    by (simp only: algunos.simps(2) disj_assoc)&lt;br /&gt;
  finally show ?case .&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 11.1. Demostrar o refutar automáticamente&lt;br /&gt;
     algunos P xs = (¬ todos (λx. (¬ P x)) xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* manperjim pabalagon josgomrom4 alfmarcua raffergon2 cammonagu&lt;br /&gt;
   gleherlop chrgencar benber giafus1 pabbergue enrparalv marfruman1&lt;br /&gt;
   antramhur juacanrod alikan hugrubsan aribatval *) &lt;br /&gt;
lemma &amp;quot;algunos P xs = (¬ todos (λx. (¬ P 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 11.2. Demostrar o refutar detalladamente&lt;br /&gt;
     algunos P xs = (¬ todos (λx. (¬ P x)) xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* manperjim pabalagon josgomrom4 cammonagu pabbergue enrparalv&lt;br /&gt;
   marfruman1 antramhur juacanrod alikan hugrubsan aribatval *)&lt;br /&gt;
lemma &amp;quot;algunos P xs = (¬ todos (λx. (¬ P x)) xs)&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  have &amp;quot;algunos P [] = False&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (¬ todos (λx. (¬ P x)) [])&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;algunos P [] = (¬ todos (λx. (¬ P x)) [])&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume HI: &amp;quot;algunos P xs = (¬ todos (λx. (¬ P x)) xs)&amp;quot;&lt;br /&gt;
  have &amp;quot;(¬ todos (λx. (¬ P x)) (a#xs)) = &lt;br /&gt;
        (¬ ((¬ P a) ∧ todos (λx. (¬ P x)) xs))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (P a ∨ ¬ todos (λx. (¬ P x)) xs)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (P a ∨ algunos P xs)&amp;quot; using HI by simp&lt;br /&gt;
  finally show &amp;quot;algunos P (a#xs) = (¬ todos (λx. (¬ P x)) (a#xs))&amp;quot; &lt;br /&gt;
    by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* alfmarcua *)&lt;br /&gt;
lemma &amp;quot;algunos P xs = (¬ todos (λx. (¬ P x)) xs)&amp;quot; (is &amp;quot;?P xs&amp;quot;)&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  have &amp;quot;algunos P [] = False&amp;quot; by (simp only:algunos.simps(1))&lt;br /&gt;
  also have &amp;quot;... = (¬ True)&amp;quot; by (simp only: HOL.simp_thms(7))&lt;br /&gt;
  also have &amp;quot;... = (¬ todos (λx. (¬ P x)) [])&amp;quot; &lt;br /&gt;
    by (simp only: todos.simps(1))&lt;br /&gt;
  finally show &amp;quot;?P []&amp;quot; .&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume HI:&amp;quot;?P xs&amp;quot;&lt;br /&gt;
  have &amp;quot;algunos P (a # xs) = (P a ∨ algunos P xs)&amp;quot; &lt;br /&gt;
    by (simp only: algunos.simps(2))&lt;br /&gt;
  also have &amp;quot;... = (P a ∨ ¬ todos (λx. (¬ P x)) xs)&amp;quot; &lt;br /&gt;
    by (simp only: HI)&lt;br /&gt;
  also have &amp;quot;... = (¬ ¬ P a ∨ ¬ todos (λx. (¬ P x)) xs)&amp;quot; &lt;br /&gt;
    by (simp only: HOL.simp_thms(1))&lt;br /&gt;
  also have &amp;quot;... = (¬ (¬ P a ∧ todos (λx. (¬ P x)) xs))&amp;quot; &lt;br /&gt;
    by (simp only: HOL.de_Morgan_conj)&lt;br /&gt;
  also have &amp;quot;... = (¬ todos (λx. (¬ P x)) (a#xs))&amp;quot; &lt;br /&gt;
    by (simp only: todos.simps(2))&lt;br /&gt;
  finally show &amp;quot;?P (a#xs)&amp;quot; .&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber *)&lt;br /&gt;
lemma &amp;quot;algunos P xs = (¬ todos (λx. (¬ P x)) xs)&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  case Nil&lt;br /&gt;
  have &amp;quot;algunos P [] = False&amp;quot; by (simp only: algunos.simps(1))&lt;br /&gt;
  also have &amp;quot;False = (¬ todos (λx. ¬ P x) [])&amp;quot; &lt;br /&gt;
    by (simp only: todos.simps(1) not_True_eq_False)&lt;br /&gt;
  finally show ?case .&lt;br /&gt;
next&lt;br /&gt;
  case (Cons x xs)&lt;br /&gt;
  assume IH: &amp;quot;algunos P xs = (¬ todos (λx. (¬ P x)) xs)&amp;quot;&lt;br /&gt;
  have &amp;quot;algunos P (x#xs) = ( P x ∨ algunos P xs )&amp;quot; &lt;br /&gt;
    by (simp only: algunos.simps(2))&lt;br /&gt;
  also have &amp;quot;... = ( P x ∨ (¬ todos (λx. (¬ P x)) xs) )&amp;quot; &lt;br /&gt;
    by (simp only: IH)&lt;br /&gt;
  also have &amp;quot;... = ( ¬( ¬ P x ∧ todos (λx. (¬ P x)) xs) )&amp;quot; &lt;br /&gt;
    by (simp only: not_not de_Morgan_conj)&lt;br /&gt;
  also have &amp;quot;... = (¬ todos (λx. (¬ P x)) (x#xs))&amp;quot; &lt;br /&gt;
    by (simp only: todos.simps(2))&lt;br /&gt;
  finally show ?case .&lt;br /&gt;
qed&lt;br /&gt;
     &lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 12. Definir la funcion primitiva recursiva &lt;br /&gt;
     estaEn :: &amp;#039;a ⇒ &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (estaEn x xs) se verifica si el elemento x está en la lista&lt;br /&gt;
  xs. Por ejemplo, &lt;br /&gt;
     estaEn (2::nat) [3,2,4] = True&lt;br /&gt;
     estaEn (1::nat) [3,2,4] = False&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* manperjim pabalagon josgomrom4 alfmarcua raffergon2 cammonagu&lt;br /&gt;
   gleherlop chrgencar benber giafus1 pabbergue enrparalv marfruman1&lt;br /&gt;
   antramhur juacanrod alikan hugrubsan aribatval *) &lt;br /&gt;
fun estaEn :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;estaEn x [] = False&amp;quot; |&lt;br /&gt;
  &amp;quot;estaEn x (y#xs) = (x=y ∨ estaEn x xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 13. Expresar la relación existente entre estaEn y algunos. &lt;br /&gt;
  Demostrar dicha relación de forma automática y detallada.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* manperjim pabalagon josgomrom4 alfmarcua cammonagu gleherlop&lt;br /&gt;
   chrgencar benber giafus1 pabbergue marfruman1 antramhur juacanrod&lt;br /&gt;
   alikan *)  &lt;br /&gt;
lemma &amp;quot;estaEn x xs = algunos (λa. x=a) xs&amp;quot;&lt;br /&gt;
  by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
(* pabalagon josgomrom4 cammonagu marfruman1 antramhur *)&lt;br /&gt;
lemma &amp;quot;estaEn x xs = algunos (λa. x=a) xs&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;estaEn x [] = algunos (λa. x=a) []&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix y xs&lt;br /&gt;
  assume HI: &amp;quot;estaEn x xs = algunos (λa. x=a) xs&amp;quot;&lt;br /&gt;
  have &amp;quot;estaEn x (y#xs) = (x=y ∨ estaEn x xs)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (x=y ∨ algunos (λa. x=a) xs)&amp;quot; using HI by simp&lt;br /&gt;
  finally show &amp;quot;estaEn x (y#xs) = algunos (λa. x=a) (y#xs)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* alfmarcua *)&lt;br /&gt;
lemma &amp;quot;estaEn x xs = algunos (λk. x=k) xs&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 only: estaEn.simps(1) algunos.simps(1))&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume HI:&amp;quot;?P xs&amp;quot;&lt;br /&gt;
  have &amp;quot;estaEn x (a # xs) = (x=a ∨ estaEn x xs)&amp;quot; &lt;br /&gt;
    by (simp only: estaEn.simps(2))&lt;br /&gt;
  also have &amp;quot;... = (x=a ∨ algunos (λk. x=k) xs)&amp;quot; by (simp only: HI)&lt;br /&gt;
  (* also have &amp;quot;... = ((λk. x=k) a ∨ algunos (λk. x=k) xs)&amp;quot; by (simp only:HOL.simp_thms(6)) *)&lt;br /&gt;
  also have &amp;quot;... = algunos (λk. x=k) (a#xs)&amp;quot; by (simp only: algunos.simps(2))&lt;br /&gt;
  finally show &amp;quot;?P (a#xs)&amp;quot; .&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber *)&lt;br /&gt;
lemma &amp;quot;estaEn x xs = (algunos (λy. y = x) xs)&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  case Nil&lt;br /&gt;
  have &amp;quot;estaEn x [] = False&amp;quot; by (simp only: estaEn.simps(1))&lt;br /&gt;
  also have &amp;quot;False = (algunos (λy. y = x) [])&amp;quot; &lt;br /&gt;
    by (simp only: algunos.simps(1))&lt;br /&gt;
  finally show ?case .&lt;br /&gt;
next&lt;br /&gt;
  case (Cons z xs)&lt;br /&gt;
  assume IH: &amp;quot;estaEn x xs = algunos (λy. y = x) xs&amp;quot;&lt;br /&gt;
  have &amp;quot;estaEn x (z#xs) = ( z = x ∨ estaEn x xs )&amp;quot; by force&lt;br /&gt;
  also have &amp;quot;... = ( z = x ∨ algunos (λy. y = x) xs)&amp;quot; by (simp only: IH)&lt;br /&gt;
  also have &amp;quot;... = (algunos (λy. y = x) (z#xs))&amp;quot; &lt;br /&gt;
    by (simp only: algunos.simps(2))&lt;br /&gt;
  finally show ?case .&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/RA2018/index.php?title=Relaci%C3%B3n_3&amp;diff=446</id>
		<title>Relación 3</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2018/index.php?title=Relaci%C3%B3n_3&amp;diff=446"/>
		<updated>2019-03-06T18:49:15Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: Protegió «Relación 3» ([Editar=Solo administradores] (indefinido) [Trasladar=Solo administradores] (indefinido))&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isabelle&amp;quot;&amp;gt;&lt;br /&gt;
chapter {* R3: Razonamiento sobre programas *}&lt;br /&gt;
&lt;br /&gt;
theory R3_Razonamiento_sobre_programas&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1.1. Definir la función&lt;br /&gt;
     sumaImpares :: nat ⇒ nat&lt;br /&gt;
  tal que (sumaImpares n) es la suma de los n primeros números&lt;br /&gt;
  impares. Por ejemplo,&lt;br /&gt;
     sumaImpares 5  =  25&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun sumaImpares :: &amp;quot;nat ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;sumaImpares 0 = 0&amp;quot;&lt;br /&gt;
| &amp;quot;sumaImpares (Suc n) = sumaImpares n + (2*n+1)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1.2. Escribir la demostración detallada de &lt;br /&gt;
     sumaImpares n = n*n&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
(* benber *)&lt;br /&gt;
lemma &amp;quot;sumaImpares n = n*n&amp;quot;&lt;br /&gt;
proof (induct n)&lt;br /&gt;
  show &amp;quot;sumaImpares 0 = 0*0&amp;quot; by (simp only: sumaImpares.simps(1))&lt;br /&gt;
next&lt;br /&gt;
  fix n&lt;br /&gt;
  assume HI: &amp;quot;sumaImpares n = n*n&amp;quot;&lt;br /&gt;
  have &amp;quot;sumaImpares (Suc n) = sumaImpares n + (2*n+1)&amp;quot; &lt;br /&gt;
    by (simp only: sumaImpares.simps(2))&lt;br /&gt;
  also have &amp;quot;... = n*n + (2*n+1)&amp;quot; by (simp only: HI)&lt;br /&gt;
  also have &amp;quot;... = n*n + (n+n+1)&amp;quot; by (simp only:)&lt;br /&gt;
  also have &amp;quot;... = n*n + n + n + 1&amp;quot; by (simp only:)&lt;br /&gt;
  also have &amp;quot;... = n*n + n*1 + n + 1&amp;quot; by (simp only:)&lt;br /&gt;
  also have &amp;quot;... = n*(n+1) + n + 1&amp;quot; &lt;br /&gt;
    by (simp only: Nat.add_mult_distrib2)&lt;br /&gt;
  also have &amp;quot;... = n*(n+1) + (n+1)&amp;quot; by (simp only:)&lt;br /&gt;
  also have &amp;quot;... = (n+1)*n + (n+1)&amp;quot; &lt;br /&gt;
    by (simp only: Groups.ab_semigroup_mult_class.mult.commute)&lt;br /&gt;
  also have &amp;quot;... = (n+1)*n + (n+1)*1&amp;quot; by (simp only: Nat.nat_mult_1_right)&lt;br /&gt;
  also have &amp;quot;... = (n+1)*(n+1)&amp;quot; by (simp only: Nat.add_mult_distrib2)&lt;br /&gt;
  also have &amp;quot;... = (Suc n) * (Suc n)&amp;quot; by (simp only: Nat.Suc_eq_plus1)&lt;br /&gt;
  finally show &amp;quot;sumaImpares (Suc n) = (Suc n) * (Suc n)&amp;quot; .&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* manperjim pabalagon josgomrom4 hugrubsan enrparalv juacanrod *)&lt;br /&gt;
lemma &amp;quot;sumaImpares n = n*n&amp;quot;&lt;br /&gt;
proof (induct n)&lt;br /&gt;
  show &amp;quot;sumaImpares 0 = 0*0&amp;quot; by (simp only: sumaImpares.simps(1))&lt;br /&gt;
next&lt;br /&gt;
  fix n&lt;br /&gt;
  assume HI: &amp;quot;sumaImpares n = n*n&amp;quot;&lt;br /&gt;
  have &amp;quot;sumaImpares (Suc n) = sumaImpares n + 2 * n + 1&amp;quot; &lt;br /&gt;
    by (simp only: sumaImpares.simps(2))&lt;br /&gt;
  also have &amp;quot;... = n*n + 2*n + 1&amp;quot; using HI by simp&lt;br /&gt;
  also have &amp;quot;... = n*n + n + n + 1&amp;quot; by (simp only: Nat.add_mult_distrib)&lt;br /&gt;
  also have &amp;quot;... = (n+1)*n + (n + 1)&amp;quot; by (simp only: Nat.add_mult_distrib)&lt;br /&gt;
  also have &amp;quot;... = (n+1)*n + (n + 1)*1&amp;quot; by (simp only: Nat.nat_mult_1_right)&lt;br /&gt;
  also have &amp;quot;... = (n+1)*(n+1)&amp;quot; by (simp only: Nat.add_mult_distrib2)&lt;br /&gt;
  finally show &amp;quot;sumaImpares (Suc n) = (Suc n)*(Suc n)&amp;quot; &lt;br /&gt;
    by (simp only: Nat.Suc_eq_plus1)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* marfruman1 raffergon2 aribatval alfmarcua cammonagu gleherlop&lt;br /&gt;
   chrgencar alikan pabbergue giafus1 antramhur *) &lt;br /&gt;
lemma &amp;quot;sumaImpares n = n*n&amp;quot;&lt;br /&gt;
proof (induct n)&lt;br /&gt;
  show &amp;quot;sumaImpares 0 = 0*0&amp;quot; by (simp only: sumaImpares.simps(1))&lt;br /&gt;
next&lt;br /&gt;
  fix n&lt;br /&gt;
  assume HI: &amp;quot;sumaImpares n = n*n&amp;quot;&lt;br /&gt;
  have &amp;quot;sumaImpares (Suc n) = sumaImpares n + 2*n +1&amp;quot; &lt;br /&gt;
    by (simp only: sumaImpares.simps(2))&lt;br /&gt;
  also have &amp;quot;... = n*n + 2*n + 1&amp;quot; using HI by simp&lt;br /&gt;
  also have &amp;quot;... = (Suc n)*(Suc n)&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;sumaImpares (Suc n) = (Suc n)*(Suc n)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2.1. Definir la función&lt;br /&gt;
     sumaPotenciasDeDosMasUno :: nat ⇒ nat&lt;br /&gt;
  tal que &lt;br /&gt;
     (sumaPotenciasDeDosMasUno n) = 1 + 2^0 + 2^1 + 2^2 + ... + 2^n. &lt;br /&gt;
  Por ejemplo, &lt;br /&gt;
     sumaPotenciasDeDosMasUno 3  =  16&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun sumaPotenciasDeDosMasUno :: &amp;quot;nat ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;sumaPotenciasDeDosMasUno 0 = 2&amp;quot;&lt;br /&gt;
| &amp;quot;sumaPotenciasDeDosMasUno (Suc n) = &lt;br /&gt;
      sumaPotenciasDeDosMasUno n + 2^(n+1)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2.2. Escribir la demostración detallada de &lt;br /&gt;
     sumaPotenciasDeDosMasUno n = 2^(n+1)&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
(* benber josgomrom4 *)&lt;br /&gt;
lemma &amp;quot;sumaPotenciasDeDosMasUno n = 2^(n+1)&amp;quot;&lt;br /&gt;
proof (induct n)&lt;br /&gt;
  have &amp;quot;sumaPotenciasDeDosMasUno 0 = 2&amp;quot; &lt;br /&gt;
    by (simp only: sumaPotenciasDeDosMasUno.simps(1))&lt;br /&gt;
  also have &amp;quot;... = 2^(0+1)&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;sumaPotenciasDeDosMasUno 0 = 2^(0+1)&amp;quot; .&lt;br /&gt;
next&lt;br /&gt;
  fix n&lt;br /&gt;
  assume HI: &amp;quot;sumaPotenciasDeDosMasUno n = 2^(n+1)&amp;quot;&lt;br /&gt;
  have &amp;quot;sumaPotenciasDeDosMasUno (Suc n) = &lt;br /&gt;
        sumaPotenciasDeDosMasUno n + 2^(n+1)&amp;quot;&lt;br /&gt;
    by (simp only: sumaPotenciasDeDosMasUno.simps(2))&lt;br /&gt;
  also have &amp;quot;... = 2^(n+1) + 2^(n+1)&amp;quot; by (simp only: HI)&lt;br /&gt;
  also have &amp;quot;... = 2 * 2^(n+1)&amp;quot; by (simp only:)&lt;br /&gt;
  also have &amp;quot;... = 2 * 2^(Suc n)&amp;quot; by (simp only: Nat.Suc_eq_plus1)&lt;br /&gt;
  also have &amp;quot;... = 2^(Suc (Suc n))&amp;quot; &lt;br /&gt;
    by (simp only: Power.power_class.power.power_Suc)&lt;br /&gt;
  also have &amp;quot;... = 2^((Suc n)+1)&amp;quot; by (simp only: Nat.Suc_eq_plus1)&lt;br /&gt;
  finally show &amp;quot;sumaPotenciasDeDosMasUno (Suc n) = 2^((Suc n)+1)&amp;quot; .&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* marfruman1 alfmarcua hugrubsan enrparalv gleherlop chrgencar&lt;br /&gt;
   juacanrod alikan *) &lt;br /&gt;
lemma &amp;quot;sumaPotenciasDeDosMasUno n = 2^(n+1)&amp;quot;&lt;br /&gt;
proof (induct n)&lt;br /&gt;
  have &amp;quot;sumaPotenciasDeDosMasUno 0 = 2&amp;quot; &lt;br /&gt;
    by (simp only: sumaPotenciasDeDosMasUno.simps(1))&lt;br /&gt;
  also have &amp;quot;... = 2^(0+1)&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;sumaPotenciasDeDosMasUno 0 = 2^(0+1)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix n&lt;br /&gt;
  assume HI: &amp;quot;sumaPotenciasDeDosMasUno n = 2^(n+1)&amp;quot;&lt;br /&gt;
  have &amp;quot;sumaPotenciasDeDosMasUno (Suc n) = &lt;br /&gt;
        sumaPotenciasDeDosMasUno n + 2^(n+1)&amp;quot;&lt;br /&gt;
    by (simp only: sumaPotenciasDeDosMasUno.simps(2))&lt;br /&gt;
  also have &amp;quot;... = 2^(n+1)+2^(n+1)&amp;quot; using HI by simp&lt;br /&gt;
  also have &amp;quot;... =2*2^(n+1)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = 2^((Suc n)+1)&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;sumaPotenciasDeDosMasUno (Suc n) = 2^((Suc n)+1)&amp;quot; &lt;br /&gt;
    by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* manperjim pabalagon raffergon2 aribatval cammonagu hugrubsan&lt;br /&gt;
   pabbergue giafus1 antramhur*) &lt;br /&gt;
lemma &amp;quot;sumaPotenciasDeDosMasUno n = 2^(n+1)&amp;quot;&lt;br /&gt;
proof (induct n)&lt;br /&gt;
  have &amp;quot;sumaPotenciasDeDosMasUno 0 = 2&amp;quot; &lt;br /&gt;
    by (simp only: sumaPotenciasDeDosMasUno.simps(1))&lt;br /&gt;
  also have &amp;quot;... = 2^1&amp;quot; by (simp only: Power.power_one_right)&lt;br /&gt;
  finally show &amp;quot;sumaPotenciasDeDosMasUno 0 = 2^(0+1)&amp;quot; &lt;br /&gt;
    by (simp only: Nat.add_0)&lt;br /&gt;
next&lt;br /&gt;
  fix n&lt;br /&gt;
  assume HI: &amp;quot;sumaPotenciasDeDosMasUno n = 2^(n+1)&amp;quot;&lt;br /&gt;
  have &amp;quot;sumaPotenciasDeDosMasUno (Suc n) = &lt;br /&gt;
        sumaPotenciasDeDosMasUno n + 2^(n+1)&amp;quot;&lt;br /&gt;
    by (simp only: sumaPotenciasDeDosMasUno.simps(2))&lt;br /&gt;
  also have &amp;quot;... = 2^(n+1) + 2^(n+1)&amp;quot; by (simp only: HI)&lt;br /&gt;
  also have &amp;quot;... = 2*2^(n+1)&amp;quot; by (simp only: Nat.add_mult_distrib)&lt;br /&gt;
  also have &amp;quot;... = 2*2^(Suc n)&amp;quot; by (simp only: Nat.Suc_eq_plus1)&lt;br /&gt;
  also have &amp;quot;... = 2^(Suc n)*2^1&amp;quot; by (simp only: Power.power_one_right)&lt;br /&gt;
  finally show &amp;quot;sumaPotenciasDeDosMasUno (Suc n) = 2^(Suc n + 1)&amp;quot; &lt;br /&gt;
    by (simp only: Power.power_add)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3.1. Definir la función&lt;br /&gt;
     copia :: nat ⇒ &amp;#039;a ⇒ &amp;#039;a list&lt;br /&gt;
  tal que (copia n x) es la lista formado por n copias del elemento&lt;br /&gt;
  x. Por ejemplo, &lt;br /&gt;
     copia 3 x = [x,x,x]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun copia :: &amp;quot;nat ⇒ &amp;#039;a ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;copia 0 x       = []&amp;quot;&lt;br /&gt;
| &amp;quot;copia (Suc n) x = x # copia n x&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3.2. Definir la función&lt;br /&gt;
     todos :: (&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (todos p xs) se verifica si todos los elementos de xs cumplen&lt;br /&gt;
  la propiedad p. Por ejemplo,&lt;br /&gt;
     todos (λx. x&amp;gt;(1::nat)) [2,6,4] = True&lt;br /&gt;
     todos (λx. x&amp;gt;(2::nat)) [2,6,4] = False&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun todos :: &amp;quot;(&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;todos p []     = True&amp;quot;&lt;br /&gt;
| &amp;quot;todos p (x#xs) = (p x ∧ todos p xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3.2. Demostrar detalladamente que todos los elementos de&lt;br /&gt;
  (copia n x) son iguales a x. &lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
(* manperjim benber raffergon2 aribatval josgomrom4 hugrubsan cammonagu&lt;br /&gt;
   gleherlop chrgencar marfruman1 pabbergue giafus1 juacanrod &lt;br /&gt;
   antramhur *)  &lt;br /&gt;
lemma &amp;quot;todos (λy. y=x) (copia n x)&amp;quot;&lt;br /&gt;
proof (induct n)&lt;br /&gt;
  fix x :: &amp;#039;a&lt;br /&gt;
  have &amp;quot;todos (λy. y=x) (copia 0 x) = todos (λy. y=x) []&amp;quot; &lt;br /&gt;
    by (simp only: copia.simps(1))&lt;br /&gt;
  also have &amp;quot;...&amp;quot; by (simp only: todos.simps(1))&lt;br /&gt;
  finally show &amp;quot;todos (λy. y = x) (copia 0 x)&amp;quot; .&lt;br /&gt;
next&lt;br /&gt;
  fix x :: &amp;#039;a&lt;br /&gt;
  fix n :: nat&lt;br /&gt;
  assume HI: &amp;quot;todos (λy. y = x) (copia n x)&amp;quot;&lt;br /&gt;
  have &amp;quot;(todos (λy. y = x) (copia (Suc n) x) ) = &lt;br /&gt;
        (todos (λy. y = x) (x # copia n x))&amp;quot;&lt;br /&gt;
    by (simp only: copia.simps(2))&lt;br /&gt;
  also have &amp;quot;... = (((λy. y = x) x ) ∧ todos (λy. y = x) (copia n x) )&amp;quot;&lt;br /&gt;
    by (simp only: todos.simps(2))&lt;br /&gt;
  also have &amp;quot;...&amp;quot; by (simp only: HI)&lt;br /&gt;
  finally show &amp;quot;todos (λy. y = x) (copia (Suc n) x)&amp;quot; .&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* pabalagon *)&lt;br /&gt;
lemma &amp;quot;todos (λy. y=x) (copia n x)&amp;quot;&lt;br /&gt;
proof (induction n)&lt;br /&gt;
  fix x:: &amp;#039;a&lt;br /&gt;
  have &amp;quot;todos (λy. y=x) (copia 0 x) = todos (λy. y=x) []&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;...&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;todos (λy. y=x) (copia 0 x)&amp;quot; .&lt;br /&gt;
next&lt;br /&gt;
  fix x:: &amp;#039;a&lt;br /&gt;
  fix n:: nat&lt;br /&gt;
  assume HI: &amp;quot;todos (λy. y=x) (copia n x)&amp;quot;&lt;br /&gt;
  have &amp;quot;todos (λy. y=x) (copia (Suc n) x) = &lt;br /&gt;
        todos (λy. y=x) (x#(copia n x))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = ((λy. y=x) x ∧ todos (λy. y=x) (copia n x))&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;todos (λy. y=x) (copia (Suc n) x)&amp;quot; using HI by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* alfmarcua *)&lt;br /&gt;
lemma &amp;quot;todos (λy. y=x) (copia n x)&amp;quot;&lt;br /&gt;
proof (induct n)&lt;br /&gt;
  have &amp;quot;todos (λy. y = x) (copia 0 x) = todos (λy. y = x) []&amp;quot; &lt;br /&gt;
    by (simp only: copia.simps(1))&lt;br /&gt;
  also have &amp;quot;...&amp;quot; by (simp only: todos.simps(1))&lt;br /&gt;
  finally show &amp;quot;todos (λy. y = x) (copia 0 x)&amp;quot; .&lt;br /&gt;
next&lt;br /&gt;
  fix n&lt;br /&gt;
  assume HI:&amp;quot;todos (λy. y = x) (copia n x)&amp;quot;&lt;br /&gt;
  have &amp;quot;(todos (λy. y = x) (copia (Suc n) x) ) = &lt;br /&gt;
        (todos (λy. y = x) (x # copia n x))&amp;quot;&lt;br /&gt;
    by (simp only: copia.simps(2))&lt;br /&gt;
  also have &amp;quot;... = ( ( (λy. y = x) x ) ∧ todos (λy. y = x) (copia n x) )&amp;quot;&lt;br /&gt;
    by (simp only: todos.simps(2))&lt;br /&gt;
  also have &amp;quot;...&amp;quot; by (simp only: HI)&lt;br /&gt;
  finally show &amp;quot;todos (λy. y = x) (copia (Suc n) x)&amp;quot; .&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4.1. Definir la función&lt;br /&gt;
    factR :: nat ⇒ nat&lt;br /&gt;
  tal que (factR n) es el factorial de n. Por ejemplo,&lt;br /&gt;
    factR 4 = 24&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun factR :: &amp;quot;nat ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;factR 0       = 1&amp;quot;&lt;br /&gt;
| &amp;quot;factR (Suc n) = Suc n * factR n&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4.2. Se considera la siguiente definición iterativa de la&lt;br /&gt;
  función factorial &lt;br /&gt;
     factI :: &amp;quot;nat ⇒ nat&amp;quot; where&lt;br /&gt;
     factI n = factI&amp;#039; n 1&lt;br /&gt;
     &lt;br /&gt;
     factI&amp;#039; :: nat ⇒ nat ⇒ nat&amp;quot; where&lt;br /&gt;
     factI&amp;#039; 0       x = x&lt;br /&gt;
     factI&amp;#039; (Suc n) x = factI&amp;#039; n (Suc n)*x&lt;br /&gt;
  Demostrar que, para todo n y todo x, se tiene &lt;br /&gt;
     factI&amp;#039; n x = x * factR n&lt;br /&gt;
  Indicación: La propiedad mult_Suc es &lt;br /&gt;
     (Suc m) * n = n + m * n&lt;br /&gt;
  Puede que se necesite desactivarla en un paso con &lt;br /&gt;
     (simp del: mult_Suc)&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
fun factI&amp;#039; :: &amp;quot;nat ⇒ nat ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;factI&amp;#039; 0       x = x&amp;quot;&lt;br /&gt;
| &amp;quot;factI&amp;#039; (Suc n) x = factI&amp;#039; n (x * Suc n)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
fun factI :: &amp;quot;nat ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;factI n = factI&amp;#039; n 1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* benber *)&lt;br /&gt;
lemma fact: &amp;quot;factI&amp;#039; n x = x * factR n&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  (* Reformulación para aplicar la hipótesis inductiva con un valor &lt;br /&gt;
     distinto de x. *)&lt;br /&gt;
  have &amp;quot;∀x. factI&amp;#039; n x = x * factR n&amp;quot;&lt;br /&gt;
  proof (induct n)&lt;br /&gt;
    show &amp;quot;∀x. factI&amp;#039; 0 x = x * factR 0&amp;quot;&lt;br /&gt;
    proof&lt;br /&gt;
      fix x&lt;br /&gt;
      have &amp;quot;factI&amp;#039; 0 x = x&amp;quot; by (simp only: factI&amp;#039;.simps(1))&lt;br /&gt;
      also have &amp;quot;... = x * 1&amp;quot; by (simp only:)&lt;br /&gt;
      also have &amp;quot;... = x * factR 0&amp;quot; by (simp only: factR.simps(1))&lt;br /&gt;
      finally show &amp;quot;factI&amp;#039; 0 x = x * factR 0&amp;quot; .&lt;br /&gt;
    qed&lt;br /&gt;
  next&lt;br /&gt;
    show &amp;quot;⋀n. ∀x. factI&amp;#039; n x = x * factR n ⟹ &lt;br /&gt;
              ∀x. factI&amp;#039; (Suc n) x = x * factR (Suc n)&amp;quot;&lt;br /&gt;
    proof&lt;br /&gt;
      fix x&lt;br /&gt;
      fix n&lt;br /&gt;
      assume HI: &amp;quot;∀y. factI&amp;#039; n y = y * factR n&amp;quot;&lt;br /&gt;
      have &amp;quot;factI&amp;#039; (Suc n) x =  factI&amp;#039; n (x * Suc n)&amp;quot; &lt;br /&gt;
        by (simp only: factI&amp;#039;.simps(2))&lt;br /&gt;
      also have &amp;quot;... = (x * Suc n) * factR n&amp;quot; by (simp only: HI)&lt;br /&gt;
      also have &amp;quot;... = x * factR (Suc n)&amp;quot; by (simp only: factR.simps(2))&lt;br /&gt;
      finally show &amp;quot;factI&amp;#039; (Suc n) x = x * factR (Suc n)&amp;quot; .&lt;br /&gt;
    qed&lt;br /&gt;
  qed&lt;br /&gt;
  thus &amp;quot;factI&amp;#039; n x = x * factR n&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* manperjim pabalagon raffergon2 aribatval josgomrom4 alfmarcua&lt;br /&gt;
   hugrubsan cammonagu marfruman1 gleherlop chrgencar pabbergue giafus1&lt;br /&gt;
   juacanrod antramhur *)  &lt;br /&gt;
lemma fact2: &amp;quot;factI&amp;#039; n x = x * factR n&amp;quot;&lt;br /&gt;
proof (induction n arbitrary: x)&lt;br /&gt;
  fix x&lt;br /&gt;
  have &amp;quot;factI&amp;#039; 0 x = x&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = x * 1&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;factI&amp;#039; 0 x = x * factR 0&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix n&lt;br /&gt;
  assume HI: &amp;quot;⋀x. factI&amp;#039; n x = x * factR n&amp;quot;&lt;br /&gt;
  show &amp;quot;⋀x. factI&amp;#039; (Suc n) x = x * factR (Suc n)&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    fix x&lt;br /&gt;
    have &amp;quot;factI&amp;#039; (Suc n) x = factI&amp;#039; n (x * Suc n)&amp;quot; &lt;br /&gt;
      by (simp only: factI&amp;#039;.simps(2))&lt;br /&gt;
    also have &amp;quot;... = x * Suc n * factR n&amp;quot; using HI by simp&lt;br /&gt;
    finally show &amp;quot;factI&amp;#039; (Suc n) x = x*factR (Suc n)&amp;quot; &lt;br /&gt;
      by (simp only: factR.simps(2))&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4.3. Escribir la demostración detallada de&lt;br /&gt;
     factI n = factR n&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
(* benber *)&lt;br /&gt;
corollary &amp;quot;factI n = factR n&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  fix n&lt;br /&gt;
  have &amp;quot;factI n = factI&amp;#039; n 1&amp;quot; by (simp only: factI.simps(1))&lt;br /&gt;
  also have &amp;quot;... = 1 * factR n&amp;quot; by (simp only: fact)&lt;br /&gt;
  also have &amp;quot;... = factR n&amp;quot; by (simp only: Groups.mult_1)&lt;br /&gt;
  finally show &amp;quot;factI n = factR n&amp;quot; .&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* manperjim pabalagon raffergon2 josgomrom4 alfmarcua hugrubsan&lt;br /&gt;
   marfruman1 gleherlop chrgencar pabbergue giafus1 juacanrod &lt;br /&gt;
   antramhur *) &lt;br /&gt;
corollary &amp;quot;factI n = factR n&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;factI n = factI&amp;#039; n 1&amp;quot; by (simp only: factI.simps(1))&lt;br /&gt;
  also have &amp;quot;... = 1*factR n&amp;quot; using fact by simp&lt;br /&gt;
  finally show &amp;quot;factI n = factR n&amp;quot; by (simp only: mult_1)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5.1. Definir, recursivamente y sin usar (@), la función&lt;br /&gt;
     amplia :: &amp;#039;a list ⇒ &amp;#039;a ⇒ &amp;#039;a list&lt;br /&gt;
  tal que (amplia xs y) es la lista obtenida añadiendo el elemento y al&lt;br /&gt;
  final de la lista xs. Por ejemplo,&lt;br /&gt;
     amplia [d,a] t = [d,a,t]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun amplia :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;amplia []     y = [y]&amp;quot;&lt;br /&gt;
| &amp;quot;amplia (x#xs) y = x # amplia xs y&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5.2. Escribir la demostración detallada de&lt;br /&gt;
     amplia xs y = xs @ [y]&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
(* benber aribatval alfmarcua giafus1 *)&lt;br /&gt;
lemma &amp;quot;amplia xs y = xs @ [y]&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  have &amp;quot;amplia [] y = [y]&amp;quot; by (simp only: amplia.simps(1))&lt;br /&gt;
  also have &amp;quot;... = [] @ [y]&amp;quot; by (simp only: List.append.left_neutral)&lt;br /&gt;
  finally show &amp;quot;amplia [] y = [] @ [y]&amp;quot; .&lt;br /&gt;
next&lt;br /&gt;
  fix x&lt;br /&gt;
  fix xs&lt;br /&gt;
  assume HI: &amp;quot;amplia xs y = xs @ [y]&amp;quot;&lt;br /&gt;
  have &amp;quot;amplia (x#xs) y = x # amplia xs y&amp;quot; by (simp only: amplia.simps(2))&lt;br /&gt;
  also have &amp;quot;... = x # (xs @ [y])&amp;quot; by (simp only: HI)&lt;br /&gt;
  also have &amp;quot;... = (x#xs) @ [y]&amp;quot; by (simp only: List.append.append_Cons)&lt;br /&gt;
  finally show &amp;quot;amplia (x#xs) y = (x#xs) @ [y]&amp;quot; .&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* marfruman1 raffergon2 enrparalv alikan gleherlop chrgencar &lt;br /&gt;
   juacanrod *)&lt;br /&gt;
lemma &amp;quot;amplia xs y = xs @ [y]&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  have &amp;quot;amplia [] y = [y]&amp;quot; by (simp only: amplia.simps(1))&lt;br /&gt;
  also have &amp;quot;... = [] @ [y]&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;amplia [] y = [] @ [y]&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x xs&lt;br /&gt;
  assume HI: &amp;quot;amplia xs y = xs @ [y]&amp;quot;&lt;br /&gt;
  have &amp;quot;amplia (x#xs) y = x# amplia xs y&amp;quot; by (simp only: amplia.simps(2))&lt;br /&gt;
  also have &amp;quot;... = x# (xs @ [y])&amp;quot; using HI by simp&lt;br /&gt;
  also have &amp;quot;... = (x#xs) @ [y]&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;amplia (x#xs) y =(x#xs) @ [y]&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* manperjim pabalagon josgomrom4 hugrubsan cammonagu pabbergue &lt;br /&gt;
   antramhur*)&lt;br /&gt;
lemma &amp;quot;amplia xs y = xs @ [y]&amp;quot;&lt;br /&gt;
proof (induction xs)&lt;br /&gt;
  have &amp;quot;amplia [] y = [y]&amp;quot; by (simp only: amplia.simps(1))&lt;br /&gt;
  show &amp;quot;amplia [] y = [] @ [y]&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume HI: &amp;quot;amplia xs y = xs @ [y]&amp;quot;&lt;br /&gt;
  have &amp;quot;amplia (a#xs) y = a # amplia xs y&amp;quot; &lt;br /&gt;
    by (simp only: amplia.simps(2))&lt;br /&gt;
  also have &amp;quot;... = a # (xs @ [y])&amp;quot; using HI by simp&lt;br /&gt;
  finally show &amp;quot;amplia (a#xs) y = (a#xs) @ [y]&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/RA2018/index.php?title=Relaci%C3%B3n_2&amp;diff=445</id>
		<title>Relación 2</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2018/index.php?title=Relaci%C3%B3n_2&amp;diff=445"/>
		<updated>2019-03-06T18:48:53Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: Protegió «Relación 2» ([Editar=Solo administradores] (indefinido) [Trasladar=Solo administradores] (indefinido))&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isabelle&amp;quot;&amp;gt;&lt;br /&gt;
chapter {* R2: Razonamiento sobre programas en Isabelle/HOL *}&lt;br /&gt;
&lt;br /&gt;
theory R2_Razonamiento_automatico_sobre_programas&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;
  Ejercicio 1.1. Definir la función&lt;br /&gt;
     sumaImpares :: nat ⇒ nat&lt;br /&gt;
  tal que (sumaImpares n) es la suma de los n primeros números&lt;br /&gt;
  impares. Por ejemplo,&lt;br /&gt;
     sumaImpares 5  =  25&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* manperjim pabalagon cammonagu juacanrod alfmarcua raffergon2&lt;br /&gt;
   hugrubsan enrparalv gleherlop chrgencar giafus1 pabbergue alikan&lt;br /&gt;
   aribatval *)  &lt;br /&gt;
fun sumaImpares :: &amp;quot;nat ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;sumaImpares 0 = 0&amp;quot; |&lt;br /&gt;
  &amp;quot;sumaImpares n = 2*n-1 + sumaImpares (n-1)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;sumaImpares 1  = 1&amp;quot;&lt;br /&gt;
value &amp;quot;sumaImpares 3  = 9&amp;quot;&lt;br /&gt;
value &amp;quot;sumaImpares 5  = 25&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* josgomrom4 marfruman1 benber antramhur *)&lt;br /&gt;
fun sumaImpares2 :: &amp;quot;nat ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;sumaImpares2 0 = 0&amp;quot; |&lt;br /&gt;
  &amp;quot;sumaImpares2 (Suc n) = 2*n + 1 + sumaImpares2 n&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;sumaImpares2 1  = 1&amp;quot;&lt;br /&gt;
value &amp;quot;sumaImpares2 3  = 9&amp;quot;&lt;br /&gt;
value &amp;quot;sumaImpares2 5  = 25&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1.2. Demostrar que &lt;br /&gt;
     sumaImpares n = n*n&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
(* manperjim pabalagon cammonagu juacanrod josgomrom4 hugrubsan&lt;br /&gt;
   enrparalv gleherlop benber chrgencar giafus1 alikan aribatval *) &lt;br /&gt;
lemma &amp;quot;sumaImpares n = n*n&amp;quot;&lt;br /&gt;
  apply (induction n)&lt;br /&gt;
   apply auto&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
(* pabalagon *)&lt;br /&gt;
lemma &amp;quot;sumaImpares n = n*n&amp;quot;&lt;br /&gt;
  apply (induction n)&lt;br /&gt;
   apply simp&lt;br /&gt;
   apply simp&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
(* pabalagon antramhur *)&lt;br /&gt;
lemma &amp;quot;sumaImpares n = n*n&amp;quot;&lt;br /&gt;
  by (induction n) simp_all&lt;br /&gt;
&lt;br /&gt;
(* alfmarcua raffergon2 marfruman1 pabbergue *)&lt;br /&gt;
lemma &amp;quot;sumaImpares n = n*n&amp;quot;&lt;br /&gt;
  by (induction n) auto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2.1. Definir la función&lt;br /&gt;
     sumaPotenciasDeDosMasUno :: nat ⇒ nat&lt;br /&gt;
  tal que &lt;br /&gt;
     (sumaPotenciasDeDosMasUno n) = 1 + 2^0 + 2^1 + 2^2 + ... + 2^n. &lt;br /&gt;
  Por ejemplo, &lt;br /&gt;
     sumaPotenciasDeDosMasUno 3  =  16&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* manperjim pabalagon cammonagu chrgencar hugrubsan gleherlop benber&lt;br /&gt;
   pabbergue aribatval *) &lt;br /&gt;
fun sumaPotenciasDeDosMasUno :: &amp;quot;nat ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;sumaPotenciasDeDosMasUno 0 = 2&amp;quot; |&lt;br /&gt;
  &amp;quot;sumaPotenciasDeDosMasUno (Suc n) = &lt;br /&gt;
     2^(n+1) + sumaPotenciasDeDosMasUno n&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;sumaPotenciasDeDosMasUno 3  =  16&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* juacanrod josgomrom4 marfruman1 antramhur *)&lt;br /&gt;
fun sumaPotenciasDeDosMasUno2 :: &amp;quot;nat ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;sumaPotenciasDeDosMasUno2 0 = 2&amp;quot; |&lt;br /&gt;
  &amp;quot;sumaPotenciasDeDosMasUno2 (Suc n) = &lt;br /&gt;
     2^(Suc n) + sumaPotenciasDeDosMasUno2 n&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;sumaPotenciasDeDosMasUno2 3  =  16&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* alfmarcua raffergon2 enrparalv alikan giafus1 *)&lt;br /&gt;
fun sumaPotenciasDeDosMasUno3 :: &amp;quot;nat ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;sumaPotenciasDeDosMasUno3 0 = 2&amp;quot; |&lt;br /&gt;
  &amp;quot;sumaPotenciasDeDosMasUno3 n = 2^n + sumaPotenciasDeDosMasUno3 (n-1)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;sumaPotenciasDeDosMasUno3 3  =  16&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2.2. Demostrar que &lt;br /&gt;
     sumaPotenciasDeDosMasUno n = 2^(n+1)&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
(* manperjim pabalagon cammonagu juacanrod alfmarcua raffergon2&lt;br /&gt;
   josgomrom4 hugrubsan enrparalv benber chrgencar gleherlop  giafus1&lt;br /&gt;
   pabbergue alikan aribatval *)  &lt;br /&gt;
lemma &amp;quot;sumaPotenciasDeDosMasUno n = 2^(n+1)&amp;quot;&lt;br /&gt;
  apply (induction n)&lt;br /&gt;
   apply auto&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
(* pabalagon antramhur *)&lt;br /&gt;
lemma &amp;quot;sumaPotenciasDeDosMasUno n = 2^(n+1)&amp;quot;&lt;br /&gt;
  by (induction n) simp_all&lt;br /&gt;
&lt;br /&gt;
(* marfruman1 *)&lt;br /&gt;
lemma &amp;quot;sumaPotenciasDeDosMasUno n = 2^(n+1)&amp;quot;&lt;br /&gt;
  by (induct n) auto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3.1. Definir la función&lt;br /&gt;
     copia :: nat ⇒ &amp;#039;a ⇒ &amp;#039;a list&lt;br /&gt;
  tal que (copia n x) es la lista formado por n copias del elemento&lt;br /&gt;
  x. Por ejemplo, &lt;br /&gt;
     copia 3 x = [x,x,x]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* manperjim pabalagon cammonagu josgomrom4 hugrubsan benber gleherlop&lt;br /&gt;
   chrgencar pabbergue alikan antramhur aribatval *) &lt;br /&gt;
fun copia :: &amp;quot;nat ⇒ &amp;#039;a ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;copia 0 x = []&amp;quot; |&lt;br /&gt;
  &amp;quot;copia (Suc n) x = x#copia n x&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;copia 3 x = [x,x,x]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* juacanrod marfruman1 *)&lt;br /&gt;
fun copia2 :: &amp;quot;nat ⇒ &amp;#039;a ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;copia2 0 x = []&amp;quot; |&lt;br /&gt;
  &amp;quot;copia2 (Suc n) x = [x] @ copia2 n x&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;copia2 3 x = [x,x,x]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* manperjim alfmarcua raffergon2 enrparalv giafus1 *)&lt;br /&gt;
fun copia3 :: &amp;quot;nat ⇒ &amp;#039;a ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;copia3 0 x = []&amp;quot; |&lt;br /&gt;
  &amp;quot;copia3 n x = x#(copia (n-1) x)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;copia3 3 x = [x,x,x]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3.2. Definir la función&lt;br /&gt;
     todos :: (&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (todos p xs) se verifica si todos los elementos de xs cumplen&lt;br /&gt;
  la propiedad p. Por ejemplo,&lt;br /&gt;
     todos (λx. x&amp;gt;(1::nat)) [2,6,4] = True&lt;br /&gt;
     todos (λx. x&amp;gt;(2::nat)) [2,6,4] = False&lt;br /&gt;
  Nota: La conjunción se representa por ∧&lt;br /&gt;
  ----------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
(* manperjim pabalagon cammonagu juacanrod alfmarcua raffergon2&lt;br /&gt;
   josgomrom4 marfruman1 hugrubsan enrparalv benber chrgencar giafus1&lt;br /&gt;
   gleherlop pabbergue alikan antramhur aribatval *)  &lt;br /&gt;
fun todos :: &amp;quot;(&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;todos p [] = True&amp;quot; |&lt;br /&gt;
  &amp;quot;todos p (x#xs) = (p x ∧ todos p xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;todos (λx. x&amp;gt;(1::nat)) [2,6,4] = True&amp;quot;&lt;br /&gt;
value &amp;quot;todos (λx. x&amp;gt;(2::nat)) [2,6,4] = False&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3.3. Demostrar que todos los elementos de (copia n x) son&lt;br /&gt;
  iguales a x. &lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
(* manperjim pabalagon cammonagu juacanrod alfmarcua raffergon2&lt;br /&gt;
   josgomrom4 hugrubsan enrparalv benber giafus1 pabbergue alikan&lt;br /&gt;
   gleherlop chrgencar aribatval *) &lt;br /&gt;
lemma &amp;quot;todos (λy. y=x) (copia n x)&amp;quot;&lt;br /&gt;
  apply (induction n)&lt;br /&gt;
   apply auto&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
(* Comentario: La demostración anterior falla para copia3. *)&lt;br /&gt;
&lt;br /&gt;
(* pabalagon antramhur *)&lt;br /&gt;
lemma &amp;quot;todos (λy. y=x) (copia n x)&amp;quot;&lt;br /&gt;
  by (induction n) simp_all&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4.1. Definir, recursivamente y sin usar (@), la función&lt;br /&gt;
     amplia :: &amp;#039;a list ⇒ &amp;#039;a ⇒ &amp;#039;a list&lt;br /&gt;
  tal que (amplia xs y) es la lista obtenida añadiendo el elemento y al&lt;br /&gt;
  final de la lista xs. Por ejemplo,&lt;br /&gt;
     amplia [d,a] t = [d,a,t]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* manperjim pabalagon cammonagu juacanrod alfmarcua raffergon2&lt;br /&gt;
   josgomrom4 marfruman1 hugrubsan enrparalv benber chrgencar gleherlop&lt;br /&gt;
   giafus1 pabbergue alikan antramhur aribatval *)  &lt;br /&gt;
fun amplia :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;amplia [] y = [y]&amp;quot; |&lt;br /&gt;
  &amp;quot;amplia (x#xs) y = x # amplia xs y&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;amplia [d,a] t = [d,a,t]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4.2. Demostrar que &lt;br /&gt;
     amplia xs y = xs @ [y]&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
(* manperjim pabalagon cammonagu juacanrod alfmarcua raffergon2&lt;br /&gt;
   josgomrom4 hugrubsan gleherlop enrparalv benber chrgencar giafus1&lt;br /&gt;
   pabbergue alikan aribatval *)  &lt;br /&gt;
lemma &amp;quot;amplia xs y = xs @ [y]&amp;quot;&lt;br /&gt;
  apply (induction xs)&lt;br /&gt;
   apply auto&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
(* pabalagon antramhur *)&lt;br /&gt;
lemma &amp;quot;amplia xs y = xs @ [y]&amp;quot;&lt;br /&gt;
  by (induction xs) simp_all&lt;br /&gt;
&lt;br /&gt;
(* marfruman1 *)&lt;br /&gt;
lemma &amp;quot;amplia xs y = xs @ [y]&amp;quot;&lt;br /&gt;
  by (induction xs) 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/RA2018/index.php?title=Relaci%C3%B3n_1&amp;diff=444</id>
		<title>Relación 1</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2018/index.php?title=Relaci%C3%B3n_1&amp;diff=444"/>
		<updated>2019-03-06T18:48:35Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: Protegió «Relación 1» ([Editar=Solo administradores] (indefinido) [Trasladar=Solo administradores] (indefinido))&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isabelle&amp;quot;&amp;gt;&lt;br /&gt;
chapter {* R1: Programación funcional en Isabelle *}&lt;br /&gt;
&lt;br /&gt;
theory R1_Programacion_funcional_en_Isabelle&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
text {* ----------------------------------------------------------------&lt;br /&gt;
  Ejercicio 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 [a,b,c] = 3&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
(* cammonagu pabalagon raffergon2 aribatval juacanrod josgomrom4&lt;br /&gt;
   marfruman1 gleherlop benber alfmarcua enrparlav manperjim chrgencar &lt;br /&gt;
   antramhur pabbergue alikan*)  &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 [a,b,c] = 3&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* hugrubsan giafus1 *)&lt;br /&gt;
fun longitud2 :: &amp;quot;&amp;#039;a list ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;longitud2 [] = 0 &amp;quot;&lt;br /&gt;
| &amp;quot;longitud2 xs = 1 + longitud2 (tl xs) &amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;longitud2 [a,b,c] = 3&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. 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;
(* manperjim pabalagon cammonagu raffergon2 aribatval juacanrod&lt;br /&gt;
   marfruman1 gleherlop benber hugrubsan alfmarcua enrparalv giafus1&lt;br /&gt;
   chrgencar antramhur alikan pabbergue *)  &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;
(* josgomrom4 *)&lt;br /&gt;
fun intercambia2 :: &amp;quot;&amp;#039;a × &amp;#039;b ⇒ &amp;#039;b × &amp;#039;a&amp;quot; where&lt;br /&gt;
  &amp;quot;intercambia2 xs = (snd xs, fst xs) &amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;intercambia2 (u,v) = (v,u)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* ---------------------------------------------------------------&lt;br /&gt;
  Ejercicio 3. 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;
(* pabalagon *)&lt;br /&gt;
fun aux :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;aux [] a     = a&amp;quot; &lt;br /&gt;
| &amp;quot;aux (x#xs) a = aux xs (x#a)&amp;quot;&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 xs = aux xs []&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;
(* manperjim pabalagon raffergon2 cammonagu josgomrom4 marfruman1&lt;br /&gt;
   gleherlop alfmarcua enrparalv chrgencar antramhur alikan pabbergue *) &lt;br /&gt;
fun inversa2 :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;inversa2 []     = []&amp;quot; &lt;br /&gt;
| &amp;quot;inversa2 (x#xs) = inversa2 xs @ [x]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;inversa2 [a,d,c] = [c,d,a]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* juacanrod hugrubsan giafus1 *)&lt;br /&gt;
fun inversa3 :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;inversa3 []   = []&amp;quot;  &lt;br /&gt;
| &amp;quot;inversa3 (xs) = inversa3(tl xs) @ [ hd (xs)]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;inversa3 [a,d,c] = [c,d,a]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* aribatval *)&lt;br /&gt;
fun inversa4 :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;inversa4 [] = []&amp;quot; &lt;br /&gt;
| &amp;quot;inversa4 xs = last xs # (inversa4 (butlast xs))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;inversa4 [a,d,c] = [c,d,a]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* benber *)&lt;br /&gt;
fun inversa5aux :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;inversa5aux [] y = [y]&amp;quot;&lt;br /&gt;
| &amp;quot;inversa5aux (x#xs) y = x#(inversa5aux xs y)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
fun inversa5 :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;inversa5 [] = []&amp;quot;&lt;br /&gt;
| &amp;quot;inversa5 (x#xs) = inversa5aux (inversa5 xs) x&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;inversa5 [a,d,c] = [c,d,a]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. 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;
(* pabalag aribatval antramhur *)&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;
(* manperjim raffergon2 cammonagu josgomrom4 marfruman1 benber alfmarcua&lt;br /&gt;
   gleherlop giafus1 chrgencar pabbergue alikan *) &lt;br /&gt;
fun repite2 :: &amp;quot;nat ⇒ &amp;#039;a ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;repite2 0 x = [] &amp;quot;&lt;br /&gt;
| &amp;quot;repite2 n x = x # repite2 (n-1) x &amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;repite2 3 a = [a,a,a]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* juacanrod hugrubsan *)&lt;br /&gt;
fun repite3 :: &amp;quot;nat ⇒ &amp;#039;a ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;repite3 0 a = []&amp;quot; &lt;br /&gt;
| &amp;quot;repite3 n a = [a] @ repite3 (n-1) a&amp;quot; &lt;br /&gt;
  &lt;br /&gt;
value &amp;quot;repite3 3 a = [a,a,a]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* enrparalv *)&lt;br /&gt;
fun repite4 :: &amp;quot;nat ⇒ &amp;#039;a ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;repite4 n x = (if n = 0 then [] else repite4 (n-1) x @ [x])&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;repite4 3 a = [a,a,a]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. 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;
(* manperjim pabalagon raffergon2 josgomrom4 aribatval gleherlop&lt;br /&gt;
   chrgencar benber antramhur*) &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;
(* cammonagu marfruman1 pabbergue *)&lt;br /&gt;
fun conc2 :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;conc2 ys []     = ys&amp;quot; |&lt;br /&gt;
  &amp;quot;conc2 xs (y#ys) = xs @y # ys&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;conc2 [a,d] [b,d,a,c] = [a,d,b,d,a,c]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* juacanrod *)&lt;br /&gt;
fun conc3 :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;conc3 [] ys = ys&amp;quot; |&lt;br /&gt;
  &amp;quot;conc3 xs ys = [hd (xs)] @ conc3 (tl (xs)) ys&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;conc3 [a,d] [b,d,a,c] = [a,d,b,d,a,c]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* hugrubsan enrparalv giafus1 alikan *)&lt;br /&gt;
fun conc4 :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;conc4 xs ys = xs @ ys&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* alfmarcua *)&lt;br /&gt;
fun conc5 :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;conc5 [] ys = ys&amp;quot;&lt;br /&gt;
| &amp;quot;conc5 xs ys = conc5 (butlast xs) ((last xs)#ys)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 6. 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;
(* pabalagon raffergon2 antramhur *)&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 0 xs           = []&amp;quot; |&lt;br /&gt;
  &amp;quot;coge n []           = []&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;
(* manperjim cammonagu josgomrom4 marfruman1 benber alfmarcua chrgencar&lt;br /&gt;
   gleherlop giafus1 pabbergue *) &lt;br /&gt;
fun coge2 :: &amp;quot;nat ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;coge2 0 xs = []&amp;quot; |&lt;br /&gt;
  &amp;quot;coge2 n [] = []&amp;quot; |&lt;br /&gt;
  &amp;quot;coge2 n (x#xs) = x # coge2 (n-1) xs&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;coge2 2 [a,c,d,b,e] = [a,c]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* juacanrod *)&lt;br /&gt;
fun coge3 :: &amp;quot;nat ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;coge3 0 xs = []&amp;quot; |&lt;br /&gt;
  &amp;quot;coge3 n xs = [hd (xs)] @ coge3 (n-1) (tl (xs))&amp;quot; &lt;br /&gt;
&lt;br /&gt;
value &amp;quot;coge3 2 [a,c,d,b,e] = [a,c]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* aribatval hugrubsan *)&lt;br /&gt;
fun coge4 :: &amp;quot;nat ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
 &amp;quot;coge4 0 xs = []&amp;quot; |&lt;br /&gt;
 &amp;quot;coge4 n [] = []&amp;quot; |&lt;br /&gt;
 &amp;quot;coge4 n xs = (hd xs) # coge4 (n-1) (tl xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;coge4 2 [a,c,d,b,e] = [a,c]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* enrparalv *)&lt;br /&gt;
fun coge5 :: &amp;quot;nat ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;coge5 n []      = []&amp;quot;&lt;br /&gt;
| &amp;quot;coge5 n (x#xs) = (if (n=0) then [] else [x] @ coge5 (n-1) xs )&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;coge5 2 [a,c,d,b,e] = [a,c]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* alikan *)&lt;br /&gt;
fun coge6 :: &amp;quot;nat ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;coge6 n [] = []&amp;quot;|&lt;br /&gt;
  &amp;quot;coge6 n (x#xs) = (case n of 0 ⇒ [] | Suc n ⇒ x # coge6 n xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;coge6 2 [a,c,d,b,e] = [a,c]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 7. 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;
(* pabalagon antramhur *)&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 0 xs           = []&amp;quot; |&lt;br /&gt;
  &amp;quot;elimina n []           = []&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;
(* manperjim raffergon2 cammonagu josgomrom4 marfruman1 benber alfmarcua&lt;br /&gt;
   enrparalv aribatval gleherlop chrgencar giafus1 pabbergue*) &lt;br /&gt;
fun elimina2 :: &amp;quot;nat ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;elimina2 0 xs     = xs&amp;quot; |&lt;br /&gt;
  &amp;quot;elimina2 n []     = []&amp;quot; |&lt;br /&gt;
  &amp;quot;elimina2 n (x#xs) = elimina2 (n-1) xs&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;elimina2 2 [a,c,d,b,e] = [d,b,e]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* juacanrod hugrubsan *)&lt;br /&gt;
fun elimina3 :: &amp;quot;nat ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;elimina3 0 xs = xs&amp;quot; |&lt;br /&gt;
  &amp;quot;elimina3 n xs = elimina3 (n-1) (tl xs)&amp;quot; &lt;br /&gt;
&lt;br /&gt;
value &amp;quot;elimina3 2 [a,c,d,b,e] = [d,b,e]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* alikan *)&lt;br /&gt;
fun elimina4 :: &amp;quot;nat ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;elimina4 n [] = []&amp;quot;|&lt;br /&gt;
  &amp;quot;elimina4 n (x#xs) = (case n of 0 ⇒ x#xs | Suc n ⇒ elimina4 n xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;elimina4 2 [a,c,d,b,e] = [d,b,e]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 8. 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 [a] = False&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* manperjim pabalagon raffergon2 josgomrom4 marfruman1 benber hugrubsan&lt;br /&gt;
   alfmarcua enrparalv aribatval chrgencar giafus1 alikan pabbergue&lt;br /&gt;
   antramhur *)  &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 xs = False&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;esVacia [a] = False&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
(* cammonagu juacanrod *)&lt;br /&gt;
fun esVacia2 :: &amp;quot;&amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;esVacia2 xs = (longitud xs = 0)&amp;quot; &lt;br /&gt;
&lt;br /&gt;
value &amp;quot;esVacia2 [a] = False&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 9. 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;
(* manperjim pabalagon cammonagu josgomrom4 marfruman1 benber alfmarcua&lt;br /&gt;
   enrparalv aribatval gleherlop chrgencar giafus1 alikan pabbergue&lt;br /&gt;
   antramhur *)  &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;
(* juacanrod *)&lt;br /&gt;
fun inversaAcAux2 :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;inversaAcAux2 [] ys = ys&amp;quot; |&lt;br /&gt;
  &amp;quot;inversaAcAux2 xs ys = inversaAcAux2 (tl xs) ([hd xs]) @ ys&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;inversaAcAux2 [a,b,c] []&amp;quot;&lt;br /&gt;
&lt;br /&gt;
fun inversaAc2 :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;inversaAc2 xs = inversaAcAux2 xs []&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;inversaAc2 [a,c,b,e] = [e,b,c,a]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* hugrubsan *)&lt;br /&gt;
fun inversaAcAux3 :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;inversaAcAux3 [] ys = ys&amp;quot;&lt;br /&gt;
  |&amp;quot;inversaAcAux3 xs ys = inversaAcAux3 (tl xs) [(hd xs)] @ ys&amp;quot;&lt;br /&gt;
&lt;br /&gt;
fun inversaAc3 :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;inversaAc3 xs =  inversaAcAux3 (tl xs) [(hd xs)]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;inversaAc3 [a,c,b,e] = [e,b,c,a]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 10. 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;
(* manperjim pabalagon raffergon2 josgomrom4 marfruman1 benber alfmarcua&lt;br /&gt;
   enrparalv aribatval gleherlop chrgencar giafus1 pabbergue antramhur&lt;br /&gt;
   alikan *)  &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;
(* cammonagu *)&lt;br /&gt;
fun sum2:: &amp;quot;nat list ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;sum2 []     = 0&amp;quot; |&lt;br /&gt;
  &amp;quot;sum2 [x]    = x&amp;quot; |&lt;br /&gt;
  &amp;quot;sum2 (x#xs) = x + sum2 xs&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;sum2 [3,2,5] = 10&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* juacanrod hugrubsan *)&lt;br /&gt;
fun sum3 :: &amp;quot;nat list ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;sum3 [] = 0&amp;quot; |&lt;br /&gt;
  &amp;quot;sum3 xs = (hd xs) + sum3 (tl xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;sum3 [3,2,5,1]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 11. 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;
(* manperjim pabalagon raffergon2 cammonagu josgomrom4 marfruman1 benber&lt;br /&gt;
   alfmarcua aribatval gleherlop chrgencar giafus1 pabbergue antramhur *) &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 (λn. Suc n) [2,3,4,5]&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
(* juacanrod *)&lt;br /&gt;
fun map2 :: &amp;quot;(&amp;#039;a ⇒ &amp;#039;b) ⇒ &amp;#039;a list ⇒ &amp;#039;b list&amp;quot; where&lt;br /&gt;
  &amp;quot;map2 f []     = []&amp;quot; |&lt;br /&gt;
  &amp;quot;map2 f (x#xs) = [(f x)] @ map2 f xs&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;map2 (λn. Suc n) [2,3,4,5]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* hugrubsan *)&lt;br /&gt;
fun map3 :: &amp;quot;(&amp;#039;a ⇒ &amp;#039;b) ⇒ &amp;#039;a list ⇒ &amp;#039;b list&amp;quot; where&lt;br /&gt;
  &amp;quot;map3 f [] = []&amp;quot; |&lt;br /&gt;
  &amp;quot;map3 f xs = f (hd xs) # map3 f (tl xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;map3 (λn. Suc n) [2,3,4,5]&amp;quot;&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/RA2018/index.php?title=Relaci%C3%B3n_7&amp;diff=439</id>
		<title>Relación 7</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2018/index.php?title=Relaci%C3%B3n_7&amp;diff=439"/>
		<updated>2019-03-04T17:22:29Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isabelle&amp;quot;&amp;gt;&lt;br /&gt;
chapter {* R7: Deducción natural de primer orden *}&lt;br /&gt;
&lt;br /&gt;
theory R7_Deduccion_natural_de_primer_orden_alu&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 &lt;br /&gt;
  continuación. *}&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;
(* benber *)&lt;br /&gt;
lemma&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 (rule ccontr)&lt;br /&gt;
  assume &amp;quot;∄x. P a ⟶ Q x&amp;quot;&lt;br /&gt;
  have &amp;quot;P a ⟶ (∃x. P a ⟶ Q x)&amp;quot;&lt;br /&gt;
  proof&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;
    moreover have &amp;quot;⋀x. Q x ⟹ ∃x&amp;#039;. P a ⟶ Q x&amp;#039;&amp;quot;&lt;br /&gt;
    proof -&lt;br /&gt;
      fix x&lt;br /&gt;
      assume &amp;quot;Q x&amp;quot;&lt;br /&gt;
      hence &amp;quot;P a ⟶ Q x&amp;quot; by (rule impI)&lt;br /&gt;
      thus &amp;quot;∃x&amp;#039;. P a ⟶ Q x&amp;#039;&amp;quot; by (rule exI)&lt;br /&gt;
    qed&lt;br /&gt;
    ultimately show &amp;quot;∃x. P a ⟶ Q x&amp;quot; by (rule exE)&lt;br /&gt;
  qed&lt;br /&gt;
  moreover note `∄x. P a ⟶ Q x`&lt;br /&gt;
  ultimately have &amp;quot;¬(P a)&amp;quot; by (rule mt)&lt;br /&gt;
  have &amp;quot;¬(P a) ⟶ (∃x. P a ⟶ Q x)&amp;quot;&lt;br /&gt;
  proof &lt;br /&gt;
    fix x&lt;br /&gt;
    assume &amp;quot;¬(P a)&amp;quot;&lt;br /&gt;
    have &amp;quot;P a ⟶ Q x&amp;quot;&lt;br /&gt;
    proof&lt;br /&gt;
      assume &amp;quot;P a&amp;quot;&lt;br /&gt;
      with `¬(P a)` have &amp;quot;False&amp;quot; by (rule notE)&lt;br /&gt;
      thus &amp;quot;Q x&amp;quot; by (rule FalseE)&lt;br /&gt;
    qed&lt;br /&gt;
    thus &amp;quot;∃x. P a ⟶ Q x&amp;quot; by (rule exI)&lt;br /&gt;
  qed&lt;br /&gt;
  moreover note `∄x. P a ⟶ Q x`&lt;br /&gt;
  ultimately have &amp;quot;¬¬(P a)&amp;quot; by (rule mt)&lt;br /&gt;
  moreover note `¬(P a)`&lt;br /&gt;
  ultimately show &amp;quot;False&amp;quot; by (rule notE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* alfmarcua *)&lt;br /&gt;
lemma ejercicio_52:&lt;br /&gt;
  &amp;quot;p ∨ ¬p&amp;quot;&lt;br /&gt;
proof (rule ccontr)&lt;br /&gt;
  assume 1: &amp;quot;¬(p ∨ ¬p)&amp;quot;&lt;br /&gt;
  have 2: &amp;quot;¬p&amp;quot; proof (rule notI)&lt;br /&gt;
    assume p hence 3: &amp;quot;p ∨ ¬p&amp;quot; by (rule disjI1)&lt;br /&gt;
    show &amp;quot;False&amp;quot; using 1 3 by (rule notE)&lt;br /&gt;
  qed&lt;br /&gt;
  have 4: &amp;quot;p ∨ ¬p&amp;quot; using 2 by (rule disjI2)&lt;br /&gt;
  show &amp;quot;False&amp;quot; using 1 4 by (rule notE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma ejercicio_1:&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 (rule disjE)&lt;br /&gt;
  show &amp;quot;P a ∨ ¬ P a&amp;quot; by (rule ejercicio_52)&lt;br /&gt;
next&lt;br /&gt;
  assume &amp;quot;P a&amp;quot;&lt;br /&gt;
  have &amp;quot;∃x. Q x&amp;quot; using assms `P a` by (rule mp)&lt;br /&gt;
  then obtain b where &amp;quot;Q b&amp;quot; by (rule exE)&lt;br /&gt;
  have &amp;quot;P a ⟹ Q b&amp;quot; using `P a` `Q b` by simp&lt;br /&gt;
  have &amp;quot;P a ⟶ Q b&amp;quot; using `P a ⟹ Q b` 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 &amp;quot;¬ P a&amp;quot;&lt;br /&gt;
  fix b&lt;br /&gt;
  have &amp;quot;P a ⟶ Q b&amp;quot;&lt;br /&gt;
  proof (rule impI)&lt;br /&gt;
    assume &amp;quot;P a&amp;quot;&lt;br /&gt;
    with `¬(P a)` have &amp;quot;False&amp;quot; by (rule notE)&lt;br /&gt;
    then show &amp;quot;Q b&amp;quot; by (rule FalseE)&lt;br /&gt;
  qed&lt;br /&gt;
  thus &amp;quot;∃x. P a ⟶ Q x&amp;quot; by (rule exI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim josgomrom4 gleherlop marfruman1 raffergon2&lt;br /&gt;
   hugrubsan pabbergue enrparalv giafus1 antramhur *) &lt;br /&gt;
lemma ejercicio_1b:&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 (rule disjE)&lt;br /&gt;
  show &amp;quot;¬P a ∨ P a&amp;quot; by (rule excluded_middle)&lt;br /&gt;
next&lt;br /&gt;
  fix b&lt;br /&gt;
  assume 3: &amp;quot;¬P a&amp;quot;&lt;br /&gt;
  have &amp;quot;P a ⟶ Q b&amp;quot; proof (rule impI)&lt;br /&gt;
    assume 4: &amp;quot;P a&amp;quot; show &amp;quot;Q b&amp;quot; using 3 4 by (rule notE)&lt;br /&gt;
  qed&lt;br /&gt;
  thus ?thesis by (rule exI)&lt;br /&gt;
next&lt;br /&gt;
  assume 1: &amp;quot;P a&amp;quot;&lt;br /&gt;
  have &amp;quot;∃x. Q x&amp;quot; using assms(1) 1 by (rule mp)&lt;br /&gt;
  then obtain b where 2: &amp;quot;Q b&amp;quot; by (rule exE)&lt;br /&gt;
  have &amp;quot;P a ⟶ Q b&amp;quot; proof (rule impI)&lt;br /&gt;
    assume &amp;quot;P a&amp;quot; show &amp;quot;Q b&amp;quot; using 2 .&lt;br /&gt;
  qed&lt;br /&gt;
  thus ?thesis by (rule exI)&lt;br /&gt;
qed&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;
(* benber *)&lt;br /&gt;
lemma&lt;br /&gt;
  assumes A1: &amp;quot;∀x y z. R x y ∧ R y z ⟶ R x z&amp;quot;&lt;br /&gt;
    and A2: &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 -&lt;br /&gt;
  {&lt;br /&gt;
    fix x y&lt;br /&gt;
    {&lt;br /&gt;
      assume &amp;quot;R x y&amp;quot;&lt;br /&gt;
      have &amp;quot;¬ (R y x)&amp;quot;&lt;br /&gt;
      proof (rule ccontr)&lt;br /&gt;
        assume &amp;quot;¬ ¬ (R y x)&amp;quot;&lt;br /&gt;
        hence &amp;quot;R y x&amp;quot; by (rule notnotD)&lt;br /&gt;
&lt;br /&gt;
        note `∀x y z. R x y ∧ R y z ⟶ R x z`&lt;br /&gt;
        moreover have &amp;quot;∀ y z. R x y ∧ R y z ⟶ R x z ⟹ False&amp;quot;&lt;br /&gt;
        proof -&lt;br /&gt;
          assume &amp;quot;∀ y z. R x y ∧ R y z ⟶ R x z&amp;quot;&lt;br /&gt;
          moreover have &amp;quot;∀ z. R x y ∧ R y z ⟶ R x z ⟹ False&amp;quot;&lt;br /&gt;
          proof -&lt;br /&gt;
            assume &amp;quot;∀ z. R x y ∧ R y z ⟶ R x z&amp;quot;&lt;br /&gt;
            moreover have &amp;quot;R x y ∧ R y x ⟶ R x x ⟹ False&amp;quot;&lt;br /&gt;
            proof -&lt;br /&gt;
              assume &amp;quot;R x y ∧ R y x ⟶ R x x&amp;quot;&lt;br /&gt;
              moreover {&lt;br /&gt;
                note `R x y`&lt;br /&gt;
                moreover note `R y x`&lt;br /&gt;
                ultimately have &amp;quot;R x y ∧ R y x&amp;quot; by (rule conjI)&lt;br /&gt;
              }&lt;br /&gt;
              ultimately have &amp;quot;R x x&amp;quot; by (rule mp)&lt;br /&gt;
&lt;br /&gt;
              note `∀x. ¬(R x x)`&lt;br /&gt;
              moreover {&lt;br /&gt;
                assume &amp;quot;¬(R x x)&amp;quot;&lt;br /&gt;
                moreover note `R x x`&lt;br /&gt;
                ultimately have &amp;quot;False&amp;quot; by (rule notE)&lt;br /&gt;
              }&lt;br /&gt;
              ultimately show &amp;quot;False&amp;quot; by (rule allE)&lt;br /&gt;
            qed&lt;br /&gt;
            ultimately show &amp;quot;False&amp;quot; by (rule allE)&lt;br /&gt;
          qed&lt;br /&gt;
          ultimately show &amp;quot;False&amp;quot; by (rule allE)&lt;br /&gt;
        qed&lt;br /&gt;
        ultimately show &amp;quot;False&amp;quot; by (rule allE)&lt;br /&gt;
      qed&lt;br /&gt;
    }&lt;br /&gt;
    hence &amp;quot;R x y ⟶ ¬ (R y x)&amp;quot; by (rule impI)&lt;br /&gt;
  }&lt;br /&gt;
  hence &amp;quot;⋀x. ∀y. R x y ⟶ ¬ (R y x)&amp;quot; by (rule allI)&lt;br /&gt;
  thus ?thesis by (rule allI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* alfmarcua marfruman1 enrparalv*)&lt;br /&gt;
lemma ejercicio_2:&lt;br /&gt;
  assumes &amp;quot;∀x y z. R x y ∧ R y z ⟶ R x z&amp;quot;&lt;br /&gt;
          &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 a&lt;br /&gt;
  show &amp;quot;∀y. R a y ⟶ ¬ R y a&amp;quot;&lt;br /&gt;
  proof (rule allI, rule impI)&lt;br /&gt;
    fix b&lt;br /&gt;
    assume &amp;quot;R a b&amp;quot;&lt;br /&gt;
    show &amp;quot;¬ R b a&amp;quot;&lt;br /&gt;
    proof (rule notI)&lt;br /&gt;
      assume &amp;quot;R b a&amp;quot;&lt;br /&gt;
      have &amp;quot;R a b ∧ R b a&amp;quot; using `R a b` `R b a` by (rule conjI)&lt;br /&gt;
      have &amp;quot;∀y z. R a y ∧ R y z ⟶ R a z&amp;quot; using assms(1) by (rule allE)&lt;br /&gt;
      then have &amp;quot;∀z. R a b ∧ R b z ⟶ R a z&amp;quot; by (rule allE)&lt;br /&gt;
      then have &amp;quot;R a b ∧ R b a ⟶ R a a&amp;quot; by (rule allE)&lt;br /&gt;
      then have &amp;quot;R a a&amp;quot; using `R a b ∧ R b a` by (rule mp)&lt;br /&gt;
      have &amp;quot;¬ (R a a)&amp;quot; using assms(2) by (rule allE)&lt;br /&gt;
      then show False using `R a a` by (rule notE)&lt;br /&gt;
    qed&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim josgomrom4 gleherlop raffergon2 hugrubsan&lt;br /&gt;
   pabbergue giafus1 antramhur *) &lt;br /&gt;
lemma ejercicio_2b:&lt;br /&gt;
  assumes &amp;quot;∀x y z. R x y ∧ R y z ⟶ R x z&amp;quot;&lt;br /&gt;
          &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 a&lt;br /&gt;
  show &amp;quot;∀y. R a y ⟶ ¬(R y a)&amp;quot;&lt;br /&gt;
  proof (rule allI)&lt;br /&gt;
    fix b&lt;br /&gt;
    have &amp;quot;∀y z. R a y ∧ R y z ⟶ R a z&amp;quot; using assms(1) by (rule allE)&lt;br /&gt;
    hence &amp;quot;∀z. R a b ∧ R b z ⟶ R a z&amp;quot; by (rule allE)&lt;br /&gt;
    hence 1: &amp;quot;R a b ∧ R b a ⟶ R a a&amp;quot; by (rule allE)&lt;br /&gt;
    have 2: &amp;quot;¬(R a a)&amp;quot; using assms(2) by (rule allE)&lt;br /&gt;
    show &amp;quot;R a b ⟶ ¬(R b a)&amp;quot; proof (rule impI)&lt;br /&gt;
      assume 3: &amp;quot;R a b&amp;quot;&lt;br /&gt;
      show &amp;quot;¬(R b a)&amp;quot;&lt;br /&gt;
      proof (rule ccontr)&lt;br /&gt;
        assume &amp;quot;¬¬R b a&amp;quot;&lt;br /&gt;
        hence 4: &amp;quot;R b a&amp;quot; by (rule notnotD)&lt;br /&gt;
        have 5: &amp;quot;R a b ∧ R b a&amp;quot; using 3 4 by (rule conjI)&lt;br /&gt;
        have 6: &amp;quot;R a a&amp;quot; using 1 5 by (rule mp)&lt;br /&gt;
        show False using 2 6 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;
(* pabalagon *)&lt;br /&gt;
lemma ejercicio_2_2: &lt;br /&gt;
  assumes &amp;quot;∀x y z. R x y ∧ R y z ⟶ R x z&amp;quot;&lt;br /&gt;
          &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 -&lt;br /&gt;
  { fix a&lt;br /&gt;
    { fix b&lt;br /&gt;
      have &amp;quot;∀y z. R a y ∧ R y z ⟶ R a z&amp;quot; using assms(1) by (rule allE)&lt;br /&gt;
      hence &amp;quot;∀z. R a b ∧ R b z ⟶ R a z&amp;quot; by (rule allE)&lt;br /&gt;
      hence 1: &amp;quot;R a b ∧ R b a ⟶ R a a&amp;quot; by (rule allE)&lt;br /&gt;
      have 2: &amp;quot;¬(R a a)&amp;quot; using assms(2) by (rule allE)&lt;br /&gt;
      have &amp;quot;R a b ⟶ ¬(R b a)&amp;quot; proof (rule impI)&lt;br /&gt;
        assume 3: &amp;quot;R a b&amp;quot;&lt;br /&gt;
        show &amp;quot;¬(R b a)&amp;quot;&lt;br /&gt;
        proof (rule ccontr)&lt;br /&gt;
          assume &amp;quot;¬¬R b a&amp;quot;&lt;br /&gt;
          hence 4: &amp;quot;R b a&amp;quot; by (rule notnotD)&lt;br /&gt;
          have 5: &amp;quot;R a b ∧ R b a&amp;quot; using 3 4 by (rule conjI)&lt;br /&gt;
          have 6: &amp;quot;R a a&amp;quot; using 1 5 by (rule mp)&lt;br /&gt;
          show False using 2 6 by (rule notE)&lt;br /&gt;
        qed&lt;br /&gt;
      qed}&lt;br /&gt;
    hence &amp;quot;∀y. R a y ⟶ ¬(R y a)&amp;quot; by (rule allI)}&lt;br /&gt;
  thus &amp;quot;∀x y. R x y ⟶ ¬(R y x)&amp;quot; by (rule allI)&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;
(* benber pabbergue*)&lt;br /&gt;
(* No es cierto si el universo consiste en más que un objeto. En ese&lt;br /&gt;
   caso, asignar la igualdad (=) a P es un contraejemplo. *)&lt;br /&gt;
&lt;br /&gt;
(* alfmarcua marfruman1 raffergon2 enrparalv*)&lt;br /&gt;
lemma ejercicio_3:&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;
(* pabalagon manperjim pabbergue josgomrom4 gleherlop hugrubsan giafus1&lt;br /&gt;
   antramhur *) &lt;br /&gt;
text{*&lt;br /&gt;
  Contraejemplo en los naturales, para todo x existe y tal que x &amp;lt; y, pero no&lt;br /&gt;
  existe y tal que para todo x, x &amp;lt; y&lt;br /&gt;
*}&lt;br /&gt;
lemma ejercicio_3: &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;
       (∃y. ∀x. P x y) ⟶ (∀x. ∃y. P x y)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* benber *)&lt;br /&gt;
lemma &amp;quot;(∃y. ∀x. P x y) ⟶ (∀x. ∃y. P x y)&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume &amp;quot;∃y. ∀x. P x y&amp;quot;&lt;br /&gt;
  moreover have &amp;quot;⋀y. ∀x. P x y ⟹ ∀x. ∃y&amp;#039;. P x y&amp;#039;&amp;quot;&lt;br /&gt;
  proof&lt;br /&gt;
    fix x y&lt;br /&gt;
    assume &amp;quot;∀x&amp;#039;. P x&amp;#039; y&amp;quot;&lt;br /&gt;
    hence &amp;quot;P x y&amp;quot; by (rule allE)&lt;br /&gt;
    thus &amp;quot;∃y&amp;#039;. P x y&amp;#039;&amp;quot; by (rule exI)&lt;br /&gt;
  qed&lt;br /&gt;
  ultimately show &amp;quot;∀x. ∃y. P x y&amp;quot; by (rule exE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* alfmarcua marfruman1 raffergon2 enrparalv *)&lt;br /&gt;
lemma ejercicio_4: &lt;br /&gt;
  &amp;quot;(∃y. ∀x. P x y) ⟶ (∀x. ∃y. P x y)&amp;quot;&lt;br /&gt;
proof (rule impI, rule allI)&lt;br /&gt;
  fix a&lt;br /&gt;
  assume &amp;quot;∃y. ∀x. P x y&amp;quot;&lt;br /&gt;
  then obtain b where &amp;quot;∀x. P x b&amp;quot; by (rule exE)&lt;br /&gt;
  then have &amp;quot;P a b&amp;quot; by (rule allE)&lt;br /&gt;
  then show &amp;quot;∃y. P a y&amp;quot; by (rule exI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim josgomrom4 gleherlop hugrubsan pabbergue&lt;br /&gt;
   antramhur *) &lt;br /&gt;
lemma ejercicio_4_2: &amp;quot;(∃y. ∀x. P x y) ⟶ (∀x. ∃y. P x y)&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume &amp;quot;∃y. ∀x. P x y&amp;quot;&lt;br /&gt;
  moreover have &amp;quot;⋀y. ∀x. P x y ⟹ ∀x. ∃y. P x y&amp;quot;&lt;br /&gt;
  proof&lt;br /&gt;
    fix x0 y0&lt;br /&gt;
    assume &amp;quot;∀x. P x y0&amp;quot;&lt;br /&gt;
    hence &amp;quot;P x0 y0&amp;quot; by (rule allE)&lt;br /&gt;
    thus &amp;quot;∃y. P x0 y&amp;quot; by (rule exI)&lt;br /&gt;
  qed&lt;br /&gt;
  ultimately show &amp;quot;∀x. ∃y. P x y&amp;quot; by (rule exE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. 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;
(* benber *)&lt;br /&gt;
lemma&lt;br /&gt;
  assumes A1: &amp;quot;∀ x. P a x x&amp;quot;&lt;br /&gt;
    and A2: &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;
  from A2&lt;br /&gt;
  have &amp;quot;∀y z. P a y z ⟶ P (f a) y (f z)&amp;quot; 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;
  moreover have &amp;quot;P a (f a) (f a)&amp;quot; using A1 by (rule allE)&lt;br /&gt;
  ultimately show &amp;quot;P (f a) (f a) (f (f a))&amp;quot; by (rule mp)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* alfmarcua enrparalv *)&lt;br /&gt;
lemma ejercicio_5:&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 (rule exI, rule mp)&lt;br /&gt;
  show &amp;quot;P a (f a) (f a)&amp;quot; using assms(1) by (rule allE)&lt;br /&gt;
next&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;
  then have &amp;quot;∀z. P a (f a) z ⟶ P (f a) (f a) (f z)&amp;quot; by (rule allE)&lt;br /&gt;
  then show &amp;quot;P a (f a) (f a) ⟶ P (f a) (f a) (f (f a))&amp;quot; by (rule allE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim josgomrom4 gleherlop marfruman1 raffergon2&lt;br /&gt;
   hugrubsan pabbergue giafus1 antramhur *) &lt;br /&gt;
lemma ejercicio_5_2:&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 (rule exI)&lt;br /&gt;
  have &amp;quot;∀y z. P a y z ⟶ P (f a) y (f z)&amp;quot; using assms(2) ..&lt;br /&gt;
  hence &amp;quot;∀z. P a (f a) z ⟶ P (f a) (f a) (f z)&amp;quot; ..&lt;br /&gt;
  hence &amp;quot;P a (f a) (f a) ⟶ P (f a) (f a) (f (f a))&amp;quot; ..&lt;br /&gt;
  moreover have &amp;quot;P a (f a) (f a)&amp;quot; using assms(1) by (rule allE)&lt;br /&gt;
  ultimately show &amp;quot;P (f a) (f a) (f (f a))&amp;quot; by (rule mp)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 6. 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;
(* benber alfmarcua giafus1 *)&lt;br /&gt;
lemma&lt;br /&gt;
  assumes &amp;quot;∀y. Q a y&amp;quot;&lt;br /&gt;
      and &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;Q a a&amp;quot; using `∀y. Q a y` by (rule allE)&lt;br /&gt;
  moreover have &amp;quot;Q a (s (s a))&amp;quot; using `∀y. Q a y` by (rule allE)&lt;br /&gt;
  ultimately show &amp;quot;Q a a ∧ Q a (s (s a))&amp;quot; by (rule conjI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim josgomrom4 gleherlop marfruman1 raffergon2&lt;br /&gt;
   hugrubsan pabbergue enrparalv antramhur *) &lt;br /&gt;
lemma ejercicio_6:&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 (rule exI)&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;
  moreover have &amp;quot;Q a (s a)&amp;quot; using assms(1) by (rule allE)&lt;br /&gt;
  ultimately have &amp;quot;Q (s a) (s (s a))&amp;quot; by (rule mp)&lt;br /&gt;
  with `Q a (s a)` show &amp;quot;Q a (s a) ∧ Q (s a) (s (s a))&amp;quot; by (rule conjI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 7. (En APLI2 el ejercicio 13 de LP) Formalizar, y demostrar&lt;br /&gt;
  la corrección, del siguiente 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;
       Or : Se aceptan órdenes del operador.&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* benber manperjim alfmarcua pabalagon marfruman1 josgomrom4 gleherlop&lt;br /&gt;
   raffergon2 hugrubsan pabbergue enrparalv giafus1 antramhur *)&lt;br /&gt;
lemma&lt;br /&gt;
  assumes &amp;quot;A ∨ P ⟶ R ∧ F&amp;quot;&lt;br /&gt;
    and &amp;quot;F ∨ N ⟶ Or&amp;quot;&lt;br /&gt;
  shows &amp;quot;A ⟶ Or&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume &amp;quot;A&amp;quot;&lt;br /&gt;
  hence &amp;quot;A ∨ P&amp;quot; by (rule disjI1)&lt;br /&gt;
  with `A ∨ P ⟶ R ∧ F` have &amp;quot;R ∧ F&amp;quot; by (rule mp)&lt;br /&gt;
  hence &amp;quot;F&amp;quot; by (rule conjunct2)&lt;br /&gt;
  hence &amp;quot;F ∨ N&amp;quot; by (rule disjI1)&lt;br /&gt;
  with `F ∨ N ⟶ Or` show &amp;quot;Or&amp;quot; by (rule mp)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 8. (En APLI2 el ejercicio 5 de LP) Formalizar, y demostrar&lt;br /&gt;
  la corrección, del siguiente argumento &lt;br /&gt;
     En cierto experimento, cuando hemos empleado un fármaco A, el&lt;br /&gt;
     paciente ha mejorado considerablemente en el caso, y sólo en el&lt;br /&gt;
     caso, en que no se haya empleado también un fármaco B. Además, o se&lt;br /&gt;
     ha empleado el fármaco A o se ha empleado el fármaco B. En&lt;br /&gt;
     consecuencia, podemos afirmar que si no hemos empleado el fármaco&lt;br /&gt;
     B, el paciente ha mejorado considerablemente. &lt;br /&gt;
  Usar A: Hemos empleado el fármaco A.&lt;br /&gt;
       B: Hemos empleado el fármaco B.&lt;br /&gt;
       M: El paciente ha mejorado notablemente.&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* benber *)&lt;br /&gt;
lemma&lt;br /&gt;
  assumes &amp;quot;A ⟶ (M ⟷ ¬B)&amp;quot;&lt;br /&gt;
    and &amp;quot;A ∨ B&amp;quot;&lt;br /&gt;
  shows &amp;quot;¬B ⟶ M&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume &amp;quot;¬B&amp;quot;&lt;br /&gt;
  note `A ∨ B`&lt;br /&gt;
  moreover {&lt;br /&gt;
    assume &amp;quot;A&amp;quot;&lt;br /&gt;
    with `A ⟶ (M ⟷ ¬B)` have &amp;quot;M ⟷ ¬B&amp;quot; by (rule mp)&lt;br /&gt;
    hence &amp;quot;¬B ⟹ M&amp;quot; by (rule iffD2)&lt;br /&gt;
    hence &amp;quot;M&amp;quot; using `¬B` .&lt;br /&gt;
  }&lt;br /&gt;
  moreover {&lt;br /&gt;
    note `¬B`&lt;br /&gt;
    moreover assume &amp;quot;B&amp;quot;&lt;br /&gt;
    ultimately have &amp;quot;M&amp;quot; by (rule notE)&lt;br /&gt;
  }&lt;br /&gt;
  ultimately show &amp;quot;M&amp;quot; by (rule disjE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* alfmarcua marfruman1 *)&lt;br /&gt;
lemma ejercicio_8:&lt;br /&gt;
  assumes &amp;quot;A ∧ ¬ B ⟶ M&amp;quot;&lt;br /&gt;
          &amp;quot;A ∨ B&amp;quot;&lt;br /&gt;
  shows &amp;quot;¬ B ⟶ M&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume &amp;quot;¬B&amp;quot;&lt;br /&gt;
  show &amp;quot;M&amp;quot; using assms(2)&lt;br /&gt;
  proof (rule disjE)&lt;br /&gt;
    assume &amp;quot;A&amp;quot;&lt;br /&gt;
    then have &amp;quot;A ∧ ¬ B&amp;quot; using `¬ B` by (rule conjI)&lt;br /&gt;
    show &amp;quot;M&amp;quot; using assms(1) `A ∧ ¬ B` by (rule mp)&lt;br /&gt;
  next&lt;br /&gt;
    assume &amp;quot;B&amp;quot;&lt;br /&gt;
    show &amp;quot;M&amp;quot; using `¬ B` `B` by (rule notE)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim josgomrom4 gleherlop raffergon2 hugrubsan&lt;br /&gt;
   pabbergue enrparalv giafus1 antramhur *) &lt;br /&gt;
lemma ejercicio_8_2:&lt;br /&gt;
  assumes &amp;quot;A ⟶ (M ⟷ ¬B)&amp;quot;&lt;br /&gt;
          &amp;quot;A ∨ B&amp;quot;&lt;br /&gt;
        shows &amp;quot;¬B ⟶ M&amp;quot;&lt;br /&gt;
using assms(2) proof (rule disjE)&lt;br /&gt;
  assume 1: A&lt;br /&gt;
  have 2: &amp;quot;M ⟷ ¬B&amp;quot; using assms(1) 1 by (rule mp)&lt;br /&gt;
  show &amp;quot;¬B ⟶ M&amp;quot; proof (rule impI)&lt;br /&gt;
    assume 3: &amp;quot;¬B&amp;quot; show M using 2 3 by (rule iffD2)&lt;br /&gt;
  qed&lt;br /&gt;
next&lt;br /&gt;
  assume 4: B&lt;br /&gt;
  show ?thesis proof (rule impI)&lt;br /&gt;
    assume &amp;quot;¬B&amp;quot; thus M using 4 by (rule notE)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 9. (En APLI2 el ejercicio 13 de LPO) Formalizar, y decidir&lt;br /&gt;
  la corrección, del siguiente argumento &lt;br /&gt;
     Toda persona pobre tiene un padre rico. Por tanto, existe una&lt;br /&gt;
     persona rica que tiene un abuelo rico.&lt;br /&gt;
  Usar R(x) para x es rico&lt;br /&gt;
       p(x) para el padre de x&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* benber *)&lt;br /&gt;
lemma&lt;br /&gt;
  assumes &amp;quot;∀x. ¬ R x ⟶ R (p x)&amp;quot;&lt;br /&gt;
  shows &amp;quot;∃x. R x ∧ R (p (p x))&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have 0: &amp;quot;p ∨ ¬ p&amp;quot; for p&lt;br /&gt;
  proof (rule ccontr)&lt;br /&gt;
    assume &amp;quot;¬ (p ∨ ¬ p)&amp;quot;&lt;br /&gt;
    moreover {&lt;br /&gt;
      have &amp;quot;p&amp;quot;&lt;br /&gt;
      proof (rule ccontr)&lt;br /&gt;
        assume &amp;quot;¬ p&amp;quot;&lt;br /&gt;
        hence &amp;quot;p ∨ ¬ p&amp;quot; by (rule disjI2)&lt;br /&gt;
        with `¬ (p ∨ ¬ p)` show &amp;quot;False&amp;quot; by (rule notE)&lt;br /&gt;
      qed&lt;br /&gt;
      hence &amp;quot;p ∨ ¬ p&amp;quot; by (rule disjI1)&lt;br /&gt;
    }&lt;br /&gt;
    ultimately show &amp;quot;False&amp;quot; by (rule notE)&lt;br /&gt;
  qed&lt;br /&gt;
&lt;br /&gt;
  have &amp;quot;¬ R x ⟶ R (p x)&amp;quot; for x using assms(1) by (rule allE)&lt;br /&gt;
  hence 1: &amp;quot;¬ R x ⟹ R (p x)&amp;quot; for x by (rule mp)&lt;br /&gt;
&lt;br /&gt;
  have 2: &amp;quot;⟦R y; ¬ R (p y)⟧ ⟹ ?thesis&amp;quot; for y&lt;br /&gt;
  proof&lt;br /&gt;
    assume &amp;quot;R y&amp;quot;&lt;br /&gt;
    assume &amp;quot;¬ R (p y)&amp;quot;&lt;br /&gt;
    hence &amp;quot;R (p (p y))&amp;quot; by (rule 1)&lt;br /&gt;
    with `R y` show &amp;quot;R y ∧ R (p (p y))&amp;quot; by (rule conjI)&lt;br /&gt;
  qed&lt;br /&gt;
&lt;br /&gt;
  have 3: &amp;quot;R y ⟹ ?thesis&amp;quot; for y&lt;br /&gt;
  proof -&lt;br /&gt;
    assume &amp;quot;R y&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    have &amp;quot;R (p y) ∨ ¬ R (p y)&amp;quot; by (rule 0)&lt;br /&gt;
    moreover {&lt;br /&gt;
      assume &amp;quot;R (p y)&amp;quot;&lt;br /&gt;
      have &amp;quot;R (p (p y)) ∨ ¬ R (p (p y))&amp;quot; by (rule 0)&lt;br /&gt;
      moreover {&lt;br /&gt;
        assume &amp;quot;R (p (p y))&amp;quot;&lt;br /&gt;
        with `R y` have &amp;quot;R y ∧ R (p (p y))&amp;quot; by (rule conjI)&lt;br /&gt;
        hence ?thesis by (rule exI)&lt;br /&gt;
      }&lt;br /&gt;
      moreover {&lt;br /&gt;
        assume &amp;quot;¬ R (p (p y))&amp;quot;&lt;br /&gt;
        with `R (p y)` have ?thesis by (rule 2)&lt;br /&gt;
      }&lt;br /&gt;
      ultimately have ?thesis by (rule disjE)&lt;br /&gt;
    }&lt;br /&gt;
    moreover {&lt;br /&gt;
      assume &amp;quot;¬ R (p y)&amp;quot;&lt;br /&gt;
      with `R y` have ?thesis by (rule 2)&lt;br /&gt;
    }&lt;br /&gt;
    ultimately show ?thesis by (rule disjE)&lt;br /&gt;
  qed&lt;br /&gt;
&lt;br /&gt;
  fix y&lt;br /&gt;
  have &amp;quot;R y ∨ ¬ R y&amp;quot; by (rule 0)&lt;br /&gt;
  moreover {&lt;br /&gt;
    assume &amp;quot;R y&amp;quot;&lt;br /&gt;
    hence ?thesis by (rule 3)&lt;br /&gt;
  }&lt;br /&gt;
  moreover {&lt;br /&gt;
    assume &amp;quot;¬ R y&amp;quot;&lt;br /&gt;
    hence &amp;quot;R (p y)&amp;quot; by (rule 1)&lt;br /&gt;
    hence ?thesis by (rule 3)&lt;br /&gt;
  }&lt;br /&gt;
  ultimately show ?thesis by (rule disjE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* alfmarcua *)&lt;br /&gt;
lemma ejercicio_9_2:&lt;br /&gt;
  assumes &amp;quot;∀ x. ¬ R x ⟶ R (p x)&amp;quot;&lt;br /&gt;
  shows &amp;quot;∃x. R x ∧ R (p (p x))&amp;quot;&lt;br /&gt;
proof (rule disjE, rule ejercicio_52)&lt;br /&gt;
  have prelemma:&amp;quot;(∃y. ¬ R (p y)) ⟶ ?thesis&amp;quot;&lt;br /&gt;
  proof (rule impI)&lt;br /&gt;
    assume &amp;quot;∃y. ¬ R (p y)&amp;quot;&lt;br /&gt;
    then obtain b where  &amp;quot;¬ R (p b)&amp;quot; by (rule exE)&lt;br /&gt;
    have &amp;quot;¬ R (p b) ⟶ R (p (p b))&amp;quot; using assms by (rule allE)&lt;br /&gt;
    then have &amp;quot;R (p (p b))&amp;quot; using `¬ R (p b)` by (rule mp)&lt;br /&gt;
    have &amp;quot;¬ R b ⟶ R (p b)&amp;quot; using assms by (rule allE)&lt;br /&gt;
    then have &amp;quot;¬¬ R b&amp;quot; using `¬ R (p b)` by (rule mt)&lt;br /&gt;
    then have &amp;quot;R b&amp;quot; by (rule notnotD)&lt;br /&gt;
    then have &amp;quot;R b ∧ R (p (p b))&amp;quot; using `R (p (p b))` by (rule conjI)&lt;br /&gt;
    then show &amp;quot;∃x. R x ∧ R (p (p x))&amp;quot; by (rule exI)&lt;br /&gt;
  qed&lt;br /&gt;
  &lt;br /&gt;
  fix a&lt;br /&gt;
  show &amp;quot;R (p a) ⟹ ?thesis&amp;quot;&lt;br /&gt;
  proof (rule disjE, rule ejercicio_52)&lt;br /&gt;
    assume &amp;quot;R (p a)&amp;quot;&lt;br /&gt;
    show &amp;quot;R (p (p a)) ⟹ ?thesis&amp;quot;&lt;br /&gt;
    proof (rule disjE, rule ejercicio_52)&lt;br /&gt;
      assume &amp;quot;R (p (p (p a)))&amp;quot;&lt;br /&gt;
      have &amp;quot;R (p a) ∧ R (p (p (p a)))&amp;quot; using `R (p a)` `R (p (p (p a)))`  by (rule conjI)&lt;br /&gt;
      then show ?thesis by (rule exI)&lt;br /&gt;
    next&lt;br /&gt;
      assume &amp;quot;¬ R (p (p (p a)))&amp;quot;&lt;br /&gt;
      then have &amp;quot;∃y. ¬ R (p y)&amp;quot; by (rule exI)&lt;br /&gt;
      show ?thesis using prelemma `∃y. ¬ R (p y)` by (rule mp)&lt;br /&gt;
    qed&lt;br /&gt;
  next&lt;br /&gt;
    assume &amp;quot;¬ R (p (p a))&amp;quot;&lt;br /&gt;
    then have &amp;quot;∃y. ¬ R (p y)&amp;quot; by (rule exI)&lt;br /&gt;
    show ?thesis using prelemma `∃y. ¬ R (p y)` by (rule mp)&lt;br /&gt;
  qed&lt;br /&gt;
&lt;br /&gt;
  assume &amp;quot;¬ R (p a)&amp;quot;&lt;br /&gt;
  then have &amp;quot;∃y. ¬ R (p y)&amp;quot; by (rule exI)&lt;br /&gt;
  show ?thesis using prelemma `∃y. ¬ R (p y)` by (rule mp)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim marfruman1 josgomrom4 gleherlop raffergon2&lt;br /&gt;
   hugrubsan pabbergue enrparalv giafus1 antramhur *) &lt;br /&gt;
lemma ejercicio_9_3:&lt;br /&gt;
  assumes &amp;quot;∀x. ¬R x ⟶ R (p x)&amp;quot;&lt;br /&gt;
  shows &amp;quot;∃x. R x ∧ R (p (p x))&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  fix y&lt;br /&gt;
  have s1: &amp;quot;⟦¬R (p y)⟧ ⟹ ?thesis&amp;quot; for y proof (rule exI)&lt;br /&gt;
    assume 2: &amp;quot;¬R (p y)&amp;quot;&lt;br /&gt;
    have &amp;quot;¬R (p y) ⟶ R (p (p y))&amp;quot; using assms(1) by (rule allE)&lt;br /&gt;
    hence 3: &amp;quot;R (p (p y))&amp;quot; using 2 by (rule mp)&lt;br /&gt;
    have &amp;quot;¬R y ⟶ R (p y)&amp;quot; using assms(1) by (rule allE)&lt;br /&gt;
    hence &amp;quot;¬¬R y&amp;quot; using 2 by (rule mt)&lt;br /&gt;
    hence &amp;quot;R y&amp;quot; by (rule notnotD)&lt;br /&gt;
    thus &amp;quot;R y ∧ R (p (p y))&amp;quot; using 3 by (rule conjI)&lt;br /&gt;
  qed&lt;br /&gt;
  have s2: &amp;quot;R y ⟹ ?thesis&amp;quot; for y proof -&lt;br /&gt;
    assume 2: &amp;quot;R y&amp;quot;&lt;br /&gt;
    have &amp;quot;¬R (p y) ∨ R (p y)&amp;quot; by (rule excluded_middle)&lt;br /&gt;
    thus ?thesis proof (rule disjE)&lt;br /&gt;
      assume 3: &amp;quot;¬R (p y)&amp;quot; thus ?thesis by (rule s1)&lt;br /&gt;
    next&lt;br /&gt;
      assume 4: &amp;quot;R (p y)&amp;quot;&lt;br /&gt;
      have &amp;quot;¬R (p (p y)) ∨ R (p (p y))&amp;quot; by (rule excluded_middle)&lt;br /&gt;
      thus ?thesis proof (rule disjE)&lt;br /&gt;
        assume &amp;quot;¬R (p (p y))&amp;quot; thus ?thesis by (rule s1)&lt;br /&gt;
      next&lt;br /&gt;
        assume &amp;quot;R (p (p y))&amp;quot;&lt;br /&gt;
        with `R y` have &amp;quot;R y ∧ R (p (p y))&amp;quot; by (rule conjI)&lt;br /&gt;
        thus ?thesis by (rule exI)&lt;br /&gt;
      qed&lt;br /&gt;
    qed&lt;br /&gt;
  qed&lt;br /&gt;
  have &amp;quot;¬R y ∨ R y&amp;quot; by (rule excluded_middle)&lt;br /&gt;
  thus ?thesis proof (rule disjE)&lt;br /&gt;
    assume 2: &amp;quot;R y&amp;quot; thus ?thesis by (rule s2)&lt;br /&gt;
  next&lt;br /&gt;
    assume 4: &amp;quot;¬R y&amp;quot;&lt;br /&gt;
    have &amp;quot;¬R y ⟶ R (p y)&amp;quot; using assms(1) by (rule allE)&lt;br /&gt;
    hence &amp;quot;R (p y)&amp;quot; using 4 by (rule mp)&lt;br /&gt;
    thus ?thesis by (rule s2)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 10. (En APLI2 el ejercicio 10 de LPO) Formalizar, y decidir&lt;br /&gt;
  la corrección, del siguiente 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;
(* benber *)&lt;br /&gt;
lemma&lt;br /&gt;
  assumes &amp;quot;∀x. Af x ⟶ (∀y. E y ⟶ Ap x y)&amp;quot;&lt;br /&gt;
    and &amp;quot;∀x. E x ⟶ ¬ Ap j x&amp;quot;&lt;br /&gt;
  shows &amp;quot;(∃x. E x ∧ N x) ⟶ ¬ Af j&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume &amp;quot;∃x. E x ∧ N x&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  show &amp;quot;¬ Af j&amp;quot;&lt;br /&gt;
  proof (rule ccontr)&lt;br /&gt;
    assume &amp;quot;¬ ¬ Af j&amp;quot;&lt;br /&gt;
    hence &amp;quot;Af j&amp;quot; by (rule notnotD)&lt;br /&gt;
&lt;br /&gt;
    note `∀x. Af x ⟶ (∀y. E y ⟶ Ap x y)`&lt;br /&gt;
    hence &amp;quot;Af j ⟶ (∀x. E x ⟶ Ap j x)&amp;quot; by (rule allE)&lt;br /&gt;
    moreover note `Af j`&lt;br /&gt;
    ultimately have &amp;quot;∀x. E x ⟶ Ap j x&amp;quot; by (rule mp)&lt;br /&gt;
&lt;br /&gt;
    note `∃x. E x ∧ N x`&lt;br /&gt;
    moreover have &amp;quot;E x ∧ N x ⟹ False&amp;quot; for x&lt;br /&gt;
    proof -&lt;br /&gt;
      assume &amp;quot;E x ∧ N x&amp;quot;&lt;br /&gt;
      hence &amp;quot;E x&amp;quot; by (rule conjunct1)&lt;br /&gt;
&lt;br /&gt;
      note `∀x. E x ⟶ Ap j x`&lt;br /&gt;
      hence &amp;quot;E x ⟶ Ap j x&amp;quot; by (rule allE)&lt;br /&gt;
      hence &amp;quot;Ap j x&amp;quot; using `E x`  by (rule mp)&lt;br /&gt;
&lt;br /&gt;
      note `∀x. E x ⟶ ¬ Ap j x`&lt;br /&gt;
      hence &amp;quot;E x ⟶ ¬ Ap j x&amp;quot; by (rule allE)&lt;br /&gt;
      hence &amp;quot;¬ Ap j x&amp;quot; using `E x` by (rule mp)&lt;br /&gt;
      thus &amp;quot;False&amp;quot; using `Ap j x` by (rule notE)&lt;br /&gt;
    qed&lt;br /&gt;
    ultimately show &amp;quot;False&amp;quot; by (rule exE)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* alfmarcua marfruman1 *)&lt;br /&gt;
lemma ejercicio_10_2:&lt;br /&gt;
  assumes &amp;quot;∀x y. Af x ∧ E y ⟶ Ap x y&amp;quot;&lt;br /&gt;
          &amp;quot;∀y. E y ⟶ ¬ Ap j y&amp;quot;&lt;br /&gt;
  shows &amp;quot;(∃y. E y ∧ N y) ⟶ ¬ Af j&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume &amp;quot;∃x. E x ∧ N x&amp;quot;&lt;br /&gt;
  then obtain a where &amp;quot;E a ∧ N a&amp;quot; by (rule exE)&lt;br /&gt;
  then have &amp;quot;E a&amp;quot; by (rule conjunct1)&lt;br /&gt;
  show &amp;quot;¬ Af j&amp;quot;&lt;br /&gt;
  proof (rule notI, rule notE)&lt;br /&gt;
    assume &amp;quot;Af j&amp;quot;&lt;br /&gt;
    then show &amp;quot;Af j ∧ E a&amp;quot; using `E a` by (rule conjI)&lt;br /&gt;
  next&lt;br /&gt;
    have &amp;quot;E a ⟶ ¬ Ap j a&amp;quot; using assms(2) by (rule allE)&lt;br /&gt;
    then have &amp;quot;¬ Ap j a&amp;quot; using `E a` by (rule mp)&lt;br /&gt;
    have &amp;quot;∀y. Af j ∧ E y ⟶ Ap j y&amp;quot; using assms(1) by (rule allE)&lt;br /&gt;
    then have &amp;quot;Af j ∧ E a ⟶ Ap j a&amp;quot; by (rule allE)&lt;br /&gt;
    then show &amp;quot;¬ (Af j ∧ E a)&amp;quot; using `¬ Ap j a` by (rule mt)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim josgomrom4 gleherlop raffergon2 hugrubsan&lt;br /&gt;
   pabbergue enrparalv giafus1 antramhur *) &lt;br /&gt;
lemma ejercicio_10_3:&lt;br /&gt;
  assumes &amp;quot;∀x y. Af x ∧ E y ⟶ Ap x y&amp;quot;&lt;br /&gt;
          &amp;quot;∀x y. x = j ∧ E y ⟶ ¬(Ap x y)&amp;quot;&lt;br /&gt;
  shows &amp;quot;(∃ x. (E x ∧ N x)) ⟶ ¬(Af j)&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume 1: &amp;quot;∃x. E x ∧ N x&amp;quot;&lt;br /&gt;
  show &amp;quot;¬(Af j)&amp;quot; proof (rule ccontr)&lt;br /&gt;
    fix a&lt;br /&gt;
    assume &amp;quot;¬¬Af j&amp;quot; hence 2: &amp;quot;Af j&amp;quot; by (rule notnotD)&lt;br /&gt;
    obtain a where 3: &amp;quot;E a ∧ N a&amp;quot; using 1 by (rule exE)&lt;br /&gt;
    hence 4: &amp;quot;E a&amp;quot; by (rule conjunct1)&lt;br /&gt;
    have 5: &amp;quot;N a&amp;quot; using 3 by (rule conjunct2)&lt;br /&gt;
    have &amp;quot;∀y. Af j ∧ E y ⟶ Ap j y&amp;quot; using assms(1) by (rule allE)&lt;br /&gt;
    hence 6: &amp;quot;Af j ∧ E a ⟶ Ap j a&amp;quot; by (rule allE)&lt;br /&gt;
    have 7: &amp;quot;Af j ∧ E a&amp;quot; using 2 4 by (rule conjI)&lt;br /&gt;
    have 8: &amp;quot;Ap j a&amp;quot; using 6 7 by (rule mp)&lt;br /&gt;
    have &amp;quot;∀y. j = j ∧ E y ⟶ ¬(Ap j y)&amp;quot; using assms(2) by (rule allE)&lt;br /&gt;
    hence 9: &amp;quot;j = j ∧ E a ⟶ ¬(Ap j a)&amp;quot; by (rule allE)&lt;br /&gt;
    have &amp;quot;j = j&amp;quot; by (rule refl)&lt;br /&gt;
    hence 10: &amp;quot;j = j ∧ E a&amp;quot; using 4 by (rule conjI)&lt;br /&gt;
    have &amp;quot;¬(Ap j a)&amp;quot; using 9 10 by (rule mp)&lt;br /&gt;
    thus False using 8 by (rule notE)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 11. Formalizar, y decidir la corrección, del siguiente&lt;br /&gt;
  argumento&lt;br /&gt;
     Ningún socio del club está en deuda con el tesorero del club. Si&lt;br /&gt;
     un socio del club no paga su cuota está en deuda con el tesorero&lt;br /&gt;
     del club. Por tanto, si el tesorero del club es socio del club,&lt;br /&gt;
     entonces paga su cuota. &lt;br /&gt;
  Usar P(x) para x es socio del club&lt;br /&gt;
       Q(x) para x paga su cuota&lt;br /&gt;
       R(x) para x está en deuda con el tesorero&lt;br /&gt;
       a    para el tesorero del club&lt;br /&gt;
   ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* benber *)&lt;br /&gt;
lemma&lt;br /&gt;
  assumes A1: &amp;quot;∀x. P x ⟶ R x&amp;quot;&lt;br /&gt;
    and A2: &amp;quot;∀x. P x ⟶ (¬(Q x) ⟶ R x)&amp;quot;&lt;br /&gt;
    and &amp;quot;¬(R a)&amp;quot;&lt;br /&gt;
  shows &amp;quot;P a ⟶ Q a&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  have &amp;quot;P a ⟶ (¬(Q a) ⟶ R a)&amp;quot; using A2 by (rule allE)&lt;br /&gt;
  moreover assume &amp;quot;P a&amp;quot;&lt;br /&gt;
  ultimately have &amp;quot;¬(Q a) ⟶ R a&amp;quot; by (rule mp)&lt;br /&gt;
&lt;br /&gt;
  show &amp;quot;Q a&amp;quot;&lt;br /&gt;
  proof (rule ccontr)&lt;br /&gt;
    assume &amp;quot;¬(Q a)&amp;quot;&lt;br /&gt;
    with `¬(Q a) ⟶ R a` have &amp;quot;R a&amp;quot; by (rule mp)&lt;br /&gt;
    with `¬(R a)` show &amp;quot;False&amp;quot; by (rule notE)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* alfmarcua *)&lt;br /&gt;
lemma ejercicio_11:&lt;br /&gt;
  assumes &amp;quot;∄x. P x ∧ R x&amp;quot;&lt;br /&gt;
          &amp;quot;∀x. P x ∧ (¬ Q x) ⟶ R x&amp;quot;&lt;br /&gt;
  shows &amp;quot;P a ⟶ Q a&amp;quot;&lt;br /&gt;
proof (rule impI, rule ccontr)&lt;br /&gt;
  assume &amp;quot;P a&amp;quot; &amp;quot;¬ Q a&amp;quot;&lt;br /&gt;
  then have &amp;quot;P a ∧ (¬ Q a)&amp;quot; by (rule conjI)&lt;br /&gt;
  have &amp;quot;P a ∧ (¬ Q a) ⟶ R a&amp;quot; using assms(2) by (rule allE)&lt;br /&gt;
  then have &amp;quot;R a&amp;quot; using `P a ∧ (¬ Q a)` by (rule mp)&lt;br /&gt;
  have &amp;quot;P a ∧ R a&amp;quot; using `P a` `R a` by (rule conjI)&lt;br /&gt;
  then have &amp;quot;∃x. P x ∧ R x&amp;quot; by (rule exI)&lt;br /&gt;
  show False using assms(1) `∃x. P x ∧ R x` by (rule notE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim marfruman1 josgomrom4 gleherlop hugrubsan&lt;br /&gt;
   pabbergue enrparalv giafus1 antramhur *) &lt;br /&gt;
lemma ejercicio_11_2:&lt;br /&gt;
  assumes &amp;quot;¬(∃x. P x ∧ R x)&amp;quot;&lt;br /&gt;
          &amp;quot;∀x. P x ∧ ¬Q x ⟶ R x&amp;quot;&lt;br /&gt;
  shows &amp;quot;P a ⟶ Q a&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume 1: &amp;quot;P a&amp;quot;&lt;br /&gt;
  show &amp;quot;Q a&amp;quot; proof (rule ccontr)&lt;br /&gt;
    assume 2: &amp;quot;¬Q a&amp;quot;&lt;br /&gt;
    have 3: &amp;quot;P a ∧ ¬Q a&amp;quot; using 1 2 by (rule conjI)&lt;br /&gt;
    have 4: &amp;quot;P a ∧ ¬ Q a ⟶R a&amp;quot; using assms(2) by (rule allE)&lt;br /&gt;
    hence 5: &amp;quot;R a&amp;quot; using 3 by (rule mp)&lt;br /&gt;
    have 6: &amp;quot;P a ∧ R a&amp;quot; using 1 5 by (rule conjI)&lt;br /&gt;
    hence 7: &amp;quot;∃x. P x ∧ R x&amp;quot; by (rule exI)&lt;br /&gt;
    show False using assms(1) 7 by (rule notE)&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/RA2018/index.php?title=Relaci%C3%B3n_8&amp;diff=422</id>
		<title>Relación 8</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2018/index.php?title=Relaci%C3%B3n_8&amp;diff=422"/>
		<updated>2019-02-28T15:52:37Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isabelle&amp;quot;&amp;gt;&lt;br /&gt;
chapter {* R8: Gramáticas libres de contexto *}&lt;br /&gt;
&lt;br /&gt;
theory R8_Gramaticas_libre_de_contexto&lt;br /&gt;
imports Main&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  En esta relación se definen dos gramáticas libres de contexto y se&lt;br /&gt;
  demuestra que son equivalentes. Además, se define por recursión una&lt;br /&gt;
  función para reconocer las palabras de la gramática y se demuestra que&lt;br /&gt;
  es correcta y completa. *}&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. Una gramática libre de contexto para las expresiones&lt;br /&gt;
  parentizadas es&lt;br /&gt;
     S ⟶ ε | &amp;#039;(&amp;#039; S &amp;#039;)&amp;#039; | SS&lt;br /&gt;
  definir inductivamente la gramática S usando A y B para &amp;#039;(&amp;#039; y &amp;#039;)&amp;#039;,&lt;br /&gt;
  respectivamente. &lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
datatype alfabeto = A | B&lt;br /&gt;
&lt;br /&gt;
inductive_set S :: &amp;quot;alfabeto list set&amp;quot; where&lt;br /&gt;
  S1: &amp;quot;[] ∈ S&amp;quot; &lt;br /&gt;
| S2: &amp;quot;w ∈ S ⟹ [A] @ w @ [B] ∈ S&amp;quot; &lt;br /&gt;
| S3: &amp;quot;v ∈ S ⟹ w ∈ S ⟹ v @ w ∈ S&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Otra gramática libre de contexto para las expresiones&lt;br /&gt;
  parentizadas es&lt;br /&gt;
     T ⟶ ε | T &amp;#039;(&amp;#039; T &amp;#039;)&amp;#039;&lt;br /&gt;
  definir inductivamente la gramática T usando A y B para &amp;#039;(&amp;#039; y &amp;#039;)&amp;#039;,&lt;br /&gt;
  respectivamente. &lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
inductive_set T :: &amp;quot;alfabeto list set&amp;quot; where&lt;br /&gt;
  T1: &amp;quot;[] ∈ T&amp;quot; &lt;br /&gt;
| T2: &amp;quot;v ∈ T ⟹ w ∈ T ⟹ v @ [A] @ w @ [B] ∈ T&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. Demostrar que T está contenido en S. &lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* benber alfmarcua antramhur *)&lt;br /&gt;
lemma T_en_S: &lt;br /&gt;
  assumes &amp;quot;w ∈ T&amp;quot;  &lt;br /&gt;
  shows   &amp;quot;w ∈ S&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;w ∈ T ⟹ w ∈ S&amp;quot;&lt;br /&gt;
  proof (induction rule: T.induct)&lt;br /&gt;
    show &amp;quot;[] ∈ S&amp;quot; by (rule S1)&lt;br /&gt;
  next&lt;br /&gt;
    fix v w&lt;br /&gt;
    assume &amp;quot;w ∈ S&amp;quot;&lt;br /&gt;
    hence &amp;quot;[A] @ w @ [B] ∈ S&amp;quot; by (rule S2)&lt;br /&gt;
    moreover assume &amp;quot;v ∈ S&amp;quot;&lt;br /&gt;
    ultimately show &amp;quot;v @ [A] @ w @ [B] ∈ S&amp;quot; using S3 by simp&lt;br /&gt;
  qed&lt;br /&gt;
  thus ?thesis using assms .&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* cammonagu *)&lt;br /&gt;
declare S1 [iff] S2[intro!,simp]&lt;br /&gt;
&lt;br /&gt;
(* cammonagu *)&lt;br /&gt;
declare T1 [iff]&lt;br /&gt;
&lt;br /&gt;
(* cammonagu *)&lt;br /&gt;
lemma T2ImpS: &amp;quot;w ∈ T ⟹ w ∈ S&amp;quot;&lt;br /&gt;
  apply (erule T.induct)&lt;br /&gt;
    apply simp&lt;br /&gt;
  apply (blast intro: S3)&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
(* cammonagu *)&lt;br /&gt;
lemma T_en_S1: &lt;br /&gt;
  assumes &amp;quot;w ∈ T&amp;quot;  &lt;br /&gt;
  shows   &amp;quot;w ∈ S&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;w ∈ T ⟹ w ∈ S&amp;quot; using assms by (rule T2ImpS)&lt;br /&gt;
  thus ?thesis using assms .&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Demostrar que S está contenido en T. &lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* benber *)&lt;br /&gt;
lemma S_en_T: &lt;br /&gt;
  &amp;quot;w ∈ S ⟹ w ∈ T&amp;quot;&lt;br /&gt;
proof (induction rule: S.induct)&lt;br /&gt;
  show &amp;quot;[] ∈ T&amp;quot; by (rule T1)&lt;br /&gt;
next&lt;br /&gt;
  fix w&lt;br /&gt;
&lt;br /&gt;
  have &amp;quot;[] ∈ T&amp;quot; by (rule T1)&lt;br /&gt;
  moreover assume &amp;quot;w ∈ T&amp;quot;&lt;br /&gt;
  ultimately have &amp;quot;[] @ [A] @ w @ [B] ∈ T&amp;quot; by (rule T2)&lt;br /&gt;
  thus &amp;quot;[A] @ w @ [B] ∈ T&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix v w&lt;br /&gt;
  assume &amp;quot;v ∈ T&amp;quot;&lt;br /&gt;
  moreover assume &amp;quot;w ∈ T&amp;quot;&lt;br /&gt;
  moreover have &amp;quot;⟦v ∈ T; w ∈ T⟧ ⟹ v @ w ∈ T&amp;quot; for v w&lt;br /&gt;
  proof (induction &amp;quot;length w + length v&amp;quot; &lt;br /&gt;
         arbitrary: w v &lt;br /&gt;
         rule: less_induct)&lt;br /&gt;
    case IH: less&lt;br /&gt;
&lt;br /&gt;
    show &amp;quot;v @ w ∈ T&amp;quot;&lt;br /&gt;
    proof (cases w rule: T.cases)&lt;br /&gt;
      show &amp;quot;w ∈ T&amp;quot; using `w ∈ T`.&lt;br /&gt;
    next&lt;br /&gt;
      assume &amp;quot;w = []&amp;quot;&lt;br /&gt;
      thus &amp;quot;v @ w ∈ T&amp;quot; using `v ∈ T` by simp&lt;br /&gt;
    next&lt;br /&gt;
      fix w1 w2&lt;br /&gt;
      assume &amp;quot;w1 ∈ T&amp;quot; and &amp;quot;w2 ∈ T&amp;quot;&lt;br /&gt;
      assume &amp;quot;w = w1 @ [A] @ w2 @ [B]&amp;quot;&lt;br /&gt;
      hence 1: &amp;quot;v @ w = v @ w1 @ [A] @ w2 @ [B]&amp;quot; by simp&lt;br /&gt;
&lt;br /&gt;
      have &amp;quot;length w1 &amp;lt; length w&amp;quot; using `w = w1 @ [A] @ w2 @ [B]` &lt;br /&gt;
        by simp&lt;br /&gt;
      hence &amp;quot;length v + length w1 &amp;lt; length v + length w&amp;quot; by simp&lt;br /&gt;
      moreover note `v ∈ T`&lt;br /&gt;
      moreover note `w1 ∈ T`&lt;br /&gt;
      ultimately have &amp;quot;v @ w1 ∈ T&amp;quot; using IH by simp&lt;br /&gt;
      moreover note `w2 ∈ T`&lt;br /&gt;
      ultimately have &amp;quot;(v @ w1) @ [A] @ w2 @ [B] ∈ T&amp;quot; by (rule T2)&lt;br /&gt;
      thus &amp;quot;v @ w ∈ T&amp;quot; using 1 by simp&lt;br /&gt;
    qed&lt;br /&gt;
  qed&lt;br /&gt;
  ultimately show &amp;quot;v @ w ∈ T&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* alfmarcua antramhur *)&lt;br /&gt;
lemma S_en_T_2: &lt;br /&gt;
  &amp;quot;w ∈ S ⟹ w ∈ T&amp;quot;&lt;br /&gt;
proof (induction rule: S.induct)&lt;br /&gt;
  show &amp;quot;[] ∈ T&amp;quot; by (rule T1)&lt;br /&gt;
next&lt;br /&gt;
  fix w&lt;br /&gt;
  assume &amp;quot;w ∈ T&amp;quot;&lt;br /&gt;
  have &amp;quot;[] @ [A] @ w @ [B] ∈ T&amp;quot; using T1 `w ∈ T` by (rule T2)&lt;br /&gt;
  then show &amp;quot;[A] @ w @ [B] ∈ T&amp;quot; by (simp only: List.append.append_Nil)&lt;br /&gt;
next&lt;br /&gt;
  fix w v&lt;br /&gt;
  assume &amp;quot;v ∈ T&amp;quot;&lt;br /&gt;
  show &amp;quot;w ∈ T ⟹ v @ w ∈ T&amp;quot;&lt;br /&gt;
  proof (induction rule: T.induct)&lt;br /&gt;
    show &amp;quot;v @ [] ∈ T&amp;quot; using `v ∈ T` &lt;br /&gt;
      by (simp only: List.append.right_neutral)&lt;br /&gt;
  next&lt;br /&gt;
    fix va w&lt;br /&gt;
    have &amp;quot;v @ va ∈ T ⟹ w ∈ T ⟹ (v @ va) @ [A] @ w @ [B] ∈ T &amp;quot; &lt;br /&gt;
      by (rule T2)&lt;br /&gt;
    then show &amp;quot;v @ va ∈ T ⟹ w ∈ T ⟹ v @ va @ [A] @ w @ [B] ∈ T &amp;quot; &lt;br /&gt;
      by (simp only: List.append_assoc)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Demostrar que S y T son iguales. &lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* benber cammonagu antramhur *)&lt;br /&gt;
lemma S_igual_T:&lt;br /&gt;
  &amp;quot;S = T&amp;quot;&lt;br /&gt;
  using T_en_S S_en_T by auto&lt;br /&gt;
&lt;br /&gt;
(* alfmarcua *)&lt;br /&gt;
lemma S_igual_T_2:&lt;br /&gt;
  &amp;quot;S = T&amp;quot;&lt;br /&gt;
proof (rule equalityI)&lt;br /&gt;
  show &amp;quot;S ⊆ T&amp;quot; using S_en_T by (rule subsetI)&lt;br /&gt;
next&lt;br /&gt;
  show &amp;quot;T ⊆ S&amp;quot; using T_en_S by (rule subsetI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. En lugar de una gramática, se puede usar el siguiente&lt;br /&gt;
  procedimiento para determinar si la cadena es una sucesión de&lt;br /&gt;
  paréntesis bien balanceada: se recorre la cadena de izquierda a&lt;br /&gt;
  derecha contando cuántos paréntesis de necesitan para que esté bien&lt;br /&gt;
  balanceada. Si el contador al final de la cadena es 0, la cadena está&lt;br /&gt;
  bien balanceada.&lt;br /&gt;
&lt;br /&gt;
  Definir la función&lt;br /&gt;
     balanceada :: alfabeto list ⇒ bool&lt;br /&gt;
  tal que (balanceada w) se verifica si w está bien balanceada. Por&lt;br /&gt;
  ejemplo, &lt;br /&gt;
     balanceada [A,A,B,B] = True&lt;br /&gt;
     balanceada [A,B,A,B] = True&lt;br /&gt;
     balanceada [A,B,B,A] = False&lt;br /&gt;
  Indicación: Definir balanceada  usando la función auxiliar &lt;br /&gt;
     balanceada_aux :: alfabeto list ⇒ nat ⇒ bool&lt;br /&gt;
  tal que (balanceada_aux w 0) se verifica si w está bien balanceada.&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* benber alfmarcua antramhur *)&lt;br /&gt;
(* balanceada_aux w n = True si y solo si ([A]*n) @ w es balanceada *)&lt;br /&gt;
fun balanceada_aux :: &amp;quot;alfabeto list ⇒ nat ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;balanceada_aux [] 0 = True&amp;quot;&lt;br /&gt;
| &amp;quot;balanceada_aux [] (Suc n) = False&amp;quot;&lt;br /&gt;
| &amp;quot;balanceada_aux (B#w) 0 = False&amp;quot;&lt;br /&gt;
| &amp;quot;balanceada_aux (B#w) (Suc n) = balanceada_aux w n&amp;quot;&lt;br /&gt;
| &amp;quot;balanceada_aux (A#w) n = balanceada_aux w (Suc n)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
fun balanceada :: &amp;quot;alfabeto list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;balanceada w = balanceada_aux w 0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 6. Demostrar que balanceada es un reconocedor correcto de la&lt;br /&gt;
  gramática S; es decir, &lt;br /&gt;
     w ∈ S ⟹ balanceada w&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* benber *)&lt;br /&gt;
lemma balanceada_correcto_aux1: &lt;br /&gt;
  &amp;quot;balanceada_aux w n ⟹ balanceada_aux (w @ [B]) (Suc n)&amp;quot;&lt;br /&gt;
proof (induction w arbitrary: n)&lt;br /&gt;
  case Nil&lt;br /&gt;
  assume &amp;quot;balanceada_aux [] n&amp;quot;&lt;br /&gt;
  thus ?case by simp&lt;br /&gt;
next&lt;br /&gt;
  case IS: (Cons x w)&lt;br /&gt;
  show ?case&lt;br /&gt;
  proof (cases x)&lt;br /&gt;
    case A&lt;br /&gt;
    note `balanceada_aux (x#w) n`&lt;br /&gt;
    hence &amp;quot;balanceada_aux (A#w) n&amp;quot; using `x = A` by simp&lt;br /&gt;
    hence &amp;quot;balanceada_aux w (Suc n)&amp;quot; by simp&lt;br /&gt;
    hence &amp;quot;balanceada_aux (w@[B]) (Suc (Suc n))&amp;quot; using IS.IH by simp&lt;br /&gt;
    hence &amp;quot;balanceada_aux ((A#w)@[B]) (Suc n)&amp;quot; by simp&lt;br /&gt;
    thus ?thesis using `x = A` by simp&lt;br /&gt;
  next&lt;br /&gt;
    case B&lt;br /&gt;
    hence 1: &amp;quot;balanceada_aux (B#w) n&amp;quot; using IS.prems by simp&lt;br /&gt;
&lt;br /&gt;
    show ?thesis&lt;br /&gt;
    proof (cases n)&lt;br /&gt;
      case 0&lt;br /&gt;
      hence &amp;quot;balanceada_aux (B#w) 0&amp;quot; using 1 by simp&lt;br /&gt;
      hence &amp;quot;False&amp;quot; by simp&lt;br /&gt;
      thus ?thesis ..&lt;br /&gt;
    next&lt;br /&gt;
      case (Suc m)&lt;br /&gt;
      hence &amp;quot;balanceada_aux (B#w) (Suc m)&amp;quot; using 1 by simp&lt;br /&gt;
      hence &amp;quot;balanceada_aux w m&amp;quot; by simp&lt;br /&gt;
      hence &amp;quot;balanceada_aux (w@[B]) (Suc m)&amp;quot; using IS.IH by simp&lt;br /&gt;
      hence &amp;quot;balanceada_aux (w@[B]) n&amp;quot; using `n = Suc m` by simp&lt;br /&gt;
      hence &amp;quot;balanceada_aux (B#(w@[B])) (Suc n)&amp;quot; by simp&lt;br /&gt;
      thus ?thesis using `x = B` by simp&lt;br /&gt;
    qed&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma balanceada_correcto_aux2:&lt;br /&gt;
  assumes &amp;quot;balanceada v&amp;quot;&lt;br /&gt;
  shows &amp;quot;balanceada_aux w n ⟹ balanceada_aux (w @ v) n&amp;quot;&lt;br /&gt;
proof (induction w arbitrary: n)&lt;br /&gt;
  case Nil&lt;br /&gt;
  hence &amp;quot;n = 0&amp;quot; using balanceada_aux.elims by auto&lt;br /&gt;
  thus ?case using assms by simp&lt;br /&gt;
next&lt;br /&gt;
  case IS: (Cons x w)&lt;br /&gt;
  show &amp;quot;balanceada_aux ((x#w)@v) n&amp;quot;&lt;br /&gt;
  proof (cases x)&lt;br /&gt;
    case A&lt;br /&gt;
    hence &amp;quot;balanceada_aux (A#w) n&amp;quot; using IS.prems by simp&lt;br /&gt;
    hence &amp;quot;balanceada_aux w (Suc n)&amp;quot; by simp&lt;br /&gt;
    hence &amp;quot;balanceada_aux (w@v) (Suc n)&amp;quot; using IS.IH by simp&lt;br /&gt;
    hence &amp;quot;balanceada_aux (A#(w@v)) n&amp;quot; by simp&lt;br /&gt;
    thus ?thesis using `x = A` by simp&lt;br /&gt;
  next&lt;br /&gt;
    case B&lt;br /&gt;
    hence 1: &amp;quot;balanceada_aux (B#w) n&amp;quot; using IS.prems by simp&lt;br /&gt;
&lt;br /&gt;
    show ?thesis&lt;br /&gt;
    proof (cases n)&lt;br /&gt;
      case 0&lt;br /&gt;
      hence &amp;quot;balanceada_aux (B#w) 0&amp;quot; using 1 by simp&lt;br /&gt;
      hence &amp;quot;False&amp;quot; by simp&lt;br /&gt;
      thus ?thesis ..&lt;br /&gt;
    next&lt;br /&gt;
      case (Suc m)&lt;br /&gt;
      hence &amp;quot;balanceada_aux (B#w) (Suc m)&amp;quot; using 1 by simp&lt;br /&gt;
      hence &amp;quot;balanceada_aux w m&amp;quot; by simp&lt;br /&gt;
      hence &amp;quot;balanceada_aux (w@v) m&amp;quot; using IS.IH by simp&lt;br /&gt;
      hence &amp;quot;balanceada_aux (B#(w@v)) (Suc m)&amp;quot; by simp&lt;br /&gt;
      thus ?thesis using `x = B` `n = Suc m` by simp&lt;br /&gt;
    qed&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma balanceada_correcto:&lt;br /&gt;
  &amp;quot;w ∈ S ⟹ balanceada w&amp;quot;&lt;br /&gt;
proof (induction rule: S.induct)&lt;br /&gt;
  case S1&lt;br /&gt;
  have &amp;quot;balanceada [] = balanceada_aux [] 0&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;...&amp;quot; by simp&lt;br /&gt;
  finally show ?case.&lt;br /&gt;
next&lt;br /&gt;
  case S2&lt;br /&gt;
  fix w&lt;br /&gt;
  assume &amp;quot;balanceada w&amp;quot;&lt;br /&gt;
  hence &amp;quot;balanceada_aux w 0&amp;quot; by simp&lt;br /&gt;
  hence &amp;quot;balanceada_aux (w@[B]) 1&amp;quot; using balanceada_correcto_aux1 &lt;br /&gt;
    by simp&lt;br /&gt;
  hence &amp;quot;balanceada_aux ([A] @ w @ [B]) 0&amp;quot; by simp&lt;br /&gt;
  thus &amp;quot;balanceada ([A] @ w @ [B])&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  case S3&lt;br /&gt;
  thus ?case using balanceada_correcto_aux2 by auto&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* alfmarcua antramhur *)&lt;br /&gt;
lemma balanceada_correcto_aux3:&lt;br /&gt;
  shows &amp;quot;balanceada_aux v m ⟹ &lt;br /&gt;
         balanceada_aux w n ⟹ &lt;br /&gt;
         balanceada_aux (v @ w) (m+n)&amp;quot;&lt;br /&gt;
proof (induction v arbitrary: n m)&lt;br /&gt;
  case Nil&lt;br /&gt;
  then show ?case &lt;br /&gt;
  proof (cases m)&lt;br /&gt;
    case 0&lt;br /&gt;
    then have &amp;quot;balanceada_aux w (m + n)&amp;quot; using Nil.prems(2) &lt;br /&gt;
      by (simp only:Groups.monoid_add_class.add.left_neutral)&lt;br /&gt;
    then show ?thesis  by (simp only:List.append.append_Nil)&lt;br /&gt;
  next&lt;br /&gt;
    case (Suc mm)&lt;br /&gt;
    then have &amp;quot;False&amp;quot; using Nil.prems(1) &lt;br /&gt;
      by (simp only: balanceada_aux.simps(2))&lt;br /&gt;
    then show ?thesis ..&lt;br /&gt;
  qed&lt;br /&gt;
next&lt;br /&gt;
  case IS:(Cons a v)&lt;br /&gt;
  show &amp;quot;balanceada_aux ((a # v) @ w) (m + n)&amp;quot;&lt;br /&gt;
  proof (cases a)&lt;br /&gt;
    define k :: nat where &amp;quot;k = m + 1&amp;quot;&lt;br /&gt;
    case A&lt;br /&gt;
    then have &amp;quot;balanceada_aux v k&amp;quot; using `k = m + 1` IS.prems(1) &lt;br /&gt;
      by simp&lt;br /&gt;
    then have &amp;quot;balanceada_aux (v @ w) (k + n)&amp;quot; using IS.prems(2)  &lt;br /&gt;
      by (rule IS.IH)&lt;br /&gt;
    then have &amp;quot;balanceada_aux (v @ w) (Suc(m + n))&amp;quot; using `k = m + 1` &lt;br /&gt;
      by simp&lt;br /&gt;
    then have &amp;quot;balanceada_aux (A # (v @ w)) (m + n)&amp;quot; &lt;br /&gt;
      by (simp only: balanceada_aux.simps(5))&lt;br /&gt;
    then show ?thesis using `a = A` &lt;br /&gt;
      by (simp only:List.append.append_Cons)&lt;br /&gt;
  next&lt;br /&gt;
    case B&lt;br /&gt;
    then show ?thesis&lt;br /&gt;
    proof (cases m)&lt;br /&gt;
      case 0&lt;br /&gt;
      then have &amp;quot;False&amp;quot; using IS.prems(1) `a = B` &lt;br /&gt;
        by (simp only: balanceada_aux.simps(3))&lt;br /&gt;
      then show ?thesis ..&lt;br /&gt;
    next&lt;br /&gt;
      case (Suc mm)&lt;br /&gt;
      hence &amp;quot;balanceada_aux v mm&amp;quot; using IS.prems(1) `a = B` &lt;br /&gt;
        by (simp only: balanceada_aux.simps(4))&lt;br /&gt;
      then have &amp;quot;balanceada_aux (v @ w) (mm + n)&amp;quot; using IS.prems(2) &lt;br /&gt;
        by (rule IS.IH)&lt;br /&gt;
      then have &amp;quot;balanceada_aux (B # (v @ w)) (Suc (mm + n))&amp;quot; &lt;br /&gt;
        by (simp only: balanceada_aux.simps(4))&lt;br /&gt;
      then have &amp;quot;balanceada_aux (B # (v @ w)) (m + n)&amp;quot; &lt;br /&gt;
        using `m = Suc mm` by (simp only: Nat.plus_nat.add_Suc)&lt;br /&gt;
      then show ?thesis using `a=B`  &lt;br /&gt;
        by (simp only:List.append.append_Cons)&lt;br /&gt;
    qed&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma balanceada_correcto_2:&lt;br /&gt;
  &amp;quot;w ∈ S ⟹ balanceada w&amp;quot;&lt;br /&gt;
proof (induction rule: S.induct)&lt;br /&gt;
  case S1&lt;br /&gt;
  have &amp;quot;balanceada_aux [] 0&amp;quot; by (simp only: balanceada_aux.simps(1))&lt;br /&gt;
  then show ?case by (simp only: balanceada.simps)&lt;br /&gt;
next&lt;br /&gt;
  case (S2 w)&lt;br /&gt;
  then have 1:&amp;quot;balanceada_aux w 0&amp;quot; by (simp only: balanceada.simps)&lt;br /&gt;
  have &amp;quot;balanceada_aux [] 0&amp;quot; by (simp only: balanceada_aux.simps(1))&lt;br /&gt;
  then have 2:&amp;quot;balanceada_aux (B#[]) (Suc 0)&amp;quot; &lt;br /&gt;
    by (simp only: balanceada_aux.simps(4))&lt;br /&gt;
  have &amp;quot;balanceada_aux w 0 ⟹ &lt;br /&gt;
        balanceada_aux [B] (Suc 0) ⟹  &lt;br /&gt;
        balanceada_aux (w @ [B]) (0+Suc 0)&amp;quot; &lt;br /&gt;
    by (rule balanceada_correcto_aux3)&lt;br /&gt;
  then have &amp;quot;balanceada_aux (w @ [B]) (Suc 0)&amp;quot; using 1 2 &lt;br /&gt;
    by (simp only:Groups.monoid_add_class.add.left_neutral)&lt;br /&gt;
  then have &amp;quot;balanceada_aux (A # (w @ [B])) 0&amp;quot; &lt;br /&gt;
    by (simp only: balanceada_aux.simps(5))&lt;br /&gt;
  then have &amp;quot;balanceada_aux ([A] @ w @ [B]) 0&amp;quot; &lt;br /&gt;
    by (simp only: List.append_Cons List.append_Nil)&lt;br /&gt;
  then show ?case by (simp only: balanceada.simps)&lt;br /&gt;
next&lt;br /&gt;
  case (S3 v w)&lt;br /&gt;
  then have 1:&amp;quot;balanceada_aux w 0&amp;quot; by (simp only: balanceada.simps)&lt;br /&gt;
  have 2:&amp;quot;balanceada_aux v 0&amp;quot; using S3(3) &lt;br /&gt;
    by (simp only: balanceada.simps)&lt;br /&gt;
  have &amp;quot;balanceada_aux v 0 ⟹ &lt;br /&gt;
        balanceada_aux w 0 ⟹  &lt;br /&gt;
        balanceada_aux (v @ w) (0+0)&amp;quot; &lt;br /&gt;
    by (rule balanceada_correcto_aux3)&lt;br /&gt;
  then have &amp;quot;balanceada_aux (v @ w) 0&amp;quot; using 1 2 &lt;br /&gt;
    by (simp only:Groups.monoid_add_class.add.right_neutral)&lt;br /&gt;
  then show ?case by (simp only: balanceada.simps)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 7. Demostrar que balanceada es un reconocedor completo de &lt;br /&gt;
  la gramática S; es decir, &lt;br /&gt;
     balanceada w ⟹ w ∈ S &lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* benber *)&lt;br /&gt;
lemma balanceada_aux_unico: &lt;br /&gt;
  &amp;quot;⟦balanceada_aux w k; balanceada_aux w l⟧ ⟹ k = l&amp;quot; for w k l&lt;br /&gt;
proof (induction w arbitrary: k l)&lt;br /&gt;
  case Nil&lt;br /&gt;
  hence &amp;quot;k = 0 ∧ l = 0&amp;quot; using balanceada_aux.elims by auto&lt;br /&gt;
  thus ?case by simp&lt;br /&gt;
next&lt;br /&gt;
  case IS: (Cons x w&amp;#039;)&lt;br /&gt;
  show ?case&lt;br /&gt;
  proof (cases x)&lt;br /&gt;
    case A&lt;br /&gt;
    thus ?thesis using IS by auto&lt;br /&gt;
  next&lt;br /&gt;
    case B&lt;br /&gt;
    show ?thesis&lt;br /&gt;
    proof (cases k)&lt;br /&gt;
      case 0&lt;br /&gt;
      hence &amp;quot;False&amp;quot; using IS.prems `x = B` by simp&lt;br /&gt;
      thus ?thesis ..&lt;br /&gt;
    next&lt;br /&gt;
      case (Suc k&amp;#039;)&lt;br /&gt;
      hence &amp;quot;balanceada_aux w&amp;#039; k&amp;#039;&amp;quot; using IS.prems `x = B` by simp&lt;br /&gt;
&lt;br /&gt;
      show ?thesis&lt;br /&gt;
      proof (cases l)&lt;br /&gt;
        case 0&lt;br /&gt;
        hence &amp;quot;False&amp;quot; using IS.prems `x = B` by simp&lt;br /&gt;
        thus ?thesis ..&lt;br /&gt;
      next&lt;br /&gt;
        case (Suc l&amp;#039;)&lt;br /&gt;
        hence &amp;quot;balanceada_aux w&amp;#039; l&amp;#039;&amp;quot; using IS.prems `x = B` by simp&lt;br /&gt;
        thus ?thesis &lt;br /&gt;
          using `balanceada_aux w&amp;#039; k&amp;#039;` IS.IH `k = Suc k&amp;#039;` `l = Suc l&amp;#039;` &lt;br /&gt;
          by auto&lt;br /&gt;
      qed&lt;br /&gt;
    qed&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma balanceada_completo_aux1:&lt;br /&gt;
  &amp;quot;⟦balanceada (x # w @ [y]); &lt;br /&gt;
    ⋀u v. u ≠ [] ∧ v ≠ [] ∧ u @ v = x # w @ [y] ⟶ ¬ (balanceada v)⟧&lt;br /&gt;
    ⟹ x = A ∧ y = B ∧ balanceada w&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  assume &amp;quot;balanceada (x # w @ [y])&amp;quot;&lt;br /&gt;
  hence bal: &amp;quot;balanceada_aux ( x # w @ [y] ) 0&amp;quot; by simp&lt;br /&gt;
&lt;br /&gt;
  assume postfix_con: &amp;quot;⋀u v. u ≠ [] ∧ v ≠ [] ∧ u @ v = x # w @ [y] ⟶ &lt;br /&gt;
                             ¬ (balanceada v)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  have &amp;quot;x = A&amp;quot;&lt;br /&gt;
  proof (rule ccontr)&lt;br /&gt;
    assume &amp;quot;x ≠ A&amp;quot;&lt;br /&gt;
    hence &amp;quot;x = B&amp;quot; using alfabeto.exhaust by blast&lt;br /&gt;
    thus &amp;quot;False&amp;quot; using bal by simp&lt;br /&gt;
  qed&lt;br /&gt;
&lt;br /&gt;
  have hl1: &amp;quot;balanceada_aux (w @ [y]) n ⟹ y = B&amp;quot; for w y n&lt;br /&gt;
  proof (induction w arbitrary: n)&lt;br /&gt;
    case IB: Nil&lt;br /&gt;
    show &amp;quot;y = B&amp;quot;&lt;br /&gt;
    proof (rule ccontr)&lt;br /&gt;
      assume &amp;quot;y ≠ B&amp;quot;&lt;br /&gt;
      hence &amp;quot;y = A&amp;quot; using alfabeto.exhaust by blast&lt;br /&gt;
      thus &amp;quot;False&amp;quot; using IB by simp&lt;br /&gt;
    qed&lt;br /&gt;
  next&lt;br /&gt;
    case IS: (Cons x w)&lt;br /&gt;
    hence &amp;quot;balanceada_aux (x # w @ [y]) n&amp;quot; by simp&lt;br /&gt;
    hence &amp;quot;∃m. balanceada_aux (w @ [y]) m&amp;quot; using balanceada_aux.elims(2) &lt;br /&gt;
      by blast (* SH&amp;#039;d *)&lt;br /&gt;
    thus &amp;quot;y = B&amp;quot; using IS.IH by auto&lt;br /&gt;
  qed&lt;br /&gt;
&lt;br /&gt;
  have &amp;quot;y = B&amp;quot; using bal hl1[of &amp;quot;(x#w)&amp;quot;] by simp&lt;br /&gt;
  hence &amp;quot;balanceada_aux (w @ [B]) 1&amp;quot; using bal `x = A` by simp&lt;br /&gt;
&lt;br /&gt;
  have hl2: &amp;quot;balanceada_aux (x#w) n ⟹ ∃m. balanceada_aux w m&amp;quot; &lt;br /&gt;
    for x w n&lt;br /&gt;
  proof (cases x)&lt;br /&gt;
    case A&lt;br /&gt;
    moreover assume &amp;quot;balanceada_aux (x#w) n&amp;quot;&lt;br /&gt;
    ultimately show ?thesis by auto&lt;br /&gt;
  next&lt;br /&gt;
    case B&lt;br /&gt;
    moreover assume &amp;quot;balanceada_aux (x#w) n&amp;quot;&lt;br /&gt;
    ultimately have &amp;quot;balanceada_aux (B#w) n&amp;quot; by simp&lt;br /&gt;
    thus ?thesis by (cases n) auto&lt;br /&gt;
  qed&lt;br /&gt;
&lt;br /&gt;
  have &amp;quot;⟦balanceada_aux w n; u @ v = w⟧ ⟹ ∃ m. balanceada_aux v m&amp;quot; &lt;br /&gt;
    for u v w n&lt;br /&gt;
  proof (induction w arbitrary: u v n)&lt;br /&gt;
    case Nil&lt;br /&gt;
    hence &amp;quot;v = []&amp;quot; by simp&lt;br /&gt;
    hence &amp;quot;balanceada_aux v 0&amp;quot; by simp&lt;br /&gt;
    thus ?case ..&lt;br /&gt;
  next&lt;br /&gt;
    case IS: (Cons x w&amp;#039;)&lt;br /&gt;
    then obtain m where mDef: &amp;quot;balanceada_aux w&amp;#039; m&amp;quot; using hl2 by blast&lt;br /&gt;
&lt;br /&gt;
    show ?case&lt;br /&gt;
    proof (cases u)&lt;br /&gt;
      case Nil&lt;br /&gt;
      hence &amp;quot;balanceada_aux v n&amp;quot; using IS by simp&lt;br /&gt;
      thus ?thesis ..&lt;br /&gt;
    next&lt;br /&gt;
      case (Cons y u&amp;#039;)&lt;br /&gt;
      hence &amp;quot;w&amp;#039; = u&amp;#039; @ v&amp;quot; using IS.prems by simp&lt;br /&gt;
      thus ?thesis using IS.IH mDef by simp&lt;br /&gt;
    qed&lt;br /&gt;
  qed&lt;br /&gt;
  moreover have &amp;quot;balanceada_aux (w @ [B]) 1&amp;quot; using bal `x = A` `y = B` &lt;br /&gt;
    by simp&lt;br /&gt;
  ultimately have &amp;quot;u @ v = (w @ [B]) ⟹ ∃m. balanceada_aux v m&amp;quot; &lt;br /&gt;
    for u v by auto&lt;br /&gt;
  moreover {&lt;br /&gt;
    fix u v&lt;br /&gt;
    have 1: &amp;quot;⟦u&amp;#039; ≠ []; v ≠ []; u&amp;#039; @ v = (x # w @ [y])⟧ ⟹ &lt;br /&gt;
             ¬(balanceada v)&amp;quot; for u&amp;#039;&lt;br /&gt;
      using postfix_con by auto&lt;br /&gt;
    have &amp;quot;⟦v ≠ []; (x#u) @ v = (x # w @ [y])⟧ ⟹ ¬(balanceada v)&amp;quot; &lt;br /&gt;
      using 1[of &amp;quot;x#u&amp;quot;] by simp&lt;br /&gt;
    hence &amp;quot;⟦v ≠ []; u @ v = (w @ [B])⟧ ⟹ ¬(balanceada_aux v 0)&amp;quot; &lt;br /&gt;
      using `y = B` by simp&lt;br /&gt;
  }&lt;br /&gt;
  ultimately have hl3: &amp;quot;⟦v ≠ []; u @ v = (w @ [B])⟧ ⟹ &lt;br /&gt;
                        ∃m. balanceada_aux v (Suc m)&amp;quot; for u v&lt;br /&gt;
    by (metis zero_induct) (* SH&amp;#039;d *)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  have hl4: &amp;quot;⟦balanceada_aux (v @ [B]) (Suc n); ⋀s t. v = s @ t ⟹ &lt;br /&gt;
              ∃m. balanceada_aux (t @ [B]) (Suc m)⟧&lt;br /&gt;
             ⟹ balanceada_aux v n&amp;quot; for v n&lt;br /&gt;
  proof (induction v arbitrary: n)&lt;br /&gt;
    case Nil&lt;br /&gt;
    hence &amp;quot;balanceada_aux [B] (Suc n)&amp;quot; by simp&lt;br /&gt;
    thus &amp;quot;balanceada_aux [] n&amp;quot; by simp&lt;br /&gt;
  next&lt;br /&gt;
    case IS: (Cons x v&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
    have &amp;quot;x#v&amp;#039; = [x] @ v&amp;#039;&amp;quot; by simp&lt;br /&gt;
    then obtain m where mDef: &amp;quot;balanceada_aux (v&amp;#039; @ [B]) (Suc m)&amp;quot; &lt;br /&gt;
      using IS.prems by blast&lt;br /&gt;
    moreover have v&amp;#039;Postf: &amp;quot;⋀s t. v&amp;#039; = s @ t ⟹ &lt;br /&gt;
                                  ∃m. balanceada_aux (t @ [B]) (Suc m)&amp;quot;&lt;br /&gt;
      using IS.prems by auto&lt;br /&gt;
    ultimately have &amp;quot;balanceada_aux v&amp;#039; m&amp;quot; using IS.IH by simp&lt;br /&gt;
&lt;br /&gt;
    show ?case&lt;br /&gt;
    proof (cases x)&lt;br /&gt;
      case A&lt;br /&gt;
      hence &amp;quot;balanceada_aux ((A # v&amp;#039;) @ [B]) (Suc n)&amp;quot; using IS.prems &lt;br /&gt;
        by simp&lt;br /&gt;
      hence &amp;quot;balanceada_aux (v&amp;#039; @ [B]) (Suc (Suc n))&amp;quot; by simp&lt;br /&gt;
      hence &amp;quot;balanceada_aux v&amp;#039; (Suc n)&amp;quot; using IS.IH v&amp;#039;Postf by simp&lt;br /&gt;
      thus ?thesis using `x = A` by simp&lt;br /&gt;
    next&lt;br /&gt;
      case B&lt;br /&gt;
      hence &amp;quot;balanceada_aux ((B # v&amp;#039;) @ [B]) (Suc n)&amp;quot; using IS.prems &lt;br /&gt;
        by simp&lt;br /&gt;
      hence 1: &amp;quot;balanceada_aux ( v&amp;#039; @ [B]) n&amp;quot; using IS.prems by simp&lt;br /&gt;
&lt;br /&gt;
      have &amp;quot;n = Suc m&amp;quot; using 1 mDef balanceada_aux_unico by simp&lt;br /&gt;
      thus &amp;quot;balanceada_aux (x # v&amp;#039;) n&amp;quot; &lt;br /&gt;
        using `balanceada_aux v&amp;#039; m` `x = B` by simp&lt;br /&gt;
    qed&lt;br /&gt;
  qed&lt;br /&gt;
  moreover note `balanceada_aux (w @ [B]) 1`&lt;br /&gt;
  moreover have &amp;quot;w = s @ t ⟹ ∃m. balanceada_aux (t @ [B]) (Suc m)&amp;quot; &lt;br /&gt;
    for s t using hl3 by simp&lt;br /&gt;
  ultimately have &amp;quot;balanceada_aux w 0&amp;quot; by simp&lt;br /&gt;
  thus &amp;quot;x = A ∧ y = B ∧ balanceada w&amp;quot; using `x = A` `y = B`by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma balanceada_completo_aux2: &lt;br /&gt;
  assumes &amp;quot;balanceada (u @ v)&amp;quot; and &amp;quot;¬ balanceada u&amp;quot;&lt;br /&gt;
  shows &amp;quot;¬ balanceada v&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;⟦balanceada_aux (u @ v) n; balanceada v⟧ ⟹ balanceada_aux u n&amp;quot; &lt;br /&gt;
    for n&lt;br /&gt;
  proof (induction u arbitrary: n)&lt;br /&gt;
    case Nil&lt;br /&gt;
    hence &amp;quot;n = 0&amp;quot; using balanceada_aux_unico by simp&lt;br /&gt;
    thus ?case by simp&lt;br /&gt;
  next&lt;br /&gt;
    case IS: (Cons x u&amp;#039;)&lt;br /&gt;
    show ?case&lt;br /&gt;
    proof (cases x)&lt;br /&gt;
      case A&lt;br /&gt;
      hence &amp;quot;balanceada_aux (A # u&amp;#039; @ v) n&amp;quot; using IS.prems by simp&lt;br /&gt;
      hence &amp;quot;balanceada_aux (u&amp;#039; @ v) (Suc n)&amp;quot; by simp&lt;br /&gt;
      hence &amp;quot;balanceada_aux u&amp;#039; (Suc n)&amp;quot; using `balanceada v` IS.IH &lt;br /&gt;
        by simp&lt;br /&gt;
      thus ?thesis using `x = A` by simp&lt;br /&gt;
    next&lt;br /&gt;
      case B&lt;br /&gt;
      hence 1: &amp;quot;balanceada_aux (B # u&amp;#039; @ v) n&amp;quot; using IS.prems by simp&lt;br /&gt;
      then obtain m where &amp;quot;Suc m = n&amp;quot; by (cases n) auto&lt;br /&gt;
      hence &amp;quot;balanceada_aux (B # u&amp;#039; @ v) (Suc m)&amp;quot; using 1 by simp&lt;br /&gt;
      hence &amp;quot;balanceada_aux u&amp;#039; m&amp;quot; using `balanceada v` IS.IH by simp&lt;br /&gt;
      hence &amp;quot;balanceada_aux (B # u&amp;#039;) n&amp;quot; using `Suc m = n` by auto&lt;br /&gt;
      thus ?thesis using `x = B` by simp&lt;br /&gt;
    qed&lt;br /&gt;
  qed&lt;br /&gt;
  thus ?thesis using assms by auto&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma balanceada_completo:&lt;br /&gt;
  assumes &amp;quot;balanceada w&amp;quot;&lt;br /&gt;
  shows   &amp;quot;w ∈ S&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;balanceada w ⟹ w ∈ S&amp;quot;&lt;br /&gt;
  proof (induction &amp;quot;length w&amp;quot; arbitrary: w rule: less_induct)&lt;br /&gt;
    case IS: less&lt;br /&gt;
  &lt;br /&gt;
    show ?case&lt;br /&gt;
    proof (cases w)&lt;br /&gt;
      case Nil&lt;br /&gt;
      thus ?thesis using S1 by simp&lt;br /&gt;
    next&lt;br /&gt;
      case (Cons x w&amp;#039;)&lt;br /&gt;
      show ?thesis&lt;br /&gt;
      proof (cases w&amp;#039;)&lt;br /&gt;
        case Nil&lt;br /&gt;
        hence &amp;quot;¬ balanceada (x#w&amp;#039;)&amp;quot; by (cases x) auto&lt;br /&gt;
        hence &amp;quot;False&amp;quot; using `w = x # w&amp;#039;`IS.prems by simp&lt;br /&gt;
        thus ?thesis ..&lt;br /&gt;
      next&lt;br /&gt;
        case (Cons y w&amp;#039;&amp;#039;)&lt;br /&gt;
        show ?thesis&lt;br /&gt;
        proof cases&lt;br /&gt;
          assume &amp;quot;∃u v. w = u @ v ∧ u ≠ [] ∧ v ≠ [] ∧ &lt;br /&gt;
                        balanceada u ∧ balanceada v&amp;quot;&lt;br /&gt;
          then obtain u v where &amp;quot;w = u @ v&amp;quot; and &lt;br /&gt;
                                &amp;quot;u ≠ []&amp;quot; and &lt;br /&gt;
                                &amp;quot;v ≠ []&amp;quot; and &lt;br /&gt;
                                &amp;quot;balanceada u&amp;quot;&lt;br /&gt;
            and &amp;quot;balanceada v&amp;quot; by blast&lt;br /&gt;
&lt;br /&gt;
          have &amp;quot;u ∈ S&amp;quot; using `w = u @ v` `v ≠ []` `balanceada u` IS &lt;br /&gt;
            by simp&lt;br /&gt;
          moreover have &amp;quot;v ∈ S&amp;quot; &lt;br /&gt;
            using `w = u @ v` `u ≠ []` `balanceada v` IS by simp&lt;br /&gt;
          ultimately show &amp;quot;w ∈ S&amp;quot; using S3 `w = u @ v` by simp&lt;br /&gt;
        next&lt;br /&gt;
          assume &amp;quot;∄u v. w = u @ v ∧ u ≠ [] ∧ v ≠ [] ∧ &lt;br /&gt;
                        balanceada u ∧ balanceada v&amp;quot;&lt;br /&gt;
          hence 1: &amp;quot;⟦u @ v = w; u ≠ []; v ≠ []; balanceada u⟧ ⟹ &lt;br /&gt;
                    ¬ balanceada v&amp;quot; for u v by auto&lt;br /&gt;
&lt;br /&gt;
          have &amp;quot;w = x # y # w&amp;#039;&amp;#039;&amp;quot; using `w = x # w&amp;#039;` `w&amp;#039; = y # w&amp;#039;&amp;#039;` &lt;br /&gt;
            by simp&lt;br /&gt;
          moreover have &amp;quot;∃ u z. y # w&amp;#039;&amp;#039; = u @ [z]&amp;quot;&lt;br /&gt;
          proof -&lt;br /&gt;
            have &amp;quot;∃ u y. (x :: alfabeto) # v = u @ [y]&amp;quot; for x v&lt;br /&gt;
            proof (induction v arbitrary: x)&lt;br /&gt;
              case Nil&lt;br /&gt;
              have &amp;quot;x # [] = [] @ [x]&amp;quot; by simp&lt;br /&gt;
              thus ?case by simp&lt;br /&gt;
            next&lt;br /&gt;
              case IS: (Cons z v&amp;#039;)&lt;br /&gt;
              then obtain u&amp;#039; y&amp;#039; where &amp;quot;z # v&amp;#039; = u&amp;#039; @ [y&amp;#039;]&amp;quot; by blast&lt;br /&gt;
              hence &amp;quot;x # z # v&amp;#039; = x # u&amp;#039; @ [y&amp;#039;]&amp;quot; using IS by simp&lt;br /&gt;
              thus ?case by simp&lt;br /&gt;
            qed&lt;br /&gt;
            thus ?thesis by simp&lt;br /&gt;
          qed&lt;br /&gt;
          ultimately have &amp;quot;∃ u z. w = x # u @ [z]&amp;quot; by auto&lt;br /&gt;
          then obtain u z where &amp;quot;w = x # u @ [z]&amp;quot; by blast&lt;br /&gt;
          hence &amp;quot;balanceada (x # u @ [z])&amp;quot; using `balanceada w` by simp&lt;br /&gt;
          moreover have &amp;quot;⟦s ≠ []; t ≠ []; s @ t = x # u @ [z]⟧ ⟹ &lt;br /&gt;
                         ¬ balanceada t&amp;quot; for s t&lt;br /&gt;
          proof (cases &amp;quot;balanceada s&amp;quot;)&lt;br /&gt;
            case True&lt;br /&gt;
            moreover assume &amp;quot;s ≠ []&amp;quot;&lt;br /&gt;
            moreover assume &amp;quot;t ≠ []&amp;quot;&lt;br /&gt;
            moreover assume &amp;quot;s @ t = x # u @ [z]&amp;quot;&lt;br /&gt;
            ultimately show ?thesis using 1 `w = x # u @ [z]` by auto&lt;br /&gt;
          next&lt;br /&gt;
            case False&lt;br /&gt;
&lt;br /&gt;
            assume &amp;quot;s @ t = x # u @ [z]&amp;quot;&lt;br /&gt;
            hence &amp;quot;x # u @ [z] = s @ t&amp;quot; ..&lt;br /&gt;
            thus ?thesis&lt;br /&gt;
              using balanceada_completo_aux2 &lt;br /&gt;
                    `balanceada w` &lt;br /&gt;
                    `¬ balanceada s` &lt;br /&gt;
                    `w = x # u @ [z]` &lt;br /&gt;
              by simp&lt;br /&gt;
          qed&lt;br /&gt;
          ultimately have &amp;quot;x = A&amp;quot; and &amp;quot;z = B&amp;quot; and &amp;quot;balanceada u&amp;quot;&lt;br /&gt;
            using balanceada_completo_aux1[of x u z] by auto&lt;br /&gt;
          moreover have &amp;quot;u ∈ S&amp;quot; &lt;br /&gt;
            using `w = x # u @ [z]` IS `balanceada u` by simp&lt;br /&gt;
          hence &amp;quot;x # u @ [z] ∈ S&amp;quot; using S2 `u ∈ S` `x = A` `z = B` &lt;br /&gt;
            by simp&lt;br /&gt;
          thus &amp;quot;w ∈ S&amp;quot; using `w = x # u @ [z]` by simp&lt;br /&gt;
        qed&lt;br /&gt;
      qed&lt;br /&gt;
    qed&lt;br /&gt;
  qed&lt;br /&gt;
  thus ?thesis using assms .&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/RA2018/index.php?title=Relaci%C3%B3n_8&amp;diff=421</id>
		<title>Relación 8</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2018/index.php?title=Relaci%C3%B3n_8&amp;diff=421"/>
		<updated>2019-02-28T15:52:24Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isabelle&amp;quot;&amp;gt;&lt;br /&gt;
chapter {* R8: Gramáticas libres de contexto *}&lt;br /&gt;
&lt;br /&gt;
theory R8_Gramaticas_libre_de_contexto_alu&lt;br /&gt;
imports Main&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  En esta relación se definen dos gramáticas libres de contexto y se&lt;br /&gt;
  demuestra que son equivalentes. Además, se define por recursión una&lt;br /&gt;
  función para reconocer las palabras de la gramática y se demuestra que&lt;br /&gt;
  es correcta y completa. *}&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. Una gramática libre de contexto para las expresiones&lt;br /&gt;
  parentizadas es&lt;br /&gt;
     S ⟶ ε | &amp;#039;(&amp;#039; S &amp;#039;)&amp;#039; | SS&lt;br /&gt;
  definir inductivamente la gramática S usando A y B para &amp;#039;(&amp;#039; y &amp;#039;)&amp;#039;,&lt;br /&gt;
  respectivamente. &lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
datatype alfabeto = A | B&lt;br /&gt;
&lt;br /&gt;
inductive_set S :: &amp;quot;alfabeto list set&amp;quot; where&lt;br /&gt;
  S1: &amp;quot;[] ∈ S&amp;quot; &lt;br /&gt;
| S2: &amp;quot;w ∈ S ⟹ [A] @ w @ [B] ∈ S&amp;quot; &lt;br /&gt;
| S3: &amp;quot;v ∈ S ⟹ w ∈ S ⟹ v @ w ∈ S&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Otra gramática libre de contexto para las expresiones&lt;br /&gt;
  parentizadas es&lt;br /&gt;
     T ⟶ ε | T &amp;#039;(&amp;#039; T &amp;#039;)&amp;#039;&lt;br /&gt;
  definir inductivamente la gramática T usando A y B para &amp;#039;(&amp;#039; y &amp;#039;)&amp;#039;,&lt;br /&gt;
  respectivamente. &lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
inductive_set T :: &amp;quot;alfabeto list set&amp;quot; where&lt;br /&gt;
  T1: &amp;quot;[] ∈ T&amp;quot; &lt;br /&gt;
| T2: &amp;quot;v ∈ T ⟹ w ∈ T ⟹ v @ [A] @ w @ [B] ∈ T&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. Demostrar que T está contenido en S. &lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* benber alfmarcua antramhur *)&lt;br /&gt;
lemma T_en_S: &lt;br /&gt;
  assumes &amp;quot;w ∈ T&amp;quot;  &lt;br /&gt;
  shows   &amp;quot;w ∈ S&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;w ∈ T ⟹ w ∈ S&amp;quot;&lt;br /&gt;
  proof (induction rule: T.induct)&lt;br /&gt;
    show &amp;quot;[] ∈ S&amp;quot; by (rule S1)&lt;br /&gt;
  next&lt;br /&gt;
    fix v w&lt;br /&gt;
    assume &amp;quot;w ∈ S&amp;quot;&lt;br /&gt;
    hence &amp;quot;[A] @ w @ [B] ∈ S&amp;quot; by (rule S2)&lt;br /&gt;
    moreover assume &amp;quot;v ∈ S&amp;quot;&lt;br /&gt;
    ultimately show &amp;quot;v @ [A] @ w @ [B] ∈ S&amp;quot; using S3 by simp&lt;br /&gt;
  qed&lt;br /&gt;
  thus ?thesis using assms .&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* cammonagu *)&lt;br /&gt;
declare S1 [iff] S2[intro!,simp]&lt;br /&gt;
&lt;br /&gt;
(* cammonagu *)&lt;br /&gt;
declare T1 [iff]&lt;br /&gt;
&lt;br /&gt;
(* cammonagu *)&lt;br /&gt;
lemma T2ImpS: &amp;quot;w ∈ T ⟹ w ∈ S&amp;quot;&lt;br /&gt;
  apply (erule T.induct)&lt;br /&gt;
    apply simp&lt;br /&gt;
  apply (blast intro: S3)&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
(* cammonagu *)&lt;br /&gt;
lemma T_en_S1: &lt;br /&gt;
  assumes &amp;quot;w ∈ T&amp;quot;  &lt;br /&gt;
  shows   &amp;quot;w ∈ S&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;w ∈ T ⟹ w ∈ S&amp;quot; using assms by (rule T2ImpS)&lt;br /&gt;
  thus ?thesis using assms .&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Demostrar que S está contenido en T. &lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* benber *)&lt;br /&gt;
lemma S_en_T: &lt;br /&gt;
  &amp;quot;w ∈ S ⟹ w ∈ T&amp;quot;&lt;br /&gt;
proof (induction rule: S.induct)&lt;br /&gt;
  show &amp;quot;[] ∈ T&amp;quot; by (rule T1)&lt;br /&gt;
next&lt;br /&gt;
  fix w&lt;br /&gt;
&lt;br /&gt;
  have &amp;quot;[] ∈ T&amp;quot; by (rule T1)&lt;br /&gt;
  moreover assume &amp;quot;w ∈ T&amp;quot;&lt;br /&gt;
  ultimately have &amp;quot;[] @ [A] @ w @ [B] ∈ T&amp;quot; by (rule T2)&lt;br /&gt;
  thus &amp;quot;[A] @ w @ [B] ∈ T&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix v w&lt;br /&gt;
  assume &amp;quot;v ∈ T&amp;quot;&lt;br /&gt;
  moreover assume &amp;quot;w ∈ T&amp;quot;&lt;br /&gt;
  moreover have &amp;quot;⟦v ∈ T; w ∈ T⟧ ⟹ v @ w ∈ T&amp;quot; for v w&lt;br /&gt;
  proof (induction &amp;quot;length w + length v&amp;quot; &lt;br /&gt;
         arbitrary: w v &lt;br /&gt;
         rule: less_induct)&lt;br /&gt;
    case IH: less&lt;br /&gt;
&lt;br /&gt;
    show &amp;quot;v @ w ∈ T&amp;quot;&lt;br /&gt;
    proof (cases w rule: T.cases)&lt;br /&gt;
      show &amp;quot;w ∈ T&amp;quot; using `w ∈ T`.&lt;br /&gt;
    next&lt;br /&gt;
      assume &amp;quot;w = []&amp;quot;&lt;br /&gt;
      thus &amp;quot;v @ w ∈ T&amp;quot; using `v ∈ T` by simp&lt;br /&gt;
    next&lt;br /&gt;
      fix w1 w2&lt;br /&gt;
      assume &amp;quot;w1 ∈ T&amp;quot; and &amp;quot;w2 ∈ T&amp;quot;&lt;br /&gt;
      assume &amp;quot;w = w1 @ [A] @ w2 @ [B]&amp;quot;&lt;br /&gt;
      hence 1: &amp;quot;v @ w = v @ w1 @ [A] @ w2 @ [B]&amp;quot; by simp&lt;br /&gt;
&lt;br /&gt;
      have &amp;quot;length w1 &amp;lt; length w&amp;quot; using `w = w1 @ [A] @ w2 @ [B]` &lt;br /&gt;
        by simp&lt;br /&gt;
      hence &amp;quot;length v + length w1 &amp;lt; length v + length w&amp;quot; by simp&lt;br /&gt;
      moreover note `v ∈ T`&lt;br /&gt;
      moreover note `w1 ∈ T`&lt;br /&gt;
      ultimately have &amp;quot;v @ w1 ∈ T&amp;quot; using IH by simp&lt;br /&gt;
      moreover note `w2 ∈ T`&lt;br /&gt;
      ultimately have &amp;quot;(v @ w1) @ [A] @ w2 @ [B] ∈ T&amp;quot; by (rule T2)&lt;br /&gt;
      thus &amp;quot;v @ w ∈ T&amp;quot; using 1 by simp&lt;br /&gt;
    qed&lt;br /&gt;
  qed&lt;br /&gt;
  ultimately show &amp;quot;v @ w ∈ T&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* alfmarcua antramhur *)&lt;br /&gt;
lemma S_en_T_2: &lt;br /&gt;
  &amp;quot;w ∈ S ⟹ w ∈ T&amp;quot;&lt;br /&gt;
proof (induction rule: S.induct)&lt;br /&gt;
  show &amp;quot;[] ∈ T&amp;quot; by (rule T1)&lt;br /&gt;
next&lt;br /&gt;
  fix w&lt;br /&gt;
  assume &amp;quot;w ∈ T&amp;quot;&lt;br /&gt;
  have &amp;quot;[] @ [A] @ w @ [B] ∈ T&amp;quot; using T1 `w ∈ T` by (rule T2)&lt;br /&gt;
  then show &amp;quot;[A] @ w @ [B] ∈ T&amp;quot; by (simp only: List.append.append_Nil)&lt;br /&gt;
next&lt;br /&gt;
  fix w v&lt;br /&gt;
  assume &amp;quot;v ∈ T&amp;quot;&lt;br /&gt;
  show &amp;quot;w ∈ T ⟹ v @ w ∈ T&amp;quot;&lt;br /&gt;
  proof (induction rule: T.induct)&lt;br /&gt;
    show &amp;quot;v @ [] ∈ T&amp;quot; using `v ∈ T` &lt;br /&gt;
      by (simp only: List.append.right_neutral)&lt;br /&gt;
  next&lt;br /&gt;
    fix va w&lt;br /&gt;
    have &amp;quot;v @ va ∈ T ⟹ w ∈ T ⟹ (v @ va) @ [A] @ w @ [B] ∈ T &amp;quot; &lt;br /&gt;
      by (rule T2)&lt;br /&gt;
    then show &amp;quot;v @ va ∈ T ⟹ w ∈ T ⟹ v @ va @ [A] @ w @ [B] ∈ T &amp;quot; &lt;br /&gt;
      by (simp only: List.append_assoc)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Demostrar que S y T son iguales. &lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* benber cammonagu antramhur *)&lt;br /&gt;
lemma S_igual_T:&lt;br /&gt;
  &amp;quot;S = T&amp;quot;&lt;br /&gt;
  using T_en_S S_en_T by auto&lt;br /&gt;
&lt;br /&gt;
(* alfmarcua *)&lt;br /&gt;
lemma S_igual_T_2:&lt;br /&gt;
  &amp;quot;S = T&amp;quot;&lt;br /&gt;
proof (rule equalityI)&lt;br /&gt;
  show &amp;quot;S ⊆ T&amp;quot; using S_en_T by (rule subsetI)&lt;br /&gt;
next&lt;br /&gt;
  show &amp;quot;T ⊆ S&amp;quot; using T_en_S by (rule subsetI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. En lugar de una gramática, se puede usar el siguiente&lt;br /&gt;
  procedimiento para determinar si la cadena es una sucesión de&lt;br /&gt;
  paréntesis bien balanceada: se recorre la cadena de izquierda a&lt;br /&gt;
  derecha contando cuántos paréntesis de necesitan para que esté bien&lt;br /&gt;
  balanceada. Si el contador al final de la cadena es 0, la cadena está&lt;br /&gt;
  bien balanceada.&lt;br /&gt;
&lt;br /&gt;
  Definir la función&lt;br /&gt;
     balanceada :: alfabeto list ⇒ bool&lt;br /&gt;
  tal que (balanceada w) se verifica si w está bien balanceada. Por&lt;br /&gt;
  ejemplo, &lt;br /&gt;
     balanceada [A,A,B,B] = True&lt;br /&gt;
     balanceada [A,B,A,B] = True&lt;br /&gt;
     balanceada [A,B,B,A] = False&lt;br /&gt;
  Indicación: Definir balanceada  usando la función auxiliar &lt;br /&gt;
     balanceada_aux :: alfabeto list ⇒ nat ⇒ bool&lt;br /&gt;
  tal que (balanceada_aux w 0) se verifica si w está bien balanceada.&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* benber alfmarcua antramhur *)&lt;br /&gt;
(* balanceada_aux w n = True si y solo si ([A]*n) @ w es balanceada *)&lt;br /&gt;
fun balanceada_aux :: &amp;quot;alfabeto list ⇒ nat ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;balanceada_aux [] 0 = True&amp;quot;&lt;br /&gt;
| &amp;quot;balanceada_aux [] (Suc n) = False&amp;quot;&lt;br /&gt;
| &amp;quot;balanceada_aux (B#w) 0 = False&amp;quot;&lt;br /&gt;
| &amp;quot;balanceada_aux (B#w) (Suc n) = balanceada_aux w n&amp;quot;&lt;br /&gt;
| &amp;quot;balanceada_aux (A#w) n = balanceada_aux w (Suc n)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
fun balanceada :: &amp;quot;alfabeto list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;balanceada w = balanceada_aux w 0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 6. Demostrar que balanceada es un reconocedor correcto de la&lt;br /&gt;
  gramática S; es decir, &lt;br /&gt;
     w ∈ S ⟹ balanceada w&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* benber *)&lt;br /&gt;
lemma balanceada_correcto_aux1: &lt;br /&gt;
  &amp;quot;balanceada_aux w n ⟹ balanceada_aux (w @ [B]) (Suc n)&amp;quot;&lt;br /&gt;
proof (induction w arbitrary: n)&lt;br /&gt;
  case Nil&lt;br /&gt;
  assume &amp;quot;balanceada_aux [] n&amp;quot;&lt;br /&gt;
  thus ?case by simp&lt;br /&gt;
next&lt;br /&gt;
  case IS: (Cons x w)&lt;br /&gt;
  show ?case&lt;br /&gt;
  proof (cases x)&lt;br /&gt;
    case A&lt;br /&gt;
    note `balanceada_aux (x#w) n`&lt;br /&gt;
    hence &amp;quot;balanceada_aux (A#w) n&amp;quot; using `x = A` by simp&lt;br /&gt;
    hence &amp;quot;balanceada_aux w (Suc n)&amp;quot; by simp&lt;br /&gt;
    hence &amp;quot;balanceada_aux (w@[B]) (Suc (Suc n))&amp;quot; using IS.IH by simp&lt;br /&gt;
    hence &amp;quot;balanceada_aux ((A#w)@[B]) (Suc n)&amp;quot; by simp&lt;br /&gt;
    thus ?thesis using `x = A` by simp&lt;br /&gt;
  next&lt;br /&gt;
    case B&lt;br /&gt;
    hence 1: &amp;quot;balanceada_aux (B#w) n&amp;quot; using IS.prems by simp&lt;br /&gt;
&lt;br /&gt;
    show ?thesis&lt;br /&gt;
    proof (cases n)&lt;br /&gt;
      case 0&lt;br /&gt;
      hence &amp;quot;balanceada_aux (B#w) 0&amp;quot; using 1 by simp&lt;br /&gt;
      hence &amp;quot;False&amp;quot; by simp&lt;br /&gt;
      thus ?thesis ..&lt;br /&gt;
    next&lt;br /&gt;
      case (Suc m)&lt;br /&gt;
      hence &amp;quot;balanceada_aux (B#w) (Suc m)&amp;quot; using 1 by simp&lt;br /&gt;
      hence &amp;quot;balanceada_aux w m&amp;quot; by simp&lt;br /&gt;
      hence &amp;quot;balanceada_aux (w@[B]) (Suc m)&amp;quot; using IS.IH by simp&lt;br /&gt;
      hence &amp;quot;balanceada_aux (w@[B]) n&amp;quot; using `n = Suc m` by simp&lt;br /&gt;
      hence &amp;quot;balanceada_aux (B#(w@[B])) (Suc n)&amp;quot; by simp&lt;br /&gt;
      thus ?thesis using `x = B` by simp&lt;br /&gt;
    qed&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma balanceada_correcto_aux2:&lt;br /&gt;
  assumes &amp;quot;balanceada v&amp;quot;&lt;br /&gt;
  shows &amp;quot;balanceada_aux w n ⟹ balanceada_aux (w @ v) n&amp;quot;&lt;br /&gt;
proof (induction w arbitrary: n)&lt;br /&gt;
  case Nil&lt;br /&gt;
  hence &amp;quot;n = 0&amp;quot; using balanceada_aux.elims by auto&lt;br /&gt;
  thus ?case using assms by simp&lt;br /&gt;
next&lt;br /&gt;
  case IS: (Cons x w)&lt;br /&gt;
  show &amp;quot;balanceada_aux ((x#w)@v) n&amp;quot;&lt;br /&gt;
  proof (cases x)&lt;br /&gt;
    case A&lt;br /&gt;
    hence &amp;quot;balanceada_aux (A#w) n&amp;quot; using IS.prems by simp&lt;br /&gt;
    hence &amp;quot;balanceada_aux w (Suc n)&amp;quot; by simp&lt;br /&gt;
    hence &amp;quot;balanceada_aux (w@v) (Suc n)&amp;quot; using IS.IH by simp&lt;br /&gt;
    hence &amp;quot;balanceada_aux (A#(w@v)) n&amp;quot; by simp&lt;br /&gt;
    thus ?thesis using `x = A` by simp&lt;br /&gt;
  next&lt;br /&gt;
    case B&lt;br /&gt;
    hence 1: &amp;quot;balanceada_aux (B#w) n&amp;quot; using IS.prems by simp&lt;br /&gt;
&lt;br /&gt;
    show ?thesis&lt;br /&gt;
    proof (cases n)&lt;br /&gt;
      case 0&lt;br /&gt;
      hence &amp;quot;balanceada_aux (B#w) 0&amp;quot; using 1 by simp&lt;br /&gt;
      hence &amp;quot;False&amp;quot; by simp&lt;br /&gt;
      thus ?thesis ..&lt;br /&gt;
    next&lt;br /&gt;
      case (Suc m)&lt;br /&gt;
      hence &amp;quot;balanceada_aux (B#w) (Suc m)&amp;quot; using 1 by simp&lt;br /&gt;
      hence &amp;quot;balanceada_aux w m&amp;quot; by simp&lt;br /&gt;
      hence &amp;quot;balanceada_aux (w@v) m&amp;quot; using IS.IH by simp&lt;br /&gt;
      hence &amp;quot;balanceada_aux (B#(w@v)) (Suc m)&amp;quot; by simp&lt;br /&gt;
      thus ?thesis using `x = B` `n = Suc m` by simp&lt;br /&gt;
    qed&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma balanceada_correcto:&lt;br /&gt;
  &amp;quot;w ∈ S ⟹ balanceada w&amp;quot;&lt;br /&gt;
proof (induction rule: S.induct)&lt;br /&gt;
  case S1&lt;br /&gt;
  have &amp;quot;balanceada [] = balanceada_aux [] 0&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;...&amp;quot; by simp&lt;br /&gt;
  finally show ?case.&lt;br /&gt;
next&lt;br /&gt;
  case S2&lt;br /&gt;
  fix w&lt;br /&gt;
  assume &amp;quot;balanceada w&amp;quot;&lt;br /&gt;
  hence &amp;quot;balanceada_aux w 0&amp;quot; by simp&lt;br /&gt;
  hence &amp;quot;balanceada_aux (w@[B]) 1&amp;quot; using balanceada_correcto_aux1 &lt;br /&gt;
    by simp&lt;br /&gt;
  hence &amp;quot;balanceada_aux ([A] @ w @ [B]) 0&amp;quot; by simp&lt;br /&gt;
  thus &amp;quot;balanceada ([A] @ w @ [B])&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  case S3&lt;br /&gt;
  thus ?case using balanceada_correcto_aux2 by auto&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* alfmarcua antramhur *)&lt;br /&gt;
lemma balanceada_correcto_aux3:&lt;br /&gt;
  shows &amp;quot;balanceada_aux v m ⟹ &lt;br /&gt;
         balanceada_aux w n ⟹ &lt;br /&gt;
         balanceada_aux (v @ w) (m+n)&amp;quot;&lt;br /&gt;
proof (induction v arbitrary: n m)&lt;br /&gt;
  case Nil&lt;br /&gt;
  then show ?case &lt;br /&gt;
  proof (cases m)&lt;br /&gt;
    case 0&lt;br /&gt;
    then have &amp;quot;balanceada_aux w (m + n)&amp;quot; using Nil.prems(2) &lt;br /&gt;
      by (simp only:Groups.monoid_add_class.add.left_neutral)&lt;br /&gt;
    then show ?thesis  by (simp only:List.append.append_Nil)&lt;br /&gt;
  next&lt;br /&gt;
    case (Suc mm)&lt;br /&gt;
    then have &amp;quot;False&amp;quot; using Nil.prems(1) &lt;br /&gt;
      by (simp only: balanceada_aux.simps(2))&lt;br /&gt;
    then show ?thesis ..&lt;br /&gt;
  qed&lt;br /&gt;
next&lt;br /&gt;
  case IS:(Cons a v)&lt;br /&gt;
  show &amp;quot;balanceada_aux ((a # v) @ w) (m + n)&amp;quot;&lt;br /&gt;
  proof (cases a)&lt;br /&gt;
    define k :: nat where &amp;quot;k = m + 1&amp;quot;&lt;br /&gt;
    case A&lt;br /&gt;
    then have &amp;quot;balanceada_aux v k&amp;quot; using `k = m + 1` IS.prems(1) &lt;br /&gt;
      by simp&lt;br /&gt;
    then have &amp;quot;balanceada_aux (v @ w) (k + n)&amp;quot; using IS.prems(2)  &lt;br /&gt;
      by (rule IS.IH)&lt;br /&gt;
    then have &amp;quot;balanceada_aux (v @ w) (Suc(m + n))&amp;quot; using `k = m + 1` &lt;br /&gt;
      by simp&lt;br /&gt;
    then have &amp;quot;balanceada_aux (A # (v @ w)) (m + n)&amp;quot; &lt;br /&gt;
      by (simp only: balanceada_aux.simps(5))&lt;br /&gt;
    then show ?thesis using `a = A` &lt;br /&gt;
      by (simp only:List.append.append_Cons)&lt;br /&gt;
  next&lt;br /&gt;
    case B&lt;br /&gt;
    then show ?thesis&lt;br /&gt;
    proof (cases m)&lt;br /&gt;
      case 0&lt;br /&gt;
      then have &amp;quot;False&amp;quot; using IS.prems(1) `a = B` &lt;br /&gt;
        by (simp only: balanceada_aux.simps(3))&lt;br /&gt;
      then show ?thesis ..&lt;br /&gt;
    next&lt;br /&gt;
      case (Suc mm)&lt;br /&gt;
      hence &amp;quot;balanceada_aux v mm&amp;quot; using IS.prems(1) `a = B` &lt;br /&gt;
        by (simp only: balanceada_aux.simps(4))&lt;br /&gt;
      then have &amp;quot;balanceada_aux (v @ w) (mm + n)&amp;quot; using IS.prems(2) &lt;br /&gt;
        by (rule IS.IH)&lt;br /&gt;
      then have &amp;quot;balanceada_aux (B # (v @ w)) (Suc (mm + n))&amp;quot; &lt;br /&gt;
        by (simp only: balanceada_aux.simps(4))&lt;br /&gt;
      then have &amp;quot;balanceada_aux (B # (v @ w)) (m + n)&amp;quot; &lt;br /&gt;
        using `m = Suc mm` by (simp only: Nat.plus_nat.add_Suc)&lt;br /&gt;
      then show ?thesis using `a=B`  &lt;br /&gt;
        by (simp only:List.append.append_Cons)&lt;br /&gt;
    qed&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma balanceada_correcto_2:&lt;br /&gt;
  &amp;quot;w ∈ S ⟹ balanceada w&amp;quot;&lt;br /&gt;
proof (induction rule: S.induct)&lt;br /&gt;
  case S1&lt;br /&gt;
  have &amp;quot;balanceada_aux [] 0&amp;quot; by (simp only: balanceada_aux.simps(1))&lt;br /&gt;
  then show ?case by (simp only: balanceada.simps)&lt;br /&gt;
next&lt;br /&gt;
  case (S2 w)&lt;br /&gt;
  then have 1:&amp;quot;balanceada_aux w 0&amp;quot; by (simp only: balanceada.simps)&lt;br /&gt;
  have &amp;quot;balanceada_aux [] 0&amp;quot; by (simp only: balanceada_aux.simps(1))&lt;br /&gt;
  then have 2:&amp;quot;balanceada_aux (B#[]) (Suc 0)&amp;quot; &lt;br /&gt;
    by (simp only: balanceada_aux.simps(4))&lt;br /&gt;
  have &amp;quot;balanceada_aux w 0 ⟹ &lt;br /&gt;
        balanceada_aux [B] (Suc 0) ⟹  &lt;br /&gt;
        balanceada_aux (w @ [B]) (0+Suc 0)&amp;quot; &lt;br /&gt;
    by (rule balanceada_correcto_aux3)&lt;br /&gt;
  then have &amp;quot;balanceada_aux (w @ [B]) (Suc 0)&amp;quot; using 1 2 &lt;br /&gt;
    by (simp only:Groups.monoid_add_class.add.left_neutral)&lt;br /&gt;
  then have &amp;quot;balanceada_aux (A # (w @ [B])) 0&amp;quot; &lt;br /&gt;
    by (simp only: balanceada_aux.simps(5))&lt;br /&gt;
  then have &amp;quot;balanceada_aux ([A] @ w @ [B]) 0&amp;quot; &lt;br /&gt;
    by (simp only: List.append_Cons List.append_Nil)&lt;br /&gt;
  then show ?case by (simp only: balanceada.simps)&lt;br /&gt;
next&lt;br /&gt;
  case (S3 v w)&lt;br /&gt;
  then have 1:&amp;quot;balanceada_aux w 0&amp;quot; by (simp only: balanceada.simps)&lt;br /&gt;
  have 2:&amp;quot;balanceada_aux v 0&amp;quot; using S3(3) &lt;br /&gt;
    by (simp only: balanceada.simps)&lt;br /&gt;
  have &amp;quot;balanceada_aux v 0 ⟹ &lt;br /&gt;
        balanceada_aux w 0 ⟹  &lt;br /&gt;
        balanceada_aux (v @ w) (0+0)&amp;quot; &lt;br /&gt;
    by (rule balanceada_correcto_aux3)&lt;br /&gt;
  then have &amp;quot;balanceada_aux (v @ w) 0&amp;quot; using 1 2 &lt;br /&gt;
    by (simp only:Groups.monoid_add_class.add.right_neutral)&lt;br /&gt;
  then show ?case by (simp only: balanceada.simps)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 7. Demostrar que balanceada es un reconocedor completo de &lt;br /&gt;
  la gramática S; es decir, &lt;br /&gt;
     balanceada w ⟹ w ∈ S &lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* benber *)&lt;br /&gt;
lemma balanceada_aux_unico: &lt;br /&gt;
  &amp;quot;⟦balanceada_aux w k; balanceada_aux w l⟧ ⟹ k = l&amp;quot; for w k l&lt;br /&gt;
proof (induction w arbitrary: k l)&lt;br /&gt;
  case Nil&lt;br /&gt;
  hence &amp;quot;k = 0 ∧ l = 0&amp;quot; using balanceada_aux.elims by auto&lt;br /&gt;
  thus ?case by simp&lt;br /&gt;
next&lt;br /&gt;
  case IS: (Cons x w&amp;#039;)&lt;br /&gt;
  show ?case&lt;br /&gt;
  proof (cases x)&lt;br /&gt;
    case A&lt;br /&gt;
    thus ?thesis using IS by auto&lt;br /&gt;
  next&lt;br /&gt;
    case B&lt;br /&gt;
    show ?thesis&lt;br /&gt;
    proof (cases k)&lt;br /&gt;
      case 0&lt;br /&gt;
      hence &amp;quot;False&amp;quot; using IS.prems `x = B` by simp&lt;br /&gt;
      thus ?thesis ..&lt;br /&gt;
    next&lt;br /&gt;
      case (Suc k&amp;#039;)&lt;br /&gt;
      hence &amp;quot;balanceada_aux w&amp;#039; k&amp;#039;&amp;quot; using IS.prems `x = B` by simp&lt;br /&gt;
&lt;br /&gt;
      show ?thesis&lt;br /&gt;
      proof (cases l)&lt;br /&gt;
        case 0&lt;br /&gt;
        hence &amp;quot;False&amp;quot; using IS.prems `x = B` by simp&lt;br /&gt;
        thus ?thesis ..&lt;br /&gt;
      next&lt;br /&gt;
        case (Suc l&amp;#039;)&lt;br /&gt;
        hence &amp;quot;balanceada_aux w&amp;#039; l&amp;#039;&amp;quot; using IS.prems `x = B` by simp&lt;br /&gt;
        thus ?thesis &lt;br /&gt;
          using `balanceada_aux w&amp;#039; k&amp;#039;` IS.IH `k = Suc k&amp;#039;` `l = Suc l&amp;#039;` &lt;br /&gt;
          by auto&lt;br /&gt;
      qed&lt;br /&gt;
    qed&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma balanceada_completo_aux1:&lt;br /&gt;
  &amp;quot;⟦balanceada (x # w @ [y]); &lt;br /&gt;
    ⋀u v. u ≠ [] ∧ v ≠ [] ∧ u @ v = x # w @ [y] ⟶ ¬ (balanceada v)⟧&lt;br /&gt;
    ⟹ x = A ∧ y = B ∧ balanceada w&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  assume &amp;quot;balanceada (x # w @ [y])&amp;quot;&lt;br /&gt;
  hence bal: &amp;quot;balanceada_aux ( x # w @ [y] ) 0&amp;quot; by simp&lt;br /&gt;
&lt;br /&gt;
  assume postfix_con: &amp;quot;⋀u v. u ≠ [] ∧ v ≠ [] ∧ u @ v = x # w @ [y] ⟶ &lt;br /&gt;
                             ¬ (balanceada v)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  have &amp;quot;x = A&amp;quot;&lt;br /&gt;
  proof (rule ccontr)&lt;br /&gt;
    assume &amp;quot;x ≠ A&amp;quot;&lt;br /&gt;
    hence &amp;quot;x = B&amp;quot; using alfabeto.exhaust by blast&lt;br /&gt;
    thus &amp;quot;False&amp;quot; using bal by simp&lt;br /&gt;
  qed&lt;br /&gt;
&lt;br /&gt;
  have hl1: &amp;quot;balanceada_aux (w @ [y]) n ⟹ y = B&amp;quot; for w y n&lt;br /&gt;
  proof (induction w arbitrary: n)&lt;br /&gt;
    case IB: Nil&lt;br /&gt;
    show &amp;quot;y = B&amp;quot;&lt;br /&gt;
    proof (rule ccontr)&lt;br /&gt;
      assume &amp;quot;y ≠ B&amp;quot;&lt;br /&gt;
      hence &amp;quot;y = A&amp;quot; using alfabeto.exhaust by blast&lt;br /&gt;
      thus &amp;quot;False&amp;quot; using IB by simp&lt;br /&gt;
    qed&lt;br /&gt;
  next&lt;br /&gt;
    case IS: (Cons x w)&lt;br /&gt;
    hence &amp;quot;balanceada_aux (x # w @ [y]) n&amp;quot; by simp&lt;br /&gt;
    hence &amp;quot;∃m. balanceada_aux (w @ [y]) m&amp;quot; using balanceada_aux.elims(2) &lt;br /&gt;
      by blast (* SH&amp;#039;d *)&lt;br /&gt;
    thus &amp;quot;y = B&amp;quot; using IS.IH by auto&lt;br /&gt;
  qed&lt;br /&gt;
&lt;br /&gt;
  have &amp;quot;y = B&amp;quot; using bal hl1[of &amp;quot;(x#w)&amp;quot;] by simp&lt;br /&gt;
  hence &amp;quot;balanceada_aux (w @ [B]) 1&amp;quot; using bal `x = A` by simp&lt;br /&gt;
&lt;br /&gt;
  have hl2: &amp;quot;balanceada_aux (x#w) n ⟹ ∃m. balanceada_aux w m&amp;quot; &lt;br /&gt;
    for x w n&lt;br /&gt;
  proof (cases x)&lt;br /&gt;
    case A&lt;br /&gt;
    moreover assume &amp;quot;balanceada_aux (x#w) n&amp;quot;&lt;br /&gt;
    ultimately show ?thesis by auto&lt;br /&gt;
  next&lt;br /&gt;
    case B&lt;br /&gt;
    moreover assume &amp;quot;balanceada_aux (x#w) n&amp;quot;&lt;br /&gt;
    ultimately have &amp;quot;balanceada_aux (B#w) n&amp;quot; by simp&lt;br /&gt;
    thus ?thesis by (cases n) auto&lt;br /&gt;
  qed&lt;br /&gt;
&lt;br /&gt;
  have &amp;quot;⟦balanceada_aux w n; u @ v = w⟧ ⟹ ∃ m. balanceada_aux v m&amp;quot; &lt;br /&gt;
    for u v w n&lt;br /&gt;
  proof (induction w arbitrary: u v n)&lt;br /&gt;
    case Nil&lt;br /&gt;
    hence &amp;quot;v = []&amp;quot; by simp&lt;br /&gt;
    hence &amp;quot;balanceada_aux v 0&amp;quot; by simp&lt;br /&gt;
    thus ?case ..&lt;br /&gt;
  next&lt;br /&gt;
    case IS: (Cons x w&amp;#039;)&lt;br /&gt;
    then obtain m where mDef: &amp;quot;balanceada_aux w&amp;#039; m&amp;quot; using hl2 by blast&lt;br /&gt;
&lt;br /&gt;
    show ?case&lt;br /&gt;
    proof (cases u)&lt;br /&gt;
      case Nil&lt;br /&gt;
      hence &amp;quot;balanceada_aux v n&amp;quot; using IS by simp&lt;br /&gt;
      thus ?thesis ..&lt;br /&gt;
    next&lt;br /&gt;
      case (Cons y u&amp;#039;)&lt;br /&gt;
      hence &amp;quot;w&amp;#039; = u&amp;#039; @ v&amp;quot; using IS.prems by simp&lt;br /&gt;
      thus ?thesis using IS.IH mDef by simp&lt;br /&gt;
    qed&lt;br /&gt;
  qed&lt;br /&gt;
  moreover have &amp;quot;balanceada_aux (w @ [B]) 1&amp;quot; using bal `x = A` `y = B` &lt;br /&gt;
    by simp&lt;br /&gt;
  ultimately have &amp;quot;u @ v = (w @ [B]) ⟹ ∃m. balanceada_aux v m&amp;quot; &lt;br /&gt;
    for u v by auto&lt;br /&gt;
  moreover {&lt;br /&gt;
    fix u v&lt;br /&gt;
    have 1: &amp;quot;⟦u&amp;#039; ≠ []; v ≠ []; u&amp;#039; @ v = (x # w @ [y])⟧ ⟹ &lt;br /&gt;
             ¬(balanceada v)&amp;quot; for u&amp;#039;&lt;br /&gt;
      using postfix_con by auto&lt;br /&gt;
    have &amp;quot;⟦v ≠ []; (x#u) @ v = (x # w @ [y])⟧ ⟹ ¬(balanceada v)&amp;quot; &lt;br /&gt;
      using 1[of &amp;quot;x#u&amp;quot;] by simp&lt;br /&gt;
    hence &amp;quot;⟦v ≠ []; u @ v = (w @ [B])⟧ ⟹ ¬(balanceada_aux v 0)&amp;quot; &lt;br /&gt;
      using `y = B` by simp&lt;br /&gt;
  }&lt;br /&gt;
  ultimately have hl3: &amp;quot;⟦v ≠ []; u @ v = (w @ [B])⟧ ⟹ &lt;br /&gt;
                        ∃m. balanceada_aux v (Suc m)&amp;quot; for u v&lt;br /&gt;
    by (metis zero_induct) (* SH&amp;#039;d *)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  have hl4: &amp;quot;⟦balanceada_aux (v @ [B]) (Suc n); ⋀s t. v = s @ t ⟹ &lt;br /&gt;
              ∃m. balanceada_aux (t @ [B]) (Suc m)⟧&lt;br /&gt;
             ⟹ balanceada_aux v n&amp;quot; for v n&lt;br /&gt;
  proof (induction v arbitrary: n)&lt;br /&gt;
    case Nil&lt;br /&gt;
    hence &amp;quot;balanceada_aux [B] (Suc n)&amp;quot; by simp&lt;br /&gt;
    thus &amp;quot;balanceada_aux [] n&amp;quot; by simp&lt;br /&gt;
  next&lt;br /&gt;
    case IS: (Cons x v&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
    have &amp;quot;x#v&amp;#039; = [x] @ v&amp;#039;&amp;quot; by simp&lt;br /&gt;
    then obtain m where mDef: &amp;quot;balanceada_aux (v&amp;#039; @ [B]) (Suc m)&amp;quot; &lt;br /&gt;
      using IS.prems by blast&lt;br /&gt;
    moreover have v&amp;#039;Postf: &amp;quot;⋀s t. v&amp;#039; = s @ t ⟹ &lt;br /&gt;
                                  ∃m. balanceada_aux (t @ [B]) (Suc m)&amp;quot;&lt;br /&gt;
      using IS.prems by auto&lt;br /&gt;
    ultimately have &amp;quot;balanceada_aux v&amp;#039; m&amp;quot; using IS.IH by simp&lt;br /&gt;
&lt;br /&gt;
    show ?case&lt;br /&gt;
    proof (cases x)&lt;br /&gt;
      case A&lt;br /&gt;
      hence &amp;quot;balanceada_aux ((A # v&amp;#039;) @ [B]) (Suc n)&amp;quot; using IS.prems &lt;br /&gt;
        by simp&lt;br /&gt;
      hence &amp;quot;balanceada_aux (v&amp;#039; @ [B]) (Suc (Suc n))&amp;quot; by simp&lt;br /&gt;
      hence &amp;quot;balanceada_aux v&amp;#039; (Suc n)&amp;quot; using IS.IH v&amp;#039;Postf by simp&lt;br /&gt;
      thus ?thesis using `x = A` by simp&lt;br /&gt;
    next&lt;br /&gt;
      case B&lt;br /&gt;
      hence &amp;quot;balanceada_aux ((B # v&amp;#039;) @ [B]) (Suc n)&amp;quot; using IS.prems &lt;br /&gt;
        by simp&lt;br /&gt;
      hence 1: &amp;quot;balanceada_aux ( v&amp;#039; @ [B]) n&amp;quot; using IS.prems by simp&lt;br /&gt;
&lt;br /&gt;
      have &amp;quot;n = Suc m&amp;quot; using 1 mDef balanceada_aux_unico by simp&lt;br /&gt;
      thus &amp;quot;balanceada_aux (x # v&amp;#039;) n&amp;quot; &lt;br /&gt;
        using `balanceada_aux v&amp;#039; m` `x = B` by simp&lt;br /&gt;
    qed&lt;br /&gt;
  qed&lt;br /&gt;
  moreover note `balanceada_aux (w @ [B]) 1`&lt;br /&gt;
  moreover have &amp;quot;w = s @ t ⟹ ∃m. balanceada_aux (t @ [B]) (Suc m)&amp;quot; &lt;br /&gt;
    for s t using hl3 by simp&lt;br /&gt;
  ultimately have &amp;quot;balanceada_aux w 0&amp;quot; by simp&lt;br /&gt;
  thus &amp;quot;x = A ∧ y = B ∧ balanceada w&amp;quot; using `x = A` `y = B`by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma balanceada_completo_aux2: &lt;br /&gt;
  assumes &amp;quot;balanceada (u @ v)&amp;quot; and &amp;quot;¬ balanceada u&amp;quot;&lt;br /&gt;
  shows &amp;quot;¬ balanceada v&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;⟦balanceada_aux (u @ v) n; balanceada v⟧ ⟹ balanceada_aux u n&amp;quot; &lt;br /&gt;
    for n&lt;br /&gt;
  proof (induction u arbitrary: n)&lt;br /&gt;
    case Nil&lt;br /&gt;
    hence &amp;quot;n = 0&amp;quot; using balanceada_aux_unico by simp&lt;br /&gt;
    thus ?case by simp&lt;br /&gt;
  next&lt;br /&gt;
    case IS: (Cons x u&amp;#039;)&lt;br /&gt;
    show ?case&lt;br /&gt;
    proof (cases x)&lt;br /&gt;
      case A&lt;br /&gt;
      hence &amp;quot;balanceada_aux (A # u&amp;#039; @ v) n&amp;quot; using IS.prems by simp&lt;br /&gt;
      hence &amp;quot;balanceada_aux (u&amp;#039; @ v) (Suc n)&amp;quot; by simp&lt;br /&gt;
      hence &amp;quot;balanceada_aux u&amp;#039; (Suc n)&amp;quot; using `balanceada v` IS.IH &lt;br /&gt;
        by simp&lt;br /&gt;
      thus ?thesis using `x = A` by simp&lt;br /&gt;
    next&lt;br /&gt;
      case B&lt;br /&gt;
      hence 1: &amp;quot;balanceada_aux (B # u&amp;#039; @ v) n&amp;quot; using IS.prems by simp&lt;br /&gt;
      then obtain m where &amp;quot;Suc m = n&amp;quot; by (cases n) auto&lt;br /&gt;
      hence &amp;quot;balanceada_aux (B # u&amp;#039; @ v) (Suc m)&amp;quot; using 1 by simp&lt;br /&gt;
      hence &amp;quot;balanceada_aux u&amp;#039; m&amp;quot; using `balanceada v` IS.IH by simp&lt;br /&gt;
      hence &amp;quot;balanceada_aux (B # u&amp;#039;) n&amp;quot; using `Suc m = n` by auto&lt;br /&gt;
      thus ?thesis using `x = B` by simp&lt;br /&gt;
    qed&lt;br /&gt;
  qed&lt;br /&gt;
  thus ?thesis using assms by auto&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
lemma balanceada_completo:&lt;br /&gt;
  assumes &amp;quot;balanceada w&amp;quot;&lt;br /&gt;
  shows   &amp;quot;w ∈ S&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;balanceada w ⟹ w ∈ S&amp;quot;&lt;br /&gt;
  proof (induction &amp;quot;length w&amp;quot; arbitrary: w rule: less_induct)&lt;br /&gt;
    case IS: less&lt;br /&gt;
  &lt;br /&gt;
    show ?case&lt;br /&gt;
    proof (cases w)&lt;br /&gt;
      case Nil&lt;br /&gt;
      thus ?thesis using S1 by simp&lt;br /&gt;
    next&lt;br /&gt;
      case (Cons x w&amp;#039;)&lt;br /&gt;
      show ?thesis&lt;br /&gt;
      proof (cases w&amp;#039;)&lt;br /&gt;
        case Nil&lt;br /&gt;
        hence &amp;quot;¬ balanceada (x#w&amp;#039;)&amp;quot; by (cases x) auto&lt;br /&gt;
        hence &amp;quot;False&amp;quot; using `w = x # w&amp;#039;`IS.prems by simp&lt;br /&gt;
        thus ?thesis ..&lt;br /&gt;
      next&lt;br /&gt;
        case (Cons y w&amp;#039;&amp;#039;)&lt;br /&gt;
        show ?thesis&lt;br /&gt;
        proof cases&lt;br /&gt;
          assume &amp;quot;∃u v. w = u @ v ∧ u ≠ [] ∧ v ≠ [] ∧ &lt;br /&gt;
                        balanceada u ∧ balanceada v&amp;quot;&lt;br /&gt;
          then obtain u v where &amp;quot;w = u @ v&amp;quot; and &lt;br /&gt;
                                &amp;quot;u ≠ []&amp;quot; and &lt;br /&gt;
                                &amp;quot;v ≠ []&amp;quot; and &lt;br /&gt;
                                &amp;quot;balanceada u&amp;quot;&lt;br /&gt;
            and &amp;quot;balanceada v&amp;quot; by blast&lt;br /&gt;
&lt;br /&gt;
          have &amp;quot;u ∈ S&amp;quot; using `w = u @ v` `v ≠ []` `balanceada u` IS &lt;br /&gt;
            by simp&lt;br /&gt;
          moreover have &amp;quot;v ∈ S&amp;quot; &lt;br /&gt;
            using `w = u @ v` `u ≠ []` `balanceada v` IS by simp&lt;br /&gt;
          ultimately show &amp;quot;w ∈ S&amp;quot; using S3 `w = u @ v` by simp&lt;br /&gt;
        next&lt;br /&gt;
          assume &amp;quot;∄u v. w = u @ v ∧ u ≠ [] ∧ v ≠ [] ∧ &lt;br /&gt;
                        balanceada u ∧ balanceada v&amp;quot;&lt;br /&gt;
          hence 1: &amp;quot;⟦u @ v = w; u ≠ []; v ≠ []; balanceada u⟧ ⟹ &lt;br /&gt;
                    ¬ balanceada v&amp;quot; for u v by auto&lt;br /&gt;
&lt;br /&gt;
          have &amp;quot;w = x # y # w&amp;#039;&amp;#039;&amp;quot; using `w = x # w&amp;#039;` `w&amp;#039; = y # w&amp;#039;&amp;#039;` &lt;br /&gt;
            by simp&lt;br /&gt;
          moreover have &amp;quot;∃ u z. y # w&amp;#039;&amp;#039; = u @ [z]&amp;quot;&lt;br /&gt;
          proof -&lt;br /&gt;
            have &amp;quot;∃ u y. (x :: alfabeto) # v = u @ [y]&amp;quot; for x v&lt;br /&gt;
            proof (induction v arbitrary: x)&lt;br /&gt;
              case Nil&lt;br /&gt;
              have &amp;quot;x # [] = [] @ [x]&amp;quot; by simp&lt;br /&gt;
              thus ?case by simp&lt;br /&gt;
            next&lt;br /&gt;
              case IS: (Cons z v&amp;#039;)&lt;br /&gt;
              then obtain u&amp;#039; y&amp;#039; where &amp;quot;z # v&amp;#039; = u&amp;#039; @ [y&amp;#039;]&amp;quot; by blast&lt;br /&gt;
              hence &amp;quot;x # z # v&amp;#039; = x # u&amp;#039; @ [y&amp;#039;]&amp;quot; using IS by simp&lt;br /&gt;
              thus ?case by simp&lt;br /&gt;
            qed&lt;br /&gt;
            thus ?thesis by simp&lt;br /&gt;
          qed&lt;br /&gt;
          ultimately have &amp;quot;∃ u z. w = x # u @ [z]&amp;quot; by auto&lt;br /&gt;
          then obtain u z where &amp;quot;w = x # u @ [z]&amp;quot; by blast&lt;br /&gt;
          hence &amp;quot;balanceada (x # u @ [z])&amp;quot; using `balanceada w` by simp&lt;br /&gt;
          moreover have &amp;quot;⟦s ≠ []; t ≠ []; s @ t = x # u @ [z]⟧ ⟹ &lt;br /&gt;
                         ¬ balanceada t&amp;quot; for s t&lt;br /&gt;
          proof (cases &amp;quot;balanceada s&amp;quot;)&lt;br /&gt;
            case True&lt;br /&gt;
            moreover assume &amp;quot;s ≠ []&amp;quot;&lt;br /&gt;
            moreover assume &amp;quot;t ≠ []&amp;quot;&lt;br /&gt;
            moreover assume &amp;quot;s @ t = x # u @ [z]&amp;quot;&lt;br /&gt;
            ultimately show ?thesis using 1 `w = x # u @ [z]` by auto&lt;br /&gt;
          next&lt;br /&gt;
            case False&lt;br /&gt;
&lt;br /&gt;
            assume &amp;quot;s @ t = x # u @ [z]&amp;quot;&lt;br /&gt;
            hence &amp;quot;x # u @ [z] = s @ t&amp;quot; ..&lt;br /&gt;
            thus ?thesis&lt;br /&gt;
              using balanceada_completo_aux2 &lt;br /&gt;
                    `balanceada w` &lt;br /&gt;
                    `¬ balanceada s` &lt;br /&gt;
                    `w = x # u @ [z]` &lt;br /&gt;
              by simp&lt;br /&gt;
          qed&lt;br /&gt;
          ultimately have &amp;quot;x = A&amp;quot; and &amp;quot;z = B&amp;quot; and &amp;quot;balanceada u&amp;quot;&lt;br /&gt;
            using balanceada_completo_aux1[of x u z] by auto&lt;br /&gt;
          moreover have &amp;quot;u ∈ S&amp;quot; &lt;br /&gt;
            using `w = x # u @ [z]` IS `balanceada u` by simp&lt;br /&gt;
          hence &amp;quot;x # u @ [z] ∈ S&amp;quot; using S2 `u ∈ S` `x = A` `z = B` &lt;br /&gt;
            by simp&lt;br /&gt;
          thus &amp;quot;w ∈ S&amp;quot; using `w = x # u @ [z]` by simp&lt;br /&gt;
        qed&lt;br /&gt;
      qed&lt;br /&gt;
    qed&lt;br /&gt;
  qed&lt;br /&gt;
  thus ?thesis using assms .&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/RA2018/index.php?title=Relaci%C3%B3n_7&amp;diff=420</id>
		<title>Relación 7</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2018/index.php?title=Relaci%C3%B3n_7&amp;diff=420"/>
		<updated>2019-02-28T13:13:59Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isabelle&amp;quot;&amp;gt;&lt;br /&gt;
chapter {* R6: Deducción natural proposicional *}&lt;br /&gt;
&lt;br /&gt;
theory R6_Deduccion_natural_proposicional&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 relación es demostrar cada uno de los ejercicios&lt;br /&gt;
  usando sólo las reglas básicas de deducción natural de la lógica&lt;br /&gt;
  proposicional (sin usar el método auto).&lt;br /&gt;
&lt;br /&gt;
  Las reglas básicas de la deducción natural son las siguientes:&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;
  · notnotI:    P ⟹ ¬¬ P&lt;br /&gt;
  · mp:         ⟦P ⟶ Q; P⟧ ⟹ Q &lt;br /&gt;
  · mt:         ⟦F ⟶ G; ¬G⟧ ⟹ ¬F &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;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Se usarán las reglas notnotI y mt que demostramos a continuación. *}&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;
section {* Implicaciones *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. Demostrar&lt;br /&gt;
       p ⟶ q, p ⊢ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim josgomrom4 cammonagu raffergon2 chrgencar&lt;br /&gt;
   gleherlop giafus1 marfruman1 enrparalv pabbergue antramhur alikan&lt;br /&gt;
   juacanrod hugrubsan *) &lt;br /&gt;
lemma ejercicio_1:&lt;br /&gt;
  assumes 1: &amp;quot;p ⟶ q&amp;quot; and&lt;br /&gt;
          2: &amp;quot;p&amp;quot;&lt;br /&gt;
  shows &amp;quot;q&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  show &amp;quot;q&amp;quot; using 1 2 by (rule mp)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber alfmarcua *)&lt;br /&gt;
lemma ejercicio_1_1:&lt;br /&gt;
  assumes &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
          &amp;quot;p&amp;quot;&lt;br /&gt;
  shows &amp;quot;q&amp;quot;&lt;br /&gt;
  using assms by (rule mp)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Demostrar&lt;br /&gt;
     p ⟶ q, q ⟶ r, p ⊢ r&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim josgomrom4 cammonagu gleherlop raffergon2&lt;br /&gt;
   chrgencar giafus1 marfruman1 alfmarcua enrparalv pabbergue antramhur&lt;br /&gt;
   alikan juacanrod hugrubsan *) &lt;br /&gt;
lemma ejercicio_2:&lt;br /&gt;
  assumes 1: &amp;quot;p ⟶ q&amp;quot; and&lt;br /&gt;
          2: &amp;quot;q ⟶ r&amp;quot; and&lt;br /&gt;
          3: &amp;quot;p&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 1 3 by (rule mp)&lt;br /&gt;
  show &amp;quot;r&amp;quot; using 2 4 by (rule mp)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber *)&lt;br /&gt;
lemma ejercicio_2_1:&lt;br /&gt;
  assumes &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
          &amp;quot;q ⟶ r&amp;quot;&lt;br /&gt;
          &amp;quot;p&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 `p ⟶ q` `p` by (rule mp)&lt;br /&gt;
  with `q ⟶ r` show &amp;quot;r&amp;quot; by (rule mp)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. Demostrar&lt;br /&gt;
     p ⟶ (q ⟶ r), p ⟶ q, p ⊢ r&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim josgomrom4 cammonagu gleherlop raffergon2&lt;br /&gt;
   chrgencar giafus1 marfruman1 alfmarcua enrparalv pabbergue antramhur&lt;br /&gt;
   alikan juacanrod hugrubsan *) &lt;br /&gt;
lemma ejercicio_3:&lt;br /&gt;
  assumes 1: &amp;quot;p ⟶ (q ⟶ r)&amp;quot; and&lt;br /&gt;
          2: &amp;quot;p ⟶ q&amp;quot; and&lt;br /&gt;
          3: &amp;quot;p&amp;quot;&lt;br /&gt;
  shows &amp;quot;r&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have 4: &amp;quot;q ⟶ r&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 &amp;quot;r&amp;quot; using 4 5 by (rule mp)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber *)&lt;br /&gt;
lemma ejercicio_3_1:&lt;br /&gt;
  assumes &amp;quot;p ⟶ (q ⟶ r)&amp;quot;&lt;br /&gt;
          &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
          &amp;quot;p&amp;quot;&lt;br /&gt;
  shows &amp;quot;r&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;q ⟶ r&amp;quot; using `p ⟶ (q ⟶ r)` `p` by (rule mp)&lt;br /&gt;
  moreover have &amp;quot;q&amp;quot; using `p ⟶ q` `p` by (rule mp)&lt;br /&gt;
  ultimately show &amp;quot;r&amp;quot; by (rule mp)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Demostrar&lt;br /&gt;
     p ⟶ q, q ⟶ r ⊢ p ⟶ r&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim josgomrom4 cammonagu chrgencar raffergon2&lt;br /&gt;
   gleherlop giafus1 marfruman1 alfmarcua enrparalv pabbergue antramhur&lt;br /&gt;
   alikan juacanrod hugrubsan *) &lt;br /&gt;
lemma ejercicio_4:&lt;br /&gt;
  assumes 1: &amp;quot;p ⟶ q&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;
  { 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;r&amp;quot; using 2 4 by (rule mp)}&lt;br /&gt;
  thus &amp;quot;p ⟶ r&amp;quot; by (rule impI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber *)&lt;br /&gt;
lemma ejercicio_4_1:&lt;br /&gt;
  assumes &amp;quot;p ⟶ q&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;
  assume p&lt;br /&gt;
  with `p ⟶ q` have &amp;quot;q&amp;quot; by (rule mp)&lt;br /&gt;
  with `q ⟶ r` show &amp;quot;r&amp;quot; by (rule mp)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. Demostrar&lt;br /&gt;
     p ⟶ (q ⟶ r) ⊢ q ⟶ (p ⟶ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim raffergon2 giafus1 gleherlop marfruman1 alfmarcua&lt;br /&gt;
   enrparalv chrgencar pabbergue antramhur alikan hugrubsan *) &lt;br /&gt;
lemma ejercicio_5:&lt;br /&gt;
  assumes 1: &amp;quot;p ⟶ (q ⟶ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;q ⟶ (p ⟶ r)&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume 2: &amp;quot;q&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;q ⟶ r&amp;quot; using 1 3 by (rule mp)&lt;br /&gt;
    show &amp;quot;r&amp;quot; using 4 2 by (rule mp)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber josgomrom4 juacanrod cammonagu  *)&lt;br /&gt;
lemma ejercicio_5_1:&lt;br /&gt;
  assumes &amp;quot;p ⟶ (q ⟶ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;q ⟶ (p ⟶ r)&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume &amp;quot;q&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;
    with `p ⟶ (q ⟶ r)` have &amp;quot;q ⟶ r&amp;quot; by (rule mp)&lt;br /&gt;
    thus &amp;quot;r&amp;quot; using `q` by (rule mp)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* pabalagon *)&lt;br /&gt;
lemma ejercicio_5_2:&lt;br /&gt;
  assumes 1: &amp;quot;p ⟶ (q ⟶ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;q ⟶ (p ⟶ r)&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  { assume 2: &amp;quot;q&amp;quot;&lt;br /&gt;
    { assume 3: &amp;quot;p&amp;quot;&lt;br /&gt;
      have 4: &amp;quot;q ⟶ r&amp;quot; using 1 3 by (rule mp)&lt;br /&gt;
      have 5: &amp;quot;r&amp;quot; using 4 2 by (rule mp)}&lt;br /&gt;
    hence &amp;quot;p ⟶ r&amp;quot; by (rule impI)&lt;br /&gt;
  }&lt;br /&gt;
  thus &amp;quot;q ⟶ (p ⟶ r)&amp;quot; by (rule impI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 6. Demostrar&lt;br /&gt;
     p ⟶ (q ⟶ r) ⊢ (p ⟶ q) ⟶ (p ⟶ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim cammonagu chrgencar raffergon2 gleherlop giafus1 &lt;br /&gt;
   marfruman1 alfmarcua enrparalv pabbergue  antramhur alikan juacanrod&lt;br /&gt;
   hugrubsan *) &lt;br /&gt;
lemma ejercicio_6:&lt;br /&gt;
  assumes 1: &amp;quot;p ⟶ (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;
  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;q ⟶ r&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 &amp;quot;r&amp;quot; using 4 5 by (rule mp)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber josgomrom4 *)&lt;br /&gt;
lemma ejercicio_6_1:&lt;br /&gt;
  assumes &amp;quot;p ⟶ (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;
  show &amp;quot;p ⟶ r&amp;quot;&lt;br /&gt;
  proof&lt;br /&gt;
    assume &amp;quot;p&amp;quot;&lt;br /&gt;
    with `p ⟶ (q ⟶ r)` have &amp;quot;q ⟶ r&amp;quot; by (rule mp)&lt;br /&gt;
    moreover from `p ⟶ q` `p` have &amp;quot;q&amp;quot; by (rule mp)&lt;br /&gt;
    ultimately show &amp;quot;r&amp;quot; by (rule mp)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 7. Demostrar&lt;br /&gt;
     p ⊢ q ⟶ p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim josgomrom4 raffergon2 giafus1 gleherlop&lt;br /&gt;
   marfruman1 enrparalv pabbergue antramhur alikan hugrubsan *) &lt;br /&gt;
lemma ejercicio_7:&lt;br /&gt;
  assumes 1: &amp;quot;p&amp;quot;  &lt;br /&gt;
  shows   &amp;quot;q ⟶ p&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume 2: &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;
&lt;br /&gt;
(* benber cammonagu juacanrod chrgencar *)&lt;br /&gt;
lemma ejercicio_7_1:&lt;br /&gt;
  assumes &amp;quot;p&amp;quot;  &lt;br /&gt;
  shows   &amp;quot;q ⟶ p&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  show &amp;quot;p&amp;quot; using `p` .&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* alfmarcua *)&lt;br /&gt;
lemma ejercicio_7_2:&lt;br /&gt;
  assumes &amp;quot;p&amp;quot;  &lt;br /&gt;
  shows   &amp;quot;q ⟶ p&amp;quot;&lt;br /&gt;
  using assms by (rule impI)&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 8. Demostrar&lt;br /&gt;
     ⊢ p ⟶ (q ⟶ p)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim josgomrom4 raffergon2 giafus1 marfruman1&lt;br /&gt;
   enrparalv pabbergue antramhur alikan hugrubsan *) &lt;br /&gt;
lemma ejercicio_8:&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 2: &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;
(* benber cammonagu gleherlop chrgencar juacanrod alfmarcua *)&lt;br /&gt;
lemma ejercicio_8_1:&lt;br /&gt;
  &amp;quot;p ⟶ (q ⟶ p)&amp;quot;&lt;br /&gt;
  using ejercicio_7_1 by (rule impI)&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 9. Demostrar&lt;br /&gt;
     p ⟶ q ⊢ (q ⟶ r) ⟶ (p ⟶ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim raffergon2 giafus1 marfruman1 alfmarcua enrparalv&lt;br /&gt;
   gleherlop antramhur alikan hugrubsan *) &lt;br /&gt;
lemma ejercicio_9:&lt;br /&gt;
  assumes 1: &amp;quot;p ⟶ q&amp;quot; &lt;br /&gt;
  shows   &amp;quot;(q ⟶ r) ⟶ (p ⟶ r)&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume 2: &amp;quot;q ⟶ r&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;q&amp;quot; using 1 3 by (rule mp)&lt;br /&gt;
    show &amp;quot;r&amp;quot; using 2 4 by (rule mp)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber josgomrom4 cammonagu chrgencar juacanrod pabbergue *)&lt;br /&gt;
lemma ejercicio_9_1:&lt;br /&gt;
  assumes &amp;quot;p ⟶ q&amp;quot; &lt;br /&gt;
  shows   &amp;quot;(q ⟶ r) ⟶ (p ⟶ r)&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume &amp;quot;q ⟶ r&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;
    with `p ⟶ q` have &amp;quot;q&amp;quot; by (rule mp)&lt;br /&gt;
    with `q ⟶ r` show &amp;quot;r&amp;quot; by (rule mp)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 10. Demostrar&lt;br /&gt;
     p ⟶ (q ⟶ (r ⟶ s)) ⊢ r ⟶ (q ⟶ (p ⟶ s))&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim raffergon2 marfruman1 gleherlop alfmarcua&lt;br /&gt;
   enrparalv pabbergue antramhur alikan juacanrod hugrubsan *) &lt;br /&gt;
lemma ejercicio_10:&lt;br /&gt;
  assumes 1: &amp;quot;p ⟶ (q ⟶ (r ⟶ s))&amp;quot; &lt;br /&gt;
  shows   &amp;quot;r ⟶ (q ⟶ (p ⟶ s))&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume 2: &amp;quot;r&amp;quot;&lt;br /&gt;
  show &amp;quot;q ⟶ (p ⟶ s)&amp;quot;&lt;br /&gt;
  proof (rule impI)&lt;br /&gt;
    assume 3: &amp;quot;q&amp;quot;&lt;br /&gt;
    show &amp;quot;p ⟶ s&amp;quot;&lt;br /&gt;
    proof (rule impI)&lt;br /&gt;
      assume 4: &amp;quot;p&amp;quot;&lt;br /&gt;
      have 5: &amp;quot;q ⟶ (r ⟶ s)&amp;quot; using 1 4 by (rule mp)&lt;br /&gt;
      have 6: &amp;quot;r ⟶ s&amp;quot; using 5 3 by (rule mp)&lt;br /&gt;
      show &amp;quot;s&amp;quot; using 6 2 by (rule mp)&lt;br /&gt;
    qed&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber josgomrom4 cammonagu chrgencar giafus1 *)&lt;br /&gt;
lemma ejercicio_10_1:&lt;br /&gt;
  assumes &amp;quot;p ⟶ (q ⟶ (r ⟶ s))&amp;quot; &lt;br /&gt;
  shows   &amp;quot;r ⟶ (q ⟶ (p ⟶ s))&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume &amp;quot;r&amp;quot;&lt;br /&gt;
  show &amp;quot;q ⟶ (p ⟶ s)&amp;quot;&lt;br /&gt;
  proof&lt;br /&gt;
    assume &amp;quot;q&amp;quot;&lt;br /&gt;
    show &amp;quot;p ⟶ s&amp;quot;&lt;br /&gt;
    proof&lt;br /&gt;
      assume &amp;quot;p&amp;quot;&lt;br /&gt;
      with `p ⟶ (q ⟶ (r ⟶ s))`&lt;br /&gt;
        have &amp;quot;q ⟶ (r ⟶ s)&amp;quot; by (rule mp)&lt;br /&gt;
      hence &amp;quot;r ⟶ s&amp;quot; using `q` by (rule mp)&lt;br /&gt;
      thus &amp;quot;s&amp;quot; using `r` by (rule mp)&lt;br /&gt;
    qed&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 11. Demostrar&lt;br /&gt;
     ⊢ (p ⟶ (q ⟶ r)) ⟶ ((p ⟶ q) ⟶ (p ⟶ r))&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim josgomrom4 gleherlop cammonagu giafus1 alfmarcua&lt;br /&gt;
   chrgencar pabbergue alikan juacanrod hugrubsan *) &lt;br /&gt;
lemma ejercicio_11:&lt;br /&gt;
  &amp;quot;(p ⟶ (q ⟶ r)) ⟶ ((p ⟶ q) ⟶ (p ⟶ r))&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume 1: &amp;quot;p ⟶ (q ⟶ r)&amp;quot;&lt;br /&gt;
  show &amp;quot;(p ⟶ q) ⟶ (p ⟶ r)&amp;quot; using 1 ejercicio_6 by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* pabalagon raffergon2 marfruman1 enrparalv antramhur *)&lt;br /&gt;
lemma ejercicio_11_2:&lt;br /&gt;
  &amp;quot;(p ⟶ (q ⟶ r)) ⟶ ((p ⟶ q) ⟶ (p ⟶ r))&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume 1: &amp;quot;p ⟶ (q ⟶ r)&amp;quot;&lt;br /&gt;
  show &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;
    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;q ⟶ r&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 &amp;quot;r&amp;quot; using 4 5 by (rule mp)&lt;br /&gt;
    qed&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber *)&lt;br /&gt;
lemma ejercicio_11_1:&lt;br /&gt;
  &amp;quot;(p ⟶ (q ⟶ r)) ⟶ ((p ⟶ q) ⟶ (p ⟶ r))&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume &amp;quot;p ⟶ (q ⟶ r)&amp;quot;&lt;br /&gt;
  show &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;
    show &amp;quot;p ⟶ r&amp;quot;&lt;br /&gt;
    proof&lt;br /&gt;
      assume p&lt;br /&gt;
      with `p ⟶ (q ⟶ r)` have &amp;quot;q ⟶ r&amp;quot; by (rule mp)&lt;br /&gt;
      moreover have &amp;quot;q&amp;quot; using `p ⟶ q` `p` by (rule mp)&lt;br /&gt;
      ultimately show r by (rule mp)&lt;br /&gt;
    qed&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 12. Demostrar&lt;br /&gt;
     (p ⟶ q) ⟶ r ⊢ p ⟶ (q ⟶ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim raffergon2 marfruman1 gleherlop enrparalv&lt;br /&gt;
   pabbergue antramhur alikan juacanrod hugrubsan *) &lt;br /&gt;
lemma ejercicio_12:&lt;br /&gt;
  assumes 1: &amp;quot;(p ⟶ q) ⟶ r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ⟶ (q ⟶ r)&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume 2: &amp;quot;p&amp;quot;&lt;br /&gt;
  show &amp;quot;q ⟶ r&amp;quot;&lt;br /&gt;
  proof (rule impI)&lt;br /&gt;
    assume 3: &amp;quot;q&amp;quot;&lt;br /&gt;
    have 4: &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
    proof (rule impI)&lt;br /&gt;
      assume 5: &amp;quot;p&amp;quot;&lt;br /&gt;
      show &amp;quot;q&amp;quot; using 3 by this&lt;br /&gt;
    qed&lt;br /&gt;
    show &amp;quot;r&amp;quot; using 1 4 by (rule mp)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber  josgomrom4 cammonagu giafus1 alfmarcua chrgencar *)&lt;br /&gt;
lemma ejercicio_12_1:&lt;br /&gt;
  assumes &amp;quot;(p ⟶ q) ⟶ r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ⟶ (q ⟶ r)&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume &amp;quot;p&amp;quot;&lt;br /&gt;
  show &amp;quot;q ⟶ r&amp;quot;&lt;br /&gt;
  proof&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;
    with `(p ⟶ q) ⟶ r` show &amp;quot;r&amp;quot; by (rule mp)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
section {* Conjunciones *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 13. Demostrar&lt;br /&gt;
     p, q ⊢  p ∧ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon *)&lt;br /&gt;
lemma ejercicio_13:&lt;br /&gt;
  assumes &amp;quot;p&amp;quot;&lt;br /&gt;
          &amp;quot;q&amp;quot; &lt;br /&gt;
  shows &amp;quot;p ∧ q&amp;quot;&lt;br /&gt;
using assms(1, 2) by (rule conjI)&lt;br /&gt;
&lt;br /&gt;
(* benber manperjim josgomrom4 cammonagu raffergon2 marfruman1 alfmarcua&lt;br /&gt;
   enrparalv chrgencar gleherlop pabbergue antramhur juacanrod hugrubsan  &lt;br /&gt;
   alikan *)&lt;br /&gt;
lemma ejercicio_13_1:&lt;br /&gt;
  assumes &amp;quot;p&amp;quot;&lt;br /&gt;
          &amp;quot;q&amp;quot; &lt;br /&gt;
  shows &amp;quot;p ∧ q&amp;quot;&lt;br /&gt;
  using assms by (rule conjI)&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 14. Demostrar&lt;br /&gt;
     p ∧ q ⊢ p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon  josgomrom4 *)&lt;br /&gt;
lemma ejercicio_14:&lt;br /&gt;
  assumes &amp;quot;p ∧ q&amp;quot;  &lt;br /&gt;
  shows   &amp;quot;p&amp;quot;&lt;br /&gt;
  using assms(1) by (rule conjunct1)&lt;br /&gt;
&lt;br /&gt;
(* benber manperjim cammonagu raffergon2 marfruman1 alfmarcua enrparalv&lt;br /&gt;
   chrgencar pabbergue gleherlop antramhur hugrubsan juacanrod alikan *) &lt;br /&gt;
lemma ejercicio_14_1:&lt;br /&gt;
  assumes &amp;quot;p ∧ q&amp;quot;  &lt;br /&gt;
  shows   &amp;quot;p&amp;quot;&lt;br /&gt;
  using assms by (rule conjunct1)&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 15. Demostrar&lt;br /&gt;
     p ∧ q ⊢ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim juacanrod josgomrom4 *)&lt;br /&gt;
lemma ejercicio_15:&lt;br /&gt;
  assumes &amp;quot;p ∧ q&amp;quot; &lt;br /&gt;
  shows   &amp;quot;q&amp;quot;&lt;br /&gt;
  using assms(1) by (rule conjunct2)&lt;br /&gt;
&lt;br /&gt;
(* benber cammonagu raffergon2 marfruman1 alfmarcua enrparalv chrgencar&lt;br /&gt;
   pabbergue antramhur gleherlop hugrubsan alikan *) &lt;br /&gt;
lemma ejercicio_15_1:&lt;br /&gt;
  assumes &amp;quot;p ∧ q&amp;quot; &lt;br /&gt;
  shows   &amp;quot;q&amp;quot;&lt;br /&gt;
  using assms by (rule conjunct2)&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 16. Demostrar&lt;br /&gt;
     p ∧ (q ∧ r) ⊢ (p ∧ q) ∧ r&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim josgomrom4 raffergon2 marfruman1 alfmarcua&lt;br /&gt;
   cammmonagu enrparalv chrgencar gleherlop pabbergue antramhur&lt;br /&gt;
   hugrubsan alikan juacanrod cammonagu *)  &lt;br /&gt;
lemma ejercicio_16:&lt;br /&gt;
  assumes &amp;quot;p ∧ (q ∧ r)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;(p ∧ q) ∧ r&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have 1: &amp;quot;p&amp;quot; using assms(1) by (rule conjunct1)&lt;br /&gt;
  have 2: &amp;quot;q ∧ r&amp;quot; using assms(1) by (rule conjunct2)&lt;br /&gt;
  have 3: &amp;quot;q&amp;quot; using 2 by (rule conjunct1)&lt;br /&gt;
  have 4: &amp;quot;r&amp;quot; using 2 by (rule conjunct2)&lt;br /&gt;
  have 5: &amp;quot;p ∧ q&amp;quot; using 1 3 by (rule conjI)&lt;br /&gt;
  show &amp;quot;(p ∧ q) ∧ r&amp;quot; using 5 4 by (rule conjI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber *)&lt;br /&gt;
lemma ejercicio_16_1:&lt;br /&gt;
  assumes &amp;quot;p ∧ (q ∧ r)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;(p ∧ q) ∧ r&amp;quot;&lt;br /&gt;
proof - (* TODO? *)&lt;br /&gt;
  have &amp;quot;q ∧ r&amp;quot; using assms by (rule conjunct2)&lt;br /&gt;
  have &amp;quot;p&amp;quot; using assms by (rule conjunct1)&lt;br /&gt;
  moreover have &amp;quot;q&amp;quot; using `q ∧ r` by (rule conjunct1)&lt;br /&gt;
  ultimately have &amp;quot;p ∧ q&amp;quot; by (rule conjI)&lt;br /&gt;
  moreover have &amp;quot;r&amp;quot; using `q ∧ r` by (rule conjunct2)&lt;br /&gt;
  ultimately show &amp;quot;(p ∧ q) ∧ r&amp;quot; by (rule conjI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 17. Demostrar&lt;br /&gt;
     (p ∧ q) ∧ r ⊢ p ∧ (q ∧ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim josgomrom4 raffergon2 marfruman1 alfmarcua&lt;br /&gt;
   cammonagu chrgencar gleherlop pabbergue antramhur enrparalv hugrubsan&lt;br /&gt;
   juacanrod alikan *)  &lt;br /&gt;
lemma ejercicio_17:&lt;br /&gt;
  assumes 1: &amp;quot;(p ∧ q) ∧ r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ∧ (q ∧ r)&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have 2: &amp;quot;r&amp;quot; using 1 by (rule conjunct2)&lt;br /&gt;
  have 3: &amp;quot;p ∧ q&amp;quot; using 1 by (rule conjunct1)&lt;br /&gt;
  have 4: &amp;quot;p&amp;quot; using 3 by (rule conjunct1)&lt;br /&gt;
  have 5: &amp;quot;q&amp;quot; using 3 by (rule conjunct2)&lt;br /&gt;
  have 6: &amp;quot;q ∧ r&amp;quot; using 5 2 by (rule conjI)&lt;br /&gt;
  show ?thesis using 4 6 by (rule conjI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber *)&lt;br /&gt;
lemma ejercicio_17_1:&lt;br /&gt;
  assumes &amp;quot;(p ∧ q) ∧ r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ∧ (q ∧ r)&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;p ∧ q&amp;quot; using assms by (rule conjunct1)&lt;br /&gt;
  have &amp;quot;p&amp;quot; using `p ∧ q` by (rule conjunct1)&lt;br /&gt;
  moreover have &amp;quot;q ∧ r&amp;quot;&lt;br /&gt;
  proof (rule conjI)&lt;br /&gt;
    show &amp;quot;q&amp;quot; using `p ∧ q` by (rule conjunct2)&lt;br /&gt;
  next&lt;br /&gt;
    show &amp;quot;r&amp;quot; using assms by (rule conjunct2)&lt;br /&gt;
  qed&lt;br /&gt;
  ultimately show ?thesis by (rule conjI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 18. Demostrar&lt;br /&gt;
     p ∧ q ⊢ p ⟶ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon raffergon2 marfruman1 juacanrod alikan*)&lt;br /&gt;
lemma ejercicio_18:&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 impI)&lt;br /&gt;
  assume &amp;quot;p&amp;quot;&lt;br /&gt;
  show &amp;quot;q&amp;quot; using assms(1) by (rule conjunct2)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber manperjim josgomrom4 cammonagu alfmarcua chrgencar pabbergue&lt;br /&gt;
   gleherlop antramhur enrparalv hugrubsan *) &lt;br /&gt;
lemma ejercicio_18_1:&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;q&amp;quot; using assms by (rule conjunct2)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 19. Demostrar&lt;br /&gt;
     (p ⟶ q) ∧ (p ⟶ r) ⊢ p ⟶ q ∧ r   &lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim josgomrom4 raffergon2 marfruman1 alfmarcua&lt;br /&gt;
   cammonagu chrgencar gleherlop pabbergue antramhur enrparalv juacanrod&lt;br /&gt;
   hugrubsan alikan *)  &lt;br /&gt;
lemma ejercicio_19:&lt;br /&gt;
  assumes 1: &amp;quot;(p ⟶ q) ∧ (p ⟶ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ⟶ q ∧ r&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume 2: &amp;quot;p&amp;quot;&lt;br /&gt;
  have 3: &amp;quot;p ⟶ q&amp;quot; using 1 by (rule conjunct1)&lt;br /&gt;
  have 4: &amp;quot;p ⟶ r&amp;quot; using 1 by (rule conjunct2)&lt;br /&gt;
  have 5: &amp;quot;q&amp;quot; using 3 2 by (rule mp)&lt;br /&gt;
  have 6: &amp;quot;r&amp;quot; using 4 2 by (rule mp)&lt;br /&gt;
  show &amp;quot;q ∧ r&amp;quot; using 5 6 by (rule conjI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber cammonagu *)&lt;br /&gt;
lemma ejercicio_19_1:&lt;br /&gt;
  assumes &amp;quot;(p ⟶ q) ∧ (p ⟶ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ⟶ q ∧ r&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume p&lt;br /&gt;
  show &amp;quot;q ∧ r&amp;quot;&lt;br /&gt;
  proof&lt;br /&gt;
    have &amp;quot;p ⟶ q&amp;quot; using assms by (rule conjunct1)&lt;br /&gt;
    thus &amp;quot;q&amp;quot; using `p` by (rule mp)&lt;br /&gt;
  next&lt;br /&gt;
    have &amp;quot;p ⟶ r&amp;quot; using assms by (rule conjunct2)&lt;br /&gt;
    thus &amp;quot;r&amp;quot; using `p` by (rule mp)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 20. Demostrar&lt;br /&gt;
     p ⟶ q ∧ r ⊢ (p ⟶ q) ∧ (p ⟶ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim josgomrom4 raffergon2 marfruman1 alfmarcua&lt;br /&gt;
   cammonagu chrgencar gleherlop pabbergue antramhur enrparalv juacanrod&lt;br /&gt;
   hugrubsan alikan *)  &lt;br /&gt;
lemma ejercicio_20:&lt;br /&gt;
  assumes 1: &amp;quot;p ⟶ q ∧ r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;(p ⟶ q) ∧ (p ⟶ r)&amp;quot;&lt;br /&gt;
proof (rule conjI)&lt;br /&gt;
  show &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;
    have 3: &amp;quot;q ∧ r&amp;quot; using 1 2 by (rule mp)&lt;br /&gt;
    show 4: &amp;quot;q&amp;quot; using 3 by (rule conjunct1)&lt;br /&gt;
  qed&lt;br /&gt;
  show &amp;quot;p ⟶ r&amp;quot;&lt;br /&gt;
  proof (rule impI)&lt;br /&gt;
    assume 2: &amp;quot;p&amp;quot;&lt;br /&gt;
    have 3: &amp;quot;q ∧ r&amp;quot; using 1 2 by (rule mp)&lt;br /&gt;
    show 4: &amp;quot;r&amp;quot; using 3 by (rule conjunct2)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber *)&lt;br /&gt;
lemma ejercicio_20_1:&lt;br /&gt;
  assumes &amp;quot;p ⟶ q ∧ r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;(p ⟶ q) ∧ (p ⟶ r)&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  show &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
  proof&lt;br /&gt;
    assume &amp;quot;p&amp;quot;&lt;br /&gt;
    with assms have &amp;quot;q ∧ r&amp;quot; by (rule mp)&lt;br /&gt;
    thus &amp;quot;q&amp;quot; by (rule conjunct1)&lt;br /&gt;
  qed&lt;br /&gt;
next&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;
    with assms have &amp;quot;q ∧ r&amp;quot; by (rule mp)&lt;br /&gt;
    thus &amp;quot;r&amp;quot; by (rule conjunct2)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 21. Demostrar&lt;br /&gt;
     p ⟶ (q ⟶ r) ⊢ p ∧ q ⟶ r&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim josgomrom4 raffergon2 marfruman1 alfmarcua&lt;br /&gt;
   cammonagu chrgencar pabbergue gleherlop antramhur enrparalv juacanrod&lt;br /&gt;
   hugrubsan alikan *)  &lt;br /&gt;
lemma ejercicio_21:&lt;br /&gt;
  assumes 1: &amp;quot;p ⟶ (q ⟶ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ∧ q ⟶ r&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume 2: &amp;quot;p ∧ q&amp;quot;&lt;br /&gt;
  have 3: &amp;quot;p&amp;quot; using 2 by (rule conjunct1)&lt;br /&gt;
  have 4: &amp;quot;q ⟶ r&amp;quot; using 1 3 by (rule mp)&lt;br /&gt;
  have 5: &amp;quot;q&amp;quot; using 2 by (rule conjunct2)&lt;br /&gt;
  show &amp;quot;r&amp;quot; using 4 5 by (rule mp)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber *)&lt;br /&gt;
lemma ejercicio_21_1:&lt;br /&gt;
  assumes &amp;quot;p ⟶ (q ⟶ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ∧ q ⟶ r&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume &amp;quot;p ∧ q&amp;quot;&lt;br /&gt;
  hence &amp;quot;p&amp;quot; by (rule conjunct1)&lt;br /&gt;
  with `p ⟶ (q ⟶ r)` have &amp;quot;q ⟶ r&amp;quot; by (rule mp)&lt;br /&gt;
  moreover from `p ∧ q` have &amp;quot;q&amp;quot; by (rule conjunct2)&lt;br /&gt;
  ultimately show &amp;quot;r&amp;quot; by (rule mp)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 22. Demostrar&lt;br /&gt;
     p ∧ q ⟶ r ⊢ p ⟶ (q ⟶ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim josgomrom4 raffergon2 marfruman1 alfmarcua&lt;br /&gt;
   chrgencar pabbergue gleherlop antramhur enrparalv juacanrod hugrubsan&lt;br /&gt;
   alikan *)  &lt;br /&gt;
lemma ejercicio_22:&lt;br /&gt;
  assumes 1: &amp;quot;p ∧ q ⟶ r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ⟶ (q ⟶ r)&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume 2: &amp;quot;p&amp;quot;&lt;br /&gt;
  show &amp;quot;q ⟶ r&amp;quot;&lt;br /&gt;
  proof (rule impI)&lt;br /&gt;
    assume 3: &amp;quot;q&amp;quot;&lt;br /&gt;
    have 4: &amp;quot;p ∧ q&amp;quot; using 2 3 by (rule conjI)&lt;br /&gt;
    show &amp;quot;r&amp;quot; using 1 4 by (rule mp)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber cammonagu *)&lt;br /&gt;
lemma ejercicio_22_1:&lt;br /&gt;
  assumes &amp;quot;p ∧ q ⟶ r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ⟶ (q ⟶ r)&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume &amp;quot;p&amp;quot;&lt;br /&gt;
  show &amp;quot;q ⟶ r&amp;quot;&lt;br /&gt;
  proof&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 `p ∧ q ⟶ r` show &amp;quot;r&amp;quot; by (rule mp)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 23. Demostrar&lt;br /&gt;
     (p ⟶ q) ⟶ r ⊢ p ∧ q ⟶ r&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim josgomrom4 raffergon2 marfruman1 alfmarcua&lt;br /&gt;
   chrgencar pabbergue gleherlop antramhur enrparalv juacanrod hugrubsan&lt;br /&gt;
   alikan *)  &lt;br /&gt;
lemma ejercicio_23:&lt;br /&gt;
  assumes 1: &amp;quot;(p ⟶ q) ⟶ r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ∧ q ⟶ r&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume 2: &amp;quot;p ∧ q&amp;quot;&lt;br /&gt;
  have 3: &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
  proof (rule impI)&lt;br /&gt;
    assume &amp;quot;p&amp;quot;&lt;br /&gt;
    show &amp;quot;q&amp;quot; using 2 by (rule conjunct2)&lt;br /&gt;
  qed&lt;br /&gt;
  show &amp;quot;r&amp;quot; using 1 3 by (rule mp)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber cammonagu *)&lt;br /&gt;
lemma ejercicio_23_1:&lt;br /&gt;
  assumes &amp;quot;(p ⟶ q) ⟶ r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ∧ q ⟶ r&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume &amp;quot;p ∧ q&amp;quot;&lt;br /&gt;
  hence &amp;quot;q&amp;quot; by (rule conjunct2)&lt;br /&gt;
  hence &amp;quot;p ⟶ q&amp;quot; by (rule impI)&lt;br /&gt;
  with `(p ⟶ q) ⟶ r` show &amp;quot;r&amp;quot; by (rule mp)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 24. Demostrar&lt;br /&gt;
     p ∧ (q ⟶ r) ⊢ (p ⟶ q) ⟶ r&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim josgomrom4 raffergon2 marfruman1 alfmarcua&lt;br /&gt;
   chrgencar pabbergue gleherlop antramhur enrparalv hugrubsan juacanrod&lt;br /&gt;
   cammonagu alikan *)  &lt;br /&gt;
lemma ejercicio_24:&lt;br /&gt;
  assumes 1: &amp;quot;p ∧ (q ⟶ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;(p ⟶ q) ⟶ r&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume 2: &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
  have 3: &amp;quot;p&amp;quot; using 1 by (rule conjunct1)&lt;br /&gt;
  have 4: &amp;quot;q ⟶ r&amp;quot; using 1 by (rule conjunct2)&lt;br /&gt;
  have 5: &amp;quot;q&amp;quot; using 2 3 by (rule mp)&lt;br /&gt;
  show 6: &amp;quot;r&amp;quot; using 4 5 by (rule mp)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber *)&lt;br /&gt;
lemma ejercicio_24_1:&lt;br /&gt;
  assumes &amp;quot;p ∧ (q ⟶ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;(p ⟶ q) ⟶ r&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  have &amp;quot;q ⟶ r&amp;quot; using assms by (rule conjunct2)&lt;br /&gt;
  assume &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
  moreover have &amp;quot;p&amp;quot; using assms by (rule conjunct1)&lt;br /&gt;
  ultimately have &amp;quot;q&amp;quot; by (rule mp)&lt;br /&gt;
  with `q ⟶ r` show r by (rule mp)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
section {* Disyunciones *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 25. Demostrar&lt;br /&gt;
     p ⊢ p ∨ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim josgomrom4 benber cammonagu raffergon2 marfruman1&lt;br /&gt;
   alfmarcua chrgencar gleherlop pabbergue antramhur enrparalv juacanrod&lt;br /&gt;
   hugrubsan alikan *)  &lt;br /&gt;
lemma ejercicio_25:&lt;br /&gt;
  assumes &amp;quot;p&amp;quot;&lt;br /&gt;
  shows   &amp;quot;p ∨ q&amp;quot;&lt;br /&gt;
  using assms(1) by (rule disjI1)&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 26. Demostrar&lt;br /&gt;
     q ⊢ p ∨ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim josgomrom4 benber cammonagu marfruman1 alfmarcua&lt;br /&gt;
   chrgencar pabbergue gleherlop antramhur enrparalv juacanrod hugrubsan&lt;br /&gt;
   alikan *)  &lt;br /&gt;
lemma ejercicio_26:&lt;br /&gt;
  assumes &amp;quot;q&amp;quot;&lt;br /&gt;
  shows   &amp;quot;p ∨ q&amp;quot;&lt;br /&gt;
  using assms(1) by (rule disjI2)&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 27. Demostrar&lt;br /&gt;
     p ∨ q ⊢ q ∨ p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim josgomrom4 raffergon2 marfruman1 chrgencar&lt;br /&gt;
   pabbergue antramhur enrparalv juacanrod hugrubsan cammonagu alikan *) &lt;br /&gt;
lemma ejercicio_27:&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 proof (rule disjE)&lt;br /&gt;
  assume 2: &amp;quot;p&amp;quot; thus &amp;quot;q ∨ p&amp;quot; by (rule disjI2)&lt;br /&gt;
next&lt;br /&gt;
  assume 3: &amp;quot;q&amp;quot; thus &amp;quot;q ∨ p&amp;quot; by (rule disjI1)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber alfmarcua gleherlop *)&lt;br /&gt;
lemma ejercicio_27_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 .&lt;br /&gt;
  moreover have &amp;quot;p ⟹ q ∨ p&amp;quot; by (rule disjI2)&lt;br /&gt;
  moreover have &amp;quot;q ⟹ q ∨ p&amp;quot; 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;
  Ejercicio 28. Demostrar&lt;br /&gt;
     q ⟶ r ⊢ p ∨ q ⟶ p ∨ r&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim josgomrom4 raffergon2 marfruman1 chrgencar&lt;br /&gt;
   gleherlop alfmarcua pabbergue antramhur enrparalv juacanrod hugrubsan&lt;br /&gt;
   cammonagu alikan *) &lt;br /&gt;
lemma ejercicio_28:&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; show &amp;quot;p ∨ r&amp;quot; using 2&lt;br /&gt;
  proof (rule disjE)&lt;br /&gt;
    assume 3: p thus &amp;quot;p ∨ r&amp;quot; by (rule disjI1)&lt;br /&gt;
  next&lt;br /&gt;
    assume 4: q have r using 1 4 by (rule mp)&lt;br /&gt;
    thus &amp;quot;p ∨ r&amp;quot; by (rule disjI2)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber *)&lt;br /&gt;
lemma ejercicio_28_1:&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;
  moreover have &amp;quot;p ⟹ p ∨ r&amp;quot; by (rule disjI1)&lt;br /&gt;
  moreover have &amp;quot;q ⟹ p ∨ r&amp;quot;&lt;br /&gt;
  proof (rule disjI2)&lt;br /&gt;
    assume &amp;quot;q&amp;quot;&lt;br /&gt;
    with `q ⟶ r` show &amp;quot;r&amp;quot; by (rule mp)&lt;br /&gt;
  qed&lt;br /&gt;
  ultimately show &amp;quot;p ∨ r&amp;quot; by (rule disjE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 29. Demostrar&lt;br /&gt;
     p ∨ p ⊢ p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon juacanrod marfruman1 *)&lt;br /&gt;
lemma ejercicio_29:&lt;br /&gt;
  assumes 1: &amp;quot;p ∨ p&amp;quot;&lt;br /&gt;
  shows   &amp;quot;p&amp;quot;&lt;br /&gt;
using 1 proof (rule disjE)&lt;br /&gt;
  assume &amp;quot;p&amp;quot; thus &amp;quot;p&amp;quot; .&lt;br /&gt;
next&lt;br /&gt;
  assume &amp;quot;p&amp;quot; thus &amp;quot;p&amp;quot; .&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber manperjim cammonagu josgomrom4 raffergon2 chrgencar alfmarcua&lt;br /&gt;
   gleherlop pabbergue antramhur enrparalv hugrubsan alikan *) &lt;br /&gt;
lemma ejercicio_29_1:&lt;br /&gt;
  assumes &amp;quot;p ∨ p&amp;quot;&lt;br /&gt;
  shows   &amp;quot;p&amp;quot;&lt;br /&gt;
  using assms by (rule disjE)&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 30. Demostrar&lt;br /&gt;
     p ⊢ p ∨ p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim  benber josgomrom4 raffergon2 marfruman1&lt;br /&gt;
   chrgencar alfmarcua pabbergue gleherlop antramhur enrparalv hugrubsan&lt;br /&gt;
   juacanrod cammonagu alikan *)  &lt;br /&gt;
lemma ejercicio_30:&lt;br /&gt;
  assumes &amp;quot;p&amp;quot;&lt;br /&gt;
  shows   &amp;quot;p ∨ p&amp;quot;&lt;br /&gt;
  using assms(1) by (rule disjI1)&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 31. Demostrar&lt;br /&gt;
     p ∨ (q ∨ r) ⊢ (p ∨ q) ∨ r&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim marfruman1 josgomrom4 alfmarcua pabbergue&lt;br /&gt;
   gleherlop antramhur enrparalv juacanrod hugrubsan alikan *) &lt;br /&gt;
lemma ejercicio_31:&lt;br /&gt;
  assumes 1: &amp;quot;p ∨ (q ∨ r)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;(p ∨ q) ∨ r&amp;quot; (is &amp;quot;?R&amp;quot;)&lt;br /&gt;
using 1 proof (rule disjE)&lt;br /&gt;
  assume &amp;quot;p&amp;quot; hence &amp;quot;p ∨ q&amp;quot; by (rule disjI1)&lt;br /&gt;
  thus ?R by (rule disjI1)&lt;br /&gt;
next&lt;br /&gt;
  assume &amp;quot;q ∨ r&amp;quot; thus ?R&lt;br /&gt;
  proof (rule disjE)&lt;br /&gt;
    assume &amp;quot;q&amp;quot; hence &amp;quot;p ∨ q&amp;quot; by (rule disjI2)&lt;br /&gt;
    thus &amp;quot;(p ∨ q) ∨ r&amp;quot; by (rule disjI1)&lt;br /&gt;
  next&lt;br /&gt;
    assume &amp;quot;r&amp;quot; thus ?thesis by (rule disjI2)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber cammonagu *)&lt;br /&gt;
lemma ejercicio_31_1:&lt;br /&gt;
  assumes &amp;quot;p ∨ (q ∨ r)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;(p ∨ q) ∨ r&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;p ∨ (q ∨ r)&amp;quot; using assms .&lt;br /&gt;
  moreover {&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) ∨ r&amp;quot; by (rule disjI1)&lt;br /&gt;
  }&lt;br /&gt;
  moreover {&lt;br /&gt;
    assume &amp;quot;q ∨ r&amp;quot;&lt;br /&gt;
    moreover {&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;
      hence &amp;quot;(p ∨ q) ∨ r&amp;quot; by (rule disjI1)&lt;br /&gt;
    }&lt;br /&gt;
    moreover {&lt;br /&gt;
      assume &amp;quot;r&amp;quot;&lt;br /&gt;
      hence &amp;quot;(p ∨ q) ∨ r&amp;quot; by (rule disjI2)&lt;br /&gt;
    }&lt;br /&gt;
    ultimately have &amp;quot;(p ∨ q) ∨ r&amp;quot; by (rule disjE)&lt;br /&gt;
  }&lt;br /&gt;
  ultimately show &amp;quot;(p ∨ q) ∨ r&amp;quot; by (rule disjE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 32. Demostrar&lt;br /&gt;
     (p ∨ q) ∨ r ⊢ p ∨ (q ∨ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim marfruman1 josgomrom4 alfmarcua gleherlop&lt;br /&gt;
   pabbergue antramhur enrparalv juacanrod hugrubsan alikan *) &lt;br /&gt;
lemma ejercicio_32:&lt;br /&gt;
  assumes 1: &amp;quot;(p ∨ q) ∨ r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ∨ (q ∨ r)&amp;quot;&lt;br /&gt;
using 1 proof (rule disjE)&lt;br /&gt;
  assume &amp;quot;p ∨ q&amp;quot; thus ?thesis&lt;br /&gt;
  proof (rule disjE)&lt;br /&gt;
    assume p thus ?thesis by (rule disjI1)&lt;br /&gt;
  next&lt;br /&gt;
    assume q hence &amp;quot;q ∨ r&amp;quot; by (rule disjI1)&lt;br /&gt;
    thus ?thesis by (rule disjI2)&lt;br /&gt;
  qed&lt;br /&gt;
next&lt;br /&gt;
  assume r hence &amp;quot;q ∨ r&amp;quot; by (rule disjI2)&lt;br /&gt;
  thus ?thesis by (rule disjI2)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber cammonagu *)&lt;br /&gt;
lemma ejercicio_32_1:&lt;br /&gt;
  assumes &amp;quot;(p ∨ q) ∨ r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ∨ (q ∨ r)&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;(p ∨ q) ∨ r&amp;quot; using assms .&lt;br /&gt;
  moreover {&lt;br /&gt;
    assume &amp;quot;p ∨ q&amp;quot;&lt;br /&gt;
    moreover {&lt;br /&gt;
      assume &amp;quot;p&amp;quot;&lt;br /&gt;
      hence ?thesis by (rule disjI1)&lt;br /&gt;
    }&lt;br /&gt;
    moreover {&lt;br /&gt;
      assume &amp;quot;q&amp;quot;&lt;br /&gt;
      hence &amp;quot;q ∨ r&amp;quot; by (rule disjI1)&lt;br /&gt;
      hence ?thesis by (rule disjI2)&lt;br /&gt;
    }&lt;br /&gt;
    ultimately have ?thesis by (rule disjE)&lt;br /&gt;
  }&lt;br /&gt;
  moreover {&lt;br /&gt;
    assume &amp;quot;r&amp;quot;&lt;br /&gt;
    hence &amp;quot;q ∨ r&amp;quot; by (rule disjI2)&lt;br /&gt;
    hence ?thesis by (rule disjI2)&lt;br /&gt;
  }&lt;br /&gt;
  ultimately show ?thesis by (rule disjE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 33. Demostrar&lt;br /&gt;
     p ∧ (q ∨ r) ⊢ (p ∧ q) ∨ (p ∧ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim marfruman1 josgomrom4 chrgencar gleherlop&lt;br /&gt;
   alfmarcua pabbergue antramhur enrparalv juacanrod hugrubsan alikan *) &lt;br /&gt;
lemma ejercicio_33:&lt;br /&gt;
  assumes 1: &amp;quot;p ∧ (q ∨ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;(p ∧ q) ∨ (p ∧ r)&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have 2: p using 1 by (rule conjunct1)&lt;br /&gt;
  show ?thesis&lt;br /&gt;
  proof (rule disjE)&lt;br /&gt;
    assume 3: q have &amp;quot;p ∧ q&amp;quot; using 2 3 by (rule conjI)&lt;br /&gt;
    thus ?thesis by (rule disjI1)&lt;br /&gt;
  next&lt;br /&gt;
    assume 4: r have &amp;quot;p ∧ r&amp;quot; using 2 4 by (rule conjI)&lt;br /&gt;
    thus ?thesis by (rule disjI2)&lt;br /&gt;
  next&lt;br /&gt;
    show &amp;quot;q ∨ r&amp;quot; using 1 by (rule conjunct2)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber cammonagu *)&lt;br /&gt;
lemma ejercicio_33_1:&lt;br /&gt;
  assumes &amp;quot;p ∧ (q ∨ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;(p ∧ q) ∨ (p ∧ r)&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;p&amp;quot; using assms by (rule conjunct1)&lt;br /&gt;
  have &amp;quot;q ∨ r&amp;quot; using assms by (rule conjunct2)&lt;br /&gt;
  moreover {&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;
    hence ?thesis by (rule disjI1)&lt;br /&gt;
  }&lt;br /&gt;
  moreover {&lt;br /&gt;
    assume &amp;quot;r&amp;quot;&lt;br /&gt;
    with `p` have &amp;quot;p ∧ r&amp;quot; by (rule conjI)&lt;br /&gt;
    hence ?thesis by (rule disjI2)&lt;br /&gt;
  }&lt;br /&gt;
  ultimately show ?thesis by (rule disjE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 34. Demostrar&lt;br /&gt;
     (p ∧ q) ∨ (p ∧ r) ⊢ p ∧ (q ∨ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim marfruman1 josgomrom4 chrgencar alfmarcua&lt;br /&gt;
   gleherlop pabbergue antramhur enrparalv juacanrod hugrubsan alikan *) &lt;br /&gt;
lemma ejercicio_34:&lt;br /&gt;
  assumes &amp;quot;(p ∧ q) ∨ (p ∧ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ∧ (q ∨ r)&amp;quot;&lt;br /&gt;
using assms(1) proof (rule disjE)&lt;br /&gt;
  assume 2: &amp;quot;p ∧ q&amp;quot; hence q by (rule conjunct2)&lt;br /&gt;
  hence 3: &amp;quot;q ∨ r&amp;quot; by (rule disjI1)&lt;br /&gt;
  have p using 2 by (rule conjunct1)&lt;br /&gt;
  thus ?thesis using 3 by (rule conjI)&lt;br /&gt;
next&lt;br /&gt;
  assume 4: &amp;quot;p ∧ r&amp;quot; hence r by (rule conjunct2)&lt;br /&gt;
  hence 5: &amp;quot;q ∨ r&amp;quot; by (rule disjI2)&lt;br /&gt;
  have p using 4 by (rule conjunct1)&lt;br /&gt;
  thus ?thesis using 5 by (rule conjI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber cammonagu *)&lt;br /&gt;
lemma ejercicio_34_1:&lt;br /&gt;
  assumes &amp;quot;(p ∧ q) ∨ (p ∧ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ∧ (q ∨ r)&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;(p ∧ q) ∨ (p ∧ r)&amp;quot; using assms .&lt;br /&gt;
  moreover {&lt;br /&gt;
    assume &amp;quot;p ∧ q&amp;quot;&lt;br /&gt;
    hence &amp;quot;p&amp;quot; by (rule conjunct1)&lt;br /&gt;
    moreover {&lt;br /&gt;
      have &amp;quot;q&amp;quot; using `p ∧ q` by (rule conjunct2)&lt;br /&gt;
      hence &amp;quot;q ∨ r&amp;quot; by (rule disjI1)&lt;br /&gt;
    }&lt;br /&gt;
    ultimately have ?thesis by (rule conjI)&lt;br /&gt;
  }&lt;br /&gt;
  moreover {&lt;br /&gt;
    assume &amp;quot;p ∧ r&amp;quot;&lt;br /&gt;
    hence &amp;quot;p&amp;quot; by (rule conjunct1)&lt;br /&gt;
    moreover {&lt;br /&gt;
      have &amp;quot;r&amp;quot; using `p ∧ r` by (rule conjunct2)&lt;br /&gt;
      hence &amp;quot;q ∨ r&amp;quot; by (rule disjI2)&lt;br /&gt;
    }&lt;br /&gt;
    ultimately have ?thesis by (rule conjI)&lt;br /&gt;
  }&lt;br /&gt;
  ultimately show ?thesis by (rule disjE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 35. Demostrar&lt;br /&gt;
     p ∨ (q ∧ r) ⊢ (p ∨ q) ∧ (p ∨ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim marfruman1 josgomrom4 chrgencar alfmarcua&lt;br /&gt;
   gleherlop pabbergue antramhur enrparalv juacanrod hugrubsan alikan *) &lt;br /&gt;
lemma ejercicio_35:&lt;br /&gt;
  assumes &amp;quot;p ∨ (q ∧ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;(p ∨ q) ∧ (p ∨ r)&amp;quot;&lt;br /&gt;
using assms(1) proof (rule disjE)&lt;br /&gt;
  assume 1: p hence 2: &amp;quot;p ∨ r&amp;quot; by (rule disjI1)&lt;br /&gt;
  have &amp;quot;p ∨ q&amp;quot; using 1 by (rule disjI1)&lt;br /&gt;
  thus ?thesis using 2 by (rule conjI)&lt;br /&gt;
next&lt;br /&gt;
  assume 3: &amp;quot;q ∧ r&amp;quot; hence r by (rule conjunct2)&lt;br /&gt;
  hence 4: &amp;quot;p ∨ r&amp;quot; by (rule disjI2)&lt;br /&gt;
  have q using 3 by (rule conjunct1)&lt;br /&gt;
  hence &amp;quot;p ∨ q&amp;quot; by (rule disjI2)&lt;br /&gt;
  thus ?thesis using 4 by (rule conjI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber cammonagu *)&lt;br /&gt;
lemma ejercicio_35_1:&lt;br /&gt;
  assumes &amp;quot;p ∨ (q ∧ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;(p ∨ q) ∧ (p ∨ r)&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;p ∨ (q ∧ r)&amp;quot; using assms .&lt;br /&gt;
  moreover {&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;
    moreover have &amp;quot;p ∨ r&amp;quot; using `p` by (rule disjI1)&lt;br /&gt;
    ultimately have ?thesis by (rule conjI)&lt;br /&gt;
  }&lt;br /&gt;
  moreover {&lt;br /&gt;
    assume &amp;quot;q ∧ r&amp;quot;&lt;br /&gt;
    {&lt;br /&gt;
      have &amp;quot;q&amp;quot; using `q ∧ r` by (rule conjunct1)&lt;br /&gt;
      hence &amp;quot;p ∨ q&amp;quot; by (rule disjI2)&lt;br /&gt;
    }&lt;br /&gt;
    moreover {&lt;br /&gt;
      have &amp;quot;r&amp;quot; using `q ∧ r` by (rule conjunct2)&lt;br /&gt;
      hence &amp;quot;p ∨ r&amp;quot; by (rule disjI2)&lt;br /&gt;
    }&lt;br /&gt;
    ultimately have ?thesis by (rule conjI)&lt;br /&gt;
  }&lt;br /&gt;
  ultimately show ?thesis by (rule disjE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 36. Demostrar&lt;br /&gt;
     (p ∨ q) ∧ (p ∨ r) ⊢ p ∨ (q ∧ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim marfruman1 josgomrom4 chrgencar alfmarcua&lt;br /&gt;
   gleherlop pabbergue antramhur enrparalv juacanrod hugrubsan alikan *) &lt;br /&gt;
lemma ejercicio_36:&lt;br /&gt;
  assumes 1: &amp;quot;(p ∨ q) ∧ (p ∨ r)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;p ∨ (q ∧ r)&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have 2: &amp;quot;p ∨ q&amp;quot; using 1 by (rule conjunct1)&lt;br /&gt;
  have 3: &amp;quot;p ∨ r&amp;quot; using 1 by (rule conjunct2)&lt;br /&gt;
  show ?thesis using 2&lt;br /&gt;
  proof (rule disjE)&lt;br /&gt;
    assume p thus ?thesis by (rule disjI1)&lt;br /&gt;
  next&lt;br /&gt;
    assume 4: q show ?thesis using 3&lt;br /&gt;
    proof (rule disjE)&lt;br /&gt;
      assume p thus ?thesis by (rule disjI1)&lt;br /&gt;
    next&lt;br /&gt;
      assume 5: r have &amp;quot;q ∧ r&amp;quot; using 4 5 by (rule conjI)&lt;br /&gt;
      thus ?thesis by (rule disjI2)&lt;br /&gt;
    qed&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber cammonagu *)&lt;br /&gt;
lemma ejercicio_36_1:&lt;br /&gt;
  assumes &amp;quot;(p ∨ q) ∧ (p ∨ r)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;p ∨ (q ∧ r)&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;p ∨ q&amp;quot; using assms by (rule conjunct1)&lt;br /&gt;
  moreover {&lt;br /&gt;
    assume &amp;quot;p&amp;quot;&lt;br /&gt;
    hence ?thesis by (rule disjI1)&lt;br /&gt;
  }&lt;br /&gt;
  moreover {&lt;br /&gt;
    assume &amp;quot;q&amp;quot;&lt;br /&gt;
    have &amp;quot;p ∨ r&amp;quot; using assms by (rule conjunct2)&lt;br /&gt;
    moreover {&lt;br /&gt;
      assume &amp;quot;p&amp;quot;&lt;br /&gt;
      hence ?thesis by (rule disjI1)&lt;br /&gt;
    }&lt;br /&gt;
    moreover {&lt;br /&gt;
      assume &amp;quot;r&amp;quot;&lt;br /&gt;
      with `q` have &amp;quot;q ∧ r&amp;quot; by (rule conjI)&lt;br /&gt;
      hence ?thesis by (rule disjI2)&lt;br /&gt;
    }&lt;br /&gt;
    ultimately have ?thesis by (rule disjE)&lt;br /&gt;
  }&lt;br /&gt;
  ultimately show ?thesis by (rule disjE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 37. Demostrar&lt;br /&gt;
     (p ⟶ r) ∧ (q ⟶ r) ⊢ p ∨ q ⟶ r&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim marfruman1 josgomrom4 alfmarcua gleherlop&lt;br /&gt;
   pabbergue antramhur enrparalv juacanrod hugrubsan alikan *) &lt;br /&gt;
lemma ejercicio_37:&lt;br /&gt;
  assumes 1: &amp;quot;(p ⟶ r) ∧ (q ⟶ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ∨ q ⟶ r&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  have 2: &amp;quot;p ⟶ r&amp;quot; using 1 by (rule conjunct1)&lt;br /&gt;
  have 3: &amp;quot;q ⟶ r&amp;quot; using 1 by (rule conjunct2)&lt;br /&gt;
  assume 4: &amp;quot;p ∨ q&amp;quot; show &amp;quot;r&amp;quot; using 4&lt;br /&gt;
  proof (rule disjE)&lt;br /&gt;
    assume 5: &amp;quot;p&amp;quot; show &amp;quot;r&amp;quot; using 2 5 by (rule mp)&lt;br /&gt;
  next&lt;br /&gt;
    assume 6: &amp;quot;q&amp;quot; show &amp;quot;r&amp;quot; using 3 6 by (rule mp)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber cammonagu *)&lt;br /&gt;
lemma ejercicio_37_1:&lt;br /&gt;
  assumes &amp;quot;(p ⟶ r) ∧ (q ⟶ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ∨ q ⟶ r&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume &amp;quot;p ∨ q&amp;quot;&lt;br /&gt;
  moreover {&lt;br /&gt;
    have &amp;quot;p ⟶ r&amp;quot; using assms by (rule conjunct1)&lt;br /&gt;
    moreover assume &amp;quot;p&amp;quot;&lt;br /&gt;
    ultimately have &amp;quot;r&amp;quot; by (rule mp)&lt;br /&gt;
  }&lt;br /&gt;
  moreover {&lt;br /&gt;
    have &amp;quot;q ⟶ r&amp;quot; using assms by (rule conjunct2)&lt;br /&gt;
    moreover assume &amp;quot;q&amp;quot;&lt;br /&gt;
    ultimately have &amp;quot;r&amp;quot; by (rule mp)&lt;br /&gt;
  }&lt;br /&gt;
  ultimately show &amp;quot;r&amp;quot; by (rule disjE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 38. Demostrar&lt;br /&gt;
     p ∨ q ⟶ r ⊢ (p ⟶ r) ∧ (q ⟶ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim marfruman1 josgomrom4 alfmarcua gleherlop&lt;br /&gt;
   pabbergue antramhur enrparalv juacanrod hugrubsan alikan *) &lt;br /&gt;
lemma ejercicio_38:&lt;br /&gt;
  assumes &amp;quot;p ∨ q ⟶ r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;(p ⟶ r) ∧ (q ⟶ r)&amp;quot;&lt;br /&gt;
proof (rule conjI)&lt;br /&gt;
  show &amp;quot;p ⟶ r&amp;quot;&lt;br /&gt;
  proof (rule impI)&lt;br /&gt;
    assume &amp;quot;p&amp;quot; hence 1: &amp;quot;p ∨ q&amp;quot; by (rule disjI1)&lt;br /&gt;
    show &amp;quot;r&amp;quot; using assms(1) 1 by (rule mp)&lt;br /&gt;
  qed&lt;br /&gt;
next&lt;br /&gt;
  show &amp;quot;q ⟶ r&amp;quot;&lt;br /&gt;
  proof (rule impI)&lt;br /&gt;
    assume q hence 2: &amp;quot;p ∨ q&amp;quot; by (rule disjI2)&lt;br /&gt;
    show r using assms(1) 2 by (rule mp)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber cammonagu*)&lt;br /&gt;
lemma ejercicio_38_1:&lt;br /&gt;
  assumes &amp;quot;p ∨ q ⟶ r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;(p ⟶ r) ∧ (q ⟶ r)&amp;quot;&lt;br /&gt;
proof&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 ∨ q&amp;quot; by (rule disjI1)&lt;br /&gt;
    with assms show &amp;quot;r&amp;quot; by (rule mp)&lt;br /&gt;
  qed&lt;br /&gt;
next&lt;br /&gt;
  show &amp;quot;q ⟶ r&amp;quot;&lt;br /&gt;
  proof&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 show &amp;quot;r&amp;quot; by (rule mp)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
section {* Negaciones *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 39. Demostrar&lt;br /&gt;
     p ⊢ ¬¬p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim  benber josgomrom4 raffergon2 gleherlop&lt;br /&gt;
   marfruman1 chrgencar alfmarcua pabbergue enrparalv juacanrod&lt;br /&gt;
   hugrubsan cammonagu alikan *)  &lt;br /&gt;
lemma ejercicio_39:&lt;br /&gt;
  assumes &amp;quot;p&amp;quot;&lt;br /&gt;
  shows   &amp;quot;¬¬p&amp;quot;&lt;br /&gt;
  using assms(1) by (rule notnotI)&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 40. Demostrar&lt;br /&gt;
     ¬p ⊢ p ⟶ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim marfruman1 josgomrom4 alfmarcua pabbergue&lt;br /&gt;
   gleherlop juacanrod enrparalv hugrubsan alikan *) &lt;br /&gt;
lemma ejercicio_40:&lt;br /&gt;
  assumes 1: &amp;quot;¬p&amp;quot;&lt;br /&gt;
  shows   &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume 2: p show q using 1 2 by (rule notE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber cammonagu *)&lt;br /&gt;
lemma ejercicio_40_1:&lt;br /&gt;
  assumes &amp;quot;¬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;
  with `¬p` show &amp;quot;q&amp;quot; by (rule notE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 41. Demostrar&lt;br /&gt;
     p ⟶ q ⊢ ¬q ⟶ ¬p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim raffergon2 josgomrom4 marfruman1 alfmarcua&lt;br /&gt;
   pabbergue gleherlop enrparalv juacanrod hugrubsan alikan *) &lt;br /&gt;
lemma ejercicio_41:&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 (rule impI)&lt;br /&gt;
  assume 2: &amp;quot;¬q&amp;quot; show &amp;quot;¬p&amp;quot; using 1 2 by (rule mt)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber cammonagu *)&lt;br /&gt;
lemma ejercicio_41_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;
  assume &amp;quot;¬q&amp;quot;&lt;br /&gt;
  with `p ⟶ q` show &amp;quot;¬p&amp;quot; by (rule mt)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 42. Demostrar&lt;br /&gt;
     p∨q, ¬q ⊢ p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim raffergon2 josgomrom4 marfruman1 alfmarcua&lt;br /&gt;
   pabbergue gleherlop enrparalv juacanrod hugrubsan alikan *) &lt;br /&gt;
lemma ejercicio_42:&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;
using assms(1) proof (rule disjE)&lt;br /&gt;
  assume &amp;quot;p&amp;quot; thus &amp;quot;p&amp;quot; .&lt;br /&gt;
next&lt;br /&gt;
  assume 2: &amp;quot;q&amp;quot; show &amp;quot;p&amp;quot; using assms(2) 2 by (rule notE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber cammonagu *)&lt;br /&gt;
lemma ejercicio_42_1:&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;
  note `p ∨ q`&lt;br /&gt;
  moreover have &amp;quot;p ⟹ p&amp;quot; .&lt;br /&gt;
  moreover {&lt;br /&gt;
    assume &amp;quot;q&amp;quot;&lt;br /&gt;
    with `¬q` have &amp;quot;p&amp;quot; by (rule notE)&lt;br /&gt;
  }&lt;br /&gt;
  ultimately show &amp;quot;p&amp;quot; by (rule disjE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 43. Demostrar&lt;br /&gt;
     p ∨ q, ¬p ⊢ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim raffergon2 josgomrom4 marfruman1 alfmarcua&lt;br /&gt;
   pabbergue gleherlop enrparalv juacanrod hugrubsan alikan *) &lt;br /&gt;
lemma ejercicio_43:&lt;br /&gt;
  assumes &amp;quot;p ∨ q&amp;quot;&lt;br /&gt;
          &amp;quot;¬p&amp;quot; &lt;br /&gt;
  shows   &amp;quot;q&amp;quot;&lt;br /&gt;
using assms(1) proof (rule disjE)&lt;br /&gt;
  assume 1: &amp;quot;p&amp;quot; show &amp;quot;q&amp;quot; using assms(2) 1 by (rule notE)&lt;br /&gt;
next&lt;br /&gt;
  assume &amp;quot;q&amp;quot; thus &amp;quot;q&amp;quot; .&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber cammonagu*)&lt;br /&gt;
lemma ejercicio_43_1:&lt;br /&gt;
  assumes &amp;quot;p ∨ q&amp;quot;&lt;br /&gt;
          &amp;quot;¬p&amp;quot; &lt;br /&gt;
  shows   &amp;quot;q&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;
    with `¬p` have &amp;quot;q&amp;quot; by (rule notE)&lt;br /&gt;
  }&lt;br /&gt;
  moreover have &amp;quot;q ⟹ q&amp;quot; .&lt;br /&gt;
  ultimately show &amp;quot;q&amp;quot; by (rule disjE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 44. Demostrar&lt;br /&gt;
     p ∨ q ⊢ ¬(¬p ∧ ¬q)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim gleherlop josgomrom4 marfruman1 pabbergue&lt;br /&gt;
   juacanrod hugrubsan alikan *) &lt;br /&gt;
lemma ejercicio_44:&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 notI)&lt;br /&gt;
  assume 1: &amp;quot;¬p ∧ ¬q&amp;quot; hence 2: &amp;quot;¬p&amp;quot; by (rule conjunct1)&lt;br /&gt;
  have 3: &amp;quot;¬q&amp;quot; using 1 by (rule conjunct2)&lt;br /&gt;
  show &amp;quot;False&amp;quot;&lt;br /&gt;
  using assms(1) proof (rule disjE)&lt;br /&gt;
    assume 4: &amp;quot;p&amp;quot; show ?thesis using 2 4 by (rule notE)&lt;br /&gt;
  next&lt;br /&gt;
    assume 5: &amp;quot;q&amp;quot; show ?thesis using 3 5 by (rule notE)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber alfmarcua cammonagu *)&lt;br /&gt;
lemma ejercicio_44_1:&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;
  note `p ∨ q`&lt;br /&gt;
  moreover {&lt;br /&gt;
    from `¬p ∧ ¬q` have &amp;quot;¬p&amp;quot; by (rule conjunct1)&lt;br /&gt;
    moreover assume &amp;quot;p&amp;quot;&lt;br /&gt;
    ultimately have &amp;quot;False&amp;quot; by (rule notE)&lt;br /&gt;
  }&lt;br /&gt;
  moreover {&lt;br /&gt;
    from `¬p ∧ ¬q` have &amp;quot;¬q&amp;quot; by (rule conjunct2)&lt;br /&gt;
    moreover assume &amp;quot;q&amp;quot;&lt;br /&gt;
    ultimately have &amp;quot;False&amp;quot; by (rule notE)&lt;br /&gt;
  }&lt;br /&gt;
  ultimately show &amp;quot;False&amp;quot; by (rule disjE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 45. Demostrar&lt;br /&gt;
     p ∧ q ⊢ ¬(¬p ∨ ¬q)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim marfruman1 josgomrom4 gleherlop pabbergue&lt;br /&gt;
   juacanrod hugrubsan alikan *) &lt;br /&gt;
lemma ejercicio_45:&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 notI)&lt;br /&gt;
  assume 2: &amp;quot;¬p ∨ ¬q&amp;quot; have 3: &amp;quot;p&amp;quot; using 1 by (rule conjunct1)&lt;br /&gt;
  have 4: &amp;quot;q&amp;quot; using 1 by (rule conjunct2)&lt;br /&gt;
  show &amp;quot;False&amp;quot; using 2&lt;br /&gt;
  proof (rule disjE)&lt;br /&gt;
    assume &amp;quot;¬p&amp;quot; thus ?thesis using 3 by (rule notE)&lt;br /&gt;
  next&lt;br /&gt;
    assume &amp;quot;¬q&amp;quot; thus ?thesis using 4 by (rule notE)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber alfmarcua cammonagu *)&lt;br /&gt;
lemma ejercicio_45_1:&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;
  moreover {&lt;br /&gt;
    assume &amp;quot;¬p&amp;quot;&lt;br /&gt;
    moreover have &amp;quot;p&amp;quot; using `p ∧ q` by (rule conjunct1)&lt;br /&gt;
    ultimately have &amp;quot;False&amp;quot; by (rule notE)&lt;br /&gt;
  }&lt;br /&gt;
  moreover {&lt;br /&gt;
    assume &amp;quot;¬q&amp;quot;&lt;br /&gt;
    moreover have &amp;quot;q&amp;quot; using `p ∧ q` by (rule conjunct2)&lt;br /&gt;
    ultimately have &amp;quot;False&amp;quot; by (rule notE)&lt;br /&gt;
  }&lt;br /&gt;
  ultimately show False by (rule disjE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 46. Demostrar&lt;br /&gt;
     ¬(p ∨ q) ⊢ ¬p ∧ ¬q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim marfruman1 josgomrom4 gleherlop pabbergue&lt;br /&gt;
   juacanrod hugrubsan alikan *) &lt;br /&gt;
lemma ejercicio_46:&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 conjI)&lt;br /&gt;
  show &amp;quot;¬p&amp;quot;&lt;br /&gt;
  proof (rule notI)&lt;br /&gt;
    assume p hence 2: &amp;quot;p ∨ q&amp;quot; by (rule disjI1)&lt;br /&gt;
    show False using 1 2 by (rule notE)&lt;br /&gt;
  qed&lt;br /&gt;
  show &amp;quot;¬q&amp;quot;&lt;br /&gt;
  proof (rule notI)&lt;br /&gt;
    assume q hence 3: &amp;quot;p ∨ q&amp;quot; by (rule disjI2)&lt;br /&gt;
    show False using 1 3 by (rule notE)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber cammmonagu *)&lt;br /&gt;
lemma ejercicio_46_1:&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&amp;quot;&lt;br /&gt;
  proof (rule ccontr)&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;
    with assms show &amp;quot;False&amp;quot; by (rule notE)&lt;br /&gt;
  qed&lt;br /&gt;
next&lt;br /&gt;
  show &amp;quot;¬q&amp;quot;&lt;br /&gt;
  proof (rule ccontr)&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;
    with assms show &amp;quot;False&amp;quot; by (rule notE)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* alfmarcua *)&lt;br /&gt;
lemma ejercicio_46_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 (rule conjI)&lt;br /&gt;
  have &amp;quot;p ⟹ p ∨ q&amp;quot; by (rule disjI1)&lt;br /&gt;
  then have &amp;quot;p ⟶ p ∨ q&amp;quot; by (rule impI)&lt;br /&gt;
  then show &amp;quot;¬ p&amp;quot; using assms by (rule mt)&lt;br /&gt;
next&lt;br /&gt;
  have &amp;quot;q ⟹ p ∨ q&amp;quot; by (rule disjI2)&lt;br /&gt;
  then have &amp;quot;q ⟶ p ∨ q&amp;quot; by (rule impI)&lt;br /&gt;
  then show &amp;quot;¬ q&amp;quot; using assms by (rule mt)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 47. Demostrar&lt;br /&gt;
     ¬p ∧ ¬q ⊢ ¬(p ∨ q)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim marfruman1 josgomrom4 pabbregue juacanrod&lt;br /&gt;
   hugrubsan alikan *) &lt;br /&gt;
lemma ejercicio_47:&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 notI)&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;
  assume 4: &amp;quot;p ∨ q&amp;quot;&lt;br /&gt;
  show False&lt;br /&gt;
  using 4 proof (rule disjE)&lt;br /&gt;
    assume 5: p show ?thesis using 2 5 by (rule notE)&lt;br /&gt;
  next&lt;br /&gt;
    assume 6: q show ?thesis using 3 6 by (rule notE)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber gleherlop cammonagu*)&lt;br /&gt;
lemma ejercicio_47_1:&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;
  hence &amp;quot;¬(¬p ∧ ¬q)&amp;quot; by (rule ejercicio_44_1)&lt;br /&gt;
  thus &amp;quot;False&amp;quot; using assms by (rule notE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* alfmarcua *)&lt;br /&gt;
lemma ejercicio_47_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 (rule notI)&lt;br /&gt;
  have &amp;quot;¬ p&amp;quot; using assms by (rule conjunct1)&lt;br /&gt;
  have &amp;quot;¬ q&amp;quot; using assms by (rule conjunct2)&lt;br /&gt;
  assume &amp;quot;p ∨ q&amp;quot;&lt;br /&gt;
  then have &amp;quot;q&amp;quot; using `¬ p` by (rule ejercicio_43)&lt;br /&gt;
  show False using `¬ q` `q` by (rule notE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 48. Demostrar&lt;br /&gt;
     ¬p ∨ ¬q ⊢ ¬(p ∧ q)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim marfruman1 josgomrom4 pabbergue juacanrod&lt;br /&gt;
   hugrubsan alikan *) &lt;br /&gt;
lemma ejercicio_48:&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 notI)&lt;br /&gt;
  assume 2: &amp;quot;p ∧ q&amp;quot; hence 3: p by (rule conjunct1)&lt;br /&gt;
  have 4: q using 2 by (rule conjunct2)&lt;br /&gt;
  show False&lt;br /&gt;
  using 1 proof (rule disjE)&lt;br /&gt;
    assume &amp;quot;¬p&amp;quot; thus ?thesis using 3 by (rule notE)&lt;br /&gt;
  next&lt;br /&gt;
    assume &amp;quot;¬q&amp;quot; thus ?thesis using 4 by (rule notE)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber alfmarcua gleherlop cammonagu *)&lt;br /&gt;
lemma ejercicio_48_1:&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;
  hence &amp;quot;¬(¬p ∨ ¬q)&amp;quot; by (rule ejercicio_45_1)&lt;br /&gt;
  thus &amp;quot;False&amp;quot; using assms by (rule notE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 49. Demostrar&lt;br /&gt;
     ⊢ ¬(p ∧ ¬p)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim marfruman1 josgomrom4 alfmarcu gleherlop&lt;br /&gt;
   hugrubsan juacanrod cammonagu alikan *) &lt;br /&gt;
lemma ejercicio_49:&lt;br /&gt;
  &amp;quot;¬(p ∧ ¬p)&amp;quot;&lt;br /&gt;
proof (rule notI)&lt;br /&gt;
  assume 1: &amp;quot;p ∧ ¬p&amp;quot; hence 2: p by (rule conjunct1)&lt;br /&gt;
  have &amp;quot;¬p&amp;quot; using 1 by (rule conjunct2)&lt;br /&gt;
  thus &amp;quot;False&amp;quot; using 2 by (rule notE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber *)&lt;br /&gt;
lemma ejercicio_49_1:&lt;br /&gt;
  &amp;quot;¬(p ∧ ¬p)&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume &amp;quot;p ∧ ¬p&amp;quot;&lt;br /&gt;
  hence &amp;quot;¬p&amp;quot; by (rule conjunct2)&lt;br /&gt;
  moreover have &amp;quot;p&amp;quot; using `p ∧ ¬p` by (rule conjunct1)&lt;br /&gt;
  ultimately show &amp;quot;False&amp;quot; by (rule notE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 50. Demostrar&lt;br /&gt;
     p ∧ ¬p ⊢ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim raffergon2 josgomrom4 marfruman1 gleherlop&lt;br /&gt;
   alfmarcua enrparalv pabbergue juacanrod hugrubsan alikan *) &lt;br /&gt;
lemma ejercicio_50:&lt;br /&gt;
  assumes 1: &amp;quot;p ∧ ¬p&amp;quot;&lt;br /&gt;
  shows   &amp;quot;q&amp;quot;&lt;br /&gt;
proof (rule notE)&lt;br /&gt;
  show p using 1 by (rule conjunct1)&lt;br /&gt;
  show &amp;quot;¬p&amp;quot; using 1 by (rule conjunct2)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber cammonagu*)&lt;br /&gt;
lemma ejercicio_50_1:&lt;br /&gt;
  assumes &amp;quot;p ∧ ¬p&amp;quot; &lt;br /&gt;
  shows   &amp;quot;q&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;¬p&amp;quot; using `p ∧ ¬p` by (rule conjunct2)&lt;br /&gt;
  moreover have &amp;quot;p&amp;quot; using `p ∧ ¬p` by (rule conjunct1)&lt;br /&gt;
  ultimately show &amp;quot;q&amp;quot; by (rule notE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 51. Demostrar&lt;br /&gt;
     ¬¬p ⊢ p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim benber raffergon2 josgomrom4 marfruman1 gleherlop&lt;br /&gt;
   alfmarcua enrparalv pabbergue juacanrod hugrubsan cammmonagu alikan *) &lt;br /&gt;
lemma ejercicio_51:&lt;br /&gt;
  assumes &amp;quot;¬¬p&amp;quot;&lt;br /&gt;
  shows   &amp;quot;p&amp;quot;&lt;br /&gt;
  using assms(1) by (rule notnotD)&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 52. Demostrar&lt;br /&gt;
     ⊢ p ∨ ¬p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim marfruman1 josgomrom4 juacanrod pabbergue alikan *)&lt;br /&gt;
lemma ejercicio_52:&lt;br /&gt;
  &amp;quot;p ∨ ¬p&amp;quot;&lt;br /&gt;
proof (rule ccontr)&lt;br /&gt;
  assume 1: &amp;quot;¬(p ∨ ¬p)&amp;quot;&lt;br /&gt;
  have 2: &amp;quot;¬p&amp;quot; proof (rule notI)&lt;br /&gt;
    assume p hence 3: &amp;quot;p ∨ ¬p&amp;quot; by (rule disjI1)&lt;br /&gt;
    show &amp;quot;False&amp;quot; using 1 3 by (rule notE)&lt;br /&gt;
  qed&lt;br /&gt;
  have 4: &amp;quot;p ∨ ¬p&amp;quot; using 2 by (rule disjI2)&lt;br /&gt;
  show &amp;quot;False&amp;quot; using 1 4 by (rule notE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber cammonagu *)&lt;br /&gt;
lemma ejercicio_52_1:&lt;br /&gt;
  &amp;quot;p ∨ ¬p&amp;quot;&lt;br /&gt;
proof (rule ccontr)&lt;br /&gt;
  assume &amp;quot;¬ (p ∨ ¬ p)&amp;quot;&lt;br /&gt;
  hence &amp;quot;¬p ∧ ¬¬p&amp;quot; by (rule ejercicio_46_1)&lt;br /&gt;
  hence &amp;quot;¬p&amp;quot; by (rule conjunct1)&lt;br /&gt;
  moreover {&lt;br /&gt;
    have &amp;quot;¬¬p&amp;quot; using `¬p ∧ ¬¬p` by (rule conjunct2)&lt;br /&gt;
    hence &amp;quot;p&amp;quot; by (rule notnotD)&lt;br /&gt;
  }&lt;br /&gt;
  ultimately show &amp;quot;False&amp;quot; by (rule notE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* alfmarcua *)&lt;br /&gt;
lemma ejercicio_52_2:&lt;br /&gt;
  &amp;quot;p ∨ ¬p&amp;quot;&lt;br /&gt;
proof (rule ccontr)&lt;br /&gt;
  assume &amp;quot;¬ (p ∨ ¬ p)&amp;quot;&lt;br /&gt;
  then have &amp;quot;¬ p ∧ ¬¬ p&amp;quot; by (rule ejercicio_46)&lt;br /&gt;
  then show False by (rule ejercicio_50)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 53. Demostrar&lt;br /&gt;
     ⊢ ((p ⟶ q) ⟶ p) ⟶ p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim marfruman1 josgomrom4 alfmarcua gleherlop&lt;br /&gt;
   juacanrod pabbergue *) &lt;br /&gt;
lemma ejercicio_53:&lt;br /&gt;
  &amp;quot;((p ⟶ q) ⟶ p) ⟶ p&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume 1: &amp;quot;(p ⟶ q) ⟶ p&amp;quot;&lt;br /&gt;
  show p proof (rule ccontr)&lt;br /&gt;
    assume 2: &amp;quot;¬p&amp;quot;&lt;br /&gt;
    have 3: &amp;quot;¬(p ⟶ q)&amp;quot; using 1 2 by (rule mt)&lt;br /&gt;
    have 4: &amp;quot;p ⟶ q&amp;quot; proof (rule impI)&lt;br /&gt;
      assume 5: p show q using 2 5 by (rule notE)&lt;br /&gt;
    qed&lt;br /&gt;
    show False using 3 4 by (rule notE)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber cammonagu *)&lt;br /&gt;
lemma ejercicio_53_1:&lt;br /&gt;
  &amp;quot;((p ⟶ q) ⟶ p) ⟶ p&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume &amp;quot;(p ⟶ q) ⟶ p&amp;quot;&lt;br /&gt;
  have &amp;quot;p ∨ ¬p&amp;quot; by (rule ejercicio_52_1)&lt;br /&gt;
  moreover have &amp;quot;p ⟹ p&amp;quot; .&lt;br /&gt;
  moreover {&lt;br /&gt;
    assume &amp;quot;¬ p&amp;quot;&lt;br /&gt;
    hence &amp;quot;p ⟶ q&amp;quot; by (rule ejercicio_40_1)&lt;br /&gt;
    with `(p ⟶ q) ⟶ p` have &amp;quot;p&amp;quot; by (rule mp)&lt;br /&gt;
  }&lt;br /&gt;
  ultimately show &amp;quot;p&amp;quot; by (rule disjE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 54. Demostrar&lt;br /&gt;
     ¬q ⟶ ¬p ⊢ p ⟶ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim marfruman1 josgomrom4 gleherlop juacanrod&lt;br /&gt;
   pabbergue *) &lt;br /&gt;
lemma ejercicio_54:&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 (rule impI)&lt;br /&gt;
  assume 2: &amp;quot;p&amp;quot; hence 3: &amp;quot;¬¬p&amp;quot; by (rule notnotI)&lt;br /&gt;
  have &amp;quot;¬¬q&amp;quot; using 1 3 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;
(* benber alfmarcua  cammonagu *)&lt;br /&gt;
lemma ejercicio_54_1:&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;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 55. Demostrar&lt;br /&gt;
     ¬(¬p ∧ ¬q) ⊢ p ∨ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon marfruman1*)&lt;br /&gt;
lemma ejercicio_55:&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 2: &amp;quot;¬(p ∨ q)&amp;quot;&lt;br /&gt;
  have 3: &amp;quot;p&amp;quot;&lt;br /&gt;
  proof (rule ccontr)&lt;br /&gt;
    assume 4: &amp;quot;¬p&amp;quot;&lt;br /&gt;
    have 5: &amp;quot;q&amp;quot;&lt;br /&gt;
    proof (rule ccontr)&lt;br /&gt;
      assume 6: &amp;quot;¬q&amp;quot; have 7: &amp;quot;¬p ∧ ¬q&amp;quot; using 4 6 by (rule conjI)&lt;br /&gt;
      show False using 1 7 by (rule notE)&lt;br /&gt;
    qed&lt;br /&gt;
    have 8: &amp;quot;p ∨ q&amp;quot; using 5 by (rule disjI2)&lt;br /&gt;
    show False using 2 8 by (rule notE)&lt;br /&gt;
  qed&lt;br /&gt;
  have 9: &amp;quot;p ∨ q&amp;quot; using 3 by (rule disjI1)&lt;br /&gt;
  show False using 2 9 by (rule notE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber alfmarcua josgomrom4 manperjim pabbergue juacanrod cammonagu *)&lt;br /&gt;
lemma ejercicio_55_1:&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 ejercicio_46_1)&lt;br /&gt;
  with assms show False by (rule notE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 56. Demostrar&lt;br /&gt;
     ¬(¬p ∨ ¬q) ⊢ p ∧ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim marfruman1 josgomrom4 gleherlop juacanrod&lt;br /&gt;
   pabbergue *) &lt;br /&gt;
lemma ejercicio_56:&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 conjI)&lt;br /&gt;
  show 3: p&lt;br /&gt;
  proof (rule ccontr)&lt;br /&gt;
    assume &amp;quot;¬p&amp;quot; hence 4: &amp;quot;¬p ∨ ¬q&amp;quot; by (rule disjI1)&lt;br /&gt;
    show False using 1 4 by (rule notE)&lt;br /&gt;
  qed&lt;br /&gt;
  show 5: q&lt;br /&gt;
  proof (rule ccontr)&lt;br /&gt;
    assume &amp;quot;¬q&amp;quot; hence 6: &amp;quot;¬p ∨ ¬q&amp;quot; by (rule disjI2)&lt;br /&gt;
    show False using 1 6 by (rule notE)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber alfmarcua cammonagu *)&lt;br /&gt;
lemma ejercicio_56_1:&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 ejercicio_46_1)&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;
  moreover {&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;
  }&lt;br /&gt;
  ultimately show &amp;quot;p ∧ q&amp;quot; by (rule conjI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 57. Demostrar&lt;br /&gt;
     ¬(p ∧ q) ⊢ ¬p ∨ ¬q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim marfruman1 josgomrom4 gleherlop juacanrod&lt;br /&gt;
   pabbergue *) &lt;br /&gt;
lemma ejercicio_57:&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 2: &amp;quot;¬(¬p ∨ ¬q)&amp;quot;&lt;br /&gt;
  show False using 1&lt;br /&gt;
  proof (rule notE)&lt;br /&gt;
    show 3: &amp;quot;p ∧ q&amp;quot;&lt;br /&gt;
    proof (rule conjI)&lt;br /&gt;
      show p&lt;br /&gt;
      proof (rule ccontr)&lt;br /&gt;
        assume &amp;quot;¬p&amp;quot; hence 4: &amp;quot;¬p ∨ ¬q&amp;quot; by (rule disjI1)&lt;br /&gt;
        show False using 2 4 by (rule notE)&lt;br /&gt;
      qed&lt;br /&gt;
    next&lt;br /&gt;
      show q&lt;br /&gt;
      proof (rule ccontr)&lt;br /&gt;
        assume &amp;quot;¬q&amp;quot; hence 5: &amp;quot;¬p ∨ ¬q&amp;quot; by (rule disjI2)&lt;br /&gt;
        show False using 2 5 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;
(* benber alfmarcua cammonagu *)&lt;br /&gt;
lemma ejercicio_57_1:&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 ejercicio_56_1)&lt;br /&gt;
  with assms show &amp;quot;False&amp;quot; by (rule notE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 58. Demostrar&lt;br /&gt;
     ⊢ (p ⟶ q) ∨ (q ⟶ p)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim josgomrom4 marfruman1 juacanrod pabbergue *)&lt;br /&gt;
lemma ejercicio_58:&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; proof (rule ccontr)&lt;br /&gt;
    assume 1: &amp;quot;¬((p ⟶ q) ∨ ¬(p ⟶ q))&amp;quot;&lt;br /&gt;
    have 2: &amp;quot;¬(p ⟶ q)&amp;quot; proof (rule notI)&lt;br /&gt;
      assume &amp;quot;p ⟶ q&amp;quot; &lt;br /&gt;
      hence 3: &amp;quot;(p ⟶ q) ∨ ¬(p ⟶ q)&amp;quot; by (rule disjI1)&lt;br /&gt;
      show False using 1 3 by (rule notE)&lt;br /&gt;
    qed&lt;br /&gt;
    hence 4: &amp;quot;(p ⟶ q) ∨ ¬(p ⟶ q)&amp;quot; by (rule disjI2)&lt;br /&gt;
    show &amp;quot;False&amp;quot; using 1 4 by (rule notE)&lt;br /&gt;
  qed&lt;br /&gt;
  thus ?thesis proof (rule disjE)&lt;br /&gt;
    assume &amp;quot;p ⟶ q&amp;quot; thus ?thesis by (rule disjI1)&lt;br /&gt;
  next&lt;br /&gt;
    assume 1: &amp;quot;¬(p ⟶ q)&amp;quot;&lt;br /&gt;
    have &amp;quot;q ⟶ p&amp;quot; proof (rule impI)&lt;br /&gt;
      assume 2: q&lt;br /&gt;
      have 3: &amp;quot;p ⟶ q&amp;quot; proof (rule impI)&lt;br /&gt;
        assume p show q using 2 .&lt;br /&gt;
      qed&lt;br /&gt;
      show p using 1 3 by (rule notE)&lt;br /&gt;
    qed&lt;br /&gt;
    thus ?thesis by (rule disjI2)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* pabalagon gleherlop *)&lt;br /&gt;
lemma ejercicio_58_2:&lt;br /&gt;
  &amp;quot;(p ⟶ q) ∨ (q ⟶ p)&amp;quot;&lt;br /&gt;
proof (rule ccontr)&lt;br /&gt;
  assume 1: &amp;quot;¬((p ⟶ q) ∨ (q ⟶ p))&amp;quot;&lt;br /&gt;
  hence 1: &amp;quot;(p ∧ ¬q) ∧ (q ∧ ¬p)&amp;quot; by simp&lt;br /&gt;
  hence &amp;quot;p ∧ ¬q&amp;quot; ..&lt;br /&gt;
  hence 2: p ..&lt;br /&gt;
  have &amp;quot;q ∧ ¬p&amp;quot; using 1 ..&lt;br /&gt;
  hence 3: &amp;quot;¬p&amp;quot; ..&lt;br /&gt;
  show False using 3 2 by (rule notE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber cammonagu *)&lt;br /&gt;
lemma ejercicio_58_1:&lt;br /&gt;
  &amp;quot;(p ⟶ q) ∨ (q ⟶ p)&amp;quot;&lt;br /&gt;
proof (rule ccontr)&lt;br /&gt;
  assume &amp;quot;¬ ((p ⟶ q) ∨ (q ⟶ p))&amp;quot;&lt;br /&gt;
  hence 1: &amp;quot;¬(p ⟶ q) ∧ ¬(q ⟶ p)&amp;quot; by (rule ejercicio_46_1)&lt;br /&gt;
&lt;br /&gt;
  have &amp;quot;p ∨ ¬p&amp;quot; by (rule ejercicio_52_1)&lt;br /&gt;
  moreover {&lt;br /&gt;
    assume &amp;quot;p&amp;quot;&lt;br /&gt;
    hence &amp;quot;q ⟶ p&amp;quot; by (rule ejercicio_7_1)&lt;br /&gt;
&lt;br /&gt;
    have &amp;quot;¬(q ⟶ p)&amp;quot; using 1 by (rule conjunct2)&lt;br /&gt;
    hence &amp;quot;False&amp;quot; using `q ⟶ p` by (rule notE)&lt;br /&gt;
  }&lt;br /&gt;
  moreover {&lt;br /&gt;
    assume &amp;quot;¬p&amp;quot;&lt;br /&gt;
    hence &amp;quot;p ⟶ q&amp;quot; by (rule ejercicio_40_1)&lt;br /&gt;
&lt;br /&gt;
    have &amp;quot;¬(p ⟶ q)&amp;quot; using 1 by (rule conjunct1)&lt;br /&gt;
    hence &amp;quot;False&amp;quot; using `p ⟶ q` by (rule notE)&lt;br /&gt;
  }&lt;br /&gt;
  ultimately show &amp;quot;False&amp;quot; by (rule disjE)&lt;br /&gt;
  moreover {&lt;br /&gt;
    assume &amp;quot;p&amp;quot;&lt;br /&gt;
    hence &amp;quot;q ⟶ p&amp;quot; by (rule ejercicio_7_1)&lt;br /&gt;
&lt;br /&gt;
    have &amp;quot;¬(q ⟶ p)&amp;quot; using 1 by (rule conjunct2)&lt;br /&gt;
    hence &amp;quot;False&amp;quot; using `q ⟶ p` by (rule notE)&lt;br /&gt;
  }&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* alfmarcua *)&lt;br /&gt;
lemma ejercicio_58_3:&lt;br /&gt;
  &amp;quot;(p ⟶ q) ∨ (q ⟶ p)&amp;quot;&lt;br /&gt;
proof (rule disjE)&lt;br /&gt;
  show &amp;quot;p ∨ ¬ p&amp;quot; by (rule ejercicio_52)&lt;br /&gt;
next&lt;br /&gt;
  assume &amp;quot;¬p&amp;quot;&lt;br /&gt;
  then have &amp;quot;p ⟶ q&amp;quot; by (rule ejercicio_40)&lt;br /&gt;
  then show ?thesis by (rule disjI1)&lt;br /&gt;
next&lt;br /&gt;
  assume &amp;quot;p&amp;quot;&lt;br /&gt;
  then have &amp;quot;q ⟶ p&amp;quot; by (rule ejercicio_7)&lt;br /&gt;
  then show ?thesis by (rule disjI2)&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/RA2018/index.php?title=Relaci%C3%B3n_7&amp;diff=419</id>
		<title>Relación 7</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2018/index.php?title=Relaci%C3%B3n_7&amp;diff=419"/>
		<updated>2019-02-28T13:12:45Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isabelle&amp;quot;&amp;gt;&lt;br /&gt;
chapter {* R6: Deducción natural proposicional *}&lt;br /&gt;
&lt;br /&gt;
theory R6_Deduccion_natural_proposicional_alu&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 relación es demostrar cada uno de los ejercicios&lt;br /&gt;
  usando sólo las reglas básicas de deducción natural de la lógica&lt;br /&gt;
  proposicional (sin usar el método auto).&lt;br /&gt;
&lt;br /&gt;
  Las reglas básicas de la deducción natural son las siguientes:&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;
  · notnotI:    P ⟹ ¬¬ P&lt;br /&gt;
  · mp:         ⟦P ⟶ Q; P⟧ ⟹ Q &lt;br /&gt;
  · mt:         ⟦F ⟶ G; ¬G⟧ ⟹ ¬F &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;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Se usarán las reglas notnotI y mt que demostramos a continuación. *}&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;
section {* Implicaciones *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. Demostrar&lt;br /&gt;
       p ⟶ q, p ⊢ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim josgomrom4 cammonagu raffergon2 chrgencar&lt;br /&gt;
   gleherlop giafus1 marfruman1 enrparalv pabbergue antramhur alikan&lt;br /&gt;
   juacanrod hugrubsan *) &lt;br /&gt;
lemma ejercicio_1:&lt;br /&gt;
  assumes 1: &amp;quot;p ⟶ q&amp;quot; and&lt;br /&gt;
          2: &amp;quot;p&amp;quot;&lt;br /&gt;
  shows &amp;quot;q&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  show &amp;quot;q&amp;quot; using 1 2 by (rule mp)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber alfmarcua *)&lt;br /&gt;
lemma ejercicio_1_1:&lt;br /&gt;
  assumes &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
          &amp;quot;p&amp;quot;&lt;br /&gt;
  shows &amp;quot;q&amp;quot;&lt;br /&gt;
  using assms by (rule mp)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Demostrar&lt;br /&gt;
     p ⟶ q, q ⟶ r, p ⊢ r&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim josgomrom4 cammonagu gleherlop raffergon2&lt;br /&gt;
   chrgencar giafus1 marfruman1 alfmarcua enrparalv pabbergue antramhur&lt;br /&gt;
   alikan juacanrod hugrubsan *) &lt;br /&gt;
lemma ejercicio_2:&lt;br /&gt;
  assumes 1: &amp;quot;p ⟶ q&amp;quot; and&lt;br /&gt;
          2: &amp;quot;q ⟶ r&amp;quot; and&lt;br /&gt;
          3: &amp;quot;p&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 1 3 by (rule mp)&lt;br /&gt;
  show &amp;quot;r&amp;quot; using 2 4 by (rule mp)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber *)&lt;br /&gt;
lemma ejercicio_2_1:&lt;br /&gt;
  assumes &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
          &amp;quot;q ⟶ r&amp;quot;&lt;br /&gt;
          &amp;quot;p&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 `p ⟶ q` `p` by (rule mp)&lt;br /&gt;
  with `q ⟶ r` show &amp;quot;r&amp;quot; by (rule mp)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. Demostrar&lt;br /&gt;
     p ⟶ (q ⟶ r), p ⟶ q, p ⊢ r&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim josgomrom4 cammonagu gleherlop raffergon2&lt;br /&gt;
   chrgencar giafus1 marfruman1 alfmarcua enrparalv pabbergue antramhur&lt;br /&gt;
   alikan juacanrod hugrubsan *) &lt;br /&gt;
lemma ejercicio_3:&lt;br /&gt;
  assumes 1: &amp;quot;p ⟶ (q ⟶ r)&amp;quot; and&lt;br /&gt;
          2: &amp;quot;p ⟶ q&amp;quot; and&lt;br /&gt;
          3: &amp;quot;p&amp;quot;&lt;br /&gt;
  shows &amp;quot;r&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have 4: &amp;quot;q ⟶ r&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 &amp;quot;r&amp;quot; using 4 5 by (rule mp)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber *)&lt;br /&gt;
lemma ejercicio_3_1:&lt;br /&gt;
  assumes &amp;quot;p ⟶ (q ⟶ r)&amp;quot;&lt;br /&gt;
          &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
          &amp;quot;p&amp;quot;&lt;br /&gt;
  shows &amp;quot;r&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;q ⟶ r&amp;quot; using `p ⟶ (q ⟶ r)` `p` by (rule mp)&lt;br /&gt;
  moreover have &amp;quot;q&amp;quot; using `p ⟶ q` `p` by (rule mp)&lt;br /&gt;
  ultimately show &amp;quot;r&amp;quot; by (rule mp)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Demostrar&lt;br /&gt;
     p ⟶ q, q ⟶ r ⊢ p ⟶ r&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim josgomrom4 cammonagu chrgencar raffergon2&lt;br /&gt;
   gleherlop giafus1 marfruman1 alfmarcua enrparalv pabbergue antramhur&lt;br /&gt;
   alikan juacanrod hugrubsan *) &lt;br /&gt;
lemma ejercicio_4:&lt;br /&gt;
  assumes 1: &amp;quot;p ⟶ q&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;
  { 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;r&amp;quot; using 2 4 by (rule mp)}&lt;br /&gt;
  thus &amp;quot;p ⟶ r&amp;quot; by (rule impI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber *)&lt;br /&gt;
lemma ejercicio_4_1:&lt;br /&gt;
  assumes &amp;quot;p ⟶ q&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;
  assume p&lt;br /&gt;
  with `p ⟶ q` have &amp;quot;q&amp;quot; by (rule mp)&lt;br /&gt;
  with `q ⟶ r` show &amp;quot;r&amp;quot; by (rule mp)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. Demostrar&lt;br /&gt;
     p ⟶ (q ⟶ r) ⊢ q ⟶ (p ⟶ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim raffergon2 giafus1 gleherlop marfruman1 alfmarcua&lt;br /&gt;
   enrparalv chrgencar pabbergue antramhur alikan hugrubsan *) &lt;br /&gt;
lemma ejercicio_5:&lt;br /&gt;
  assumes 1: &amp;quot;p ⟶ (q ⟶ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;q ⟶ (p ⟶ r)&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume 2: &amp;quot;q&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;q ⟶ r&amp;quot; using 1 3 by (rule mp)&lt;br /&gt;
    show &amp;quot;r&amp;quot; using 4 2 by (rule mp)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber josgomrom4 juacanrod cammonagu  *)&lt;br /&gt;
lemma ejercicio_5_1:&lt;br /&gt;
  assumes &amp;quot;p ⟶ (q ⟶ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;q ⟶ (p ⟶ r)&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume &amp;quot;q&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;
    with `p ⟶ (q ⟶ r)` have &amp;quot;q ⟶ r&amp;quot; by (rule mp)&lt;br /&gt;
    thus &amp;quot;r&amp;quot; using `q` by (rule mp)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* pabalagon *)&lt;br /&gt;
lemma ejercicio_5_2:&lt;br /&gt;
  assumes 1: &amp;quot;p ⟶ (q ⟶ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;q ⟶ (p ⟶ r)&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  { assume 2: &amp;quot;q&amp;quot;&lt;br /&gt;
    { assume 3: &amp;quot;p&amp;quot;&lt;br /&gt;
      have 4: &amp;quot;q ⟶ r&amp;quot; using 1 3 by (rule mp)&lt;br /&gt;
      have 5: &amp;quot;r&amp;quot; using 4 2 by (rule mp)}&lt;br /&gt;
    hence &amp;quot;p ⟶ r&amp;quot; by (rule impI)&lt;br /&gt;
  }&lt;br /&gt;
  thus &amp;quot;q ⟶ (p ⟶ r)&amp;quot; by (rule impI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 6. Demostrar&lt;br /&gt;
     p ⟶ (q ⟶ r) ⊢ (p ⟶ q) ⟶ (p ⟶ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim cammonagu chrgencar raffergon2 gleherlop giafus1 &lt;br /&gt;
   marfruman1 alfmarcua enrparalv pabbergue  antramhur alikan juacanrod&lt;br /&gt;
   hugrubsan *) &lt;br /&gt;
lemma ejercicio_6:&lt;br /&gt;
  assumes 1: &amp;quot;p ⟶ (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;
  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;q ⟶ r&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 &amp;quot;r&amp;quot; using 4 5 by (rule mp)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber josgomrom4 *)&lt;br /&gt;
lemma ejercicio_6_1:&lt;br /&gt;
  assumes &amp;quot;p ⟶ (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;
  show &amp;quot;p ⟶ r&amp;quot;&lt;br /&gt;
  proof&lt;br /&gt;
    assume &amp;quot;p&amp;quot;&lt;br /&gt;
    with `p ⟶ (q ⟶ r)` have &amp;quot;q ⟶ r&amp;quot; by (rule mp)&lt;br /&gt;
    moreover from `p ⟶ q` `p` have &amp;quot;q&amp;quot; by (rule mp)&lt;br /&gt;
    ultimately show &amp;quot;r&amp;quot; by (rule mp)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 7. Demostrar&lt;br /&gt;
     p ⊢ q ⟶ p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim josgomrom4 raffergon2 giafus1 gleherlop&lt;br /&gt;
   marfruman1 enrparalv pabbergue antramhur alikan hugrubsan *) &lt;br /&gt;
lemma ejercicio_7:&lt;br /&gt;
  assumes 1: &amp;quot;p&amp;quot;  &lt;br /&gt;
  shows   &amp;quot;q ⟶ p&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume 2: &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;
&lt;br /&gt;
(* benber cammonagu juacanrod chrgencar *)&lt;br /&gt;
lemma ejercicio_7_1:&lt;br /&gt;
  assumes &amp;quot;p&amp;quot;  &lt;br /&gt;
  shows   &amp;quot;q ⟶ p&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  show &amp;quot;p&amp;quot; using `p` .&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* alfmarcua *)&lt;br /&gt;
lemma ejercicio_7_2:&lt;br /&gt;
  assumes &amp;quot;p&amp;quot;  &lt;br /&gt;
  shows   &amp;quot;q ⟶ p&amp;quot;&lt;br /&gt;
  using assms by (rule impI)&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 8. Demostrar&lt;br /&gt;
     ⊢ p ⟶ (q ⟶ p)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim josgomrom4 raffergon2 giafus1 marfruman1&lt;br /&gt;
   enrparalv pabbergue antramhur alikan hugrubsan *) &lt;br /&gt;
lemma ejercicio_8:&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 2: &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;
(* benber cammonagu gleherlop chrgencar juacanrod alfmarcua *)&lt;br /&gt;
lemma ejercicio_8_1:&lt;br /&gt;
  &amp;quot;p ⟶ (q ⟶ p)&amp;quot;&lt;br /&gt;
  using ejercicio_7_1 by (rule impI)&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 9. Demostrar&lt;br /&gt;
     p ⟶ q ⊢ (q ⟶ r) ⟶ (p ⟶ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim raffergon2 giafus1 marfruman1 alfmarcua enrparalv&lt;br /&gt;
   gleherlop antramhur alikan hugrubsan *) &lt;br /&gt;
lemma ejercicio_9:&lt;br /&gt;
  assumes 1: &amp;quot;p ⟶ q&amp;quot; &lt;br /&gt;
  shows   &amp;quot;(q ⟶ r) ⟶ (p ⟶ r)&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume 2: &amp;quot;q ⟶ r&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;q&amp;quot; using 1 3 by (rule mp)&lt;br /&gt;
    show &amp;quot;r&amp;quot; using 2 4 by (rule mp)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber josgomrom4 cammonagu chrgencar juacanrod pabbergue *)&lt;br /&gt;
lemma ejercicio_9_1:&lt;br /&gt;
  assumes &amp;quot;p ⟶ q&amp;quot; &lt;br /&gt;
  shows   &amp;quot;(q ⟶ r) ⟶ (p ⟶ r)&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume &amp;quot;q ⟶ r&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;
    with `p ⟶ q` have &amp;quot;q&amp;quot; by (rule mp)&lt;br /&gt;
    with `q ⟶ r` show &amp;quot;r&amp;quot; by (rule mp)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 10. Demostrar&lt;br /&gt;
     p ⟶ (q ⟶ (r ⟶ s)) ⊢ r ⟶ (q ⟶ (p ⟶ s))&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim raffergon2 marfruman1 gleherlop alfmarcua&lt;br /&gt;
   enrparalv pabbergue antramhur alikan juacanrod hugrubsan *) &lt;br /&gt;
lemma ejercicio_10:&lt;br /&gt;
  assumes 1: &amp;quot;p ⟶ (q ⟶ (r ⟶ s))&amp;quot; &lt;br /&gt;
  shows   &amp;quot;r ⟶ (q ⟶ (p ⟶ s))&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume 2: &amp;quot;r&amp;quot;&lt;br /&gt;
  show &amp;quot;q ⟶ (p ⟶ s)&amp;quot;&lt;br /&gt;
  proof (rule impI)&lt;br /&gt;
    assume 3: &amp;quot;q&amp;quot;&lt;br /&gt;
    show &amp;quot;p ⟶ s&amp;quot;&lt;br /&gt;
    proof (rule impI)&lt;br /&gt;
      assume 4: &amp;quot;p&amp;quot;&lt;br /&gt;
      have 5: &amp;quot;q ⟶ (r ⟶ s)&amp;quot; using 1 4 by (rule mp)&lt;br /&gt;
      have 6: &amp;quot;r ⟶ s&amp;quot; using 5 3 by (rule mp)&lt;br /&gt;
      show &amp;quot;s&amp;quot; using 6 2 by (rule mp)&lt;br /&gt;
    qed&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber josgomrom4 cammonagu chrgencar giafus1 *)&lt;br /&gt;
lemma ejercicio_10_1:&lt;br /&gt;
  assumes &amp;quot;p ⟶ (q ⟶ (r ⟶ s))&amp;quot; &lt;br /&gt;
  shows   &amp;quot;r ⟶ (q ⟶ (p ⟶ s))&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume &amp;quot;r&amp;quot;&lt;br /&gt;
  show &amp;quot;q ⟶ (p ⟶ s)&amp;quot;&lt;br /&gt;
  proof&lt;br /&gt;
    assume &amp;quot;q&amp;quot;&lt;br /&gt;
    show &amp;quot;p ⟶ s&amp;quot;&lt;br /&gt;
    proof&lt;br /&gt;
      assume &amp;quot;p&amp;quot;&lt;br /&gt;
      with `p ⟶ (q ⟶ (r ⟶ s))`&lt;br /&gt;
        have &amp;quot;q ⟶ (r ⟶ s)&amp;quot; by (rule mp)&lt;br /&gt;
      hence &amp;quot;r ⟶ s&amp;quot; using `q` by (rule mp)&lt;br /&gt;
      thus &amp;quot;s&amp;quot; using `r` by (rule mp)&lt;br /&gt;
    qed&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 11. Demostrar&lt;br /&gt;
     ⊢ (p ⟶ (q ⟶ r)) ⟶ ((p ⟶ q) ⟶ (p ⟶ r))&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim josgomrom4 gleherlop cammonagu giafus1 alfmarcua&lt;br /&gt;
   chrgencar pabbergue alikan juacanrod hugrubsan *) &lt;br /&gt;
lemma ejercicio_11:&lt;br /&gt;
  &amp;quot;(p ⟶ (q ⟶ r)) ⟶ ((p ⟶ q) ⟶ (p ⟶ r))&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume 1: &amp;quot;p ⟶ (q ⟶ r)&amp;quot;&lt;br /&gt;
  show &amp;quot;(p ⟶ q) ⟶ (p ⟶ r)&amp;quot; using 1 ejercicio_6 by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* pabalagon raffergon2 marfruman1 enrparalv antramhur *)&lt;br /&gt;
lemma ejercicio_11_2:&lt;br /&gt;
  &amp;quot;(p ⟶ (q ⟶ r)) ⟶ ((p ⟶ q) ⟶ (p ⟶ r))&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume 1: &amp;quot;p ⟶ (q ⟶ r)&amp;quot;&lt;br /&gt;
  show &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;
    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;q ⟶ r&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 &amp;quot;r&amp;quot; using 4 5 by (rule mp)&lt;br /&gt;
    qed&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber *)&lt;br /&gt;
lemma ejercicio_11_1:&lt;br /&gt;
  &amp;quot;(p ⟶ (q ⟶ r)) ⟶ ((p ⟶ q) ⟶ (p ⟶ r))&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume &amp;quot;p ⟶ (q ⟶ r)&amp;quot;&lt;br /&gt;
  show &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;
    show &amp;quot;p ⟶ r&amp;quot;&lt;br /&gt;
    proof&lt;br /&gt;
      assume p&lt;br /&gt;
      with `p ⟶ (q ⟶ r)` have &amp;quot;q ⟶ r&amp;quot; by (rule mp)&lt;br /&gt;
      moreover have &amp;quot;q&amp;quot; using `p ⟶ q` `p` by (rule mp)&lt;br /&gt;
      ultimately show r by (rule mp)&lt;br /&gt;
    qed&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 12. Demostrar&lt;br /&gt;
     (p ⟶ q) ⟶ r ⊢ p ⟶ (q ⟶ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim raffergon2 marfruman1 gleherlop enrparalv&lt;br /&gt;
   pabbergue antramhur alikan juacanrod hugrubsan *) &lt;br /&gt;
lemma ejercicio_12:&lt;br /&gt;
  assumes 1: &amp;quot;(p ⟶ q) ⟶ r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ⟶ (q ⟶ r)&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume 2: &amp;quot;p&amp;quot;&lt;br /&gt;
  show &amp;quot;q ⟶ r&amp;quot;&lt;br /&gt;
  proof (rule impI)&lt;br /&gt;
    assume 3: &amp;quot;q&amp;quot;&lt;br /&gt;
    have 4: &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
    proof (rule impI)&lt;br /&gt;
      assume 5: &amp;quot;p&amp;quot;&lt;br /&gt;
      show &amp;quot;q&amp;quot; using 3 by this&lt;br /&gt;
    qed&lt;br /&gt;
    show &amp;quot;r&amp;quot; using 1 4 by (rule mp)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber  josgomrom4 cammonagu giafus1 alfmarcua chrgencar *)&lt;br /&gt;
lemma ejercicio_12_1:&lt;br /&gt;
  assumes &amp;quot;(p ⟶ q) ⟶ r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ⟶ (q ⟶ r)&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume &amp;quot;p&amp;quot;&lt;br /&gt;
  show &amp;quot;q ⟶ r&amp;quot;&lt;br /&gt;
  proof&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;
    with `(p ⟶ q) ⟶ r` show &amp;quot;r&amp;quot; by (rule mp)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
section {* Conjunciones *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 13. Demostrar&lt;br /&gt;
     p, q ⊢  p ∧ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon *)&lt;br /&gt;
lemma ejercicio_13:&lt;br /&gt;
  assumes &amp;quot;p&amp;quot;&lt;br /&gt;
          &amp;quot;q&amp;quot; &lt;br /&gt;
  shows &amp;quot;p ∧ q&amp;quot;&lt;br /&gt;
using assms(1, 2) by (rule conjI)&lt;br /&gt;
&lt;br /&gt;
(* benber manperjim josgomrom4 cammonagu raffergon2 marfruman1 alfmarcua&lt;br /&gt;
   enrparalv chrgencar gleherlop pabbergue antramhur juacanrod hugrubsan  &lt;br /&gt;
   alikan *)&lt;br /&gt;
lemma ejercicio_13_1:&lt;br /&gt;
  assumes &amp;quot;p&amp;quot;&lt;br /&gt;
          &amp;quot;q&amp;quot; &lt;br /&gt;
  shows &amp;quot;p ∧ q&amp;quot;&lt;br /&gt;
  using assms by (rule conjI)&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 14. Demostrar&lt;br /&gt;
     p ∧ q ⊢ p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon  josgomrom4 *)&lt;br /&gt;
lemma ejercicio_14:&lt;br /&gt;
  assumes &amp;quot;p ∧ q&amp;quot;  &lt;br /&gt;
  shows   &amp;quot;p&amp;quot;&lt;br /&gt;
  using assms(1) by (rule conjunct1)&lt;br /&gt;
&lt;br /&gt;
(* benber manperjim cammonagu raffergon2 marfruman1 alfmarcua enrparalv&lt;br /&gt;
   chrgencar pabbergue gleherlop antramhur hugrubsan juacanrod alikan *) &lt;br /&gt;
lemma ejercicio_14_1:&lt;br /&gt;
  assumes &amp;quot;p ∧ q&amp;quot;  &lt;br /&gt;
  shows   &amp;quot;p&amp;quot;&lt;br /&gt;
  using assms by (rule conjunct1)&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 15. Demostrar&lt;br /&gt;
     p ∧ q ⊢ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim juacanrod josgomrom4 *)&lt;br /&gt;
lemma ejercicio_15:&lt;br /&gt;
  assumes &amp;quot;p ∧ q&amp;quot; &lt;br /&gt;
  shows   &amp;quot;q&amp;quot;&lt;br /&gt;
  using assms(1) by (rule conjunct2)&lt;br /&gt;
&lt;br /&gt;
(* benber cammonagu raffergon2 marfruman1 alfmarcua enrparalv chrgencar&lt;br /&gt;
   pabbergue antramhur gleherlop hugrubsan alikan *) &lt;br /&gt;
lemma ejercicio_15_1:&lt;br /&gt;
  assumes &amp;quot;p ∧ q&amp;quot; &lt;br /&gt;
  shows   &amp;quot;q&amp;quot;&lt;br /&gt;
  using assms by (rule conjunct2)&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 16. Demostrar&lt;br /&gt;
     p ∧ (q ∧ r) ⊢ (p ∧ q) ∧ r&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim josgomrom4 raffergon2 marfruman1 alfmarcua&lt;br /&gt;
   cammmonagu enrparalv chrgencar gleherlop pabbergue antramhur&lt;br /&gt;
   hugrubsan alikan juacanrod cammonagu *)  &lt;br /&gt;
lemma ejercicio_16:&lt;br /&gt;
  assumes &amp;quot;p ∧ (q ∧ r)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;(p ∧ q) ∧ r&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have 1: &amp;quot;p&amp;quot; using assms(1) by (rule conjunct1)&lt;br /&gt;
  have 2: &amp;quot;q ∧ r&amp;quot; using assms(1) by (rule conjunct2)&lt;br /&gt;
  have 3: &amp;quot;q&amp;quot; using 2 by (rule conjunct1)&lt;br /&gt;
  have 4: &amp;quot;r&amp;quot; using 2 by (rule conjunct2)&lt;br /&gt;
  have 5: &amp;quot;p ∧ q&amp;quot; using 1 3 by (rule conjI)&lt;br /&gt;
  show &amp;quot;(p ∧ q) ∧ r&amp;quot; using 5 4 by (rule conjI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber *)&lt;br /&gt;
lemma ejercicio_16_1:&lt;br /&gt;
  assumes &amp;quot;p ∧ (q ∧ r)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;(p ∧ q) ∧ r&amp;quot;&lt;br /&gt;
proof - (* TODO? *)&lt;br /&gt;
  have &amp;quot;q ∧ r&amp;quot; using assms by (rule conjunct2)&lt;br /&gt;
  have &amp;quot;p&amp;quot; using assms by (rule conjunct1)&lt;br /&gt;
  moreover have &amp;quot;q&amp;quot; using `q ∧ r` by (rule conjunct1)&lt;br /&gt;
  ultimately have &amp;quot;p ∧ q&amp;quot; by (rule conjI)&lt;br /&gt;
  moreover have &amp;quot;r&amp;quot; using `q ∧ r` by (rule conjunct2)&lt;br /&gt;
  ultimately show &amp;quot;(p ∧ q) ∧ r&amp;quot; by (rule conjI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 17. Demostrar&lt;br /&gt;
     (p ∧ q) ∧ r ⊢ p ∧ (q ∧ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim josgomrom4 raffergon2 marfruman1 alfmarcua&lt;br /&gt;
   cammonagu chrgencar gleherlop pabbergue antramhur enrparalv hugrubsan&lt;br /&gt;
   juacanrod alikan *)  &lt;br /&gt;
lemma ejercicio_17:&lt;br /&gt;
  assumes 1: &amp;quot;(p ∧ q) ∧ r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ∧ (q ∧ r)&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have 2: &amp;quot;r&amp;quot; using 1 by (rule conjunct2)&lt;br /&gt;
  have 3: &amp;quot;p ∧ q&amp;quot; using 1 by (rule conjunct1)&lt;br /&gt;
  have 4: &amp;quot;p&amp;quot; using 3 by (rule conjunct1)&lt;br /&gt;
  have 5: &amp;quot;q&amp;quot; using 3 by (rule conjunct2)&lt;br /&gt;
  have 6: &amp;quot;q ∧ r&amp;quot; using 5 2 by (rule conjI)&lt;br /&gt;
  show ?thesis using 4 6 by (rule conjI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber *)&lt;br /&gt;
lemma ejercicio_17_1:&lt;br /&gt;
  assumes &amp;quot;(p ∧ q) ∧ r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ∧ (q ∧ r)&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;p ∧ q&amp;quot; using assms by (rule conjunct1)&lt;br /&gt;
  have &amp;quot;p&amp;quot; using `p ∧ q` by (rule conjunct1)&lt;br /&gt;
  moreover have &amp;quot;q ∧ r&amp;quot;&lt;br /&gt;
  proof (rule conjI)&lt;br /&gt;
    show &amp;quot;q&amp;quot; using `p ∧ q` by (rule conjunct2)&lt;br /&gt;
  next&lt;br /&gt;
    show &amp;quot;r&amp;quot; using assms by (rule conjunct2)&lt;br /&gt;
  qed&lt;br /&gt;
  ultimately show ?thesis by (rule conjI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 18. Demostrar&lt;br /&gt;
     p ∧ q ⊢ p ⟶ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon raffergon2 marfruman1 juacanrod alikan*)&lt;br /&gt;
lemma ejercicio_18:&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 impI)&lt;br /&gt;
  assume &amp;quot;p&amp;quot;&lt;br /&gt;
  show &amp;quot;q&amp;quot; using assms(1) by (rule conjunct2)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber manperjim josgomrom4 cammonagu alfmarcua chrgencar pabbergue&lt;br /&gt;
   gleherlop antramhur enrparalv hugrubsan *) &lt;br /&gt;
lemma ejercicio_18_1:&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;q&amp;quot; using assms by (rule conjunct2)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 19. Demostrar&lt;br /&gt;
     (p ⟶ q) ∧ (p ⟶ r) ⊢ p ⟶ q ∧ r   &lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim josgomrom4 raffergon2 marfruman1 alfmarcua&lt;br /&gt;
   cammonagu chrgencar gleherlop pabbergue antramhur enrparalv juacanrod&lt;br /&gt;
   hugrubsan alikan *)  &lt;br /&gt;
lemma ejercicio_19:&lt;br /&gt;
  assumes 1: &amp;quot;(p ⟶ q) ∧ (p ⟶ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ⟶ q ∧ r&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume 2: &amp;quot;p&amp;quot;&lt;br /&gt;
  have 3: &amp;quot;p ⟶ q&amp;quot; using 1 by (rule conjunct1)&lt;br /&gt;
  have 4: &amp;quot;p ⟶ r&amp;quot; using 1 by (rule conjunct2)&lt;br /&gt;
  have 5: &amp;quot;q&amp;quot; using 3 2 by (rule mp)&lt;br /&gt;
  have 6: &amp;quot;r&amp;quot; using 4 2 by (rule mp)&lt;br /&gt;
  show &amp;quot;q ∧ r&amp;quot; using 5 6 by (rule conjI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber cammonagu *)&lt;br /&gt;
lemma ejercicio_19_1:&lt;br /&gt;
  assumes &amp;quot;(p ⟶ q) ∧ (p ⟶ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ⟶ q ∧ r&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume p&lt;br /&gt;
  show &amp;quot;q ∧ r&amp;quot;&lt;br /&gt;
  proof&lt;br /&gt;
    have &amp;quot;p ⟶ q&amp;quot; using assms by (rule conjunct1)&lt;br /&gt;
    thus &amp;quot;q&amp;quot; using `p` by (rule mp)&lt;br /&gt;
  next&lt;br /&gt;
    have &amp;quot;p ⟶ r&amp;quot; using assms by (rule conjunct2)&lt;br /&gt;
    thus &amp;quot;r&amp;quot; using `p` by (rule mp)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 20. Demostrar&lt;br /&gt;
     p ⟶ q ∧ r ⊢ (p ⟶ q) ∧ (p ⟶ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim josgomrom4 raffergon2 marfruman1 alfmarcua&lt;br /&gt;
   cammonagu chrgencar gleherlop pabbergue antramhur enrparalv juacanrod&lt;br /&gt;
   hugrubsan alikan *)  &lt;br /&gt;
lemma ejercicio_20:&lt;br /&gt;
  assumes 1: &amp;quot;p ⟶ q ∧ r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;(p ⟶ q) ∧ (p ⟶ r)&amp;quot;&lt;br /&gt;
proof (rule conjI)&lt;br /&gt;
  show &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;
    have 3: &amp;quot;q ∧ r&amp;quot; using 1 2 by (rule mp)&lt;br /&gt;
    show 4: &amp;quot;q&amp;quot; using 3 by (rule conjunct1)&lt;br /&gt;
  qed&lt;br /&gt;
  show &amp;quot;p ⟶ r&amp;quot;&lt;br /&gt;
  proof (rule impI)&lt;br /&gt;
    assume 2: &amp;quot;p&amp;quot;&lt;br /&gt;
    have 3: &amp;quot;q ∧ r&amp;quot; using 1 2 by (rule mp)&lt;br /&gt;
    show 4: &amp;quot;r&amp;quot; using 3 by (rule conjunct2)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber *)&lt;br /&gt;
lemma ejercicio_20_1:&lt;br /&gt;
  assumes &amp;quot;p ⟶ q ∧ r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;(p ⟶ q) ∧ (p ⟶ r)&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  show &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
  proof&lt;br /&gt;
    assume &amp;quot;p&amp;quot;&lt;br /&gt;
    with assms have &amp;quot;q ∧ r&amp;quot; by (rule mp)&lt;br /&gt;
    thus &amp;quot;q&amp;quot; by (rule conjunct1)&lt;br /&gt;
  qed&lt;br /&gt;
next&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;
    with assms have &amp;quot;q ∧ r&amp;quot; by (rule mp)&lt;br /&gt;
    thus &amp;quot;r&amp;quot; by (rule conjunct2)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 21. Demostrar&lt;br /&gt;
     p ⟶ (q ⟶ r) ⊢ p ∧ q ⟶ r&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim josgomrom4 raffergon2 marfruman1 alfmarcua&lt;br /&gt;
   cammonagu chrgencar pabbergue gleherlop antramhur enrparalv juacanrod&lt;br /&gt;
   hugrubsan alikan *)  &lt;br /&gt;
lemma ejercicio_21:&lt;br /&gt;
  assumes 1: &amp;quot;p ⟶ (q ⟶ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ∧ q ⟶ r&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume 2: &amp;quot;p ∧ q&amp;quot;&lt;br /&gt;
  have 3: &amp;quot;p&amp;quot; using 2 by (rule conjunct1)&lt;br /&gt;
  have 4: &amp;quot;q ⟶ r&amp;quot; using 1 3 by (rule mp)&lt;br /&gt;
  have 5: &amp;quot;q&amp;quot; using 2 by (rule conjunct2)&lt;br /&gt;
  show &amp;quot;r&amp;quot; using 4 5 by (rule mp)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber *)&lt;br /&gt;
lemma ejercicio_21_1:&lt;br /&gt;
  assumes &amp;quot;p ⟶ (q ⟶ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ∧ q ⟶ r&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume &amp;quot;p ∧ q&amp;quot;&lt;br /&gt;
  hence &amp;quot;p&amp;quot; by (rule conjunct1)&lt;br /&gt;
  with `p ⟶ (q ⟶ r)` have &amp;quot;q ⟶ r&amp;quot; by (rule mp)&lt;br /&gt;
  moreover from `p ∧ q` have &amp;quot;q&amp;quot; by (rule conjunct2)&lt;br /&gt;
  ultimately show &amp;quot;r&amp;quot; by (rule mp)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 22. Demostrar&lt;br /&gt;
     p ∧ q ⟶ r ⊢ p ⟶ (q ⟶ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim josgomrom4 raffergon2 marfruman1 alfmarcua&lt;br /&gt;
   chrgencar pabbergue gleherlop antramhur enrparalv juacanrod hugrubsan&lt;br /&gt;
   alikan *)  &lt;br /&gt;
lemma ejercicio_22:&lt;br /&gt;
  assumes 1: &amp;quot;p ∧ q ⟶ r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ⟶ (q ⟶ r)&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume 2: &amp;quot;p&amp;quot;&lt;br /&gt;
  show &amp;quot;q ⟶ r&amp;quot;&lt;br /&gt;
  proof (rule impI)&lt;br /&gt;
    assume 3: &amp;quot;q&amp;quot;&lt;br /&gt;
    have 4: &amp;quot;p ∧ q&amp;quot; using 2 3 by (rule conjI)&lt;br /&gt;
    show &amp;quot;r&amp;quot; using 1 4 by (rule mp)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber cammonagu *)&lt;br /&gt;
lemma ejercicio_22_1:&lt;br /&gt;
  assumes &amp;quot;p ∧ q ⟶ r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ⟶ (q ⟶ r)&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume &amp;quot;p&amp;quot;&lt;br /&gt;
  show &amp;quot;q ⟶ r&amp;quot;&lt;br /&gt;
  proof&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 `p ∧ q ⟶ r` show &amp;quot;r&amp;quot; by (rule mp)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 23. Demostrar&lt;br /&gt;
     (p ⟶ q) ⟶ r ⊢ p ∧ q ⟶ r&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim josgomrom4 raffergon2 marfruman1 alfmarcua&lt;br /&gt;
   chrgencar pabbergue gleherlop antramhur enrparalv juacanrod hugrubsan&lt;br /&gt;
   alikan *)  &lt;br /&gt;
lemma ejercicio_23:&lt;br /&gt;
  assumes 1: &amp;quot;(p ⟶ q) ⟶ r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ∧ q ⟶ r&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume 2: &amp;quot;p ∧ q&amp;quot;&lt;br /&gt;
  have 3: &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
  proof (rule impI)&lt;br /&gt;
    assume &amp;quot;p&amp;quot;&lt;br /&gt;
    show &amp;quot;q&amp;quot; using 2 by (rule conjunct2)&lt;br /&gt;
  qed&lt;br /&gt;
  show &amp;quot;r&amp;quot; using 1 3 by (rule mp)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber cammonagu *)&lt;br /&gt;
lemma ejercicio_23_1:&lt;br /&gt;
  assumes &amp;quot;(p ⟶ q) ⟶ r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ∧ q ⟶ r&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume &amp;quot;p ∧ q&amp;quot;&lt;br /&gt;
  hence &amp;quot;q&amp;quot; by (rule conjunct2)&lt;br /&gt;
  hence &amp;quot;p ⟶ q&amp;quot; by (rule impI)&lt;br /&gt;
  with `(p ⟶ q) ⟶ r` show &amp;quot;r&amp;quot; by (rule mp)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 24. Demostrar&lt;br /&gt;
     p ∧ (q ⟶ r) ⊢ (p ⟶ q) ⟶ r&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim josgomrom4 raffergon2 marfruman1 alfmarcua&lt;br /&gt;
   chrgencar pabbergue gleherlop antramhur enrparalv hugrubsan juacanrod&lt;br /&gt;
   cammonagu alikan *)  &lt;br /&gt;
lemma ejercicio_24:&lt;br /&gt;
  assumes 1: &amp;quot;p ∧ (q ⟶ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;(p ⟶ q) ⟶ r&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume 2: &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
  have 3: &amp;quot;p&amp;quot; using 1 by (rule conjunct1)&lt;br /&gt;
  have 4: &amp;quot;q ⟶ r&amp;quot; using 1 by (rule conjunct2)&lt;br /&gt;
  have 5: &amp;quot;q&amp;quot; using 2 3 by (rule mp)&lt;br /&gt;
  show 6: &amp;quot;r&amp;quot; using 4 5 by (rule mp)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber *)&lt;br /&gt;
lemma ejercicio_24_1:&lt;br /&gt;
  assumes &amp;quot;p ∧ (q ⟶ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;(p ⟶ q) ⟶ r&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  have &amp;quot;q ⟶ r&amp;quot; using assms by (rule conjunct2)&lt;br /&gt;
  assume &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
  moreover have &amp;quot;p&amp;quot; using assms by (rule conjunct1)&lt;br /&gt;
  ultimately have &amp;quot;q&amp;quot; by (rule mp)&lt;br /&gt;
  with `q ⟶ r` show r by (rule mp)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
section {* Disyunciones *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 25. Demostrar&lt;br /&gt;
     p ⊢ p ∨ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim josgomrom4 benber cammonagu raffergon2 marfruman1&lt;br /&gt;
   alfmarcua chrgencar gleherlop pabbergue antramhur enrparalv juacanrod&lt;br /&gt;
   hugrubsan alikan *)  &lt;br /&gt;
lemma ejercicio_25:&lt;br /&gt;
  assumes &amp;quot;p&amp;quot;&lt;br /&gt;
  shows   &amp;quot;p ∨ q&amp;quot;&lt;br /&gt;
  using assms(1) by (rule disjI1)&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 26. Demostrar&lt;br /&gt;
     q ⊢ p ∨ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim josgomrom4 benber cammonagu marfruman1 alfmarcua&lt;br /&gt;
   chrgencar pabbergue gleherlop antramhur enrparalv juacanrod hugrubsan&lt;br /&gt;
   alikan *)  &lt;br /&gt;
lemma ejercicio_26:&lt;br /&gt;
  assumes &amp;quot;q&amp;quot;&lt;br /&gt;
  shows   &amp;quot;p ∨ q&amp;quot;&lt;br /&gt;
  using assms(1) by (rule disjI2)&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 27. Demostrar&lt;br /&gt;
     p ∨ q ⊢ q ∨ p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim josgomrom4 raffergon2 marfruman1 chrgencar&lt;br /&gt;
   pabbergue antramhur enrparalv juacanrod hugrubsan cammonagu alikan *) &lt;br /&gt;
lemma ejercicio_27:&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 proof (rule disjE)&lt;br /&gt;
  assume 2: &amp;quot;p&amp;quot; thus &amp;quot;q ∨ p&amp;quot; by (rule disjI2)&lt;br /&gt;
next&lt;br /&gt;
  assume 3: &amp;quot;q&amp;quot; thus &amp;quot;q ∨ p&amp;quot; by (rule disjI1)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber alfmarcua gleherlop *)&lt;br /&gt;
lemma ejercicio_27_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 .&lt;br /&gt;
  moreover have &amp;quot;p ⟹ q ∨ p&amp;quot; by (rule disjI2)&lt;br /&gt;
  moreover have &amp;quot;q ⟹ q ∨ p&amp;quot; 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;
  Ejercicio 28. Demostrar&lt;br /&gt;
     q ⟶ r ⊢ p ∨ q ⟶ p ∨ r&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim josgomrom4 raffergon2 marfruman1 chrgencar&lt;br /&gt;
   gleherlop alfmarcua pabbergue antramhur enrparalv juacanrod hugrubsan&lt;br /&gt;
   cammonagu alikan *) &lt;br /&gt;
lemma ejercicio_28:&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; show &amp;quot;p ∨ r&amp;quot; using 2&lt;br /&gt;
  proof (rule disjE)&lt;br /&gt;
    assume 3: p thus &amp;quot;p ∨ r&amp;quot; by (rule disjI1)&lt;br /&gt;
  next&lt;br /&gt;
    assume 4: q have r using 1 4 by (rule mp)&lt;br /&gt;
    thus &amp;quot;p ∨ r&amp;quot; by (rule disjI2)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber *)&lt;br /&gt;
lemma ejercicio_28_1:&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;
  moreover have &amp;quot;p ⟹ p ∨ r&amp;quot; by (rule disjI1)&lt;br /&gt;
  moreover have &amp;quot;q ⟹ p ∨ r&amp;quot;&lt;br /&gt;
  proof (rule disjI2)&lt;br /&gt;
    assume &amp;quot;q&amp;quot;&lt;br /&gt;
    with `q ⟶ r` show &amp;quot;r&amp;quot; by (rule mp)&lt;br /&gt;
  qed&lt;br /&gt;
  ultimately show &amp;quot;p ∨ r&amp;quot; by (rule disjE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 29. Demostrar&lt;br /&gt;
     p ∨ p ⊢ p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon juacanrod marfruman1 *)&lt;br /&gt;
lemma ejercicio_29:&lt;br /&gt;
  assumes 1: &amp;quot;p ∨ p&amp;quot;&lt;br /&gt;
  shows   &amp;quot;p&amp;quot;&lt;br /&gt;
using 1 proof (rule disjE)&lt;br /&gt;
  assume &amp;quot;p&amp;quot; thus &amp;quot;p&amp;quot; .&lt;br /&gt;
next&lt;br /&gt;
  assume &amp;quot;p&amp;quot; thus &amp;quot;p&amp;quot; .&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber manperjim cammonagu josgomrom4 raffergon2 chrgencar alfmarcua&lt;br /&gt;
   gleherlop pabbergue antramhur enrparalv hugrubsan alikan *) &lt;br /&gt;
lemma ejercicio_29_1:&lt;br /&gt;
  assumes &amp;quot;p ∨ p&amp;quot;&lt;br /&gt;
  shows   &amp;quot;p&amp;quot;&lt;br /&gt;
  using assms by (rule disjE)&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 30. Demostrar&lt;br /&gt;
     p ⊢ p ∨ p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim  benber josgomrom4 raffergon2 marfruman1&lt;br /&gt;
   chrgencar alfmarcua pabbergue gleherlop antramhur enrparalv hugrubsan&lt;br /&gt;
   juacanrod cammonagu alikan *)  &lt;br /&gt;
lemma ejercicio_30:&lt;br /&gt;
  assumes &amp;quot;p&amp;quot;&lt;br /&gt;
  shows   &amp;quot;p ∨ p&amp;quot;&lt;br /&gt;
  using assms(1) by (rule disjI1)&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 31. Demostrar&lt;br /&gt;
     p ∨ (q ∨ r) ⊢ (p ∨ q) ∨ r&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim marfruman1 josgomrom4 alfmarcua pabbergue&lt;br /&gt;
   gleherlop antramhur enrparalv juacanrod hugrubsan alikan *) &lt;br /&gt;
lemma ejercicio_31:&lt;br /&gt;
  assumes 1: &amp;quot;p ∨ (q ∨ r)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;(p ∨ q) ∨ r&amp;quot; (is &amp;quot;?R&amp;quot;)&lt;br /&gt;
using 1 proof (rule disjE)&lt;br /&gt;
  assume &amp;quot;p&amp;quot; hence &amp;quot;p ∨ q&amp;quot; by (rule disjI1)&lt;br /&gt;
  thus ?R by (rule disjI1)&lt;br /&gt;
next&lt;br /&gt;
  assume &amp;quot;q ∨ r&amp;quot; thus ?R&lt;br /&gt;
  proof (rule disjE)&lt;br /&gt;
    assume &amp;quot;q&amp;quot; hence &amp;quot;p ∨ q&amp;quot; by (rule disjI2)&lt;br /&gt;
    thus &amp;quot;(p ∨ q) ∨ r&amp;quot; by (rule disjI1)&lt;br /&gt;
  next&lt;br /&gt;
    assume &amp;quot;r&amp;quot; thus ?thesis by (rule disjI2)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber cammonagu *)&lt;br /&gt;
lemma ejercicio_31_1:&lt;br /&gt;
  assumes &amp;quot;p ∨ (q ∨ r)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;(p ∨ q) ∨ r&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;p ∨ (q ∨ r)&amp;quot; using assms .&lt;br /&gt;
  moreover {&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) ∨ r&amp;quot; by (rule disjI1)&lt;br /&gt;
  }&lt;br /&gt;
  moreover {&lt;br /&gt;
    assume &amp;quot;q ∨ r&amp;quot;&lt;br /&gt;
    moreover {&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;
      hence &amp;quot;(p ∨ q) ∨ r&amp;quot; by (rule disjI1)&lt;br /&gt;
    }&lt;br /&gt;
    moreover {&lt;br /&gt;
      assume &amp;quot;r&amp;quot;&lt;br /&gt;
      hence &amp;quot;(p ∨ q) ∨ r&amp;quot; by (rule disjI2)&lt;br /&gt;
    }&lt;br /&gt;
    ultimately have &amp;quot;(p ∨ q) ∨ r&amp;quot; by (rule disjE)&lt;br /&gt;
  }&lt;br /&gt;
  ultimately show &amp;quot;(p ∨ q) ∨ r&amp;quot; by (rule disjE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 32. Demostrar&lt;br /&gt;
     (p ∨ q) ∨ r ⊢ p ∨ (q ∨ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim marfruman1 josgomrom4 alfmarcua gleherlop&lt;br /&gt;
   pabbergue antramhur enrparalv juacanrod hugrubsan alikan *) &lt;br /&gt;
lemma ejercicio_32:&lt;br /&gt;
  assumes 1: &amp;quot;(p ∨ q) ∨ r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ∨ (q ∨ r)&amp;quot;&lt;br /&gt;
using 1 proof (rule disjE)&lt;br /&gt;
  assume &amp;quot;p ∨ q&amp;quot; thus ?thesis&lt;br /&gt;
  proof (rule disjE)&lt;br /&gt;
    assume p thus ?thesis by (rule disjI1)&lt;br /&gt;
  next&lt;br /&gt;
    assume q hence &amp;quot;q ∨ r&amp;quot; by (rule disjI1)&lt;br /&gt;
    thus ?thesis by (rule disjI2)&lt;br /&gt;
  qed&lt;br /&gt;
next&lt;br /&gt;
  assume r hence &amp;quot;q ∨ r&amp;quot; by (rule disjI2)&lt;br /&gt;
  thus ?thesis by (rule disjI2)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber cammonagu *)&lt;br /&gt;
lemma ejercicio_32_1:&lt;br /&gt;
  assumes &amp;quot;(p ∨ q) ∨ r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ∨ (q ∨ r)&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;(p ∨ q) ∨ r&amp;quot; using assms .&lt;br /&gt;
  moreover {&lt;br /&gt;
    assume &amp;quot;p ∨ q&amp;quot;&lt;br /&gt;
    moreover {&lt;br /&gt;
      assume &amp;quot;p&amp;quot;&lt;br /&gt;
      hence ?thesis by (rule disjI1)&lt;br /&gt;
    }&lt;br /&gt;
    moreover {&lt;br /&gt;
      assume &amp;quot;q&amp;quot;&lt;br /&gt;
      hence &amp;quot;q ∨ r&amp;quot; by (rule disjI1)&lt;br /&gt;
      hence ?thesis by (rule disjI2)&lt;br /&gt;
    }&lt;br /&gt;
    ultimately have ?thesis by (rule disjE)&lt;br /&gt;
  }&lt;br /&gt;
  moreover {&lt;br /&gt;
    assume &amp;quot;r&amp;quot;&lt;br /&gt;
    hence &amp;quot;q ∨ r&amp;quot; by (rule disjI2)&lt;br /&gt;
    hence ?thesis by (rule disjI2)&lt;br /&gt;
  }&lt;br /&gt;
  ultimately show ?thesis by (rule disjE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 33. Demostrar&lt;br /&gt;
     p ∧ (q ∨ r) ⊢ (p ∧ q) ∨ (p ∧ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim marfruman1 josgomrom4 chrgencar gleherlop&lt;br /&gt;
   alfmarcua pabbergue antramhur enrparalv juacanrod hugrubsan alikan *) &lt;br /&gt;
lemma ejercicio_33:&lt;br /&gt;
  assumes 1: &amp;quot;p ∧ (q ∨ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;(p ∧ q) ∨ (p ∧ r)&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have 2: p using 1 by (rule conjunct1)&lt;br /&gt;
  show ?thesis&lt;br /&gt;
  proof (rule disjE)&lt;br /&gt;
    assume 3: q have &amp;quot;p ∧ q&amp;quot; using 2 3 by (rule conjI)&lt;br /&gt;
    thus ?thesis by (rule disjI1)&lt;br /&gt;
  next&lt;br /&gt;
    assume 4: r have &amp;quot;p ∧ r&amp;quot; using 2 4 by (rule conjI)&lt;br /&gt;
    thus ?thesis by (rule disjI2)&lt;br /&gt;
  next&lt;br /&gt;
    show &amp;quot;q ∨ r&amp;quot; using 1 by (rule conjunct2)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber cammonagu *)&lt;br /&gt;
lemma ejercicio_33_1:&lt;br /&gt;
  assumes &amp;quot;p ∧ (q ∨ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;(p ∧ q) ∨ (p ∧ r)&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;p&amp;quot; using assms by (rule conjunct1)&lt;br /&gt;
  have &amp;quot;q ∨ r&amp;quot; using assms by (rule conjunct2)&lt;br /&gt;
  moreover {&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;
    hence ?thesis by (rule disjI1)&lt;br /&gt;
  }&lt;br /&gt;
  moreover {&lt;br /&gt;
    assume &amp;quot;r&amp;quot;&lt;br /&gt;
    with `p` have &amp;quot;p ∧ r&amp;quot; by (rule conjI)&lt;br /&gt;
    hence ?thesis by (rule disjI2)&lt;br /&gt;
  }&lt;br /&gt;
  ultimately show ?thesis by (rule disjE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 34. Demostrar&lt;br /&gt;
     (p ∧ q) ∨ (p ∧ r) ⊢ p ∧ (q ∨ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim marfruman1 josgomrom4 chrgencar alfmarcua&lt;br /&gt;
   gleherlop pabbergue antramhur enrparalv juacanrod hugrubsan alikan *) &lt;br /&gt;
lemma ejercicio_34:&lt;br /&gt;
  assumes &amp;quot;(p ∧ q) ∨ (p ∧ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ∧ (q ∨ r)&amp;quot;&lt;br /&gt;
using assms(1) proof (rule disjE)&lt;br /&gt;
  assume 2: &amp;quot;p ∧ q&amp;quot; hence q by (rule conjunct2)&lt;br /&gt;
  hence 3: &amp;quot;q ∨ r&amp;quot; by (rule disjI1)&lt;br /&gt;
  have p using 2 by (rule conjunct1)&lt;br /&gt;
  thus ?thesis using 3 by (rule conjI)&lt;br /&gt;
next&lt;br /&gt;
  assume 4: &amp;quot;p ∧ r&amp;quot; hence r by (rule conjunct2)&lt;br /&gt;
  hence 5: &amp;quot;q ∨ r&amp;quot; by (rule disjI2)&lt;br /&gt;
  have p using 4 by (rule conjunct1)&lt;br /&gt;
  thus ?thesis using 5 by (rule conjI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber cammonagu *)&lt;br /&gt;
lemma ejercicio_34_1:&lt;br /&gt;
  assumes &amp;quot;(p ∧ q) ∨ (p ∧ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ∧ (q ∨ r)&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;(p ∧ q) ∨ (p ∧ r)&amp;quot; using assms .&lt;br /&gt;
  moreover {&lt;br /&gt;
    assume &amp;quot;p ∧ q&amp;quot;&lt;br /&gt;
    hence &amp;quot;p&amp;quot; by (rule conjunct1)&lt;br /&gt;
    moreover {&lt;br /&gt;
      have &amp;quot;q&amp;quot; using `p ∧ q` by (rule conjunct2)&lt;br /&gt;
      hence &amp;quot;q ∨ r&amp;quot; by (rule disjI1)&lt;br /&gt;
    }&lt;br /&gt;
    ultimately have ?thesis by (rule conjI)&lt;br /&gt;
  }&lt;br /&gt;
  moreover {&lt;br /&gt;
    assume &amp;quot;p ∧ r&amp;quot;&lt;br /&gt;
    hence &amp;quot;p&amp;quot; by (rule conjunct1)&lt;br /&gt;
    moreover {&lt;br /&gt;
      have &amp;quot;r&amp;quot; using `p ∧ r` by (rule conjunct2)&lt;br /&gt;
      hence &amp;quot;q ∨ r&amp;quot; by (rule disjI2)&lt;br /&gt;
    }&lt;br /&gt;
    ultimately have ?thesis by (rule conjI)&lt;br /&gt;
  }&lt;br /&gt;
  ultimately show ?thesis by (rule disjE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 35. Demostrar&lt;br /&gt;
     p ∨ (q ∧ r) ⊢ (p ∨ q) ∧ (p ∨ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim marfruman1 josgomrom4 chrgencar alfmarcua&lt;br /&gt;
   gleherlop pabbergue antramhur enrparalv juacanrod hugrubsan alikan *) &lt;br /&gt;
lemma ejercicio_35:&lt;br /&gt;
  assumes &amp;quot;p ∨ (q ∧ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;(p ∨ q) ∧ (p ∨ r)&amp;quot;&lt;br /&gt;
using assms(1) proof (rule disjE)&lt;br /&gt;
  assume 1: p hence 2: &amp;quot;p ∨ r&amp;quot; by (rule disjI1)&lt;br /&gt;
  have &amp;quot;p ∨ q&amp;quot; using 1 by (rule disjI1)&lt;br /&gt;
  thus ?thesis using 2 by (rule conjI)&lt;br /&gt;
next&lt;br /&gt;
  assume 3: &amp;quot;q ∧ r&amp;quot; hence r by (rule conjunct2)&lt;br /&gt;
  hence 4: &amp;quot;p ∨ r&amp;quot; by (rule disjI2)&lt;br /&gt;
  have q using 3 by (rule conjunct1)&lt;br /&gt;
  hence &amp;quot;p ∨ q&amp;quot; by (rule disjI2)&lt;br /&gt;
  thus ?thesis using 4 by (rule conjI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber cammonagu *)&lt;br /&gt;
lemma ejercicio_35_1:&lt;br /&gt;
  assumes &amp;quot;p ∨ (q ∧ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;(p ∨ q) ∧ (p ∨ r)&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;p ∨ (q ∧ r)&amp;quot; using assms .&lt;br /&gt;
  moreover {&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;
    moreover have &amp;quot;p ∨ r&amp;quot; using `p` by (rule disjI1)&lt;br /&gt;
    ultimately have ?thesis by (rule conjI)&lt;br /&gt;
  }&lt;br /&gt;
  moreover {&lt;br /&gt;
    assume &amp;quot;q ∧ r&amp;quot;&lt;br /&gt;
    {&lt;br /&gt;
      have &amp;quot;q&amp;quot; using `q ∧ r` by (rule conjunct1)&lt;br /&gt;
      hence &amp;quot;p ∨ q&amp;quot; by (rule disjI2)&lt;br /&gt;
    }&lt;br /&gt;
    moreover {&lt;br /&gt;
      have &amp;quot;r&amp;quot; using `q ∧ r` by (rule conjunct2)&lt;br /&gt;
      hence &amp;quot;p ∨ r&amp;quot; by (rule disjI2)&lt;br /&gt;
    }&lt;br /&gt;
    ultimately have ?thesis by (rule conjI)&lt;br /&gt;
  }&lt;br /&gt;
  ultimately show ?thesis by (rule disjE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 36. Demostrar&lt;br /&gt;
     (p ∨ q) ∧ (p ∨ r) ⊢ p ∨ (q ∧ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim marfruman1 josgomrom4 chrgencar alfmarcua&lt;br /&gt;
   gleherlop pabbergue antramhur enrparalv juacanrod hugrubsan alikan *) &lt;br /&gt;
lemma ejercicio_36:&lt;br /&gt;
  assumes 1: &amp;quot;(p ∨ q) ∧ (p ∨ r)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;p ∨ (q ∧ r)&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have 2: &amp;quot;p ∨ q&amp;quot; using 1 by (rule conjunct1)&lt;br /&gt;
  have 3: &amp;quot;p ∨ r&amp;quot; using 1 by (rule conjunct2)&lt;br /&gt;
  show ?thesis using 2&lt;br /&gt;
  proof (rule disjE)&lt;br /&gt;
    assume p thus ?thesis by (rule disjI1)&lt;br /&gt;
  next&lt;br /&gt;
    assume 4: q show ?thesis using 3&lt;br /&gt;
    proof (rule disjE)&lt;br /&gt;
      assume p thus ?thesis by (rule disjI1)&lt;br /&gt;
    next&lt;br /&gt;
      assume 5: r have &amp;quot;q ∧ r&amp;quot; using 4 5 by (rule conjI)&lt;br /&gt;
      thus ?thesis by (rule disjI2)&lt;br /&gt;
    qed&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber cammonagu *)&lt;br /&gt;
lemma ejercicio_36_1:&lt;br /&gt;
  assumes &amp;quot;(p ∨ q) ∧ (p ∨ r)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;p ∨ (q ∧ r)&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;p ∨ q&amp;quot; using assms by (rule conjunct1)&lt;br /&gt;
  moreover {&lt;br /&gt;
    assume &amp;quot;p&amp;quot;&lt;br /&gt;
    hence ?thesis by (rule disjI1)&lt;br /&gt;
  }&lt;br /&gt;
  moreover {&lt;br /&gt;
    assume &amp;quot;q&amp;quot;&lt;br /&gt;
    have &amp;quot;p ∨ r&amp;quot; using assms by (rule conjunct2)&lt;br /&gt;
    moreover {&lt;br /&gt;
      assume &amp;quot;p&amp;quot;&lt;br /&gt;
      hence ?thesis by (rule disjI1)&lt;br /&gt;
    }&lt;br /&gt;
    moreover {&lt;br /&gt;
      assume &amp;quot;r&amp;quot;&lt;br /&gt;
      with `q` have &amp;quot;q ∧ r&amp;quot; by (rule conjI)&lt;br /&gt;
      hence ?thesis by (rule disjI2)&lt;br /&gt;
    }&lt;br /&gt;
    ultimately have ?thesis by (rule disjE)&lt;br /&gt;
  }&lt;br /&gt;
  ultimately show ?thesis by (rule disjE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 37. Demostrar&lt;br /&gt;
     (p ⟶ r) ∧ (q ⟶ r) ⊢ p ∨ q ⟶ r&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim marfruman1 josgomrom4 alfmarcua gleherlop&lt;br /&gt;
   pabbergue antramhur enrparalv juacanrod hugrubsan alikan *) &lt;br /&gt;
lemma ejercicio_37:&lt;br /&gt;
  assumes 1: &amp;quot;(p ⟶ r) ∧ (q ⟶ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ∨ q ⟶ r&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  have 2: &amp;quot;p ⟶ r&amp;quot; using 1 by (rule conjunct1)&lt;br /&gt;
  have 3: &amp;quot;q ⟶ r&amp;quot; using 1 by (rule conjunct2)&lt;br /&gt;
  assume 4: &amp;quot;p ∨ q&amp;quot; show &amp;quot;r&amp;quot; using 4&lt;br /&gt;
  proof (rule disjE)&lt;br /&gt;
    assume 5: &amp;quot;p&amp;quot; show &amp;quot;r&amp;quot; using 2 5 by (rule mp)&lt;br /&gt;
  next&lt;br /&gt;
    assume 6: &amp;quot;q&amp;quot; show &amp;quot;r&amp;quot; using 3 6 by (rule mp)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber cammonagu *)&lt;br /&gt;
lemma ejercicio_37_1:&lt;br /&gt;
  assumes &amp;quot;(p ⟶ r) ∧ (q ⟶ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ∨ q ⟶ r&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume &amp;quot;p ∨ q&amp;quot;&lt;br /&gt;
  moreover {&lt;br /&gt;
    have &amp;quot;p ⟶ r&amp;quot; using assms by (rule conjunct1)&lt;br /&gt;
    moreover assume &amp;quot;p&amp;quot;&lt;br /&gt;
    ultimately have &amp;quot;r&amp;quot; by (rule mp)&lt;br /&gt;
  }&lt;br /&gt;
  moreover {&lt;br /&gt;
    have &amp;quot;q ⟶ r&amp;quot; using assms by (rule conjunct2)&lt;br /&gt;
    moreover assume &amp;quot;q&amp;quot;&lt;br /&gt;
    ultimately have &amp;quot;r&amp;quot; by (rule mp)&lt;br /&gt;
  }&lt;br /&gt;
  ultimately show &amp;quot;r&amp;quot; by (rule disjE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 38. Demostrar&lt;br /&gt;
     p ∨ q ⟶ r ⊢ (p ⟶ r) ∧ (q ⟶ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim marfruman1 josgomrom4 alfmarcua gleherlop&lt;br /&gt;
   pabbergue antramhur enrparalv juacanrod hugrubsan alikan *) &lt;br /&gt;
lemma ejercicio_38:&lt;br /&gt;
  assumes &amp;quot;p ∨ q ⟶ r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;(p ⟶ r) ∧ (q ⟶ r)&amp;quot;&lt;br /&gt;
proof (rule conjI)&lt;br /&gt;
  show &amp;quot;p ⟶ r&amp;quot;&lt;br /&gt;
  proof (rule impI)&lt;br /&gt;
    assume &amp;quot;p&amp;quot; hence 1: &amp;quot;p ∨ q&amp;quot; by (rule disjI1)&lt;br /&gt;
    show &amp;quot;r&amp;quot; using assms(1) 1 by (rule mp)&lt;br /&gt;
  qed&lt;br /&gt;
next&lt;br /&gt;
  show &amp;quot;q ⟶ r&amp;quot;&lt;br /&gt;
  proof (rule impI)&lt;br /&gt;
    assume q hence 2: &amp;quot;p ∨ q&amp;quot; by (rule disjI2)&lt;br /&gt;
    show r using assms(1) 2 by (rule mp)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber cammonagu*)&lt;br /&gt;
lemma ejercicio_38_1:&lt;br /&gt;
  assumes &amp;quot;p ∨ q ⟶ r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;(p ⟶ r) ∧ (q ⟶ r)&amp;quot;&lt;br /&gt;
proof&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 ∨ q&amp;quot; by (rule disjI1)&lt;br /&gt;
    with assms show &amp;quot;r&amp;quot; by (rule mp)&lt;br /&gt;
  qed&lt;br /&gt;
next&lt;br /&gt;
  show &amp;quot;q ⟶ r&amp;quot;&lt;br /&gt;
  proof&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 show &amp;quot;r&amp;quot; by (rule mp)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
section {* Negaciones *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 39. Demostrar&lt;br /&gt;
     p ⊢ ¬¬p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim  benber josgomrom4 raffergon2 gleherlop&lt;br /&gt;
   marfruman1 chrgencar alfmarcua pabbergue enrparalv juacanrod&lt;br /&gt;
   hugrubsan cammonagu alikan *)  &lt;br /&gt;
lemma ejercicio_39:&lt;br /&gt;
  assumes &amp;quot;p&amp;quot;&lt;br /&gt;
  shows   &amp;quot;¬¬p&amp;quot;&lt;br /&gt;
  using assms(1) by (rule notnotI)&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 40. Demostrar&lt;br /&gt;
     ¬p ⊢ p ⟶ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim marfruman1 josgomrom4 alfmarcua pabbergue&lt;br /&gt;
   gleherlop juacanrod enrparalv hugrubsan alikan *) &lt;br /&gt;
lemma ejercicio_40:&lt;br /&gt;
  assumes 1: &amp;quot;¬p&amp;quot;&lt;br /&gt;
  shows   &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume 2: p show q using 1 2 by (rule notE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber cammonagu *)&lt;br /&gt;
lemma ejercicio_40_1:&lt;br /&gt;
  assumes &amp;quot;¬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;
  with `¬p` show &amp;quot;q&amp;quot; by (rule notE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 41. Demostrar&lt;br /&gt;
     p ⟶ q ⊢ ¬q ⟶ ¬p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim raffergon2 josgomrom4 marfruman1 alfmarcua&lt;br /&gt;
   pabbergue gleherlop enrparalv juacanrod hugrubsan alikan *) &lt;br /&gt;
lemma ejercicio_41:&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 (rule impI)&lt;br /&gt;
  assume 2: &amp;quot;¬q&amp;quot; show &amp;quot;¬p&amp;quot; using 1 2 by (rule mt)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber cammonagu *)&lt;br /&gt;
lemma ejercicio_41_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;
  assume &amp;quot;¬q&amp;quot;&lt;br /&gt;
  with `p ⟶ q` show &amp;quot;¬p&amp;quot; by (rule mt)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 42. Demostrar&lt;br /&gt;
     p∨q, ¬q ⊢ p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim raffergon2 josgomrom4 marfruman1 alfmarcua&lt;br /&gt;
   pabbergue gleherlop enrparalv juacanrod hugrubsan alikan *) &lt;br /&gt;
lemma ejercicio_42:&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;
using assms(1) proof (rule disjE)&lt;br /&gt;
  assume &amp;quot;p&amp;quot; thus &amp;quot;p&amp;quot; .&lt;br /&gt;
next&lt;br /&gt;
  assume 2: &amp;quot;q&amp;quot; show &amp;quot;p&amp;quot; using assms(2) 2 by (rule notE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber cammonagu *)&lt;br /&gt;
lemma ejercicio_42_1:&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;
  note `p ∨ q`&lt;br /&gt;
  moreover have &amp;quot;p ⟹ p&amp;quot; .&lt;br /&gt;
  moreover {&lt;br /&gt;
    assume &amp;quot;q&amp;quot;&lt;br /&gt;
    with `¬q` have &amp;quot;p&amp;quot; by (rule notE)&lt;br /&gt;
  }&lt;br /&gt;
  ultimately show &amp;quot;p&amp;quot; by (rule disjE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 43. Demostrar&lt;br /&gt;
     p ∨ q, ¬p ⊢ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim raffergon2 josgomrom4 marfruman1 alfmarcua&lt;br /&gt;
   pabbergue gleherlop enrparalv juacanrod hugrubsan alikan *) &lt;br /&gt;
lemma ejercicio_43:&lt;br /&gt;
  assumes &amp;quot;p ∨ q&amp;quot;&lt;br /&gt;
          &amp;quot;¬p&amp;quot; &lt;br /&gt;
  shows   &amp;quot;q&amp;quot;&lt;br /&gt;
using assms(1) proof (rule disjE)&lt;br /&gt;
  assume 1: &amp;quot;p&amp;quot; show &amp;quot;q&amp;quot; using assms(2) 1 by (rule notE)&lt;br /&gt;
next&lt;br /&gt;
  assume &amp;quot;q&amp;quot; thus &amp;quot;q&amp;quot; .&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber cammonagu*)&lt;br /&gt;
lemma ejercicio_43_1:&lt;br /&gt;
  assumes &amp;quot;p ∨ q&amp;quot;&lt;br /&gt;
          &amp;quot;¬p&amp;quot; &lt;br /&gt;
  shows   &amp;quot;q&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;
    with `¬p` have &amp;quot;q&amp;quot; by (rule notE)&lt;br /&gt;
  }&lt;br /&gt;
  moreover have &amp;quot;q ⟹ q&amp;quot; .&lt;br /&gt;
  ultimately show &amp;quot;q&amp;quot; by (rule disjE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 44. Demostrar&lt;br /&gt;
     p ∨ q ⊢ ¬(¬p ∧ ¬q)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim gleherlop josgomrom4 marfruman1 pabbergue&lt;br /&gt;
   juacanrod hugrubsan alikan *) &lt;br /&gt;
lemma ejercicio_44:&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 notI)&lt;br /&gt;
  assume 1: &amp;quot;¬p ∧ ¬q&amp;quot; hence 2: &amp;quot;¬p&amp;quot; by (rule conjunct1)&lt;br /&gt;
  have 3: &amp;quot;¬q&amp;quot; using 1 by (rule conjunct2)&lt;br /&gt;
  show &amp;quot;False&amp;quot;&lt;br /&gt;
  using assms(1) proof (rule disjE)&lt;br /&gt;
    assume 4: &amp;quot;p&amp;quot; show ?thesis using 2 4 by (rule notE)&lt;br /&gt;
  next&lt;br /&gt;
    assume 5: &amp;quot;q&amp;quot; show ?thesis using 3 5 by (rule notE)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber alfmarcua cammonagu *)&lt;br /&gt;
lemma ejercicio_44_1:&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;
  note `p ∨ q`&lt;br /&gt;
  moreover {&lt;br /&gt;
    from `¬p ∧ ¬q` have &amp;quot;¬p&amp;quot; by (rule conjunct1)&lt;br /&gt;
    moreover assume &amp;quot;p&amp;quot;&lt;br /&gt;
    ultimately have &amp;quot;False&amp;quot; by (rule notE)&lt;br /&gt;
  }&lt;br /&gt;
  moreover {&lt;br /&gt;
    from `¬p ∧ ¬q` have &amp;quot;¬q&amp;quot; by (rule conjunct2)&lt;br /&gt;
    moreover assume &amp;quot;q&amp;quot;&lt;br /&gt;
    ultimately have &amp;quot;False&amp;quot; by (rule notE)&lt;br /&gt;
  }&lt;br /&gt;
  ultimately show &amp;quot;False&amp;quot; by (rule disjE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 45. Demostrar&lt;br /&gt;
     p ∧ q ⊢ ¬(¬p ∨ ¬q)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim marfruman1 josgomrom4 gleherlop pabbergue&lt;br /&gt;
   juacanrod hugrubsan alikan *) &lt;br /&gt;
lemma ejercicio_45:&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 notI)&lt;br /&gt;
  assume 2: &amp;quot;¬p ∨ ¬q&amp;quot; have 3: &amp;quot;p&amp;quot; using 1 by (rule conjunct1)&lt;br /&gt;
  have 4: &amp;quot;q&amp;quot; using 1 by (rule conjunct2)&lt;br /&gt;
  show &amp;quot;False&amp;quot; using 2&lt;br /&gt;
  proof (rule disjE)&lt;br /&gt;
    assume &amp;quot;¬p&amp;quot; thus ?thesis using 3 by (rule notE)&lt;br /&gt;
  next&lt;br /&gt;
    assume &amp;quot;¬q&amp;quot; thus ?thesis using 4 by (rule notE)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber alfmarcua cammonagu *)&lt;br /&gt;
lemma ejercicio_45_1:&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;
  moreover {&lt;br /&gt;
    assume &amp;quot;¬p&amp;quot;&lt;br /&gt;
    moreover have &amp;quot;p&amp;quot; using `p ∧ q` by (rule conjunct1)&lt;br /&gt;
    ultimately have &amp;quot;False&amp;quot; by (rule notE)&lt;br /&gt;
  }&lt;br /&gt;
  moreover {&lt;br /&gt;
    assume &amp;quot;¬q&amp;quot;&lt;br /&gt;
    moreover have &amp;quot;q&amp;quot; using `p ∧ q` by (rule conjunct2)&lt;br /&gt;
    ultimately have &amp;quot;False&amp;quot; by (rule notE)&lt;br /&gt;
  }&lt;br /&gt;
  ultimately show False by (rule disjE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 46. Demostrar&lt;br /&gt;
     ¬(p ∨ q) ⊢ ¬p ∧ ¬q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim marfruman1 josgomrom4 gleherlop pabbergue&lt;br /&gt;
   juacanrod hugrubsan alikan *) &lt;br /&gt;
lemma ejercicio_46:&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 conjI)&lt;br /&gt;
  show &amp;quot;¬p&amp;quot;&lt;br /&gt;
  proof (rule notI)&lt;br /&gt;
    assume p hence 2: &amp;quot;p ∨ q&amp;quot; by (rule disjI1)&lt;br /&gt;
    show False using 1 2 by (rule notE)&lt;br /&gt;
  qed&lt;br /&gt;
  show &amp;quot;¬q&amp;quot;&lt;br /&gt;
  proof (rule notI)&lt;br /&gt;
    assume q hence 3: &amp;quot;p ∨ q&amp;quot; by (rule disjI2)&lt;br /&gt;
    show False using 1 3 by (rule notE)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber cammmonagu *)&lt;br /&gt;
lemma ejercicio_46_1:&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&amp;quot;&lt;br /&gt;
  proof (rule ccontr)&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;
    with assms show &amp;quot;False&amp;quot; by (rule notE)&lt;br /&gt;
  qed&lt;br /&gt;
next&lt;br /&gt;
  show &amp;quot;¬q&amp;quot;&lt;br /&gt;
  proof (rule ccontr)&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;
    with assms show &amp;quot;False&amp;quot; by (rule notE)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* alfmarcua *)&lt;br /&gt;
lemma ejercicio_46_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 (rule conjI)&lt;br /&gt;
  have &amp;quot;p ⟹ p ∨ q&amp;quot; by (rule disjI1)&lt;br /&gt;
  then have &amp;quot;p ⟶ p ∨ q&amp;quot; by (rule impI)&lt;br /&gt;
  then show &amp;quot;¬ p&amp;quot; using assms by (rule mt)&lt;br /&gt;
next&lt;br /&gt;
  have &amp;quot;q ⟹ p ∨ q&amp;quot; by (rule disjI2)&lt;br /&gt;
  then have &amp;quot;q ⟶ p ∨ q&amp;quot; by (rule impI)&lt;br /&gt;
  then show &amp;quot;¬ q&amp;quot; using assms by (rule mt)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 47. Demostrar&lt;br /&gt;
     ¬p ∧ ¬q ⊢ ¬(p ∨ q)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim marfruman1 josgomrom4 pabbregue juacanrod&lt;br /&gt;
   hugrubsan alikan *) &lt;br /&gt;
lemma ejercicio_47:&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 notI)&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;
  assume 4: &amp;quot;p ∨ q&amp;quot;&lt;br /&gt;
  show False&lt;br /&gt;
  using 4 proof (rule disjE)&lt;br /&gt;
    assume 5: p show ?thesis using 2 5 by (rule notE)&lt;br /&gt;
  next&lt;br /&gt;
    assume 6: q show ?thesis using 3 6 by (rule notE)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber gleherlop cammonagu*)&lt;br /&gt;
lemma ejercicio_47_1:&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;
  hence &amp;quot;¬(¬p ∧ ¬q)&amp;quot; by (rule ejercicio_44_1)&lt;br /&gt;
  thus &amp;quot;False&amp;quot; using assms by (rule notE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* alfmarcua *)&lt;br /&gt;
lemma ejercicio_47_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 (rule notI)&lt;br /&gt;
  have &amp;quot;¬ p&amp;quot; using assms by (rule conjunct1)&lt;br /&gt;
  have &amp;quot;¬ q&amp;quot; using assms by (rule conjunct2)&lt;br /&gt;
  assume &amp;quot;p ∨ q&amp;quot;&lt;br /&gt;
  then have &amp;quot;q&amp;quot; using `¬ p` by (rule ejercicio_43)&lt;br /&gt;
  show False using `¬ q` `q` by (rule notE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 48. Demostrar&lt;br /&gt;
     ¬p ∨ ¬q ⊢ ¬(p ∧ q)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim marfruman1 josgomrom4 pabbergue juacanrod&lt;br /&gt;
   hugrubsan alikan *) &lt;br /&gt;
lemma ejercicio_48:&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 notI)&lt;br /&gt;
  assume 2: &amp;quot;p ∧ q&amp;quot; hence 3: p by (rule conjunct1)&lt;br /&gt;
  have 4: q using 2 by (rule conjunct2)&lt;br /&gt;
  show False&lt;br /&gt;
  using 1 proof (rule disjE)&lt;br /&gt;
    assume &amp;quot;¬p&amp;quot; thus ?thesis using 3 by (rule notE)&lt;br /&gt;
  next&lt;br /&gt;
    assume &amp;quot;¬q&amp;quot; thus ?thesis using 4 by (rule notE)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber alfmarcua gleherlop cammonagu *)&lt;br /&gt;
lemma ejercicio_48_1:&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;
  hence &amp;quot;¬(¬p ∨ ¬q)&amp;quot; by (rule ejercicio_45_1)&lt;br /&gt;
  thus &amp;quot;False&amp;quot; using assms by (rule notE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 49. Demostrar&lt;br /&gt;
     ⊢ ¬(p ∧ ¬p)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim marfruman1 josgomrom4 alfmarcu gleherlop&lt;br /&gt;
   hugrubsan juacanrod cammonagu alikan *) &lt;br /&gt;
lemma ejercicio_49:&lt;br /&gt;
  &amp;quot;¬(p ∧ ¬p)&amp;quot;&lt;br /&gt;
proof (rule notI)&lt;br /&gt;
  assume 1: &amp;quot;p ∧ ¬p&amp;quot; hence 2: p by (rule conjunct1)&lt;br /&gt;
  have &amp;quot;¬p&amp;quot; using 1 by (rule conjunct2)&lt;br /&gt;
  thus &amp;quot;False&amp;quot; using 2 by (rule notE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber *)&lt;br /&gt;
lemma ejercicio_49_1:&lt;br /&gt;
  &amp;quot;¬(p ∧ ¬p)&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume &amp;quot;p ∧ ¬p&amp;quot;&lt;br /&gt;
  hence &amp;quot;¬p&amp;quot; by (rule conjunct2)&lt;br /&gt;
  moreover have &amp;quot;p&amp;quot; using `p ∧ ¬p` by (rule conjunct1)&lt;br /&gt;
  ultimately show &amp;quot;False&amp;quot; by (rule notE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 50. Demostrar&lt;br /&gt;
     p ∧ ¬p ⊢ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim raffergon2 josgomrom4 marfruman1 gleherlop&lt;br /&gt;
   alfmarcua enrparalv pabbergue juacanrod hugrubsan alikan *) &lt;br /&gt;
lemma ejercicio_50:&lt;br /&gt;
  assumes 1: &amp;quot;p ∧ ¬p&amp;quot;&lt;br /&gt;
  shows   &amp;quot;q&amp;quot;&lt;br /&gt;
proof (rule notE)&lt;br /&gt;
  show p using 1 by (rule conjunct1)&lt;br /&gt;
  show &amp;quot;¬p&amp;quot; using 1 by (rule conjunct2)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber cammonagu*)&lt;br /&gt;
lemma ejercicio_50_1:&lt;br /&gt;
  assumes &amp;quot;p ∧ ¬p&amp;quot; &lt;br /&gt;
  shows   &amp;quot;q&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;¬p&amp;quot; using `p ∧ ¬p` by (rule conjunct2)&lt;br /&gt;
  moreover have &amp;quot;p&amp;quot; using `p ∧ ¬p` by (rule conjunct1)&lt;br /&gt;
  ultimately show &amp;quot;q&amp;quot; by (rule notE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 51. Demostrar&lt;br /&gt;
     ¬¬p ⊢ p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim benber raffergon2 josgomrom4 marfruman1 gleherlop&lt;br /&gt;
   alfmarcua enrparalv pabbergue juacanrod hugrubsan cammmonagu alikan *) &lt;br /&gt;
lemma ejercicio_51:&lt;br /&gt;
  assumes &amp;quot;¬¬p&amp;quot;&lt;br /&gt;
  shows   &amp;quot;p&amp;quot;&lt;br /&gt;
  using assms(1) by (rule notnotD)&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 52. Demostrar&lt;br /&gt;
     ⊢ p ∨ ¬p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim marfruman1 josgomrom4 juacanrod pabbergue alikan *)&lt;br /&gt;
lemma ejercicio_52:&lt;br /&gt;
  &amp;quot;p ∨ ¬p&amp;quot;&lt;br /&gt;
proof (rule ccontr)&lt;br /&gt;
  assume 1: &amp;quot;¬(p ∨ ¬p)&amp;quot;&lt;br /&gt;
  have 2: &amp;quot;¬p&amp;quot; proof (rule notI)&lt;br /&gt;
    assume p hence 3: &amp;quot;p ∨ ¬p&amp;quot; by (rule disjI1)&lt;br /&gt;
    show &amp;quot;False&amp;quot; using 1 3 by (rule notE)&lt;br /&gt;
  qed&lt;br /&gt;
  have 4: &amp;quot;p ∨ ¬p&amp;quot; using 2 by (rule disjI2)&lt;br /&gt;
  show &amp;quot;False&amp;quot; using 1 4 by (rule notE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber cammonagu *)&lt;br /&gt;
lemma ejercicio_52_1:&lt;br /&gt;
  &amp;quot;p ∨ ¬p&amp;quot;&lt;br /&gt;
proof (rule ccontr)&lt;br /&gt;
  assume &amp;quot;¬ (p ∨ ¬ p)&amp;quot;&lt;br /&gt;
  hence &amp;quot;¬p ∧ ¬¬p&amp;quot; by (rule ejercicio_46_1)&lt;br /&gt;
  hence &amp;quot;¬p&amp;quot; by (rule conjunct1)&lt;br /&gt;
  moreover {&lt;br /&gt;
    have &amp;quot;¬¬p&amp;quot; using `¬p ∧ ¬¬p` by (rule conjunct2)&lt;br /&gt;
    hence &amp;quot;p&amp;quot; by (rule notnotD)&lt;br /&gt;
  }&lt;br /&gt;
  ultimately show &amp;quot;False&amp;quot; by (rule notE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* alfmarcua *)&lt;br /&gt;
lemma ejercicio_52_2:&lt;br /&gt;
  &amp;quot;p ∨ ¬p&amp;quot;&lt;br /&gt;
proof (rule ccontr)&lt;br /&gt;
  assume &amp;quot;¬ (p ∨ ¬ p)&amp;quot;&lt;br /&gt;
  then have &amp;quot;¬ p ∧ ¬¬ p&amp;quot; by (rule ejercicio_46)&lt;br /&gt;
  then show False by (rule ejercicio_50)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 53. Demostrar&lt;br /&gt;
     ⊢ ((p ⟶ q) ⟶ p) ⟶ p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim marfruman1 josgomrom4 alfmarcua gleherlop&lt;br /&gt;
   juacanrod pabbergue *) &lt;br /&gt;
lemma ejercicio_53:&lt;br /&gt;
  &amp;quot;((p ⟶ q) ⟶ p) ⟶ p&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume 1: &amp;quot;(p ⟶ q) ⟶ p&amp;quot;&lt;br /&gt;
  show p proof (rule ccontr)&lt;br /&gt;
    assume 2: &amp;quot;¬p&amp;quot;&lt;br /&gt;
    have 3: &amp;quot;¬(p ⟶ q)&amp;quot; using 1 2 by (rule mt)&lt;br /&gt;
    have 4: &amp;quot;p ⟶ q&amp;quot; proof (rule impI)&lt;br /&gt;
      assume 5: p show q using 2 5 by (rule notE)&lt;br /&gt;
    qed&lt;br /&gt;
    show False using 3 4 by (rule notE)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber cammonagu *)&lt;br /&gt;
lemma ejercicio_53_1:&lt;br /&gt;
  &amp;quot;((p ⟶ q) ⟶ p) ⟶ p&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume &amp;quot;(p ⟶ q) ⟶ p&amp;quot;&lt;br /&gt;
  have &amp;quot;p ∨ ¬p&amp;quot; by (rule ejercicio_52_1)&lt;br /&gt;
  moreover have &amp;quot;p ⟹ p&amp;quot; .&lt;br /&gt;
  moreover {&lt;br /&gt;
    assume &amp;quot;¬ p&amp;quot;&lt;br /&gt;
    hence &amp;quot;p ⟶ q&amp;quot; by (rule ejercicio_40_1)&lt;br /&gt;
    with `(p ⟶ q) ⟶ p` have &amp;quot;p&amp;quot; by (rule mp)&lt;br /&gt;
  }&lt;br /&gt;
  ultimately show &amp;quot;p&amp;quot; by (rule disjE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 54. Demostrar&lt;br /&gt;
     ¬q ⟶ ¬p ⊢ p ⟶ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim marfruman1 josgomrom4 gleherlop juacanrod&lt;br /&gt;
   pabbergue *) &lt;br /&gt;
lemma ejercicio_54:&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 (rule impI)&lt;br /&gt;
  assume 2: &amp;quot;p&amp;quot; hence 3: &amp;quot;¬¬p&amp;quot; by (rule notnotI)&lt;br /&gt;
  have &amp;quot;¬¬q&amp;quot; using 1 3 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;
(* benber alfmarcua  cammonagu *)&lt;br /&gt;
lemma ejercicio_54_1:&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;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 55. Demostrar&lt;br /&gt;
     ¬(¬p ∧ ¬q) ⊢ p ∨ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon marfruman1*)&lt;br /&gt;
lemma ejercicio_55:&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 2: &amp;quot;¬(p ∨ q)&amp;quot;&lt;br /&gt;
  have 3: &amp;quot;p&amp;quot;&lt;br /&gt;
  proof (rule ccontr)&lt;br /&gt;
    assume 4: &amp;quot;¬p&amp;quot;&lt;br /&gt;
    have 5: &amp;quot;q&amp;quot;&lt;br /&gt;
    proof (rule ccontr)&lt;br /&gt;
      assume 6: &amp;quot;¬q&amp;quot; have 7: &amp;quot;¬p ∧ ¬q&amp;quot; using 4 6 by (rule conjI)&lt;br /&gt;
      show False using 1 7 by (rule notE)&lt;br /&gt;
    qed&lt;br /&gt;
    have 8: &amp;quot;p ∨ q&amp;quot; using 5 by (rule disjI2)&lt;br /&gt;
    show False using 2 8 by (rule notE)&lt;br /&gt;
  qed&lt;br /&gt;
  have 9: &amp;quot;p ∨ q&amp;quot; using 3 by (rule disjI1)&lt;br /&gt;
  show False using 2 9 by (rule notE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber alfmarcua josgomrom4 manperjim pabbergue juacanrod cammonagu *)&lt;br /&gt;
lemma ejercicio_55_1:&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 ejercicio_46_1)&lt;br /&gt;
  with assms show False by (rule notE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 56. Demostrar&lt;br /&gt;
     ¬(¬p ∨ ¬q) ⊢ p ∧ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim marfruman1 josgomrom4 gleherlop juacanrod&lt;br /&gt;
   pabbergue *) &lt;br /&gt;
lemma ejercicio_56:&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 conjI)&lt;br /&gt;
  show 3: p&lt;br /&gt;
  proof (rule ccontr)&lt;br /&gt;
    assume &amp;quot;¬p&amp;quot; hence 4: &amp;quot;¬p ∨ ¬q&amp;quot; by (rule disjI1)&lt;br /&gt;
    show False using 1 4 by (rule notE)&lt;br /&gt;
  qed&lt;br /&gt;
  show 5: q&lt;br /&gt;
  proof (rule ccontr)&lt;br /&gt;
    assume &amp;quot;¬q&amp;quot; hence 6: &amp;quot;¬p ∨ ¬q&amp;quot; by (rule disjI2)&lt;br /&gt;
    show False using 1 6 by (rule notE)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber alfmarcua cammonagu *)&lt;br /&gt;
lemma ejercicio_56_1:&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 ejercicio_46_1)&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;
  moreover {&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;
  }&lt;br /&gt;
  ultimately show &amp;quot;p ∧ q&amp;quot; by (rule conjI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 57. Demostrar&lt;br /&gt;
     ¬(p ∧ q) ⊢ ¬p ∨ ¬q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim marfruman1 josgomrom4 gleherlop juacanrod&lt;br /&gt;
   pabbergue *) &lt;br /&gt;
lemma ejercicio_57:&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 2: &amp;quot;¬(¬p ∨ ¬q)&amp;quot;&lt;br /&gt;
  show False using 1&lt;br /&gt;
  proof (rule notE)&lt;br /&gt;
    show 3: &amp;quot;p ∧ q&amp;quot;&lt;br /&gt;
    proof (rule conjI)&lt;br /&gt;
      show p&lt;br /&gt;
      proof (rule ccontr)&lt;br /&gt;
        assume &amp;quot;¬p&amp;quot; hence 4: &amp;quot;¬p ∨ ¬q&amp;quot; by (rule disjI1)&lt;br /&gt;
        show False using 2 4 by (rule notE)&lt;br /&gt;
      qed&lt;br /&gt;
    next&lt;br /&gt;
      show q&lt;br /&gt;
      proof (rule ccontr)&lt;br /&gt;
        assume &amp;quot;¬q&amp;quot; hence 5: &amp;quot;¬p ∨ ¬q&amp;quot; by (rule disjI2)&lt;br /&gt;
        show False using 2 5 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;
(* benber alfmarcua cammonagu *)&lt;br /&gt;
lemma ejercicio_57_1:&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 ejercicio_56_1)&lt;br /&gt;
  with assms show &amp;quot;False&amp;quot; by (rule notE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 58. Demostrar&lt;br /&gt;
     ⊢ (p ⟶ q) ∨ (q ⟶ p)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim josgomrom4 marfruman1 juacanrod pabbergue *)&lt;br /&gt;
lemma ejercicio_58:&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; proof (rule ccontr)&lt;br /&gt;
    assume 1: &amp;quot;¬((p ⟶ q) ∨ ¬(p ⟶ q))&amp;quot;&lt;br /&gt;
    have 2: &amp;quot;¬(p ⟶ q)&amp;quot; proof (rule notI)&lt;br /&gt;
      assume &amp;quot;p ⟶ q&amp;quot; &lt;br /&gt;
      hence 3: &amp;quot;(p ⟶ q) ∨ ¬(p ⟶ q)&amp;quot; by (rule disjI1)&lt;br /&gt;
      show False using 1 3 by (rule notE)&lt;br /&gt;
    qed&lt;br /&gt;
    hence 4: &amp;quot;(p ⟶ q) ∨ ¬(p ⟶ q)&amp;quot; by (rule disjI2)&lt;br /&gt;
    show &amp;quot;False&amp;quot; using 1 4 by (rule notE)&lt;br /&gt;
  qed&lt;br /&gt;
  thus ?thesis proof (rule disjE)&lt;br /&gt;
    assume &amp;quot;p ⟶ q&amp;quot; thus ?thesis by (rule disjI1)&lt;br /&gt;
  next&lt;br /&gt;
    assume 1: &amp;quot;¬(p ⟶ q)&amp;quot;&lt;br /&gt;
    have &amp;quot;q ⟶ p&amp;quot; proof (rule impI)&lt;br /&gt;
      assume 2: q&lt;br /&gt;
      have 3: &amp;quot;p ⟶ q&amp;quot; proof (rule impI)&lt;br /&gt;
        assume p show q using 2 .&lt;br /&gt;
      qed&lt;br /&gt;
      show p using 1 3 by (rule notE)&lt;br /&gt;
    qed&lt;br /&gt;
    thus ?thesis by (rule disjI2)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* pabalagon gleherlop *)&lt;br /&gt;
lemma ejercicio_58_2:&lt;br /&gt;
  &amp;quot;(p ⟶ q) ∨ (q ⟶ p)&amp;quot;&lt;br /&gt;
proof (rule ccontr)&lt;br /&gt;
  assume 1: &amp;quot;¬((p ⟶ q) ∨ (q ⟶ p))&amp;quot;&lt;br /&gt;
  hence 1: &amp;quot;(p ∧ ¬q) ∧ (q ∧ ¬p)&amp;quot; by simp&lt;br /&gt;
  hence &amp;quot;p ∧ ¬q&amp;quot; ..&lt;br /&gt;
  hence 2: p ..&lt;br /&gt;
  have &amp;quot;q ∧ ¬p&amp;quot; using 1 ..&lt;br /&gt;
  hence 3: &amp;quot;¬p&amp;quot; ..&lt;br /&gt;
  show False using 3 2 by (rule notE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber cammonagu *)&lt;br /&gt;
lemma ejercicio_58_1:&lt;br /&gt;
  &amp;quot;(p ⟶ q) ∨ (q ⟶ p)&amp;quot;&lt;br /&gt;
proof (rule ccontr)&lt;br /&gt;
  assume &amp;quot;¬ ((p ⟶ q) ∨ (q ⟶ p))&amp;quot;&lt;br /&gt;
  hence 1: &amp;quot;¬(p ⟶ q) ∧ ¬(q ⟶ p)&amp;quot; by (rule ejercicio_46_1)&lt;br /&gt;
&lt;br /&gt;
  have &amp;quot;p ∨ ¬p&amp;quot; by (rule ejercicio_52_1)&lt;br /&gt;
  moreover {&lt;br /&gt;
    assume &amp;quot;p&amp;quot;&lt;br /&gt;
    hence &amp;quot;q ⟶ p&amp;quot; by (rule ejercicio_7_1)&lt;br /&gt;
&lt;br /&gt;
    have &amp;quot;¬(q ⟶ p)&amp;quot; using 1 by (rule conjunct2)&lt;br /&gt;
    hence &amp;quot;False&amp;quot; using `q ⟶ p` by (rule notE)&lt;br /&gt;
  }&lt;br /&gt;
  moreover {&lt;br /&gt;
    assume &amp;quot;¬p&amp;quot;&lt;br /&gt;
    hence &amp;quot;p ⟶ q&amp;quot; by (rule ejercicio_40_1)&lt;br /&gt;
&lt;br /&gt;
    have &amp;quot;¬(p ⟶ q)&amp;quot; using 1 by (rule conjunct1)&lt;br /&gt;
    hence &amp;quot;False&amp;quot; using `p ⟶ q` by (rule notE)&lt;br /&gt;
  }&lt;br /&gt;
  ultimately show &amp;quot;False&amp;quot; by (rule disjE)&lt;br /&gt;
  moreover {&lt;br /&gt;
    assume &amp;quot;p&amp;quot;&lt;br /&gt;
    hence &amp;quot;q ⟶ p&amp;quot; by (rule ejercicio_7_1)&lt;br /&gt;
&lt;br /&gt;
    have &amp;quot;¬(q ⟶ p)&amp;quot; using 1 by (rule conjunct2)&lt;br /&gt;
    hence &amp;quot;False&amp;quot; using `q ⟶ p` by (rule notE)&lt;br /&gt;
  }&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* alfmarcua *)&lt;br /&gt;
lemma ejercicio_58_3:&lt;br /&gt;
  &amp;quot;(p ⟶ q) ∨ (q ⟶ p)&amp;quot;&lt;br /&gt;
proof (rule disjE)&lt;br /&gt;
  show &amp;quot;p ∨ ¬ p&amp;quot; by (rule ejercicio_52)&lt;br /&gt;
next&lt;br /&gt;
  assume &amp;quot;¬p&amp;quot;&lt;br /&gt;
  then have &amp;quot;p ⟶ q&amp;quot; by (rule ejercicio_40)&lt;br /&gt;
  then show ?thesis by (rule disjI1)&lt;br /&gt;
next&lt;br /&gt;
  assume &amp;quot;p&amp;quot;&lt;br /&gt;
  then have &amp;quot;q ⟶ p&amp;quot; by (rule ejercicio_7)&lt;br /&gt;
  then show ?thesis by (rule disjI2)&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/RA2018/index.php?title=Relaci%C3%B3n_6&amp;diff=418</id>
		<title>Relación 6</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2018/index.php?title=Relaci%C3%B3n_6&amp;diff=418"/>
		<updated>2019-02-28T13:04:57Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isabelle&amp;quot;&amp;gt;&lt;br /&gt;
chapter {* R6: Deducción natural proposicional *}&lt;br /&gt;
&lt;br /&gt;
theory R6_Deduccion_natural_proposicional&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 relación es demostrar cada uno de los ejercicios&lt;br /&gt;
  usando sólo las reglas básicas de deducción natural de la lógica&lt;br /&gt;
  proposicional (sin usar el método auto).&lt;br /&gt;
&lt;br /&gt;
  Las reglas básicas de la deducción natural son las siguientes:&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;
  · notnotI:    P ⟹ ¬¬ P&lt;br /&gt;
  · mp:         ⟦P ⟶ Q; P⟧ ⟹ Q &lt;br /&gt;
  · mt:         ⟦F ⟶ G; ¬G⟧ ⟹ ¬F &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;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Se usarán las reglas notnotI y mt que demostramos a continuación. *}&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;
section {* Implicaciones *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. Demostrar&lt;br /&gt;
       p ⟶ q, p ⊢ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim josgomrom4 cammonagu raffergon2 chrgencar&lt;br /&gt;
   gleherlop giafus1 marfruman1 enrparalv pabbergue antramhur alikan&lt;br /&gt;
   juacanrod hugrubsan *) &lt;br /&gt;
lemma ejercicio_1:&lt;br /&gt;
  assumes 1: &amp;quot;p ⟶ q&amp;quot; and&lt;br /&gt;
          2: &amp;quot;p&amp;quot;&lt;br /&gt;
  shows &amp;quot;q&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  show &amp;quot;q&amp;quot; using 1 2 by (rule mp)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber alfmarcua *)&lt;br /&gt;
lemma ejercicio_1_1:&lt;br /&gt;
  assumes &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
          &amp;quot;p&amp;quot;&lt;br /&gt;
  shows &amp;quot;q&amp;quot;&lt;br /&gt;
  using assms by (rule mp)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Demostrar&lt;br /&gt;
     p ⟶ q, q ⟶ r, p ⊢ r&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim josgomrom4 cammonagu gleherlop raffergon2&lt;br /&gt;
   chrgencar giafus1 marfruman1 alfmarcua enrparalv pabbergue antramhur&lt;br /&gt;
   alikan juacanrod hugrubsan *) &lt;br /&gt;
lemma ejercicio_2:&lt;br /&gt;
  assumes 1: &amp;quot;p ⟶ q&amp;quot; and&lt;br /&gt;
          2: &amp;quot;q ⟶ r&amp;quot; and&lt;br /&gt;
          3: &amp;quot;p&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 1 3 by (rule mp)&lt;br /&gt;
  show &amp;quot;r&amp;quot; using 2 4 by (rule mp)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber *)&lt;br /&gt;
lemma ejercicio_2_1:&lt;br /&gt;
  assumes &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
          &amp;quot;q ⟶ r&amp;quot;&lt;br /&gt;
          &amp;quot;p&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 `p ⟶ q` `p` by (rule mp)&lt;br /&gt;
  with `q ⟶ r` show &amp;quot;r&amp;quot; by (rule mp)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. Demostrar&lt;br /&gt;
     p ⟶ (q ⟶ r), p ⟶ q, p ⊢ r&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim josgomrom4 cammonagu gleherlop raffergon2&lt;br /&gt;
   chrgencar giafus1 marfruman1 alfmarcua enrparalv pabbergue antramhur&lt;br /&gt;
   alikan juacanrod hugrubsan *) &lt;br /&gt;
lemma ejercicio_3:&lt;br /&gt;
  assumes 1: &amp;quot;p ⟶ (q ⟶ r)&amp;quot; and&lt;br /&gt;
          2: &amp;quot;p ⟶ q&amp;quot; and&lt;br /&gt;
          3: &amp;quot;p&amp;quot;&lt;br /&gt;
  shows &amp;quot;r&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have 4: &amp;quot;q ⟶ r&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 &amp;quot;r&amp;quot; using 4 5 by (rule mp)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber *)&lt;br /&gt;
lemma ejercicio_3_1:&lt;br /&gt;
  assumes &amp;quot;p ⟶ (q ⟶ r)&amp;quot;&lt;br /&gt;
          &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
          &amp;quot;p&amp;quot;&lt;br /&gt;
  shows &amp;quot;r&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;q ⟶ r&amp;quot; using `p ⟶ (q ⟶ r)` `p` by (rule mp)&lt;br /&gt;
  moreover have &amp;quot;q&amp;quot; using `p ⟶ q` `p` by (rule mp)&lt;br /&gt;
  ultimately show &amp;quot;r&amp;quot; by (rule mp)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Demostrar&lt;br /&gt;
     p ⟶ q, q ⟶ r ⊢ p ⟶ r&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim josgomrom4 cammonagu chrgencar raffergon2&lt;br /&gt;
   gleherlop giafus1 marfruman1 alfmarcua enrparalv pabbergue antramhur&lt;br /&gt;
   alikan juacanrod hugrubsan *) &lt;br /&gt;
lemma ejercicio_4:&lt;br /&gt;
  assumes 1: &amp;quot;p ⟶ q&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;
  { 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;r&amp;quot; using 2 4 by (rule mp)}&lt;br /&gt;
  thus &amp;quot;p ⟶ r&amp;quot; by (rule impI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber *)&lt;br /&gt;
lemma ejercicio_4_1:&lt;br /&gt;
  assumes &amp;quot;p ⟶ q&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;
  assume p&lt;br /&gt;
  with `p ⟶ q` have &amp;quot;q&amp;quot; by (rule mp)&lt;br /&gt;
  with `q ⟶ r` show &amp;quot;r&amp;quot; by (rule mp)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. Demostrar&lt;br /&gt;
     p ⟶ (q ⟶ r) ⊢ q ⟶ (p ⟶ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim raffergon2 giafus1 gleherlop marfruman1 alfmarcua&lt;br /&gt;
   enrparalv chrgencar pabbergue antramhur alikan hugrubsan *) &lt;br /&gt;
lemma ejercicio_5:&lt;br /&gt;
  assumes 1: &amp;quot;p ⟶ (q ⟶ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;q ⟶ (p ⟶ r)&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume 2: &amp;quot;q&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;q ⟶ r&amp;quot; using 1 3 by (rule mp)&lt;br /&gt;
    show &amp;quot;r&amp;quot; using 4 2 by (rule mp)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber josgomrom4 juacanrod cammonagu  *)&lt;br /&gt;
lemma ejercicio_5_1:&lt;br /&gt;
  assumes &amp;quot;p ⟶ (q ⟶ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;q ⟶ (p ⟶ r)&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume &amp;quot;q&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;
    with `p ⟶ (q ⟶ r)` have &amp;quot;q ⟶ r&amp;quot; by (rule mp)&lt;br /&gt;
    thus &amp;quot;r&amp;quot; using `q` by (rule mp)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* pabalagon *)&lt;br /&gt;
lemma ejercicio_5_2:&lt;br /&gt;
  assumes 1: &amp;quot;p ⟶ (q ⟶ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;q ⟶ (p ⟶ r)&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  { assume 2: &amp;quot;q&amp;quot;&lt;br /&gt;
    { assume 3: &amp;quot;p&amp;quot;&lt;br /&gt;
      have 4: &amp;quot;q ⟶ r&amp;quot; using 1 3 by (rule mp)&lt;br /&gt;
      have 5: &amp;quot;r&amp;quot; using 4 2 by (rule mp)}&lt;br /&gt;
    hence &amp;quot;p ⟶ r&amp;quot; by (rule impI)&lt;br /&gt;
  }&lt;br /&gt;
  thus &amp;quot;q ⟶ (p ⟶ r)&amp;quot; by (rule impI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 6. Demostrar&lt;br /&gt;
     p ⟶ (q ⟶ r) ⊢ (p ⟶ q) ⟶ (p ⟶ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim cammonagu chrgencar raffergon2 gleherlop giafus1 &lt;br /&gt;
   marfruman1 alfmarcua enrparalv pabbergue  antramhur alikan juacanrod&lt;br /&gt;
   hugrubsan *) &lt;br /&gt;
lemma ejercicio_6:&lt;br /&gt;
  assumes 1: &amp;quot;p ⟶ (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;
  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;q ⟶ r&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 &amp;quot;r&amp;quot; using 4 5 by (rule mp)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber josgomrom4 *)&lt;br /&gt;
lemma ejercicio_6_1:&lt;br /&gt;
  assumes &amp;quot;p ⟶ (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;
  show &amp;quot;p ⟶ r&amp;quot;&lt;br /&gt;
  proof&lt;br /&gt;
    assume &amp;quot;p&amp;quot;&lt;br /&gt;
    with `p ⟶ (q ⟶ r)` have &amp;quot;q ⟶ r&amp;quot; by (rule mp)&lt;br /&gt;
    moreover from `p ⟶ q` `p` have &amp;quot;q&amp;quot; by (rule mp)&lt;br /&gt;
    ultimately show &amp;quot;r&amp;quot; by (rule mp)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 7. Demostrar&lt;br /&gt;
     p ⊢ q ⟶ p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim josgomrom4 raffergon2 giafus1 gleherlop&lt;br /&gt;
   marfruman1 enrparalv pabbergue antramhur alikan hugrubsan *) &lt;br /&gt;
lemma ejercicio_7:&lt;br /&gt;
  assumes 1: &amp;quot;p&amp;quot;  &lt;br /&gt;
  shows   &amp;quot;q ⟶ p&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume 2: &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;
&lt;br /&gt;
(* benber cammonagu juacanrod chrgencar *)&lt;br /&gt;
lemma ejercicio_7_1:&lt;br /&gt;
  assumes &amp;quot;p&amp;quot;  &lt;br /&gt;
  shows   &amp;quot;q ⟶ p&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  show &amp;quot;p&amp;quot; using `p` .&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* alfmarcua *)&lt;br /&gt;
lemma ejercicio_7_2:&lt;br /&gt;
  assumes &amp;quot;p&amp;quot;  &lt;br /&gt;
  shows   &amp;quot;q ⟶ p&amp;quot;&lt;br /&gt;
  using assms by (rule impI)&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 8. Demostrar&lt;br /&gt;
     ⊢ p ⟶ (q ⟶ p)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim josgomrom4 raffergon2 giafus1 marfruman1&lt;br /&gt;
   enrparalv pabbergue antramhur alikan hugrubsan *) &lt;br /&gt;
lemma ejercicio_8:&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 2: &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;
(* benber cammonagu gleherlop chrgencar juacanrod alfmarcua *)&lt;br /&gt;
lemma ejercicio_8_1:&lt;br /&gt;
  &amp;quot;p ⟶ (q ⟶ p)&amp;quot;&lt;br /&gt;
  using ejercicio_7_1 by (rule impI)&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 9. Demostrar&lt;br /&gt;
     p ⟶ q ⊢ (q ⟶ r) ⟶ (p ⟶ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim raffergon2 giafus1 marfruman1 alfmarcua enrparalv&lt;br /&gt;
   gleherlop antramhur alikan hugrubsan *) &lt;br /&gt;
lemma ejercicio_9:&lt;br /&gt;
  assumes 1: &amp;quot;p ⟶ q&amp;quot; &lt;br /&gt;
  shows   &amp;quot;(q ⟶ r) ⟶ (p ⟶ r)&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume 2: &amp;quot;q ⟶ r&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;q&amp;quot; using 1 3 by (rule mp)&lt;br /&gt;
    show &amp;quot;r&amp;quot; using 2 4 by (rule mp)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber josgomrom4 cammonagu chrgencar juacanrod pabbergue *)&lt;br /&gt;
lemma ejercicio_9_1:&lt;br /&gt;
  assumes &amp;quot;p ⟶ q&amp;quot; &lt;br /&gt;
  shows   &amp;quot;(q ⟶ r) ⟶ (p ⟶ r)&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume &amp;quot;q ⟶ r&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;
    with `p ⟶ q` have &amp;quot;q&amp;quot; by (rule mp)&lt;br /&gt;
    with `q ⟶ r` show &amp;quot;r&amp;quot; by (rule mp)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 10. Demostrar&lt;br /&gt;
     p ⟶ (q ⟶ (r ⟶ s)) ⊢ r ⟶ (q ⟶ (p ⟶ s))&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim raffergon2 marfruman1 gleherlop alfmarcua&lt;br /&gt;
   enrparalv pabbergue antramhur alikan juacanrod hugrubsan *) &lt;br /&gt;
lemma ejercicio_10:&lt;br /&gt;
  assumes 1: &amp;quot;p ⟶ (q ⟶ (r ⟶ s))&amp;quot; &lt;br /&gt;
  shows   &amp;quot;r ⟶ (q ⟶ (p ⟶ s))&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume 2: &amp;quot;r&amp;quot;&lt;br /&gt;
  show &amp;quot;q ⟶ (p ⟶ s)&amp;quot;&lt;br /&gt;
  proof (rule impI)&lt;br /&gt;
    assume 3: &amp;quot;q&amp;quot;&lt;br /&gt;
    show &amp;quot;p ⟶ s&amp;quot;&lt;br /&gt;
    proof (rule impI)&lt;br /&gt;
      assume 4: &amp;quot;p&amp;quot;&lt;br /&gt;
      have 5: &amp;quot;q ⟶ (r ⟶ s)&amp;quot; using 1 4 by (rule mp)&lt;br /&gt;
      have 6: &amp;quot;r ⟶ s&amp;quot; using 5 3 by (rule mp)&lt;br /&gt;
      show &amp;quot;s&amp;quot; using 6 2 by (rule mp)&lt;br /&gt;
    qed&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber josgomrom4 cammonagu chrgencar giafus1 *)&lt;br /&gt;
lemma ejercicio_10_1:&lt;br /&gt;
  assumes &amp;quot;p ⟶ (q ⟶ (r ⟶ s))&amp;quot; &lt;br /&gt;
  shows   &amp;quot;r ⟶ (q ⟶ (p ⟶ s))&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume &amp;quot;r&amp;quot;&lt;br /&gt;
  show &amp;quot;q ⟶ (p ⟶ s)&amp;quot;&lt;br /&gt;
  proof&lt;br /&gt;
    assume &amp;quot;q&amp;quot;&lt;br /&gt;
    show &amp;quot;p ⟶ s&amp;quot;&lt;br /&gt;
    proof&lt;br /&gt;
      assume &amp;quot;p&amp;quot;&lt;br /&gt;
      with `p ⟶ (q ⟶ (r ⟶ s))`&lt;br /&gt;
        have &amp;quot;q ⟶ (r ⟶ s)&amp;quot; by (rule mp)&lt;br /&gt;
      hence &amp;quot;r ⟶ s&amp;quot; using `q` by (rule mp)&lt;br /&gt;
      thus &amp;quot;s&amp;quot; using `r` by (rule mp)&lt;br /&gt;
    qed&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 11. Demostrar&lt;br /&gt;
     ⊢ (p ⟶ (q ⟶ r)) ⟶ ((p ⟶ q) ⟶ (p ⟶ r))&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim josgomrom4 gleherlop cammonagu giafus1 alfmarcua&lt;br /&gt;
   chrgencar pabbergue alikan juacanrod hugrubsan *) &lt;br /&gt;
lemma ejercicio_11:&lt;br /&gt;
  &amp;quot;(p ⟶ (q ⟶ r)) ⟶ ((p ⟶ q) ⟶ (p ⟶ r))&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume 1: &amp;quot;p ⟶ (q ⟶ r)&amp;quot;&lt;br /&gt;
  show &amp;quot;(p ⟶ q) ⟶ (p ⟶ r)&amp;quot; using 1 ejercicio_6 by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* pabalagon raffergon2 marfruman1 enrparalv antramhur *)&lt;br /&gt;
lemma ejercicio_11_2:&lt;br /&gt;
  &amp;quot;(p ⟶ (q ⟶ r)) ⟶ ((p ⟶ q) ⟶ (p ⟶ r))&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume 1: &amp;quot;p ⟶ (q ⟶ r)&amp;quot;&lt;br /&gt;
  show &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;
    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;q ⟶ r&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 &amp;quot;r&amp;quot; using 4 5 by (rule mp)&lt;br /&gt;
    qed&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber *)&lt;br /&gt;
lemma ejercicio_11_1:&lt;br /&gt;
  &amp;quot;(p ⟶ (q ⟶ r)) ⟶ ((p ⟶ q) ⟶ (p ⟶ r))&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume &amp;quot;p ⟶ (q ⟶ r)&amp;quot;&lt;br /&gt;
  show &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;
    show &amp;quot;p ⟶ r&amp;quot;&lt;br /&gt;
    proof&lt;br /&gt;
      assume p&lt;br /&gt;
      with `p ⟶ (q ⟶ r)` have &amp;quot;q ⟶ r&amp;quot; by (rule mp)&lt;br /&gt;
      moreover have &amp;quot;q&amp;quot; using `p ⟶ q` `p` by (rule mp)&lt;br /&gt;
      ultimately show r by (rule mp)&lt;br /&gt;
    qed&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 12. Demostrar&lt;br /&gt;
     (p ⟶ q) ⟶ r ⊢ p ⟶ (q ⟶ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim raffergon2 marfruman1 gleherlop enrparalv&lt;br /&gt;
   pabbergue antramhur alikan juacanrod hugrubsan *) &lt;br /&gt;
lemma ejercicio_12:&lt;br /&gt;
  assumes 1: &amp;quot;(p ⟶ q) ⟶ r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ⟶ (q ⟶ r)&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume 2: &amp;quot;p&amp;quot;&lt;br /&gt;
  show &amp;quot;q ⟶ r&amp;quot;&lt;br /&gt;
  proof (rule impI)&lt;br /&gt;
    assume 3: &amp;quot;q&amp;quot;&lt;br /&gt;
    have 4: &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
    proof (rule impI)&lt;br /&gt;
      assume 5: &amp;quot;p&amp;quot;&lt;br /&gt;
      show &amp;quot;q&amp;quot; using 3 by this&lt;br /&gt;
    qed&lt;br /&gt;
    show &amp;quot;r&amp;quot; using 1 4 by (rule mp)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber  josgomrom4 cammonagu giafus1 alfmarcua chrgencar *)&lt;br /&gt;
lemma ejercicio_12_1:&lt;br /&gt;
  assumes &amp;quot;(p ⟶ q) ⟶ r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ⟶ (q ⟶ r)&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume &amp;quot;p&amp;quot;&lt;br /&gt;
  show &amp;quot;q ⟶ r&amp;quot;&lt;br /&gt;
  proof&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;
    with `(p ⟶ q) ⟶ r` show &amp;quot;r&amp;quot; by (rule mp)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
section {* Conjunciones *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 13. Demostrar&lt;br /&gt;
     p, q ⊢  p ∧ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon *)&lt;br /&gt;
lemma ejercicio_13:&lt;br /&gt;
  assumes &amp;quot;p&amp;quot;&lt;br /&gt;
          &amp;quot;q&amp;quot; &lt;br /&gt;
  shows &amp;quot;p ∧ q&amp;quot;&lt;br /&gt;
using assms(1, 2) by (rule conjI)&lt;br /&gt;
&lt;br /&gt;
(* benber manperjim josgomrom4 cammonagu raffergon2 marfruman1 alfmarcua&lt;br /&gt;
   enrparalv chrgencar gleherlop pabbergue antramhur juacanrod hugrubsan  &lt;br /&gt;
   alikan *)&lt;br /&gt;
lemma ejercicio_13_1:&lt;br /&gt;
  assumes &amp;quot;p&amp;quot;&lt;br /&gt;
          &amp;quot;q&amp;quot; &lt;br /&gt;
  shows &amp;quot;p ∧ q&amp;quot;&lt;br /&gt;
  using assms by (rule conjI)&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 14. Demostrar&lt;br /&gt;
     p ∧ q ⊢ p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon  josgomrom4 *)&lt;br /&gt;
lemma ejercicio_14:&lt;br /&gt;
  assumes &amp;quot;p ∧ q&amp;quot;  &lt;br /&gt;
  shows   &amp;quot;p&amp;quot;&lt;br /&gt;
  using assms(1) by (rule conjunct1)&lt;br /&gt;
&lt;br /&gt;
(* benber manperjim cammonagu raffergon2 marfruman1 alfmarcua enrparalv&lt;br /&gt;
   chrgencar pabbergue gleherlop antramhur hugrubsan juacanrod alikan *) &lt;br /&gt;
lemma ejercicio_14_1:&lt;br /&gt;
  assumes &amp;quot;p ∧ q&amp;quot;  &lt;br /&gt;
  shows   &amp;quot;p&amp;quot;&lt;br /&gt;
  using assms by (rule conjunct1)&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 15. Demostrar&lt;br /&gt;
     p ∧ q ⊢ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim juacanrod josgomrom4 *)&lt;br /&gt;
lemma ejercicio_15:&lt;br /&gt;
  assumes &amp;quot;p ∧ q&amp;quot; &lt;br /&gt;
  shows   &amp;quot;q&amp;quot;&lt;br /&gt;
  using assms(1) by (rule conjunct2)&lt;br /&gt;
&lt;br /&gt;
(* benber cammonagu raffergon2 marfruman1 alfmarcua enrparalv chrgencar&lt;br /&gt;
   pabbergue antramhur gleherlop hugrubsan alikan *) &lt;br /&gt;
lemma ejercicio_15_1:&lt;br /&gt;
  assumes &amp;quot;p ∧ q&amp;quot; &lt;br /&gt;
  shows   &amp;quot;q&amp;quot;&lt;br /&gt;
  using assms by (rule conjunct2)&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 16. Demostrar&lt;br /&gt;
     p ∧ (q ∧ r) ⊢ (p ∧ q) ∧ r&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim josgomrom4 raffergon2 marfruman1 alfmarcua&lt;br /&gt;
   cammmonagu enrparalv chrgencar gleherlop pabbergue antramhur&lt;br /&gt;
   hugrubsan alikan juacanrod cammonagu *)  &lt;br /&gt;
lemma ejercicio_16:&lt;br /&gt;
  assumes &amp;quot;p ∧ (q ∧ r)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;(p ∧ q) ∧ r&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have 1: &amp;quot;p&amp;quot; using assms(1) by (rule conjunct1)&lt;br /&gt;
  have 2: &amp;quot;q ∧ r&amp;quot; using assms(1) by (rule conjunct2)&lt;br /&gt;
  have 3: &amp;quot;q&amp;quot; using 2 by (rule conjunct1)&lt;br /&gt;
  have 4: &amp;quot;r&amp;quot; using 2 by (rule conjunct2)&lt;br /&gt;
  have 5: &amp;quot;p ∧ q&amp;quot; using 1 3 by (rule conjI)&lt;br /&gt;
  show &amp;quot;(p ∧ q) ∧ r&amp;quot; using 5 4 by (rule conjI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber *)&lt;br /&gt;
lemma ejercicio_16_1:&lt;br /&gt;
  assumes &amp;quot;p ∧ (q ∧ r)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;(p ∧ q) ∧ r&amp;quot;&lt;br /&gt;
proof - (* TODO? *)&lt;br /&gt;
  have &amp;quot;q ∧ r&amp;quot; using assms by (rule conjunct2)&lt;br /&gt;
  have &amp;quot;p&amp;quot; using assms by (rule conjunct1)&lt;br /&gt;
  moreover have &amp;quot;q&amp;quot; using `q ∧ r` by (rule conjunct1)&lt;br /&gt;
  ultimately have &amp;quot;p ∧ q&amp;quot; by (rule conjI)&lt;br /&gt;
  moreover have &amp;quot;r&amp;quot; using `q ∧ r` by (rule conjunct2)&lt;br /&gt;
  ultimately show &amp;quot;(p ∧ q) ∧ r&amp;quot; by (rule conjI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 17. Demostrar&lt;br /&gt;
     (p ∧ q) ∧ r ⊢ p ∧ (q ∧ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim josgomrom4 raffergon2 marfruman1 alfmarcua&lt;br /&gt;
   cammonagu chrgencar gleherlop pabbergue antramhur enrparalv hugrubsan&lt;br /&gt;
   juacanrod alikan *)  &lt;br /&gt;
lemma ejercicio_17:&lt;br /&gt;
  assumes 1: &amp;quot;(p ∧ q) ∧ r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ∧ (q ∧ r)&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have 2: &amp;quot;r&amp;quot; using 1 by (rule conjunct2)&lt;br /&gt;
  have 3: &amp;quot;p ∧ q&amp;quot; using 1 by (rule conjunct1)&lt;br /&gt;
  have 4: &amp;quot;p&amp;quot; using 3 by (rule conjunct1)&lt;br /&gt;
  have 5: &amp;quot;q&amp;quot; using 3 by (rule conjunct2)&lt;br /&gt;
  have 6: &amp;quot;q ∧ r&amp;quot; using 5 2 by (rule conjI)&lt;br /&gt;
  show ?thesis using 4 6 by (rule conjI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber *)&lt;br /&gt;
lemma ejercicio_17_1:&lt;br /&gt;
  assumes &amp;quot;(p ∧ q) ∧ r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ∧ (q ∧ r)&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;p ∧ q&amp;quot; using assms by (rule conjunct1)&lt;br /&gt;
  have &amp;quot;p&amp;quot; using `p ∧ q` by (rule conjunct1)&lt;br /&gt;
  moreover have &amp;quot;q ∧ r&amp;quot;&lt;br /&gt;
  proof (rule conjI)&lt;br /&gt;
    show &amp;quot;q&amp;quot; using `p ∧ q` by (rule conjunct2)&lt;br /&gt;
  next&lt;br /&gt;
    show &amp;quot;r&amp;quot; using assms by (rule conjunct2)&lt;br /&gt;
  qed&lt;br /&gt;
  ultimately show ?thesis by (rule conjI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 18. Demostrar&lt;br /&gt;
     p ∧ q ⊢ p ⟶ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon raffergon2 marfruman1 juacanrod alikan*)&lt;br /&gt;
lemma ejercicio_18:&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 impI)&lt;br /&gt;
  assume &amp;quot;p&amp;quot;&lt;br /&gt;
  show &amp;quot;q&amp;quot; using assms(1) by (rule conjunct2)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber manperjim josgomrom4 cammonagu alfmarcua chrgencar pabbergue&lt;br /&gt;
   gleherlop antramhur enrparalv hugrubsan *) &lt;br /&gt;
lemma ejercicio_18_1:&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;q&amp;quot; using assms by (rule conjunct2)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 19. Demostrar&lt;br /&gt;
     (p ⟶ q) ∧ (p ⟶ r) ⊢ p ⟶ q ∧ r   &lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim josgomrom4 raffergon2 marfruman1 alfmarcua&lt;br /&gt;
   cammonagu chrgencar gleherlop pabbergue antramhur enrparalv juacanrod&lt;br /&gt;
   hugrubsan alikan *)  &lt;br /&gt;
lemma ejercicio_19:&lt;br /&gt;
  assumes 1: &amp;quot;(p ⟶ q) ∧ (p ⟶ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ⟶ q ∧ r&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume 2: &amp;quot;p&amp;quot;&lt;br /&gt;
  have 3: &amp;quot;p ⟶ q&amp;quot; using 1 by (rule conjunct1)&lt;br /&gt;
  have 4: &amp;quot;p ⟶ r&amp;quot; using 1 by (rule conjunct2)&lt;br /&gt;
  have 5: &amp;quot;q&amp;quot; using 3 2 by (rule mp)&lt;br /&gt;
  have 6: &amp;quot;r&amp;quot; using 4 2 by (rule mp)&lt;br /&gt;
  show &amp;quot;q ∧ r&amp;quot; using 5 6 by (rule conjI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber cammonagu *)&lt;br /&gt;
lemma ejercicio_19_1:&lt;br /&gt;
  assumes &amp;quot;(p ⟶ q) ∧ (p ⟶ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ⟶ q ∧ r&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume p&lt;br /&gt;
  show &amp;quot;q ∧ r&amp;quot;&lt;br /&gt;
  proof&lt;br /&gt;
    have &amp;quot;p ⟶ q&amp;quot; using assms by (rule conjunct1)&lt;br /&gt;
    thus &amp;quot;q&amp;quot; using `p` by (rule mp)&lt;br /&gt;
  next&lt;br /&gt;
    have &amp;quot;p ⟶ r&amp;quot; using assms by (rule conjunct2)&lt;br /&gt;
    thus &amp;quot;r&amp;quot; using `p` by (rule mp)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 20. Demostrar&lt;br /&gt;
     p ⟶ q ∧ r ⊢ (p ⟶ q) ∧ (p ⟶ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim josgomrom4 raffergon2 marfruman1 alfmarcua&lt;br /&gt;
   cammonagu chrgencar gleherlop pabbergue antramhur enrparalv juacanrod&lt;br /&gt;
   hugrubsan alikan *)  &lt;br /&gt;
lemma ejercicio_20:&lt;br /&gt;
  assumes 1: &amp;quot;p ⟶ q ∧ r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;(p ⟶ q) ∧ (p ⟶ r)&amp;quot;&lt;br /&gt;
proof (rule conjI)&lt;br /&gt;
  show &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;
    have 3: &amp;quot;q ∧ r&amp;quot; using 1 2 by (rule mp)&lt;br /&gt;
    show 4: &amp;quot;q&amp;quot; using 3 by (rule conjunct1)&lt;br /&gt;
  qed&lt;br /&gt;
  show &amp;quot;p ⟶ r&amp;quot;&lt;br /&gt;
  proof (rule impI)&lt;br /&gt;
    assume 2: &amp;quot;p&amp;quot;&lt;br /&gt;
    have 3: &amp;quot;q ∧ r&amp;quot; using 1 2 by (rule mp)&lt;br /&gt;
    show 4: &amp;quot;r&amp;quot; using 3 by (rule conjunct2)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber *)&lt;br /&gt;
lemma ejercicio_20_1:&lt;br /&gt;
  assumes &amp;quot;p ⟶ q ∧ r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;(p ⟶ q) ∧ (p ⟶ r)&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  show &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
  proof&lt;br /&gt;
    assume &amp;quot;p&amp;quot;&lt;br /&gt;
    with assms have &amp;quot;q ∧ r&amp;quot; by (rule mp)&lt;br /&gt;
    thus &amp;quot;q&amp;quot; by (rule conjunct1)&lt;br /&gt;
  qed&lt;br /&gt;
next&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;
    with assms have &amp;quot;q ∧ r&amp;quot; by (rule mp)&lt;br /&gt;
    thus &amp;quot;r&amp;quot; by (rule conjunct2)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 21. Demostrar&lt;br /&gt;
     p ⟶ (q ⟶ r) ⊢ p ∧ q ⟶ r&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim josgomrom4 raffergon2 marfruman1 alfmarcua&lt;br /&gt;
   cammonagu chrgencar pabbergue gleherlop antramhur enrparalv juacanrod&lt;br /&gt;
   hugrubsan alikan *)  &lt;br /&gt;
lemma ejercicio_21:&lt;br /&gt;
  assumes 1: &amp;quot;p ⟶ (q ⟶ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ∧ q ⟶ r&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume 2: &amp;quot;p ∧ q&amp;quot;&lt;br /&gt;
  have 3: &amp;quot;p&amp;quot; using 2 by (rule conjunct1)&lt;br /&gt;
  have 4: &amp;quot;q ⟶ r&amp;quot; using 1 3 by (rule mp)&lt;br /&gt;
  have 5: &amp;quot;q&amp;quot; using 2 by (rule conjunct2)&lt;br /&gt;
  show &amp;quot;r&amp;quot; using 4 5 by (rule mp)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber *)&lt;br /&gt;
lemma ejercicio_21_1:&lt;br /&gt;
  assumes &amp;quot;p ⟶ (q ⟶ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ∧ q ⟶ r&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume &amp;quot;p ∧ q&amp;quot;&lt;br /&gt;
  hence &amp;quot;p&amp;quot; by (rule conjunct1)&lt;br /&gt;
  with `p ⟶ (q ⟶ r)` have &amp;quot;q ⟶ r&amp;quot; by (rule mp)&lt;br /&gt;
  moreover from `p ∧ q` have &amp;quot;q&amp;quot; by (rule conjunct2)&lt;br /&gt;
  ultimately show &amp;quot;r&amp;quot; by (rule mp)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 22. Demostrar&lt;br /&gt;
     p ∧ q ⟶ r ⊢ p ⟶ (q ⟶ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim josgomrom4 raffergon2 marfruman1 alfmarcua&lt;br /&gt;
   chrgencar pabbergue gleherlop antramhur enrparalv juacanrod hugrubsan&lt;br /&gt;
   alikan *)  &lt;br /&gt;
lemma ejercicio_22:&lt;br /&gt;
  assumes 1: &amp;quot;p ∧ q ⟶ r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ⟶ (q ⟶ r)&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume 2: &amp;quot;p&amp;quot;&lt;br /&gt;
  show &amp;quot;q ⟶ r&amp;quot;&lt;br /&gt;
  proof (rule impI)&lt;br /&gt;
    assume 3: &amp;quot;q&amp;quot;&lt;br /&gt;
    have 4: &amp;quot;p ∧ q&amp;quot; using 2 3 by (rule conjI)&lt;br /&gt;
    show &amp;quot;r&amp;quot; using 1 4 by (rule mp)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber cammonagu *)&lt;br /&gt;
lemma ejercicio_22_1:&lt;br /&gt;
  assumes &amp;quot;p ∧ q ⟶ r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ⟶ (q ⟶ r)&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume &amp;quot;p&amp;quot;&lt;br /&gt;
  show &amp;quot;q ⟶ r&amp;quot;&lt;br /&gt;
  proof&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 `p ∧ q ⟶ r` show &amp;quot;r&amp;quot; by (rule mp)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 23. Demostrar&lt;br /&gt;
     (p ⟶ q) ⟶ r ⊢ p ∧ q ⟶ r&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim josgomrom4 raffergon2 marfruman1 alfmarcua&lt;br /&gt;
   chrgencar pabbergue gleherlop antramhur enrparalv juacanrod hugrubsan&lt;br /&gt;
   alikan *)  &lt;br /&gt;
lemma ejercicio_23:&lt;br /&gt;
  assumes 1: &amp;quot;(p ⟶ q) ⟶ r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ∧ q ⟶ r&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume 2: &amp;quot;p ∧ q&amp;quot;&lt;br /&gt;
  have 3: &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
  proof (rule impI)&lt;br /&gt;
    assume &amp;quot;p&amp;quot;&lt;br /&gt;
    show &amp;quot;q&amp;quot; using 2 by (rule conjunct2)&lt;br /&gt;
  qed&lt;br /&gt;
  show &amp;quot;r&amp;quot; using 1 3 by (rule mp)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber cammonagu *)&lt;br /&gt;
lemma ejercicio_23_1:&lt;br /&gt;
  assumes &amp;quot;(p ⟶ q) ⟶ r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ∧ q ⟶ r&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume &amp;quot;p ∧ q&amp;quot;&lt;br /&gt;
  hence &amp;quot;q&amp;quot; by (rule conjunct2)&lt;br /&gt;
  hence &amp;quot;p ⟶ q&amp;quot; by (rule impI)&lt;br /&gt;
  with `(p ⟶ q) ⟶ r` show &amp;quot;r&amp;quot; by (rule mp)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 24. Demostrar&lt;br /&gt;
     p ∧ (q ⟶ r) ⊢ (p ⟶ q) ⟶ r&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim josgomrom4 raffergon2 marfruman1 alfmarcua&lt;br /&gt;
   chrgencar pabbergue gleherlop antramhur enrparalv hugrubsan juacanrod&lt;br /&gt;
   cammonagu alikan *)  &lt;br /&gt;
lemma ejercicio_24:&lt;br /&gt;
  assumes 1: &amp;quot;p ∧ (q ⟶ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;(p ⟶ q) ⟶ r&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume 2: &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
  have 3: &amp;quot;p&amp;quot; using 1 by (rule conjunct1)&lt;br /&gt;
  have 4: &amp;quot;q ⟶ r&amp;quot; using 1 by (rule conjunct2)&lt;br /&gt;
  have 5: &amp;quot;q&amp;quot; using 2 3 by (rule mp)&lt;br /&gt;
  show 6: &amp;quot;r&amp;quot; using 4 5 by (rule mp)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber *)&lt;br /&gt;
lemma ejercicio_24_1:&lt;br /&gt;
  assumes &amp;quot;p ∧ (q ⟶ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;(p ⟶ q) ⟶ r&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  have &amp;quot;q ⟶ r&amp;quot; using assms by (rule conjunct2)&lt;br /&gt;
  assume &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
  moreover have &amp;quot;p&amp;quot; using assms by (rule conjunct1)&lt;br /&gt;
  ultimately have &amp;quot;q&amp;quot; by (rule mp)&lt;br /&gt;
  with `q ⟶ r` show r by (rule mp)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
section {* Disyunciones *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 25. Demostrar&lt;br /&gt;
     p ⊢ p ∨ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim josgomrom4 benber cammonagu raffergon2 marfruman1&lt;br /&gt;
   alfmarcua chrgencar gleherlop pabbergue antramhur enrparalv juacanrod&lt;br /&gt;
   hugrubsan alikan *)  &lt;br /&gt;
lemma ejercicio_25:&lt;br /&gt;
  assumes &amp;quot;p&amp;quot;&lt;br /&gt;
  shows   &amp;quot;p ∨ q&amp;quot;&lt;br /&gt;
  using assms(1) by (rule disjI1)&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 26. Demostrar&lt;br /&gt;
     q ⊢ p ∨ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim josgomrom4 benber cammonagu marfruman1 alfmarcua&lt;br /&gt;
   chrgencar pabbergue gleherlop antramhur enrparalv juacanrod hugrubsan&lt;br /&gt;
   alikan *)  &lt;br /&gt;
lemma ejercicio_26:&lt;br /&gt;
  assumes &amp;quot;q&amp;quot;&lt;br /&gt;
  shows   &amp;quot;p ∨ q&amp;quot;&lt;br /&gt;
  using assms(1) by (rule disjI2)&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 27. Demostrar&lt;br /&gt;
     p ∨ q ⊢ q ∨ p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim josgomrom4 raffergon2 marfruman1 chrgencar&lt;br /&gt;
   pabbergue antramhur enrparalv juacanrod hugrubsan cammonagu alikan *) &lt;br /&gt;
lemma ejercicio_27:&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 proof (rule disjE)&lt;br /&gt;
  assume 2: &amp;quot;p&amp;quot; thus &amp;quot;q ∨ p&amp;quot; by (rule disjI2)&lt;br /&gt;
next&lt;br /&gt;
  assume 3: &amp;quot;q&amp;quot; thus &amp;quot;q ∨ p&amp;quot; by (rule disjI1)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber alfmarcua gleherlop *)&lt;br /&gt;
lemma ejercicio_27_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 .&lt;br /&gt;
  moreover have &amp;quot;p ⟹ q ∨ p&amp;quot; by (rule disjI2)&lt;br /&gt;
  moreover have &amp;quot;q ⟹ q ∨ p&amp;quot; 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;
  Ejercicio 28. Demostrar&lt;br /&gt;
     q ⟶ r ⊢ p ∨ q ⟶ p ∨ r&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim josgomrom4 raffergon2 marfruman1 chrgencar&lt;br /&gt;
   gleherlop alfmarcua pabbergue antramhur enrparalv juacanrod hugrubsan&lt;br /&gt;
   cammonagu alikan *) &lt;br /&gt;
lemma ejercicio_28:&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; show &amp;quot;p ∨ r&amp;quot; using 2&lt;br /&gt;
  proof (rule disjE)&lt;br /&gt;
    assume 3: p thus &amp;quot;p ∨ r&amp;quot; by (rule disjI1)&lt;br /&gt;
  next&lt;br /&gt;
    assume 4: q have r using 1 4 by (rule mp)&lt;br /&gt;
    thus &amp;quot;p ∨ r&amp;quot; by (rule disjI2)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber *)&lt;br /&gt;
lemma ejercicio_28_1:&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;
  moreover have &amp;quot;p ⟹ p ∨ r&amp;quot; by (rule disjI1)&lt;br /&gt;
  moreover have &amp;quot;q ⟹ p ∨ r&amp;quot;&lt;br /&gt;
  proof (rule disjI2)&lt;br /&gt;
    assume &amp;quot;q&amp;quot;&lt;br /&gt;
    with `q ⟶ r` show &amp;quot;r&amp;quot; by (rule mp)&lt;br /&gt;
  qed&lt;br /&gt;
  ultimately show &amp;quot;p ∨ r&amp;quot; by (rule disjE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 29. Demostrar&lt;br /&gt;
     p ∨ p ⊢ p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon juacanrod marfruman1 *)&lt;br /&gt;
lemma ejercicio_29:&lt;br /&gt;
  assumes 1: &amp;quot;p ∨ p&amp;quot;&lt;br /&gt;
  shows   &amp;quot;p&amp;quot;&lt;br /&gt;
using 1 proof (rule disjE)&lt;br /&gt;
  assume &amp;quot;p&amp;quot; thus &amp;quot;p&amp;quot; .&lt;br /&gt;
next&lt;br /&gt;
  assume &amp;quot;p&amp;quot; thus &amp;quot;p&amp;quot; .&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber manperjim cammonagu josgomrom4 raffergon2 chrgencar alfmarcua&lt;br /&gt;
   gleherlop pabbergue antramhur enrparalv hugrubsan alikan *) &lt;br /&gt;
lemma ejercicio_29_1:&lt;br /&gt;
  assumes &amp;quot;p ∨ p&amp;quot;&lt;br /&gt;
  shows   &amp;quot;p&amp;quot;&lt;br /&gt;
  using assms by (rule disjE)&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 30. Demostrar&lt;br /&gt;
     p ⊢ p ∨ p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim  benber josgomrom4 raffergon2 marfruman1&lt;br /&gt;
   chrgencar alfmarcua pabbergue gleherlop antramhur enrparalv hugrubsan&lt;br /&gt;
   juacanrod cammonagu alikan *)  &lt;br /&gt;
lemma ejercicio_30:&lt;br /&gt;
  assumes &amp;quot;p&amp;quot;&lt;br /&gt;
  shows   &amp;quot;p ∨ p&amp;quot;&lt;br /&gt;
  using assms(1) by (rule disjI1)&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 31. Demostrar&lt;br /&gt;
     p ∨ (q ∨ r) ⊢ (p ∨ q) ∨ r&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim marfruman1 josgomrom4 alfmarcua pabbergue&lt;br /&gt;
   gleherlop antramhur enrparalv juacanrod hugrubsan alikan *) &lt;br /&gt;
lemma ejercicio_31:&lt;br /&gt;
  assumes 1: &amp;quot;p ∨ (q ∨ r)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;(p ∨ q) ∨ r&amp;quot; (is &amp;quot;?R&amp;quot;)&lt;br /&gt;
using 1 proof (rule disjE)&lt;br /&gt;
  assume &amp;quot;p&amp;quot; hence &amp;quot;p ∨ q&amp;quot; by (rule disjI1)&lt;br /&gt;
  thus ?R by (rule disjI1)&lt;br /&gt;
next&lt;br /&gt;
  assume &amp;quot;q ∨ r&amp;quot; thus ?R&lt;br /&gt;
  proof (rule disjE)&lt;br /&gt;
    assume &amp;quot;q&amp;quot; hence &amp;quot;p ∨ q&amp;quot; by (rule disjI2)&lt;br /&gt;
    thus &amp;quot;(p ∨ q) ∨ r&amp;quot; by (rule disjI1)&lt;br /&gt;
  next&lt;br /&gt;
    assume &amp;quot;r&amp;quot; thus ?thesis by (rule disjI2)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber cammonagu *)&lt;br /&gt;
lemma ejercicio_31_1:&lt;br /&gt;
  assumes &amp;quot;p ∨ (q ∨ r)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;(p ∨ q) ∨ r&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;p ∨ (q ∨ r)&amp;quot; using assms .&lt;br /&gt;
  moreover {&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) ∨ r&amp;quot; by (rule disjI1)&lt;br /&gt;
  }&lt;br /&gt;
  moreover {&lt;br /&gt;
    assume &amp;quot;q ∨ r&amp;quot;&lt;br /&gt;
    moreover {&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;
      hence &amp;quot;(p ∨ q) ∨ r&amp;quot; by (rule disjI1)&lt;br /&gt;
    }&lt;br /&gt;
    moreover {&lt;br /&gt;
      assume &amp;quot;r&amp;quot;&lt;br /&gt;
      hence &amp;quot;(p ∨ q) ∨ r&amp;quot; by (rule disjI2)&lt;br /&gt;
    }&lt;br /&gt;
    ultimately have &amp;quot;(p ∨ q) ∨ r&amp;quot; by (rule disjE)&lt;br /&gt;
  }&lt;br /&gt;
  ultimately show &amp;quot;(p ∨ q) ∨ r&amp;quot; by (rule disjE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 32. Demostrar&lt;br /&gt;
     (p ∨ q) ∨ r ⊢ p ∨ (q ∨ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim marfruman1 josgomrom4 alfmarcua gleherlop&lt;br /&gt;
   pabbergue antramhur enrparalv juacanrod hugrubsan alikan *) &lt;br /&gt;
lemma ejercicio_32:&lt;br /&gt;
  assumes 1: &amp;quot;(p ∨ q) ∨ r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ∨ (q ∨ r)&amp;quot;&lt;br /&gt;
using 1 proof (rule disjE)&lt;br /&gt;
  assume &amp;quot;p ∨ q&amp;quot; thus ?thesis&lt;br /&gt;
  proof (rule disjE)&lt;br /&gt;
    assume p thus ?thesis by (rule disjI1)&lt;br /&gt;
  next&lt;br /&gt;
    assume q hence &amp;quot;q ∨ r&amp;quot; by (rule disjI1)&lt;br /&gt;
    thus ?thesis by (rule disjI2)&lt;br /&gt;
  qed&lt;br /&gt;
next&lt;br /&gt;
  assume r hence &amp;quot;q ∨ r&amp;quot; by (rule disjI2)&lt;br /&gt;
  thus ?thesis by (rule disjI2)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber cammonagu *)&lt;br /&gt;
lemma ejercicio_32_1:&lt;br /&gt;
  assumes &amp;quot;(p ∨ q) ∨ r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ∨ (q ∨ r)&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;(p ∨ q) ∨ r&amp;quot; using assms .&lt;br /&gt;
  moreover {&lt;br /&gt;
    assume &amp;quot;p ∨ q&amp;quot;&lt;br /&gt;
    moreover {&lt;br /&gt;
      assume &amp;quot;p&amp;quot;&lt;br /&gt;
      hence ?thesis by (rule disjI1)&lt;br /&gt;
    }&lt;br /&gt;
    moreover {&lt;br /&gt;
      assume &amp;quot;q&amp;quot;&lt;br /&gt;
      hence &amp;quot;q ∨ r&amp;quot; by (rule disjI1)&lt;br /&gt;
      hence ?thesis by (rule disjI2)&lt;br /&gt;
    }&lt;br /&gt;
    ultimately have ?thesis by (rule disjE)&lt;br /&gt;
  }&lt;br /&gt;
  moreover {&lt;br /&gt;
    assume &amp;quot;r&amp;quot;&lt;br /&gt;
    hence &amp;quot;q ∨ r&amp;quot; by (rule disjI2)&lt;br /&gt;
    hence ?thesis by (rule disjI2)&lt;br /&gt;
  }&lt;br /&gt;
  ultimately show ?thesis by (rule disjE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 33. Demostrar&lt;br /&gt;
     p ∧ (q ∨ r) ⊢ (p ∧ q) ∨ (p ∧ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim marfruman1 josgomrom4 chrgencar gleherlop&lt;br /&gt;
   alfmarcua pabbergue antramhur enrparalv juacanrod hugrubsan alikan *) &lt;br /&gt;
lemma ejercicio_33:&lt;br /&gt;
  assumes 1: &amp;quot;p ∧ (q ∨ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;(p ∧ q) ∨ (p ∧ r)&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have 2: p using 1 by (rule conjunct1)&lt;br /&gt;
  show ?thesis&lt;br /&gt;
  proof (rule disjE)&lt;br /&gt;
    assume 3: q have &amp;quot;p ∧ q&amp;quot; using 2 3 by (rule conjI)&lt;br /&gt;
    thus ?thesis by (rule disjI1)&lt;br /&gt;
  next&lt;br /&gt;
    assume 4: r have &amp;quot;p ∧ r&amp;quot; using 2 4 by (rule conjI)&lt;br /&gt;
    thus ?thesis by (rule disjI2)&lt;br /&gt;
  next&lt;br /&gt;
    show &amp;quot;q ∨ r&amp;quot; using 1 by (rule conjunct2)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber cammonagu *)&lt;br /&gt;
lemma ejercicio_33_1:&lt;br /&gt;
  assumes &amp;quot;p ∧ (q ∨ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;(p ∧ q) ∨ (p ∧ r)&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;p&amp;quot; using assms by (rule conjunct1)&lt;br /&gt;
  have &amp;quot;q ∨ r&amp;quot; using assms by (rule conjunct2)&lt;br /&gt;
  moreover {&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;
    hence ?thesis by (rule disjI1)&lt;br /&gt;
  }&lt;br /&gt;
  moreover {&lt;br /&gt;
    assume &amp;quot;r&amp;quot;&lt;br /&gt;
    with `p` have &amp;quot;p ∧ r&amp;quot; by (rule conjI)&lt;br /&gt;
    hence ?thesis by (rule disjI2)&lt;br /&gt;
  }&lt;br /&gt;
  ultimately show ?thesis by (rule disjE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 34. Demostrar&lt;br /&gt;
     (p ∧ q) ∨ (p ∧ r) ⊢ p ∧ (q ∨ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim marfruman1 josgomrom4 chrgencar alfmarcua&lt;br /&gt;
   gleherlop pabbergue antramhur enrparalv juacanrod hugrubsan alikan *) &lt;br /&gt;
lemma ejercicio_34:&lt;br /&gt;
  assumes &amp;quot;(p ∧ q) ∨ (p ∧ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ∧ (q ∨ r)&amp;quot;&lt;br /&gt;
using assms(1) proof (rule disjE)&lt;br /&gt;
  assume 2: &amp;quot;p ∧ q&amp;quot; hence q by (rule conjunct2)&lt;br /&gt;
  hence 3: &amp;quot;q ∨ r&amp;quot; by (rule disjI1)&lt;br /&gt;
  have p using 2 by (rule conjunct1)&lt;br /&gt;
  thus ?thesis using 3 by (rule conjI)&lt;br /&gt;
next&lt;br /&gt;
  assume 4: &amp;quot;p ∧ r&amp;quot; hence r by (rule conjunct2)&lt;br /&gt;
  hence 5: &amp;quot;q ∨ r&amp;quot; by (rule disjI2)&lt;br /&gt;
  have p using 4 by (rule conjunct1)&lt;br /&gt;
  thus ?thesis using 5 by (rule conjI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber cammonagu *)&lt;br /&gt;
lemma ejercicio_34_1:&lt;br /&gt;
  assumes &amp;quot;(p ∧ q) ∨ (p ∧ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ∧ (q ∨ r)&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;(p ∧ q) ∨ (p ∧ r)&amp;quot; using assms .&lt;br /&gt;
  moreover {&lt;br /&gt;
    assume &amp;quot;p ∧ q&amp;quot;&lt;br /&gt;
    hence &amp;quot;p&amp;quot; by (rule conjunct1)&lt;br /&gt;
    moreover {&lt;br /&gt;
      have &amp;quot;q&amp;quot; using `p ∧ q` by (rule conjunct2)&lt;br /&gt;
      hence &amp;quot;q ∨ r&amp;quot; by (rule disjI1)&lt;br /&gt;
    }&lt;br /&gt;
    ultimately have ?thesis by (rule conjI)&lt;br /&gt;
  }&lt;br /&gt;
  moreover {&lt;br /&gt;
    assume &amp;quot;p ∧ r&amp;quot;&lt;br /&gt;
    hence &amp;quot;p&amp;quot; by (rule conjunct1)&lt;br /&gt;
    moreover {&lt;br /&gt;
      have &amp;quot;r&amp;quot; using `p ∧ r` by (rule conjunct2)&lt;br /&gt;
      hence &amp;quot;q ∨ r&amp;quot; by (rule disjI2)&lt;br /&gt;
    }&lt;br /&gt;
    ultimately have ?thesis by (rule conjI)&lt;br /&gt;
  }&lt;br /&gt;
  ultimately show ?thesis by (rule disjE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 35. Demostrar&lt;br /&gt;
     p ∨ (q ∧ r) ⊢ (p ∨ q) ∧ (p ∨ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim marfruman1 josgomrom4 chrgencar alfmarcua&lt;br /&gt;
   gleherlop pabbergue antramhur enrparalv juacanrod hugrubsan alikan *) &lt;br /&gt;
lemma ejercicio_35:&lt;br /&gt;
  assumes &amp;quot;p ∨ (q ∧ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;(p ∨ q) ∧ (p ∨ r)&amp;quot;&lt;br /&gt;
using assms(1) proof (rule disjE)&lt;br /&gt;
  assume 1: p hence 2: &amp;quot;p ∨ r&amp;quot; by (rule disjI1)&lt;br /&gt;
  have &amp;quot;p ∨ q&amp;quot; using 1 by (rule disjI1)&lt;br /&gt;
  thus ?thesis using 2 by (rule conjI)&lt;br /&gt;
next&lt;br /&gt;
  assume 3: &amp;quot;q ∧ r&amp;quot; hence r by (rule conjunct2)&lt;br /&gt;
  hence 4: &amp;quot;p ∨ r&amp;quot; by (rule disjI2)&lt;br /&gt;
  have q using 3 by (rule conjunct1)&lt;br /&gt;
  hence &amp;quot;p ∨ q&amp;quot; by (rule disjI2)&lt;br /&gt;
  thus ?thesis using 4 by (rule conjI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber cammonagu *)&lt;br /&gt;
lemma ejercicio_35_1:&lt;br /&gt;
  assumes &amp;quot;p ∨ (q ∧ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;(p ∨ q) ∧ (p ∨ r)&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;p ∨ (q ∧ r)&amp;quot; using assms .&lt;br /&gt;
  moreover {&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;
    moreover have &amp;quot;p ∨ r&amp;quot; using `p` by (rule disjI1)&lt;br /&gt;
    ultimately have ?thesis by (rule conjI)&lt;br /&gt;
  }&lt;br /&gt;
  moreover {&lt;br /&gt;
    assume &amp;quot;q ∧ r&amp;quot;&lt;br /&gt;
    {&lt;br /&gt;
      have &amp;quot;q&amp;quot; using `q ∧ r` by (rule conjunct1)&lt;br /&gt;
      hence &amp;quot;p ∨ q&amp;quot; by (rule disjI2)&lt;br /&gt;
    }&lt;br /&gt;
    moreover {&lt;br /&gt;
      have &amp;quot;r&amp;quot; using `q ∧ r` by (rule conjunct2)&lt;br /&gt;
      hence &amp;quot;p ∨ r&amp;quot; by (rule disjI2)&lt;br /&gt;
    }&lt;br /&gt;
    ultimately have ?thesis by (rule conjI)&lt;br /&gt;
  }&lt;br /&gt;
  ultimately show ?thesis by (rule disjE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 36. Demostrar&lt;br /&gt;
     (p ∨ q) ∧ (p ∨ r) ⊢ p ∨ (q ∧ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim marfruman1 josgomrom4 chrgencar alfmarcua&lt;br /&gt;
   gleherlop pabbergue antramhur enrparalv juacanrod hugrubsan alikan *) &lt;br /&gt;
lemma ejercicio_36:&lt;br /&gt;
  assumes 1: &amp;quot;(p ∨ q) ∧ (p ∨ r)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;p ∨ (q ∧ r)&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have 2: &amp;quot;p ∨ q&amp;quot; using 1 by (rule conjunct1)&lt;br /&gt;
  have 3: &amp;quot;p ∨ r&amp;quot; using 1 by (rule conjunct2)&lt;br /&gt;
  show ?thesis using 2&lt;br /&gt;
  proof (rule disjE)&lt;br /&gt;
    assume p thus ?thesis by (rule disjI1)&lt;br /&gt;
  next&lt;br /&gt;
    assume 4: q show ?thesis using 3&lt;br /&gt;
    proof (rule disjE)&lt;br /&gt;
      assume p thus ?thesis by (rule disjI1)&lt;br /&gt;
    next&lt;br /&gt;
      assume 5: r have &amp;quot;q ∧ r&amp;quot; using 4 5 by (rule conjI)&lt;br /&gt;
      thus ?thesis by (rule disjI2)&lt;br /&gt;
    qed&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber cammonagu *)&lt;br /&gt;
lemma ejercicio_36_1:&lt;br /&gt;
  assumes &amp;quot;(p ∨ q) ∧ (p ∨ r)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;p ∨ (q ∧ r)&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;p ∨ q&amp;quot; using assms by (rule conjunct1)&lt;br /&gt;
  moreover {&lt;br /&gt;
    assume &amp;quot;p&amp;quot;&lt;br /&gt;
    hence ?thesis by (rule disjI1)&lt;br /&gt;
  }&lt;br /&gt;
  moreover {&lt;br /&gt;
    assume &amp;quot;q&amp;quot;&lt;br /&gt;
    have &amp;quot;p ∨ r&amp;quot; using assms by (rule conjunct2)&lt;br /&gt;
    moreover {&lt;br /&gt;
      assume &amp;quot;p&amp;quot;&lt;br /&gt;
      hence ?thesis by (rule disjI1)&lt;br /&gt;
    }&lt;br /&gt;
    moreover {&lt;br /&gt;
      assume &amp;quot;r&amp;quot;&lt;br /&gt;
      with `q` have &amp;quot;q ∧ r&amp;quot; by (rule conjI)&lt;br /&gt;
      hence ?thesis by (rule disjI2)&lt;br /&gt;
    }&lt;br /&gt;
    ultimately have ?thesis by (rule disjE)&lt;br /&gt;
  }&lt;br /&gt;
  ultimately show ?thesis by (rule disjE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 37. Demostrar&lt;br /&gt;
     (p ⟶ r) ∧ (q ⟶ r) ⊢ p ∨ q ⟶ r&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim marfruman1 josgomrom4 alfmarcua gleherlop&lt;br /&gt;
   pabbergue antramhur enrparalv juacanrod hugrubsan alikan *) &lt;br /&gt;
lemma ejercicio_37:&lt;br /&gt;
  assumes 1: &amp;quot;(p ⟶ r) ∧ (q ⟶ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ∨ q ⟶ r&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  have 2: &amp;quot;p ⟶ r&amp;quot; using 1 by (rule conjunct1)&lt;br /&gt;
  have 3: &amp;quot;q ⟶ r&amp;quot; using 1 by (rule conjunct2)&lt;br /&gt;
  assume 4: &amp;quot;p ∨ q&amp;quot; show &amp;quot;r&amp;quot; using 4&lt;br /&gt;
  proof (rule disjE)&lt;br /&gt;
    assume 5: &amp;quot;p&amp;quot; show &amp;quot;r&amp;quot; using 2 5 by (rule mp)&lt;br /&gt;
  next&lt;br /&gt;
    assume 6: &amp;quot;q&amp;quot; show &amp;quot;r&amp;quot; using 3 6 by (rule mp)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber cammonagu *)&lt;br /&gt;
lemma ejercicio_37_1:&lt;br /&gt;
  assumes &amp;quot;(p ⟶ r) ∧ (q ⟶ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ∨ q ⟶ r&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume &amp;quot;p ∨ q&amp;quot;&lt;br /&gt;
  moreover {&lt;br /&gt;
    have &amp;quot;p ⟶ r&amp;quot; using assms by (rule conjunct1)&lt;br /&gt;
    moreover assume &amp;quot;p&amp;quot;&lt;br /&gt;
    ultimately have &amp;quot;r&amp;quot; by (rule mp)&lt;br /&gt;
  }&lt;br /&gt;
  moreover {&lt;br /&gt;
    have &amp;quot;q ⟶ r&amp;quot; using assms by (rule conjunct2)&lt;br /&gt;
    moreover assume &amp;quot;q&amp;quot;&lt;br /&gt;
    ultimately have &amp;quot;r&amp;quot; by (rule mp)&lt;br /&gt;
  }&lt;br /&gt;
  ultimately show &amp;quot;r&amp;quot; by (rule disjE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 38. Demostrar&lt;br /&gt;
     p ∨ q ⟶ r ⊢ (p ⟶ r) ∧ (q ⟶ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim marfruman1 josgomrom4 alfmarcua gleherlop&lt;br /&gt;
   pabbergue antramhur enrparalv juacanrod hugrubsan alikan *) &lt;br /&gt;
lemma ejercicio_38:&lt;br /&gt;
  assumes &amp;quot;p ∨ q ⟶ r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;(p ⟶ r) ∧ (q ⟶ r)&amp;quot;&lt;br /&gt;
proof (rule conjI)&lt;br /&gt;
  show &amp;quot;p ⟶ r&amp;quot;&lt;br /&gt;
  proof (rule impI)&lt;br /&gt;
    assume &amp;quot;p&amp;quot; hence 1: &amp;quot;p ∨ q&amp;quot; by (rule disjI1)&lt;br /&gt;
    show &amp;quot;r&amp;quot; using assms(1) 1 by (rule mp)&lt;br /&gt;
  qed&lt;br /&gt;
next&lt;br /&gt;
  show &amp;quot;q ⟶ r&amp;quot;&lt;br /&gt;
  proof (rule impI)&lt;br /&gt;
    assume q hence 2: &amp;quot;p ∨ q&amp;quot; by (rule disjI2)&lt;br /&gt;
    show r using assms(1) 2 by (rule mp)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber cammonagu*)&lt;br /&gt;
lemma ejercicio_38_1:&lt;br /&gt;
  assumes &amp;quot;p ∨ q ⟶ r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;(p ⟶ r) ∧ (q ⟶ r)&amp;quot;&lt;br /&gt;
proof&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 ∨ q&amp;quot; by (rule disjI1)&lt;br /&gt;
    with assms show &amp;quot;r&amp;quot; by (rule mp)&lt;br /&gt;
  qed&lt;br /&gt;
next&lt;br /&gt;
  show &amp;quot;q ⟶ r&amp;quot;&lt;br /&gt;
  proof&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 show &amp;quot;r&amp;quot; by (rule mp)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
section {* Negaciones *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 39. Demostrar&lt;br /&gt;
     p ⊢ ¬¬p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim  benber josgomrom4 raffergon2 gleherlop&lt;br /&gt;
   marfruman1 chrgencar alfmarcua pabbergue enrparalv juacanrod&lt;br /&gt;
   hugrubsan cammonagu alikan *)  &lt;br /&gt;
lemma ejercicio_39:&lt;br /&gt;
  assumes &amp;quot;p&amp;quot;&lt;br /&gt;
  shows   &amp;quot;¬¬p&amp;quot;&lt;br /&gt;
  using assms(1) by (rule notnotI)&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 40. Demostrar&lt;br /&gt;
     ¬p ⊢ p ⟶ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim marfruman1 josgomrom4 alfmarcua pabbergue&lt;br /&gt;
   gleherlop juacanrod enrparalv hugrubsan alikan *) &lt;br /&gt;
lemma ejercicio_40:&lt;br /&gt;
  assumes 1: &amp;quot;¬p&amp;quot;&lt;br /&gt;
  shows   &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume 2: p show q using 1 2 by (rule notE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber cammonagu *)&lt;br /&gt;
lemma ejercicio_40_1:&lt;br /&gt;
  assumes &amp;quot;¬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;
  with `¬p` show &amp;quot;q&amp;quot; by (rule notE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 41. Demostrar&lt;br /&gt;
     p ⟶ q ⊢ ¬q ⟶ ¬p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim raffergon2 josgomrom4 marfruman1 alfmarcua&lt;br /&gt;
   pabbergue gleherlop enrparalv juacanrod hugrubsan alikan *) &lt;br /&gt;
lemma ejercicio_41:&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 (rule impI)&lt;br /&gt;
  assume 2: &amp;quot;¬q&amp;quot; show &amp;quot;¬p&amp;quot; using 1 2 by (rule mt)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber cammonagu *)&lt;br /&gt;
lemma ejercicio_41_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;
  assume &amp;quot;¬q&amp;quot;&lt;br /&gt;
  with `p ⟶ q` show &amp;quot;¬p&amp;quot; by (rule mt)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 42. Demostrar&lt;br /&gt;
     p∨q, ¬q ⊢ p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim raffergon2 josgomrom4 marfruman1 alfmarcua&lt;br /&gt;
   pabbergue gleherlop enrparalv juacanrod hugrubsan alikan *) &lt;br /&gt;
lemma ejercicio_42:&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;
using assms(1) proof (rule disjE)&lt;br /&gt;
  assume &amp;quot;p&amp;quot; thus &amp;quot;p&amp;quot; .&lt;br /&gt;
next&lt;br /&gt;
  assume 2: &amp;quot;q&amp;quot; show &amp;quot;p&amp;quot; using assms(2) 2 by (rule notE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber cammonagu *)&lt;br /&gt;
lemma ejercicio_42_1:&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;
  note `p ∨ q`&lt;br /&gt;
  moreover have &amp;quot;p ⟹ p&amp;quot; .&lt;br /&gt;
  moreover {&lt;br /&gt;
    assume &amp;quot;q&amp;quot;&lt;br /&gt;
    with `¬q` have &amp;quot;p&amp;quot; by (rule notE)&lt;br /&gt;
  }&lt;br /&gt;
  ultimately show &amp;quot;p&amp;quot; by (rule disjE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 43. Demostrar&lt;br /&gt;
     p ∨ q, ¬p ⊢ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim raffergon2 josgomrom4 marfruman1 alfmarcua&lt;br /&gt;
   pabbergue gleherlop enrparalv juacanrod hugrubsan alikan *) &lt;br /&gt;
lemma ejercicio_43:&lt;br /&gt;
  assumes &amp;quot;p ∨ q&amp;quot;&lt;br /&gt;
          &amp;quot;¬p&amp;quot; &lt;br /&gt;
  shows   &amp;quot;q&amp;quot;&lt;br /&gt;
using assms(1) proof (rule disjE)&lt;br /&gt;
  assume 1: &amp;quot;p&amp;quot; show &amp;quot;q&amp;quot; using assms(2) 1 by (rule notE)&lt;br /&gt;
next&lt;br /&gt;
  assume &amp;quot;q&amp;quot; thus &amp;quot;q&amp;quot; .&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber cammonagu*)&lt;br /&gt;
lemma ejercicio_43_1:&lt;br /&gt;
  assumes &amp;quot;p ∨ q&amp;quot;&lt;br /&gt;
          &amp;quot;¬p&amp;quot; &lt;br /&gt;
  shows   &amp;quot;q&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;
    with `¬p` have &amp;quot;q&amp;quot; by (rule notE)&lt;br /&gt;
  }&lt;br /&gt;
  moreover have &amp;quot;q ⟹ q&amp;quot; .&lt;br /&gt;
  ultimately show &amp;quot;q&amp;quot; by (rule disjE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 44. Demostrar&lt;br /&gt;
     p ∨ q ⊢ ¬(¬p ∧ ¬q)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim gleherlop josgomrom4 marfruman1 pabbergue&lt;br /&gt;
   juacanrod hugrubsan alikan *) &lt;br /&gt;
lemma ejercicio_44:&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 notI)&lt;br /&gt;
  assume 1: &amp;quot;¬p ∧ ¬q&amp;quot; hence 2: &amp;quot;¬p&amp;quot; by (rule conjunct1)&lt;br /&gt;
  have 3: &amp;quot;¬q&amp;quot; using 1 by (rule conjunct2)&lt;br /&gt;
  show &amp;quot;False&amp;quot;&lt;br /&gt;
  using assms(1) proof (rule disjE)&lt;br /&gt;
    assume 4: &amp;quot;p&amp;quot; show ?thesis using 2 4 by (rule notE)&lt;br /&gt;
  next&lt;br /&gt;
    assume 5: &amp;quot;q&amp;quot; show ?thesis using 3 5 by (rule notE)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber alfmarcua cammonagu *)&lt;br /&gt;
lemma ejercicio_44_1:&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;
  note `p ∨ q`&lt;br /&gt;
  moreover {&lt;br /&gt;
    from `¬p ∧ ¬q` have &amp;quot;¬p&amp;quot; by (rule conjunct1)&lt;br /&gt;
    moreover assume &amp;quot;p&amp;quot;&lt;br /&gt;
    ultimately have &amp;quot;False&amp;quot; by (rule notE)&lt;br /&gt;
  }&lt;br /&gt;
  moreover {&lt;br /&gt;
    from `¬p ∧ ¬q` have &amp;quot;¬q&amp;quot; by (rule conjunct2)&lt;br /&gt;
    moreover assume &amp;quot;q&amp;quot;&lt;br /&gt;
    ultimately have &amp;quot;False&amp;quot; by (rule notE)&lt;br /&gt;
  }&lt;br /&gt;
  ultimately show &amp;quot;False&amp;quot; by (rule disjE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 45. Demostrar&lt;br /&gt;
     p ∧ q ⊢ ¬(¬p ∨ ¬q)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim marfruman1 josgomrom4 gleherlop pabbergue&lt;br /&gt;
   juacanrod hugrubsan alikan *) &lt;br /&gt;
lemma ejercicio_45:&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 notI)&lt;br /&gt;
  assume 2: &amp;quot;¬p ∨ ¬q&amp;quot; have 3: &amp;quot;p&amp;quot; using 1 by (rule conjunct1)&lt;br /&gt;
  have 4: &amp;quot;q&amp;quot; using 1 by (rule conjunct2)&lt;br /&gt;
  show &amp;quot;False&amp;quot; using 2&lt;br /&gt;
  proof (rule disjE)&lt;br /&gt;
    assume &amp;quot;¬p&amp;quot; thus ?thesis using 3 by (rule notE)&lt;br /&gt;
  next&lt;br /&gt;
    assume &amp;quot;¬q&amp;quot; thus ?thesis using 4 by (rule notE)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber alfmarcua cammonagu *)&lt;br /&gt;
lemma ejercicio_45_1:&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;
  moreover {&lt;br /&gt;
    assume &amp;quot;¬p&amp;quot;&lt;br /&gt;
    moreover have &amp;quot;p&amp;quot; using `p ∧ q` by (rule conjunct1)&lt;br /&gt;
    ultimately have &amp;quot;False&amp;quot; by (rule notE)&lt;br /&gt;
  }&lt;br /&gt;
  moreover {&lt;br /&gt;
    assume &amp;quot;¬q&amp;quot;&lt;br /&gt;
    moreover have &amp;quot;q&amp;quot; using `p ∧ q` by (rule conjunct2)&lt;br /&gt;
    ultimately have &amp;quot;False&amp;quot; by (rule notE)&lt;br /&gt;
  }&lt;br /&gt;
  ultimately show False by (rule disjE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 46. Demostrar&lt;br /&gt;
     ¬(p ∨ q) ⊢ ¬p ∧ ¬q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim marfruman1 josgomrom4 gleherlop pabbergue&lt;br /&gt;
   juacanrod hugrubsan alikan *) &lt;br /&gt;
lemma ejercicio_46:&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 conjI)&lt;br /&gt;
  show &amp;quot;¬p&amp;quot;&lt;br /&gt;
  proof (rule notI)&lt;br /&gt;
    assume p hence 2: &amp;quot;p ∨ q&amp;quot; by (rule disjI1)&lt;br /&gt;
    show False using 1 2 by (rule notE)&lt;br /&gt;
  qed&lt;br /&gt;
  show &amp;quot;¬q&amp;quot;&lt;br /&gt;
  proof (rule notI)&lt;br /&gt;
    assume q hence 3: &amp;quot;p ∨ q&amp;quot; by (rule disjI2)&lt;br /&gt;
    show False using 1 3 by (rule notE)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber cammmonagu *)&lt;br /&gt;
lemma ejercicio_46_1:&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&amp;quot;&lt;br /&gt;
  proof (rule ccontr)&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;
    with assms show &amp;quot;False&amp;quot; by (rule notE)&lt;br /&gt;
  qed&lt;br /&gt;
next&lt;br /&gt;
  show &amp;quot;¬q&amp;quot;&lt;br /&gt;
  proof (rule ccontr)&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;
    with assms show &amp;quot;False&amp;quot; by (rule notE)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* alfmarcua *)&lt;br /&gt;
lemma ejercicio_46_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 (rule conjI)&lt;br /&gt;
  have &amp;quot;p ⟹ p ∨ q&amp;quot; by (rule disjI1)&lt;br /&gt;
  then have &amp;quot;p ⟶ p ∨ q&amp;quot; by (rule impI)&lt;br /&gt;
  then show &amp;quot;¬ p&amp;quot; using assms by (rule mt)&lt;br /&gt;
next&lt;br /&gt;
  have &amp;quot;q ⟹ p ∨ q&amp;quot; by (rule disjI2)&lt;br /&gt;
  then have &amp;quot;q ⟶ p ∨ q&amp;quot; by (rule impI)&lt;br /&gt;
  then show &amp;quot;¬ q&amp;quot; using assms by (rule mt)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 47. Demostrar&lt;br /&gt;
     ¬p ∧ ¬q ⊢ ¬(p ∨ q)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim marfruman1 josgomrom4 pabbregue juacanrod&lt;br /&gt;
   hugrubsan alikan *) &lt;br /&gt;
lemma ejercicio_47:&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 notI)&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;
  assume 4: &amp;quot;p ∨ q&amp;quot;&lt;br /&gt;
  show False&lt;br /&gt;
  using 4 proof (rule disjE)&lt;br /&gt;
    assume 5: p show ?thesis using 2 5 by (rule notE)&lt;br /&gt;
  next&lt;br /&gt;
    assume 6: q show ?thesis using 3 6 by (rule notE)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber gleherlop cammonagu*)&lt;br /&gt;
lemma ejercicio_47_1:&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;
  hence &amp;quot;¬(¬p ∧ ¬q)&amp;quot; by (rule ejercicio_44_1)&lt;br /&gt;
  thus &amp;quot;False&amp;quot; using assms by (rule notE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* alfmarcua *)&lt;br /&gt;
lemma ejercicio_47_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 (rule notI)&lt;br /&gt;
  have &amp;quot;¬ p&amp;quot; using assms by (rule conjunct1)&lt;br /&gt;
  have &amp;quot;¬ q&amp;quot; using assms by (rule conjunct2)&lt;br /&gt;
  assume &amp;quot;p ∨ q&amp;quot;&lt;br /&gt;
  then have &amp;quot;q&amp;quot; using `¬ p` by (rule ejercicio_43)&lt;br /&gt;
  show False using `¬ q` `q` by (rule notE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 48. Demostrar&lt;br /&gt;
     ¬p ∨ ¬q ⊢ ¬(p ∧ q)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim marfruman1 josgomrom4 pabbergue juacanrod&lt;br /&gt;
   hugrubsan alikan *) &lt;br /&gt;
lemma ejercicio_48:&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 notI)&lt;br /&gt;
  assume 2: &amp;quot;p ∧ q&amp;quot; hence 3: p by (rule conjunct1)&lt;br /&gt;
  have 4: q using 2 by (rule conjunct2)&lt;br /&gt;
  show False&lt;br /&gt;
  using 1 proof (rule disjE)&lt;br /&gt;
    assume &amp;quot;¬p&amp;quot; thus ?thesis using 3 by (rule notE)&lt;br /&gt;
  next&lt;br /&gt;
    assume &amp;quot;¬q&amp;quot; thus ?thesis using 4 by (rule notE)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber alfmarcua gleherlop cammonagu *)&lt;br /&gt;
lemma ejercicio_48_1:&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;
  hence &amp;quot;¬(¬p ∨ ¬q)&amp;quot; by (rule ejercicio_45_1)&lt;br /&gt;
  thus &amp;quot;False&amp;quot; using assms by (rule notE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 49. Demostrar&lt;br /&gt;
     ⊢ ¬(p ∧ ¬p)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim marfruman1 josgomrom4 alfmarcu gleherlop&lt;br /&gt;
   hugrubsan juacanrod cammonagu alikan *) &lt;br /&gt;
lemma ejercicio_49:&lt;br /&gt;
  &amp;quot;¬(p ∧ ¬p)&amp;quot;&lt;br /&gt;
proof (rule notI)&lt;br /&gt;
  assume 1: &amp;quot;p ∧ ¬p&amp;quot; hence 2: p by (rule conjunct1)&lt;br /&gt;
  have &amp;quot;¬p&amp;quot; using 1 by (rule conjunct2)&lt;br /&gt;
  thus &amp;quot;False&amp;quot; using 2 by (rule notE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber *)&lt;br /&gt;
lemma ejercicio_49_1:&lt;br /&gt;
  &amp;quot;¬(p ∧ ¬p)&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume &amp;quot;p ∧ ¬p&amp;quot;&lt;br /&gt;
  hence &amp;quot;¬p&amp;quot; by (rule conjunct2)&lt;br /&gt;
  moreover have &amp;quot;p&amp;quot; using `p ∧ ¬p` by (rule conjunct1)&lt;br /&gt;
  ultimately show &amp;quot;False&amp;quot; by (rule notE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 50. Demostrar&lt;br /&gt;
     p ∧ ¬p ⊢ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim raffergon2 josgomrom4 marfruman1 gleherlop&lt;br /&gt;
   alfmarcua enrparalv pabbergue juacanrod hugrubsan alikan *) &lt;br /&gt;
lemma ejercicio_50:&lt;br /&gt;
  assumes 1: &amp;quot;p ∧ ¬p&amp;quot;&lt;br /&gt;
  shows   &amp;quot;q&amp;quot;&lt;br /&gt;
proof (rule notE)&lt;br /&gt;
  show p using 1 by (rule conjunct1)&lt;br /&gt;
  show &amp;quot;¬p&amp;quot; using 1 by (rule conjunct2)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber cammonagu*)&lt;br /&gt;
lemma ejercicio_50_1:&lt;br /&gt;
  assumes &amp;quot;p ∧ ¬p&amp;quot; &lt;br /&gt;
  shows   &amp;quot;q&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;¬p&amp;quot; using `p ∧ ¬p` by (rule conjunct2)&lt;br /&gt;
  moreover have &amp;quot;p&amp;quot; using `p ∧ ¬p` by (rule conjunct1)&lt;br /&gt;
  ultimately show &amp;quot;q&amp;quot; by (rule notE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 51. Demostrar&lt;br /&gt;
     ¬¬p ⊢ p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim benber raffergon2 josgomrom4 marfruman1 gleherlop&lt;br /&gt;
   alfmarcua enrparalv pabbergue juacanrod hugrubsan cammmonagu alikan *) &lt;br /&gt;
lemma ejercicio_51:&lt;br /&gt;
  assumes &amp;quot;¬¬p&amp;quot;&lt;br /&gt;
  shows   &amp;quot;p&amp;quot;&lt;br /&gt;
  using assms(1) by (rule notnotD)&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 52. Demostrar&lt;br /&gt;
     ⊢ p ∨ ¬p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim marfruman1 josgomrom4 juacanrod pabbergue alikan *)&lt;br /&gt;
lemma ejercicio_52:&lt;br /&gt;
  &amp;quot;p ∨ ¬p&amp;quot;&lt;br /&gt;
proof (rule ccontr)&lt;br /&gt;
  assume 1: &amp;quot;¬(p ∨ ¬p)&amp;quot;&lt;br /&gt;
  have 2: &amp;quot;¬p&amp;quot; proof (rule notI)&lt;br /&gt;
    assume p hence 3: &amp;quot;p ∨ ¬p&amp;quot; by (rule disjI1)&lt;br /&gt;
    show &amp;quot;False&amp;quot; using 1 3 by (rule notE)&lt;br /&gt;
  qed&lt;br /&gt;
  have 4: &amp;quot;p ∨ ¬p&amp;quot; using 2 by (rule disjI2)&lt;br /&gt;
  show &amp;quot;False&amp;quot; using 1 4 by (rule notE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber cammonagu *)&lt;br /&gt;
lemma ejercicio_52_1:&lt;br /&gt;
  &amp;quot;p ∨ ¬p&amp;quot;&lt;br /&gt;
proof (rule ccontr)&lt;br /&gt;
  assume &amp;quot;¬ (p ∨ ¬ p)&amp;quot;&lt;br /&gt;
  hence &amp;quot;¬p ∧ ¬¬p&amp;quot; by (rule ejercicio_46_1)&lt;br /&gt;
  hence &amp;quot;¬p&amp;quot; by (rule conjunct1)&lt;br /&gt;
  moreover {&lt;br /&gt;
    have &amp;quot;¬¬p&amp;quot; using `¬p ∧ ¬¬p` by (rule conjunct2)&lt;br /&gt;
    hence &amp;quot;p&amp;quot; by (rule notnotD)&lt;br /&gt;
  }&lt;br /&gt;
  ultimately show &amp;quot;False&amp;quot; by (rule notE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* alfmarcua *)&lt;br /&gt;
lemma ejercicio_52_2:&lt;br /&gt;
  &amp;quot;p ∨ ¬p&amp;quot;&lt;br /&gt;
proof (rule ccontr)&lt;br /&gt;
  assume &amp;quot;¬ (p ∨ ¬ p)&amp;quot;&lt;br /&gt;
  then have &amp;quot;¬ p ∧ ¬¬ p&amp;quot; by (rule ejercicio_46)&lt;br /&gt;
  then show False by (rule ejercicio_50)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 53. Demostrar&lt;br /&gt;
     ⊢ ((p ⟶ q) ⟶ p) ⟶ p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim marfruman1 josgomrom4 alfmarcua gleherlop&lt;br /&gt;
   juacanrod pabbergue *) &lt;br /&gt;
lemma ejercicio_53:&lt;br /&gt;
  &amp;quot;((p ⟶ q) ⟶ p) ⟶ p&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume 1: &amp;quot;(p ⟶ q) ⟶ p&amp;quot;&lt;br /&gt;
  show p proof (rule ccontr)&lt;br /&gt;
    assume 2: &amp;quot;¬p&amp;quot;&lt;br /&gt;
    have 3: &amp;quot;¬(p ⟶ q)&amp;quot; using 1 2 by (rule mt)&lt;br /&gt;
    have 4: &amp;quot;p ⟶ q&amp;quot; proof (rule impI)&lt;br /&gt;
      assume 5: p show q using 2 5 by (rule notE)&lt;br /&gt;
    qed&lt;br /&gt;
    show False using 3 4 by (rule notE)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber cammonagu *)&lt;br /&gt;
lemma ejercicio_53_1:&lt;br /&gt;
  &amp;quot;((p ⟶ q) ⟶ p) ⟶ p&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume &amp;quot;(p ⟶ q) ⟶ p&amp;quot;&lt;br /&gt;
  have &amp;quot;p ∨ ¬p&amp;quot; by (rule ejercicio_52_1)&lt;br /&gt;
  moreover have &amp;quot;p ⟹ p&amp;quot; .&lt;br /&gt;
  moreover {&lt;br /&gt;
    assume &amp;quot;¬ p&amp;quot;&lt;br /&gt;
    hence &amp;quot;p ⟶ q&amp;quot; by (rule ejercicio_40_1)&lt;br /&gt;
    with `(p ⟶ q) ⟶ p` have &amp;quot;p&amp;quot; by (rule mp)&lt;br /&gt;
  }&lt;br /&gt;
  ultimately show &amp;quot;p&amp;quot; by (rule disjE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 54. Demostrar&lt;br /&gt;
     ¬q ⟶ ¬p ⊢ p ⟶ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim marfruman1 josgomrom4 gleherlop juacanrod&lt;br /&gt;
   pabbergue *) &lt;br /&gt;
lemma ejercicio_54:&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 (rule impI)&lt;br /&gt;
  assume 2: &amp;quot;p&amp;quot; hence 3: &amp;quot;¬¬p&amp;quot; by (rule notnotI)&lt;br /&gt;
  have &amp;quot;¬¬q&amp;quot; using 1 3 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;
(* benber alfmarcua  cammonagu *)&lt;br /&gt;
lemma ejercicio_54_1:&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;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 55. Demostrar&lt;br /&gt;
     ¬(¬p ∧ ¬q) ⊢ p ∨ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon marfruman1*)&lt;br /&gt;
lemma ejercicio_55:&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 2: &amp;quot;¬(p ∨ q)&amp;quot;&lt;br /&gt;
  have 3: &amp;quot;p&amp;quot;&lt;br /&gt;
  proof (rule ccontr)&lt;br /&gt;
    assume 4: &amp;quot;¬p&amp;quot;&lt;br /&gt;
    have 5: &amp;quot;q&amp;quot;&lt;br /&gt;
    proof (rule ccontr)&lt;br /&gt;
      assume 6: &amp;quot;¬q&amp;quot; have 7: &amp;quot;¬p ∧ ¬q&amp;quot; using 4 6 by (rule conjI)&lt;br /&gt;
      show False using 1 7 by (rule notE)&lt;br /&gt;
    qed&lt;br /&gt;
    have 8: &amp;quot;p ∨ q&amp;quot; using 5 by (rule disjI2)&lt;br /&gt;
    show False using 2 8 by (rule notE)&lt;br /&gt;
  qed&lt;br /&gt;
  have 9: &amp;quot;p ∨ q&amp;quot; using 3 by (rule disjI1)&lt;br /&gt;
  show False using 2 9 by (rule notE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber alfmarcua josgomrom4 manperjim pabbergue juacanrod cammonagu *)&lt;br /&gt;
lemma ejercicio_55_1:&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 ejercicio_46_1)&lt;br /&gt;
  with assms show False by (rule notE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 56. Demostrar&lt;br /&gt;
     ¬(¬p ∨ ¬q) ⊢ p ∧ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim marfruman1 josgomrom4 gleherlop juacanrod&lt;br /&gt;
   pabbergue *) &lt;br /&gt;
lemma ejercicio_56:&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 conjI)&lt;br /&gt;
  show 3: p&lt;br /&gt;
  proof (rule ccontr)&lt;br /&gt;
    assume &amp;quot;¬p&amp;quot; hence 4: &amp;quot;¬p ∨ ¬q&amp;quot; by (rule disjI1)&lt;br /&gt;
    show False using 1 4 by (rule notE)&lt;br /&gt;
  qed&lt;br /&gt;
  show 5: q&lt;br /&gt;
  proof (rule ccontr)&lt;br /&gt;
    assume &amp;quot;¬q&amp;quot; hence 6: &amp;quot;¬p ∨ ¬q&amp;quot; by (rule disjI2)&lt;br /&gt;
    show False using 1 6 by (rule notE)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber alfmarcua cammonagu *)&lt;br /&gt;
lemma ejercicio_56_1:&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 ejercicio_46_1)&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;
  moreover {&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;
  }&lt;br /&gt;
  ultimately show &amp;quot;p ∧ q&amp;quot; by (rule conjI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 57. Demostrar&lt;br /&gt;
     ¬(p ∧ q) ⊢ ¬p ∨ ¬q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim marfruman1 josgomrom4 gleherlop juacanrod&lt;br /&gt;
   pabbergue *) &lt;br /&gt;
lemma ejercicio_57:&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 2: &amp;quot;¬(¬p ∨ ¬q)&amp;quot;&lt;br /&gt;
  show False using 1&lt;br /&gt;
  proof (rule notE)&lt;br /&gt;
    show 3: &amp;quot;p ∧ q&amp;quot;&lt;br /&gt;
    proof (rule conjI)&lt;br /&gt;
      show p&lt;br /&gt;
      proof (rule ccontr)&lt;br /&gt;
        assume &amp;quot;¬p&amp;quot; hence 4: &amp;quot;¬p ∨ ¬q&amp;quot; by (rule disjI1)&lt;br /&gt;
        show False using 2 4 by (rule notE)&lt;br /&gt;
      qed&lt;br /&gt;
    next&lt;br /&gt;
      show q&lt;br /&gt;
      proof (rule ccontr)&lt;br /&gt;
        assume &amp;quot;¬q&amp;quot; hence 5: &amp;quot;¬p ∨ ¬q&amp;quot; by (rule disjI2)&lt;br /&gt;
        show False using 2 5 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;
(* benber alfmarcua cammonagu *)&lt;br /&gt;
lemma ejercicio_57_1:&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 ejercicio_56_1)&lt;br /&gt;
  with assms show &amp;quot;False&amp;quot; by (rule notE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 58. Demostrar&lt;br /&gt;
     ⊢ (p ⟶ q) ∨ (q ⟶ p)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim josgomrom4 marfruman1 juacanrod pabbergue *)&lt;br /&gt;
lemma ejercicio_58:&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; proof (rule ccontr)&lt;br /&gt;
    assume 1: &amp;quot;¬((p ⟶ q) ∨ ¬(p ⟶ q))&amp;quot;&lt;br /&gt;
    have 2: &amp;quot;¬(p ⟶ q)&amp;quot; proof (rule notI)&lt;br /&gt;
      assume &amp;quot;p ⟶ q&amp;quot; &lt;br /&gt;
      hence 3: &amp;quot;(p ⟶ q) ∨ ¬(p ⟶ q)&amp;quot; by (rule disjI1)&lt;br /&gt;
      show False using 1 3 by (rule notE)&lt;br /&gt;
    qed&lt;br /&gt;
    hence 4: &amp;quot;(p ⟶ q) ∨ ¬(p ⟶ q)&amp;quot; by (rule disjI2)&lt;br /&gt;
    show &amp;quot;False&amp;quot; using 1 4 by (rule notE)&lt;br /&gt;
  qed&lt;br /&gt;
  thus ?thesis proof (rule disjE)&lt;br /&gt;
    assume &amp;quot;p ⟶ q&amp;quot; thus ?thesis by (rule disjI1)&lt;br /&gt;
  next&lt;br /&gt;
    assume 1: &amp;quot;¬(p ⟶ q)&amp;quot;&lt;br /&gt;
    have &amp;quot;q ⟶ p&amp;quot; proof (rule impI)&lt;br /&gt;
      assume 2: q&lt;br /&gt;
      have 3: &amp;quot;p ⟶ q&amp;quot; proof (rule impI)&lt;br /&gt;
        assume p show q using 2 .&lt;br /&gt;
      qed&lt;br /&gt;
      show p using 1 3 by (rule notE)&lt;br /&gt;
    qed&lt;br /&gt;
    thus ?thesis by (rule disjI2)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* pabalagon gleherlop *)&lt;br /&gt;
lemma ejercicio_58_2:&lt;br /&gt;
  &amp;quot;(p ⟶ q) ∨ (q ⟶ p)&amp;quot;&lt;br /&gt;
proof (rule ccontr)&lt;br /&gt;
  assume 1: &amp;quot;¬((p ⟶ q) ∨ (q ⟶ p))&amp;quot;&lt;br /&gt;
  hence 1: &amp;quot;(p ∧ ¬q) ∧ (q ∧ ¬p)&amp;quot; by simp&lt;br /&gt;
  hence &amp;quot;p ∧ ¬q&amp;quot; ..&lt;br /&gt;
  hence 2: p ..&lt;br /&gt;
  have &amp;quot;q ∧ ¬p&amp;quot; using 1 ..&lt;br /&gt;
  hence 3: &amp;quot;¬p&amp;quot; ..&lt;br /&gt;
  show False using 3 2 by (rule notE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber cammonagu *)&lt;br /&gt;
lemma ejercicio_58_1:&lt;br /&gt;
  &amp;quot;(p ⟶ q) ∨ (q ⟶ p)&amp;quot;&lt;br /&gt;
proof (rule ccontr)&lt;br /&gt;
  assume &amp;quot;¬ ((p ⟶ q) ∨ (q ⟶ p))&amp;quot;&lt;br /&gt;
  hence 1: &amp;quot;¬(p ⟶ q) ∧ ¬(q ⟶ p)&amp;quot; by (rule ejercicio_46_1)&lt;br /&gt;
&lt;br /&gt;
  have &amp;quot;p ∨ ¬p&amp;quot; by (rule ejercicio_52_1)&lt;br /&gt;
  moreover {&lt;br /&gt;
    assume &amp;quot;p&amp;quot;&lt;br /&gt;
    hence &amp;quot;q ⟶ p&amp;quot; by (rule ejercicio_7_1)&lt;br /&gt;
&lt;br /&gt;
    have &amp;quot;¬(q ⟶ p)&amp;quot; using 1 by (rule conjunct2)&lt;br /&gt;
    hence &amp;quot;False&amp;quot; using `q ⟶ p` by (rule notE)&lt;br /&gt;
  }&lt;br /&gt;
  moreover {&lt;br /&gt;
    assume &amp;quot;¬p&amp;quot;&lt;br /&gt;
    hence &amp;quot;p ⟶ q&amp;quot; by (rule ejercicio_40_1)&lt;br /&gt;
&lt;br /&gt;
    have &amp;quot;¬(p ⟶ q)&amp;quot; using 1 by (rule conjunct1)&lt;br /&gt;
    hence &amp;quot;False&amp;quot; using `p ⟶ q` by (rule notE)&lt;br /&gt;
  }&lt;br /&gt;
  ultimately show &amp;quot;False&amp;quot; by (rule disjE)&lt;br /&gt;
  moreover {&lt;br /&gt;
    assume &amp;quot;p&amp;quot;&lt;br /&gt;
    hence &amp;quot;q ⟶ p&amp;quot; by (rule ejercicio_7_1)&lt;br /&gt;
&lt;br /&gt;
    have &amp;quot;¬(q ⟶ p)&amp;quot; using 1 by (rule conjunct2)&lt;br /&gt;
    hence &amp;quot;False&amp;quot; using `q ⟶ p` by (rule notE)&lt;br /&gt;
  }&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* alfmarcua *)&lt;br /&gt;
lemma ejercicio_58_3:&lt;br /&gt;
  &amp;quot;(p ⟶ q) ∨ (q ⟶ p)&amp;quot;&lt;br /&gt;
proof (rule disjE)&lt;br /&gt;
  show &amp;quot;p ∨ ¬ p&amp;quot; by (rule ejercicio_52)&lt;br /&gt;
next&lt;br /&gt;
  assume &amp;quot;¬p&amp;quot;&lt;br /&gt;
  then have &amp;quot;p ⟶ q&amp;quot; by (rule ejercicio_40)&lt;br /&gt;
  then show ?thesis by (rule disjI1)&lt;br /&gt;
next&lt;br /&gt;
  assume &amp;quot;p&amp;quot;&lt;br /&gt;
  then have &amp;quot;q ⟶ p&amp;quot; by (rule ejercicio_7)&lt;br /&gt;
  then show ?thesis by (rule disjI2)&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/RA2018/index.php?title=Relaci%C3%B3n_5&amp;diff=417</id>
		<title>Relación 5</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2018/index.php?title=Relaci%C3%B3n_5&amp;diff=417"/>
		<updated>2019-02-28T13:04:42Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isabelle&amp;quot;&amp;gt;&lt;br /&gt;
chapter {* R5: Recorridos de árboles *}&lt;br /&gt;
&lt;br /&gt;
theory R5_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   h &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;
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;
(* pabalagon manperjim raffergon2 aribatval benber josgomrom4 hugrubsan&lt;br /&gt;
   cammonagu antramhur alfmarcua enrparalv marfruman1 gleherlop&lt;br /&gt;
   chrgencar giafus1 pabbergue alikan juacanrod *)  &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 x)     = [x]&amp;quot; |&lt;br /&gt;
  &amp;quot;preOrden (N x i d) = x # preOrden i @ preOrden 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;
&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;
(* pabalagon manperjim raffergon2 aribatval benber josgomrom4 hugrubsan&lt;br /&gt;
   cammonagu antramhur alfmarcua enrparalv marfruman1 gleherlop&lt;br /&gt;
   chrgencar giafus1 pabbergue alikan juacanrod *)  &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 x)     = [x]&amp;quot; |&lt;br /&gt;
  &amp;quot;postOrden (N x i d) = postOrden i @ postOrden d @ [x]&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;
(* pabalagon manperjim raffergon2 aribatval benber josgomrom4 hugrubsan&lt;br /&gt;
   gleherlop cammonagu alfmarcua enrparalv marfruman1 chrgencar giafus1&lt;br /&gt;
   pabbergue alikan juacanrod antramhur *)  &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 x)     = [x]&amp;quot; |&lt;br /&gt;
  &amp;quot;inOrden (N x i d) = inOrden i @ [x] @ inOrden 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;
&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;
(* pabalagon manperjim raffergon2 aribatval benber josgomrom4 hugrubsan&lt;br /&gt;
   gleherlop cammonagu alfmarcua enrparalv marfruman1 chrgencar giafus1&lt;br /&gt;
   pabbergue alikan juacanrod antramhur *)  &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 x)     = H x&amp;quot; |&lt;br /&gt;
  &amp;quot;espejo (N x i d) = N x (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;
(* pabalagon manperjim raffergon2 josgomrom4 hugrubsan cammonagu&lt;br /&gt;
   alfmarcua gleherlop enrparalv marfruman1 chrgencar pabbergue giafus1&lt;br /&gt;
  alikan juacanrod aribatval antramhur *) &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;... = rev (postOrden d @ [x]) @ rev (postOrden i)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = rev (postOrden i @ postOrden d @ [x])&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;
(* benber *)&lt;br /&gt;
lemma  &amp;quot;preOrden (espejo a) = rev (postOrden a)&amp;quot;&lt;br /&gt;
proof (induction a)&lt;br /&gt;
  case (H v)&lt;br /&gt;
  show ?case by simp&lt;br /&gt;
next&lt;br /&gt;
  case IS: (N v l r)&lt;br /&gt;
  have &amp;quot;preOrden (espejo (N v l r)) = &lt;br /&gt;
        preOrden (N v (espejo r) (espejo l))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = v # (preOrden (espejo r)) @ (preOrden (espejo l))&amp;quot; &lt;br /&gt;
    by simp&lt;br /&gt;
  also have &amp;quot;... = v # rev (postOrden r) @ rev (postOrden l)&amp;quot; &lt;br /&gt;
    using IS.IH by simp&lt;br /&gt;
  also have &amp;quot;... = rev ((postOrden l) @ (postOrden r) @ [v])&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = rev (postOrden (N v l r))&amp;quot; by simp&lt;br /&gt;
  finally show ?case .&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* cammonagu *)&lt;br /&gt;
lemma &amp;quot;preOrden (espejo a) = rev (postOrden a)&amp;quot;&lt;br /&gt;
  by (induction a) auto&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;
(* pabalagon manperjim josgomrom4 hugrubsan cammonagu enrparalv&lt;br /&gt;
   gleherlop chrgencar giafus1 pabbergue alikan aribatval *) &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; and 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 i @ preOrden d) @ rev [x]&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = rev (x # preOrden i @ preOrden 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;
(* raffergon2 alfmarcua marfruman1 juacanrod antramhur *)&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;
  finally show &amp;quot;?P (N x i d)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber cammonagu *)&lt;br /&gt;
lemma &amp;quot;postOrden (espejo a) = rev (preOrden a)&amp;quot;&lt;br /&gt;
  by (induction a) auto&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;
(* pabalagon manperjim josgomrom4 hugrubsan cammonagu enrparalv&lt;br /&gt;
   gleherlop chrgencar giafus1 pabbergue alikan juacanrod aribatval *) &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 H1: &amp;quot;?P i&amp;quot; and H2: &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;&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;
  also have &amp;quot;... = rev (inOrden i @ [x] @ inOrden 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;
(* raffergon2 alfmarcua marfruman1 antramhur *)&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 H1: &amp;quot;?P i&amp;quot;&lt;br /&gt;
  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;
  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;
  finally show &amp;quot;?P (N x i d)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber *)&lt;br /&gt;
theorem &amp;quot;inOrden (espejo a) = rev (inOrden a)&amp;quot;&lt;br /&gt;
proof (induction a)&lt;br /&gt;
  case (H v)&lt;br /&gt;
  show ?case by simp&lt;br /&gt;
next&lt;br /&gt;
  case IS: (N v l r)&lt;br /&gt;
  have &amp;quot;inOrden (espejo (N v l r)) = &lt;br /&gt;
        inOrden (N v (espejo r) (espejo l))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (inOrden (espejo r)) @ [v] @ (inOrden (espejo l))&amp;quot; &lt;br /&gt;
    by simp&lt;br /&gt;
  also have &amp;quot;... = (rev (inOrden r)) @ [v] @ (rev (inOrden l))&amp;quot; &lt;br /&gt;
    using IS.IH by simp&lt;br /&gt;
  also have &amp;quot;... = rev ((inOrden l) @ [v] @ (inOrden r))&amp;quot; by simp&lt;br /&gt;
  also have&amp;quot;... = rev (inOrden (N v l r))&amp;quot; by simp&lt;br /&gt;
  finally show ?case .&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* cammonagu*)&lt;br /&gt;
lemma &amp;quot;inOrden (espejo a) = rev (inOrden a)&amp;quot;&lt;br /&gt;
  by (induction a) auto&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;
(* pabalagon manperjim raffergon2 aribatval benber josgomrom4 hugrubsan&lt;br /&gt;
   cammonagu antramhur alfmarcua enrparalv marfruman1 gleherlop&lt;br /&gt;
   chrgencar giafus1 pabbergue alikan juacanrod *)  &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;
(* pabalagon manperjim raffergon2 benber josgomrom4 gleherlop hugrubsan&lt;br /&gt;
   cammonagu alfmarcua enrparalv marfruman1 chrgencar giafus1 pabbergue&lt;br /&gt;
   alikan juacanrod aribatval antramhur *) &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;
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;
(* pabalagon manperjim raffergon2 benber josgomrom4 hugrubsan cammonagu&lt;br /&gt;
   alfmarcua gleherlop enrparalv marfruman1 chrgencar giafus1 pabbergue&lt;br /&gt;
   alikan juacanrod antramhur *) &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;
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;
(* pabalagon manperjim josgomrom4 hugrubsan cammonagu alfmarcua&lt;br /&gt;
   enrparalv gleherlop chrgencar marfruman1 giafus1 pabbergue alikan&lt;br /&gt;
   juacanrod antramhur *)  &lt;br /&gt;
lemma inOrdenNotNil: &amp;quot;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;
  have &amp;quot;?P (N x i d) = ((inOrden i @ [x] @ inOrden d) ≠ [])&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = ((inOrden i ≠ []) ∨ ([x] ≠ []) ∨ (inOrden d ≠ []))&amp;quot; &lt;br /&gt;
    by simp&lt;br /&gt;
  also have &amp;quot;... = ([x] ≠ [])&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;
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 HI: &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&lt;br /&gt;
  also have &amp;quot;... = last (x # inOrden d)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = last (inOrden d)&amp;quot; by (simp add: inOrdenNotNil)&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;?P (N x i d)&amp;quot; .&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber *)&lt;br /&gt;
theorem &amp;quot;last (inOrden a) = extremo_derecha a&amp;quot;&lt;br /&gt;
proof (induction a)&lt;br /&gt;
  case (H v)&lt;br /&gt;
  show ?case by simp&lt;br /&gt;
next&lt;br /&gt;
  case IS: (N v l r)&lt;br /&gt;
  have 1: &amp;quot;last (xs@ys) = last ys&amp;quot; if &amp;quot;ys ≠ []&amp;quot; for xs ys :: &amp;quot;&amp;#039;a list&amp;quot;&lt;br /&gt;
  proof (induction xs)&lt;br /&gt;
    case Nil&lt;br /&gt;
    show ?case by simp&lt;br /&gt;
  next&lt;br /&gt;
    case IS: (Cons x xs)&lt;br /&gt;
    have &amp;quot;last ((x#xs)@ys) = last (x#(xs@ys))&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = last (xs @ ys)&amp;quot; using `ys ≠ []` by simp&lt;br /&gt;
    also have &amp;quot;... = last ys&amp;quot; using IS.IH by simp&lt;br /&gt;
    finally show ?case .&lt;br /&gt;
  qed&lt;br /&gt;
  have 2: &amp;quot;inOrden a ≠ []&amp;quot; for a :: &amp;quot;&amp;#039;a arbol&amp;quot;&lt;br /&gt;
    by (induction a) auto&lt;br /&gt;
  have &amp;quot;last (inOrden (N v l r)) = &lt;br /&gt;
        last ( (inOrden l) @ [v] @ (inOrden r) )&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = last (inOrden r)&amp;quot; using 1 2 by auto&lt;br /&gt;
  also have &amp;quot;... = extremo_derecha r&amp;quot; using IS.IH by simp&lt;br /&gt;
  also have &amp;quot;... = extremo_derecha (N v l r)&amp;quot; by simp&lt;br /&gt;
  finally show ?case .&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;
(* pabalagon manperjim josgomrom4 hugrubsan cammonagu alfmarcua&lt;br /&gt;
   gleherlop enrparalv marfruman1 chrgencar giafus1 pabbergue alikan&lt;br /&gt;
   juacanrod aribatval antramhur *) &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::&amp;#039;a&lt;br /&gt;
  have &amp;quot;hd (inOrden (H x)) = hd [x]&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = x&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = extremo_izquierda (H x)&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (H x)&amp;quot; .&lt;br /&gt;
next&lt;br /&gt;
  fix x i d&lt;br /&gt;
  assume HI: &amp;quot;?P i&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 @ [x]) @ inOrden d)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = hd (inOrden i)&amp;quot; by (simp add: inOrdenNotNil)&lt;br /&gt;
  also have &amp;quot;... = extremo_izquierda i&amp;quot; using HI 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; .&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber *)&lt;br /&gt;
theorem &amp;quot;hd (inOrden a) = extremo_izquierda a&amp;quot;&lt;br /&gt;
proof (induction a)&lt;br /&gt;
  case (H v)&lt;br /&gt;
  show ?case by simp&lt;br /&gt;
next&lt;br /&gt;
  case IS: (N v l r)&lt;br /&gt;
  moreover have &amp;quot;inOrden a ≠ []&amp;quot; for a :: &amp;quot;&amp;#039;a arbol&amp;quot;&lt;br /&gt;
    by (induction a) auto&lt;br /&gt;
  ultimately show ?case by simp&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;
(* pabalagon manperjim josgomrom4 hugrubsan cammonagu alfmarcua&lt;br /&gt;
   gleherlop marfruman1 chrgencar giafus1 pabbergue alikan juacanrod&lt;br /&gt;
   aribatval antramhur *)  &lt;br /&gt;
theorem hdPreOrden_lastPostOrden: &lt;br /&gt;
  &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::&amp;#039;a &lt;br /&gt;
  fix i d&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 [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;
  finally show &amp;quot;?P (N x i d)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* enrparalv *)&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::&amp;#039;a&lt;br /&gt;
  have &amp;quot;hd (preOrden (H x)) = hd [x]&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = x&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = last [x]&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = last (postOrden (H x))&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (H x)&amp;quot; by simp &lt;br /&gt;
next&lt;br /&gt;
  fix x i d&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] @ preOrden i)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = x&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = last [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;
oops&lt;br /&gt;
&lt;br /&gt;
(* benber cammonagu *)&lt;br /&gt;
theorem &amp;quot;hd (preOrden a) = last (postOrden a)&amp;quot;&lt;br /&gt;
  by (cases a) auto&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;
(* pabalagon manperjim josgomrom4 hugrubsan cammonagu alfmarcua&lt;br /&gt;
   gleherlop marfruman1 chrgencar giafus1 pabbergue alikan juacanrod&lt;br /&gt;
   aribatval antramhur *) &lt;br /&gt;
theorem hdPreOrden_raiz: &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::&amp;#039;a&lt;br /&gt;
  fix i d&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;
  finally show &amp;quot;?P (N x i d)&amp;quot; by (simp only: raiz.simps(2))&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* enrparalv *)&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::&amp;#039;a&lt;br /&gt;
  have &amp;quot;hd (preOrden (H x)) = hd [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 (H x)&amp;quot; by (simp only: raiz.simps(1))&lt;br /&gt;
  finally show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x i d&lt;br /&gt;
  have &amp;quot;hd (preOrden (N x i d)) = hd ([x] @ preOrden i @ preOrden d)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = hd (([x] @ preOrden i) @ preOrden d)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = hd ([x] @ preOrden i)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = hd ([x])&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = x&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N x i d)&amp;quot; by (simp only: raiz.simps(2))&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
(* benber cammonagu*)&lt;br /&gt;
theorem &amp;quot;hd (preOrden a) = raiz a&amp;quot;&lt;br /&gt;
  by (cases a) auto&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;
(* pabalagon manperjim cammonagu alfmarcua marfruman1 gleherlop&lt;br /&gt;
   chrgencar giafus1 pabbergue juacanrod hugrubsan alikan aribatval&lt;br /&gt;
   antramhur *) &lt;br /&gt;
theorem &amp;quot;hd (inOrden a) = raiz a&amp;quot;&lt;br /&gt;
  quickcheck&lt;br /&gt;
(*&lt;br /&gt;
Quickcheck found a counterexample:&lt;br /&gt;
  a = N a⇩1 (H a⇩2) (H a⇩1)&lt;br /&gt;
Evaluated terms:&lt;br /&gt;
  hd (inOrden a) = a⇩2&lt;br /&gt;
  raiz a = a⇩1 *)&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
(* benber josgomrom4 *)&lt;br /&gt;
(* El teorema no es cierto para arboles sobre numeros naturales *)&lt;br /&gt;
theorem &amp;quot;¬(∀ a :: nat arbol. hd (inOrden a) = raiz a)&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  let ?a = &amp;quot;(N 0 (H 1) (H 2)) :: nat arbol&amp;quot;&lt;br /&gt;
  have &amp;quot;hd (inOrden ?a) = 1&amp;quot; by simp&lt;br /&gt;
  moreover have &amp;quot;raiz ?a = 0&amp;quot; by simp&lt;br /&gt;
  ultimately have &amp;quot;hd (inOrden ?a) ≠ raiz ?a&amp;quot; by simp&lt;br /&gt;
  hence &amp;quot;∃ a :: nat arbol. hd (inOrden a) ≠ raiz a&amp;quot; by (simp only: exI)&lt;br /&gt;
  thus ?thesis by auto&lt;br /&gt;
qed&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;
(* pabalagon manperjim josgomrom4 cammonagu marfruman1 gleherlop&lt;br /&gt;
   chrgencar giafus1 pabbergue juacanrod hugrubsan aribatval antramhur *) &lt;br /&gt;
theorem &amp;quot;last (postOrden a) = raiz a&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;last (postOrden a) = hd (preOrden a)&amp;quot;&lt;br /&gt;
    by (simp add: hdPreOrden_lastPostOrden)&lt;br /&gt;
  also have &amp;quot;... = raiz a&amp;quot; by (simp add: hdPreOrden_raiz)&lt;br /&gt;
  finally show &amp;quot;?thesis&amp;quot; .&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber cammonagu*)&lt;br /&gt;
theorem &amp;quot;last (postOrden a) = raiz a&amp;quot;&lt;br /&gt;
  by (cases a) auto&lt;br /&gt;
&lt;br /&gt;
(* alfmarcua *)&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::&amp;#039;a&lt;br /&gt;
  fix i d&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;
  finally show &amp;quot;?P (N x i d)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* enrparalv *)&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::&amp;#039;a&lt;br /&gt;
  have &amp;quot;last (postOrden (H x)) = last [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 (H x)&amp;quot; by (simp only: raiz.simps(1))&lt;br /&gt;
  finally show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x i d&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 only: raiz.simps(2))&lt;br /&gt;
  finally show &amp;quot;?P (N x i d)&amp;quot; by simp&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/RA2018/index.php?title=Relaci%C3%B3n_4&amp;diff=416</id>
		<title>Relación 4</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2018/index.php?title=Relaci%C3%B3n_4&amp;diff=416"/>
		<updated>2019-02-28T13:04:24Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isabelle&amp;quot;&amp;gt;&lt;br /&gt;
chapter {* R4: Cuantificadores sobre listas *}&lt;br /&gt;
&lt;br /&gt;
theory R4_Cuantificadores_sobre_listas&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 la función &lt;br /&gt;
     todos :: (&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (todos p xs) se verifica si todos los elementos de la lista &lt;br /&gt;
  xs cumplen la propiedad p. Por ejemplo, se verifica &lt;br /&gt;
     todos (λx. 1&amp;lt;length x) [[2,1,4],[1,3]]&lt;br /&gt;
     ¬todos (λx. 1&amp;lt;length x) [[2,1,4],[3]]&lt;br /&gt;
&lt;br /&gt;
  Nota: La función todos es equivalente a la predefinida list_all. &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* manperjim pabalagon alfmarcua josgomrom4 aribatval cammonagu&lt;br /&gt;
   raffergon2 enrparalv gleherlop chrgencar benber giafus1 pabbergue &lt;br /&gt;
   alikan marfruman1 antramhur juacanrod hugrubsan *) &lt;br /&gt;
fun todos :: &amp;quot;(&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;todos p [] = True&amp;quot; |&lt;br /&gt;
  &amp;quot;todos p (x#xs) = (p x ∧ todos p xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Definir la función &lt;br /&gt;
     algunos :: (&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (algunos p xs) se verifica si algunos elementos de la lista &lt;br /&gt;
  xs cumplen la propiedad p. Por ejemplo, se verifica &lt;br /&gt;
     algunos (λx. 1&amp;lt;length x) [[2,1,4],[3]]&lt;br /&gt;
     ¬algunos (λx. 1&amp;lt;length x) [[],[3]]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  Nota: La función algunos es equivalente a la predefinida list_ex. &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* manperjim pabalagon alfmarcua josgomrom4 cammonagu aribatval&lt;br /&gt;
   raffergon2 enrparalv gleherlop chrgencar benber giafus1 pabbergue&lt;br /&gt;
   alikan marfruman1 antramhur juacanrod hugrubsan *) &lt;br /&gt;
fun algunos  :: &amp;quot;(&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;algunos p [] = False&amp;quot; |&lt;br /&gt;
  &amp;quot;algunos p (x#xs) = (p x ∨ algunos p xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3.1. Demostrar o refutar automáticamente &lt;br /&gt;
     todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* manperjim pabalagon alfmarcua josgomrom4 cammonagu raffergon2&lt;br /&gt;
   enrparalv gleherlop chrgencar benber giafus1 pabbergue alikan &lt;br /&gt;
   marfruman1 antramhur juacanrod hugrubsan aribatval *) &lt;br /&gt;
lemma &amp;quot;todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)&amp;quot;&lt;br /&gt;
  by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3.2. Demostrar o refutar detalladamente&lt;br /&gt;
     todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon *)&lt;br /&gt;
lemma &amp;quot;todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)&amp;quot; (is &amp;quot;?P P Q xs&amp;quot;)&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  fix P Q&lt;br /&gt;
  show &amp;quot;?P P Q []&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume HI: &amp;quot;?P P Q xs&amp;quot;&lt;br /&gt;
  have &amp;quot;todos (λx. P x ∧ Q x) (a#xs) = &lt;br /&gt;
        ((P a ∧ Q a) ∧ todos (λx. P x ∧ Q x) xs)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (P a ∧ Q a ∧ todos P xs ∧ todos Q xs)&amp;quot; &lt;br /&gt;
    using HI by simp&lt;br /&gt;
  also have &amp;quot;... = ((P a ∧ todos P xs) ∧ (Q a ∧ todos Q xs))&amp;quot; &lt;br /&gt;
    by (simp add: HOL.conj_comms)&lt;br /&gt;
  also have &amp;quot;... = (todos P (a#xs) ∧ (Q a ∧ todos Q xs))&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;todos (λx. P x ∧ Q x) (a#xs) = &lt;br /&gt;
                (todos P (a#xs) ∧ todos Q (a#xs))&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* alfmarcua juacanrod *)&lt;br /&gt;
lemma &amp;quot;todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)&amp;quot; (is &amp;quot;?P xs&amp;quot;)&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  have &amp;quot;todos (λx. P x ∧ Q x) [] = (True)&amp;quot; &lt;br /&gt;
    by (simp only: todos.simps(1))&lt;br /&gt;
  also have &amp;quot;... = (True ∧ True)&amp;quot; by (simp only: conj_absorb)&lt;br /&gt;
  also have &amp;quot;... = (todos P [] ∧ todos Q [])&amp;quot; &lt;br /&gt;
    by (simp only: todos.simps(1))&lt;br /&gt;
  finally show &amp;quot;?P []&amp;quot; .&lt;br /&gt;
next&lt;br /&gt;
  fix x xs&lt;br /&gt;
  assume HI: &amp;quot;?P xs&amp;quot;&lt;br /&gt;
  have &amp;quot;todos (λx. P x ∧ Q x) (x # xs) = &lt;br /&gt;
        ((P x ∧ Q x) ∧ todos (λx. P x ∧ Q x) xs)&amp;quot;&lt;br /&gt;
    by (simp only: todos.simps(2))&lt;br /&gt;
  also have &amp;quot;... = ((P x ∧ Q x) ∧  (todos P xs ∧ todos Q xs))&amp;quot; &lt;br /&gt;
    by (simp only: HI)&lt;br /&gt;
  also have &amp;quot;... = ((P x ∧ todos P xs) ∧ (Q x ∧ todos Q xs))&amp;quot; &lt;br /&gt;
    by (simp only: HOL.conj_comms)&lt;br /&gt;
  also have &amp;quot;... = (todos P (x # xs) ∧ todos Q (x # xs))&amp;quot; &lt;br /&gt;
    by (simp only: todos.simps(2))&lt;br /&gt;
  finally show &amp;quot;?P (x#xs)&amp;quot; .&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* manperjim josgomrom4 raffergon2 cammonagu enrparalv gleherlop&lt;br /&gt;
   chrgencar giafus1 pabbergue alikan marfruman1 antramhur hugrubsan&lt;br /&gt;
   aribatval *)  &lt;br /&gt;
lemma &amp;quot;todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;todos (λx. P x ∧ Q x) [] = (todos P [] ∧ todos Q [])&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix n xs&lt;br /&gt;
  assume HI: &amp;quot;todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)&amp;quot; &lt;br /&gt;
  have &amp;quot;todos (λx. P x ∧ Q x) (n # xs) =  &lt;br /&gt;
        ((P n ∧ Q n) ∧ (todos P xs ∧ todos Q xs))&amp;quot; using HI by simp&lt;br /&gt;
  also have &amp;quot;... = ((P n ∧ todos P xs) ∧ (Q n ∧ todos Q xs))&amp;quot; by arith&lt;br /&gt;
  also have &amp;quot;... = ((todos P(n#xs)) ∧ (todos Q(n#xs)))&amp;quot; by simp&lt;br /&gt;
 finally show &amp;quot;todos (λx. P x ∧ Q x) (n#xs) = &lt;br /&gt;
               (todos P (n#xs) ∧ todos Q (n#xs))&amp;quot; by simp &lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber *)&lt;br /&gt;
lemma &amp;quot;todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  case Nil&lt;br /&gt;
  have &amp;quot;todos (λx. P x ∧ Q x) [] = True&amp;quot; by (simp only: todos.simps(1))&lt;br /&gt;
  also have &amp;quot;... = (todos P [] ∧ todos Q [])&amp;quot; &lt;br /&gt;
    by (simp only: todos.simps(1) conj_absorb)&lt;br /&gt;
  finally show ?case.&lt;br /&gt;
next&lt;br /&gt;
  case (Cons x xs)&lt;br /&gt;
  assume IH: &amp;quot;todos (λy. P y ∧ Q y) xs = (todos P xs ∧ todos Q xs)&amp;quot;&lt;br /&gt;
  have &amp;quot;todos (λy. P y ∧ Q y) (x # xs) = &lt;br /&gt;
       ( (P x ∧ Q x) ∧ todos (λy. P y ∧ Q y) xs )&amp;quot;&lt;br /&gt;
    by (simp only: todos.simps(2))&lt;br /&gt;
  also have &amp;quot;... = ( (P x ∧ Q x) ∧ todos P xs ∧ todos Q xs )&amp;quot; &lt;br /&gt;
    by (simp only: IH)&lt;br /&gt;
  also have &amp;quot;... = ( P x ∧ (Q x ∧ todos P xs) ∧ todos Q xs )&amp;quot; &lt;br /&gt;
    by (simp only: conj_assoc)&lt;br /&gt;
  also have &amp;quot;... = ( P x ∧ (todos P xs ∧ Q x) ∧ todos Q xs )&amp;quot; &lt;br /&gt;
    by (simp only: conj_commute)&lt;br /&gt;
  also have &amp;quot;... = ( (P x ∧ todos P xs) ∧ Q x ∧ todos Q xs )&amp;quot; &lt;br /&gt;
    by (simp only: conj_assoc)&lt;br /&gt;
  also have &amp;quot;... = ( todos P (x#xs) ∧ todos Q (x#xs) )&amp;quot; &lt;br /&gt;
    by (simp only: todos.simps(2))&lt;br /&gt;
  finally show ?case.&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4.1. Demostrar o refutar automáticamente&lt;br /&gt;
     todos P (x @ y) = (todos P x ∧ todos P y)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* manperjim pabalagon alfmarcua josgomrom4 aritbatval cammonagu&lt;br /&gt;
   raffergon2 enrparalv benber gleherlop chrgencar giafus1 pabbergue&lt;br /&gt;
   alikan marfruman1 antramhur juacanrod hugrubsan aribatval *) &lt;br /&gt;
lemma &amp;quot;todos P (x @ y) = (todos P x ∧ todos P y)&amp;quot;&lt;br /&gt;
  by (induct x) auto&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4.2. Demostrar o refutar detalladamente&lt;br /&gt;
     todos P (x @ y) = (todos P x ∧ todos P y)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* manperjim pabalagon josgomrom4 raffergon2 cammonagu enrparalv&lt;br /&gt;
   gleherlop chrgencar giafus1 pabbergue alikan antramhur juacanrod&lt;br /&gt;
   hugrubsan *)  &lt;br /&gt;
lemma todos_append:&lt;br /&gt;
  &amp;quot;todos P (x @ y) = (todos P x ∧ todos P y)&amp;quot;&lt;br /&gt;
proof (induct x)&lt;br /&gt;
  show &amp;quot;todos P ([] @ y) = (todos P [] ∧ todos P y)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a x&lt;br /&gt;
  assume HI: &amp;quot;todos P (x @ y) = (todos P x ∧ todos P y)&amp;quot;&lt;br /&gt;
  have &amp;quot;todos P ((a#x) @ y) = (P a ∧ todos P (x @ y))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (P a ∧ todos P x ∧ todos P y)&amp;quot; using HI by simp&lt;br /&gt;
  finally show &amp;quot;todos P ((a#x) @ y) = (todos P (a#x) ∧ todos P y)&amp;quot; &lt;br /&gt;
    by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* alfmarcua marfruman1 *)&lt;br /&gt;
lemma todos_append_2:&lt;br /&gt;
  &amp;quot;todos P (x @ y) = (todos P x ∧ todos P y)&amp;quot; (is &amp;quot;?P x&amp;quot;)&lt;br /&gt;
proof (induct x)&lt;br /&gt;
  have &amp;quot;todos P ([] @ y) = todos P y&amp;quot; by (simp only: append_Nil)&lt;br /&gt;
  also have &amp;quot;... = (True ∧ todos P y)&amp;quot; by (simp only: simp_thms(22))&lt;br /&gt;
  also have &amp;quot;... = (todos P [] ∧ todos P y)&amp;quot; &lt;br /&gt;
    by (simp only: todos.simps(1))&lt;br /&gt;
  finally show &amp;quot;?P []&amp;quot; .&lt;br /&gt;
next&lt;br /&gt;
  fix a x&lt;br /&gt;
  assume HI:&amp;quot;?P x&amp;quot;&lt;br /&gt;
  have &amp;quot;todos P ((a # x) @ y) = todos P (a # (x @ y))&amp;quot;&lt;br /&gt;
    by (simp only:List.append.append_Cons)&lt;br /&gt;
  also have &amp;quot;... = (P a ∧ todos P (x @ y))&amp;quot; &lt;br /&gt;
    by (simp only: todos.simps(2))&lt;br /&gt;
  also have &amp;quot;... = (P a ∧ todos P x ∧ todos P y)&amp;quot; by (simp only:HI)&lt;br /&gt;
  also have &amp;quot;... = ((P a ∧ todos P x) ∧ todos P y)&amp;quot;  &lt;br /&gt;
    by (simp only:HOL.conj_assoc)&lt;br /&gt;
  also have &amp;quot;... = (todos P (a#x) ∧ todos P y)&amp;quot; &lt;br /&gt;
    by (simp only: todos.simps(2))&lt;br /&gt;
  finally show &amp;quot;?P (a#x)&amp;quot; .&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber *)&lt;br /&gt;
lemma todos_append_3:&lt;br /&gt;
  &amp;quot;todos P (x @ y) = (todos P x ∧ todos P y)&amp;quot;&lt;br /&gt;
proof (induct x )&lt;br /&gt;
  case Nil&lt;br /&gt;
  have &amp;quot;todos P ( [] @ y ) = todos P y&amp;quot; &lt;br /&gt;
    by (simp only: List.append.left_neutral)&lt;br /&gt;
  also have &amp;quot;... = (todos P [] ∧ todos P y)&amp;quot; &lt;br /&gt;
    by (simp only: todos.simps(1) simp_thms(22))&lt;br /&gt;
  finally show ?case.&lt;br /&gt;
next&lt;br /&gt;
  case (Cons a x)&lt;br /&gt;
  assume IH: &amp;quot;todos P (x @ y) = (todos P x ∧ todos P y)&amp;quot;&lt;br /&gt;
  have &amp;quot;todos P ((a # x) @ y) = (P a ∧ todos P (x @ y))&amp;quot;&lt;br /&gt;
    by (simp only: todos.simps(2) List.append.append_Cons)&lt;br /&gt;
  also have &amp;quot;... = (P a ∧ todos P x ∧ todos P y)&amp;quot; by (simp only: IH)&lt;br /&gt;
  also have &amp;quot;... = (todos P (a#x) ∧ todos P y)&amp;quot; &lt;br /&gt;
    by (simp only: todos.simps(2) conj_assoc )&lt;br /&gt;
  finally show ?case.&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5.1. Demostrar o refutar automáticamente &lt;br /&gt;
     todos P (rev xs) = todos P xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* manperjim pabalagon josgomrom4 alfmarcua aribatval cammonagu&lt;br /&gt;
   raffergon2 giafus1 pabbergue enrparalv alikan antramhur juacanrod&lt;br /&gt;
   hugrubsan *)  &lt;br /&gt;
lemma &amp;quot;todos P (rev xs) = todos P xs&amp;quot;&lt;br /&gt;
  by (induct xs) (simp_all add: HOL.conj_comms todos_append)&lt;br /&gt;
&lt;br /&gt;
(* benber marfruman1*)&lt;br /&gt;
lemma &amp;quot;todos P (rev xs) = todos P xs&amp;quot;&lt;br /&gt;
  using todos_append by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5.2. Demostrar o refutar detalladamente&lt;br /&gt;
     todos P (rev xs) = todos P xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* manperjim pabalagon josgomrom4 raffergon2 cammonagu gleherlop giafus1&lt;br /&gt;
   pabbergue enrparalv marfruman1 alikan chrgencar antramhur juacanrod&lt;br /&gt;
   hugrubsan aribatval *)  &lt;br /&gt;
lemma &amp;quot;todos P (rev xs) = todos P xs&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;todos P (rev []) = todos P []&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume HI: &amp;quot;todos P (rev xs) = todos P xs&amp;quot;&lt;br /&gt;
  have &amp;quot;todos P (rev (a#xs)) = todos P ((rev xs) @ [a])&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (todos P (rev xs) ∧ todos P [a])&amp;quot; &lt;br /&gt;
    by (simp add: todos_append)&lt;br /&gt;
  also have &amp;quot;... = (todos P xs ∧ todos P [a])&amp;quot; using HI by simp&lt;br /&gt;
  also have &amp;quot;... = (todos P xs ∧ P a)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (P a ∧ todos P xs)&amp;quot; by (simp add: HOL.conj_comms)&lt;br /&gt;
  finally show &amp;quot;todos P (rev (a#xs)) = todos P (a#xs)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* alfmarcua *)&lt;br /&gt;
lemma &amp;quot;todos P (rev xs) = todos P xs&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 only: rev.simps(1))&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume HI:&amp;quot;?P xs&amp;quot;&lt;br /&gt;
  have &amp;quot;todos P (rev (a # xs)) = todos P (rev xs @ [a])&amp;quot; &lt;br /&gt;
    by (simp only: rev.simps(2))&lt;br /&gt;
  also have &amp;quot;... = (todos P (rev xs) ∧ todos P [a])&amp;quot; &lt;br /&gt;
    by (simp only: todos_append)&lt;br /&gt;
  also have &amp;quot;... = (todos P xs ∧ todos P [a])&amp;quot; by (simp only: HI)&lt;br /&gt;
  also have &amp;quot;... = (todos P (a#[]) ∧ todos P xs)&amp;quot; &lt;br /&gt;
    by (simp only: HOL.conj_comms)&lt;br /&gt;
  also have &amp;quot;... = ((P a ∧ True) ∧ todos P xs)&amp;quot; &lt;br /&gt;
    by (simp only: todos.simps)&lt;br /&gt;
  also have &amp;quot;... = (P a ∧ todos P xs)&amp;quot;  &lt;br /&gt;
    by (simp only: HOL.simp_thms(21))&lt;br /&gt;
  also have &amp;quot;... = todos P (a#xs)&amp;quot; by (simp only: todos.simps(2))&lt;br /&gt;
  finally show &amp;quot;?P (a#xs)&amp;quot; .&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber *)&lt;br /&gt;
lemma &amp;quot;todos P (rev xs) = todos P xs&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  case Nil&lt;br /&gt;
  show &amp;quot;todos P (rev []) = todos P []&amp;quot; by (simp only: rev.simps(1))&lt;br /&gt;
next&lt;br /&gt;
  case (Cons x xs)&lt;br /&gt;
  assume IH: &amp;quot;todos P (rev xs) = todos P xs&amp;quot;&lt;br /&gt;
  have &amp;quot;todos P (rev (x#xs)) = todos P (rev xs @ [x])&amp;quot; &lt;br /&gt;
    by (simp only: rev.simps(2))&lt;br /&gt;
  also have &amp;quot;... = (todos P (rev xs) ∧ todos P [x] )&amp;quot; &lt;br /&gt;
    by (simp only: todos_append)&lt;br /&gt;
  also have &amp;quot;... = (todos P (rev xs) ∧ P x ∧ todos P [])&amp;quot; &lt;br /&gt;
    by (simp only: todos.simps(2))&lt;br /&gt;
  also have &amp;quot;... = (todos P (rev xs) ∧ P x)&amp;quot; &lt;br /&gt;
    by (simp only: todos.simps(1) simp_thms(21))&lt;br /&gt;
  also have &amp;quot;... = (todos P xs ∧ P x)&amp;quot; by (simp only: IH)&lt;br /&gt;
  also have &amp;quot;... = (todos P (x#xs))&amp;quot; &lt;br /&gt;
    by (simp only: todos.simps(2) conj_commute)&lt;br /&gt;
  finally show ?case.&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 6. Demostrar o refutar:&lt;br /&gt;
    algunos (λx. P x ∧ Q x) xs = (algunos P xs ∧ algunos Q xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon *)&lt;br /&gt;
lemma &amp;quot;algunos (λx. P x ∧ Q x) xs = (algunos P xs ∧ algunos Q xs)&amp;quot;&lt;br /&gt;
  nitpick&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
(* Contraejemplo *)&lt;br /&gt;
value &amp;quot;algunos (λx. even x ∧ odd x) [1, 2::nat] ≠&lt;br /&gt;
  algunos even [1, 2::nat] ∧ algunos odd [1, 2::nat]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* manperjim alfmarcua raffergon2 gleherlop chrgencar cammonagu giafus1&lt;br /&gt;
   pabbergue marfruman1 alikan antramhur juacanrod hugrubsan &lt;br /&gt;
   aribatval *) &lt;br /&gt;
lemma &amp;quot;algunos (λx. P x ∧ Q x) xs = (algunos P xs ∧ algunos Q xs)&amp;quot;&lt;br /&gt;
  quickcheck&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
(* benber (demostración no completa) *)&lt;br /&gt;
fun is_zero :: &amp;quot;nat ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;is_zero n = (n = 0)&amp;quot;&lt;br /&gt;
fun is_one :: &amp;quot;nat ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;is_one n = (n = 1)&amp;quot;&lt;br /&gt;
lemma &amp;quot;¬( ∀P Q xs. algunos (λx. P x ∧ Q x) xs = (algunos P xs ∧ algunos Q xs) )&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  let ?P = is_one&lt;br /&gt;
  let ?Q = is_zero&lt;br /&gt;
  have &amp;quot;algunos (λx. ?P x ∧ ?Q x) [0,1] ≠ &lt;br /&gt;
       (algunos ?P [0,1] ∧ algunos ?Q [0,1])&amp;quot; by simp&lt;br /&gt;
  hence &amp;quot;∃ xs. algunos (λx. ?P x ∧ ?Q x) xs ≠ &lt;br /&gt;
         (algunos ?P xs ∧ algunos ?Q xs)&amp;quot; by (simp only: exI)&lt;br /&gt;
  hence &amp;quot;∃Q xs. algunos (λx. ?P x ∧ Q x) xs ≠ &lt;br /&gt;
         (algunos ?P xs ∧ algunos Q xs)&amp;quot;&lt;br /&gt;
    by  (simp only: exI[of &amp;quot;λQ. ∃ xs. algunos (λx. ?P x ∧ Q x) xs ≠ (algunos ?P xs ∧ algunos Q xs)&amp;quot;])&lt;br /&gt;
  hence &amp;quot;∃P Q xs. algunos (λx. P x ∧ Q x) xs ≠ (algunos P xs ∧ algunos Q xs)&amp;quot;&lt;br /&gt;
    (*&lt;br /&gt;
      No sé por qué esto no funciona:&lt;br /&gt;
      by (simp only: exI[of &amp;quot;λP Q xs. algunos (λx. P x ∧ Q x) xs ≠ (algunos P xs ∧ algunos Q xs)&amp;quot; ?P])&lt;br /&gt;
&lt;br /&gt;
      Parece que el problema es la expresión lambda.&lt;br /&gt;
    *)&lt;br /&gt;
    sorry&lt;br /&gt;
  thus ?thesis by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 7.1. Demostrar o refutar automáticamente &lt;br /&gt;
     algunos P (map f xs) = algunos (P ∘ f) xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* manperjim pabalagon josgomrom4 alfmarcua raffergon2 gleherlop&lt;br /&gt;
   cammonagu benber giafus1 pabbergue enrparalv marfruman1 alikan&lt;br /&gt;
   antramhur juacanrod hugrubsan aribatval *)  &lt;br /&gt;
lemma &amp;quot;algunos P (map f xs) = algunos (P o f) 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.2. Demostrar o refutar detalladamente&lt;br /&gt;
     algunos P (map f xs) = algunos (P ∘ f) xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* manperjim pabalagon cammonagu giafus1 gleherlop chrgencar pabbergue&lt;br /&gt;
   enrparalv marfruman1 alikan antramhur juacanrod hugrubsan *)&lt;br /&gt;
lemma &amp;quot;algunos P (map f xs) = algunos (P o f) xs&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;algunos P (map f []) = algunos (P ∘ f) []&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume HI: &amp;quot;algunos P (map f xs) = algunos (P ∘ f) xs&amp;quot;&lt;br /&gt;
  have &amp;quot;algunos P (map f (a#xs)) = (P (f a) ∨ algunos P (map f xs))&amp;quot; &lt;br /&gt;
    by simp&lt;br /&gt;
  also have &amp;quot;... = (P (f a) ∨ algunos (P ∘ f) xs)&amp;quot; using HI by simp&lt;br /&gt;
  also have &amp;quot;... = ((P ∘ f) a ∨ algunos (P ∘ f) xs)&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;algunos P (map f (a#xs)) = algunos (P ∘ f) (a#xs)&amp;quot; &lt;br /&gt;
    by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* josgomrom4 *)&lt;br /&gt;
lemma &amp;quot;algunos P (map f xs) = algunos (P o f) xs&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;algunos P (map f []) = algunos (P o f) []&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x xs&lt;br /&gt;
  assume HI: &amp;quot;algunos P (map f xs) = algunos (P o f) xs&amp;quot;&lt;br /&gt;
  have &amp;quot;algunos P (map f (x#xs)) = (P (f x) ∨ algunos P (map f xs))&amp;quot; &lt;br /&gt;
    by simp&lt;br /&gt;
  also have &amp;quot;... = (P (f x) ∨ algunos (P o f) xs)&amp;quot; using HI by simp&lt;br /&gt;
  finally show &amp;quot;algunos P (map f (x#xs)) = algunos (P o f) (x#xs)&amp;quot; &lt;br /&gt;
    by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* alfmarcua *)&lt;br /&gt;
lemma &amp;quot;algunos P (map f xs) = algunos (P o f) xs&amp;quot; (is &amp;quot;?P xs&amp;quot;)&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  have &amp;quot;algunos P (map f []) = algunos P []&amp;quot; &lt;br /&gt;
    by (simp only: List.list.map(1))&lt;br /&gt;
  also have &amp;quot;... =  algunos (P o f) []&amp;quot; by (simp only: algunos.simps(1))&lt;br /&gt;
  finally show &amp;quot;?P []&amp;quot; .&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume HI:&amp;quot;?P xs&amp;quot;&lt;br /&gt;
  have &amp;quot;algunos P (map f (a # xs)) =  algunos P (f a # map f xs)&amp;quot; &lt;br /&gt;
    by (simp only: List.list.map(2))&lt;br /&gt;
  also have &amp;quot;... = (P (f a) ∨ algunos P (map f xs))&amp;quot; &lt;br /&gt;
    by (simp only: algunos.simps(2))&lt;br /&gt;
  also have &amp;quot;... = (P (f a) ∨ algunos (P o f) xs)&amp;quot; by (simp only:HI)&lt;br /&gt;
  also have &amp;quot;... = ((P o f) a ∨ algunos (P o f) xs)&amp;quot; &lt;br /&gt;
    by (simp only: Fun.comp_apply)&lt;br /&gt;
  also have &amp;quot;... = algunos (P o f) (a#xs)&amp;quot; by (simp only: algunos.simps(2))&lt;br /&gt;
  finally show &amp;quot;?P (a#xs)&amp;quot; .&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber *)&lt;br /&gt;
lemma &amp;quot;algunos P (map f xs) = algunos (P o f) xs&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  case Nil&lt;br /&gt;
  have &amp;quot;algunos P (map f []) = algunos P []&amp;quot; by (simp only: list.map(1))&lt;br /&gt;
  also have &amp;quot;... = False&amp;quot; by (simp only: algunos.simps(1))&lt;br /&gt;
  also have &amp;quot;False = algunos (P ∘ f) []&amp;quot; by (simp only: algunos.simps(1))&lt;br /&gt;
  finally show ?case.&lt;br /&gt;
next&lt;br /&gt;
  case (Cons x xs)&lt;br /&gt;
  assume IH: &amp;quot;algunos P (map f xs) = algunos (P ∘ f) xs&amp;quot;&lt;br /&gt;
  have &amp;quot;algunos P (map f (x # xs)) = algunos P (f x # map f xs)&amp;quot; &lt;br /&gt;
    by (simp only: list.map(2))&lt;br /&gt;
  also have &amp;quot;... = ( (P ∘ f) x ∨ algunos P (map f xs) )&amp;quot; &lt;br /&gt;
    by (simp only: algunos.simps(2) o_apply)&lt;br /&gt;
  also have &amp;quot;... = ( (P ∘ f) x ∨ algunos (P ∘ f) xs )&amp;quot; &lt;br /&gt;
    by (simp only: IH)&lt;br /&gt;
  also have &amp;quot;... = algunos (P ∘ f) (x#xs)&amp;quot; &lt;br /&gt;
    by (simp only: algunos.simps(2))&lt;br /&gt;
  finally show ?case .&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 8.1. Demostrar o refutar automáticamente &lt;br /&gt;
     algunos P (xs @ ys) = (algunos P xs ∨ algunos P ys)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* manperjim pabalagon josgomrom4 alfmarcua raffergon2 cammonagu&lt;br /&gt;
   gleherlop chrgencar benber giafus1 pabbergue enrparalv marfruman1 &lt;br /&gt;
   alikan antramhur juacanrod hugrubsan aribatval *) &lt;br /&gt;
lemma &amp;quot;algunos P (xs @ ys) = (algunos P xs ∨ algunos P ys)&amp;quot;&lt;br /&gt;
  by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 8.2. Demostrar o refutar detalladamente&lt;br /&gt;
     algunos P (xs @ ys) = (algunos P xs ∨ algunos P ys)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* manperjim pabalagon josgomrom4 raffergon2 gleherlop cammonagu giafus1&lt;br /&gt;
   pabbergue enrparalv marfruman1 alikan antramhur juacanrod hugrubsan *) &lt;br /&gt;
lemma algunos_append:&lt;br /&gt;
  &amp;quot;algunos P (xs @ ys) = (algunos P xs ∨ algunos P ys)&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;algunos P ([] @ ys) = (algunos P [] ∨ algunos P ys)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume HI: &amp;quot;algunos P (xs @ ys) = (algunos P xs ∨ algunos P ys)&amp;quot;&lt;br /&gt;
  have &amp;quot;algunos P ((a#xs) @ ys) = (P a ∨ algunos P (xs @ ys))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (P a ∨ algunos P xs ∨ algunos P ys)&amp;quot; using HI by simp&lt;br /&gt;
  finally show  &amp;quot;algunos P ((a#xs) @ ys) = &lt;br /&gt;
                 (algunos P (a#xs) ∨ algunos P ys)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* alfmarcua *)&lt;br /&gt;
lemma algunos_append_2:&lt;br /&gt;
  &amp;quot;algunos P (xs @ ys) = (algunos P xs ∨ algunos P ys)&amp;quot; (is &amp;quot;?P xs&amp;quot;)&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  have &amp;quot;algunos P ([] @ ys) = algunos P ys&amp;quot; by (simp only: append_Nil)&lt;br /&gt;
  also have &amp;quot;... = (False ∨ algunos P ys)&amp;quot; by (simp only: simp_thms(32))&lt;br /&gt;
  also have &amp;quot;... = (algunos P [] ∨ algunos P ys)&amp;quot; &lt;br /&gt;
    by (simp only: algunos.simps(1))&lt;br /&gt;
  finally show &amp;quot;?P []&amp;quot; .&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume HI:&amp;quot;?P xs&amp;quot;&lt;br /&gt;
  have &amp;quot;algunos P ((a # xs) @ ys) = algunos P (a # (xs @ ys))&amp;quot;&lt;br /&gt;
    by (simp only:List.append.append_Cons)&lt;br /&gt;
  also have &amp;quot;... = (P a ∨ algunos P (xs @ ys))&amp;quot; &lt;br /&gt;
    by (simp only: algunos.simps(2))&lt;br /&gt;
  also have &amp;quot;... = (P a ∨ algunos P xs ∨ algunos P ys)&amp;quot; &lt;br /&gt;
    by (simp only:HI)&lt;br /&gt;
  also have &amp;quot;... = ((P a ∨ algunos P xs) ∨ algunos P ys)&amp;quot;  &lt;br /&gt;
    by (simp only:HOL.disj_assoc)&lt;br /&gt;
  also have &amp;quot;... = (algunos P (a#xs) ∨ algunos P ys)&amp;quot; &lt;br /&gt;
    by (simp only: algunos.simps(2))&lt;br /&gt;
  finally show &amp;quot;?P (a#xs)&amp;quot; .&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber *)&lt;br /&gt;
lemma algunos_append_3:&lt;br /&gt;
  &amp;quot;algunos P (xs @ ys) = (algunos P xs ∨ algunos P ys)&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  case Nil&lt;br /&gt;
  have &amp;quot;algunos P ([] @ ys) = algunos P ys&amp;quot; &lt;br /&gt;
    by (simp only: append.left_neutral)&lt;br /&gt;
  also have &amp;quot;... = ( algunos P [] ∨ algunos P ys )&amp;quot; &lt;br /&gt;
    by (simp only: algunos.simps(1) simp_thms(32))&lt;br /&gt;
  finally show ?case .&lt;br /&gt;
next&lt;br /&gt;
  case (Cons x xs)&lt;br /&gt;
  assume IH: &amp;quot;algunos P (xs @ ys) = ( algunos P xs ∨ algunos P ys )&amp;quot;&lt;br /&gt;
  have &amp;quot;algunos P ((x#xs) @ ys) = algunos P (x#(xs @ ys))&amp;quot; &lt;br /&gt;
    by (simp only: append_Cons)&lt;br /&gt;
  also have &amp;quot;... = ( P x ∨ algunos P (xs @ ys) )&amp;quot; &lt;br /&gt;
    by (simp only: algunos.simps(2))&lt;br /&gt;
  also have &amp;quot;... = ( P x ∨ algunos P xs ∨ algunos P ys )&amp;quot; &lt;br /&gt;
    by (simp only: IH)&lt;br /&gt;
  also have &amp;quot;... = ( algunos P (x#xs) ∨ algunos P ys )&amp;quot; &lt;br /&gt;
    by (simp only: algunos.simps(2) disj_assoc)&lt;br /&gt;
  finally show ?case .&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 9.1. Demostrar o refutar automáticamente&lt;br /&gt;
     algunos P (rev xs) = algunos P xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* manperjim pabalagon josgomrom4 alfmarcua raffergon2 gleherlop chrgencar &lt;br /&gt;
   cammonagu giafus1 pabbergue enrparalv alikan antramhur juacanrod&lt;br /&gt;
   hugrubsan aribatval *)  &lt;br /&gt;
lemma &amp;quot;algunos P (rev xs) = algunos P xs&amp;quot;&lt;br /&gt;
  by (induct xs) (simp_all add: HOL.disj_comms algunos_append)&lt;br /&gt;
&lt;br /&gt;
(* benber marfruman1 *)&lt;br /&gt;
lemma &amp;quot;algunos P (rev xs) = algunos P xs&amp;quot;&lt;br /&gt;
  using algunos_append by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 9.2. Demostrar o refutar detalladamente&lt;br /&gt;
     algunos P (rev xs) = algunos P xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon juacanrod *)&lt;br /&gt;
lemma &amp;quot;algunos P (rev xs) = algunos P xs&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;algunos P (rev []) = algunos P []&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume HI: &amp;quot;algunos P (rev xs) = algunos P xs&amp;quot;&lt;br /&gt;
  have &amp;quot;algunos P (rev (a#xs)) = algunos P (rev xs @ [a])&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (algunos P (rev xs) ∨ algunos P [a])&amp;quot; &lt;br /&gt;
    by (simp add: algunos_append)&lt;br /&gt;
  also have &amp;quot;... = (algunos P xs ∨ algunos P [a])&amp;quot; using HI by simp&lt;br /&gt;
  also have &amp;quot;... = (algunos P xs ∨ P a)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (P a ∨ algunos P xs)&amp;quot; by (simp add: HOL.disj_comms)&lt;br /&gt;
  finally show &amp;quot;algunos P (rev (a#xs)) = algunos P (a#xs)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* manperjim josgomrom4 raffergon2 gleherlop chrgencar cammonagu giafus1&lt;br /&gt;
   pabbergue enrparalv marfruman1 alikan antramhur hugrubsan *)&lt;br /&gt;
lemma &amp;quot;algunos P (rev xs) = algunos P xs&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;algunos P (rev []) = algunos P []&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume HI:&amp;quot;algunos P (rev xs) = algunos P xs&amp;quot;&lt;br /&gt;
  have &amp;quot;algunos P (rev (a # xs)) = algunos P ((rev xs) @ [a])&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = ((algunos P (rev xs)) ∨ (algunos P [a]))&amp;quot; &lt;br /&gt;
    by (simp add: algunos_append)&lt;br /&gt;
  also have &amp;quot;... = ((algunos P xs) ∨ (algunos P [a]))&amp;quot; using HI by simp&lt;br /&gt;
  also have &amp;quot;... = ((algunos P [a]) ∨ (algunos P xs))&amp;quot; by arith&lt;br /&gt;
  finally show &amp;quot;algunos P (rev (a # xs)) = algunos P (a # xs)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* alfmarcua *)&lt;br /&gt;
lemma &amp;quot;algunos P (rev xs) = algunos P xs&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 only: rev.simps(1))&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume HI:&amp;quot;?P xs&amp;quot;&lt;br /&gt;
  have &amp;quot;algunos P (rev (a # xs)) = algunos P (rev xs @ [a])&amp;quot; &lt;br /&gt;
    by (simp only: rev.simps(2))&lt;br /&gt;
  also have &amp;quot;... = (algunos P (rev xs) ∨ algunos P [a])&amp;quot; &lt;br /&gt;
    by (simp only: algunos_append)&lt;br /&gt;
  also have &amp;quot;... = (algunos P xs ∨ algunos P [a])&amp;quot; by (simp only: HI)&lt;br /&gt;
  also have &amp;quot;... = (algunos P (a#[]) ∨ algunos P xs)&amp;quot; &lt;br /&gt;
    by (simp only: HOL.disj_comms)&lt;br /&gt;
  also have &amp;quot;... = ((P a ∨ False) ∨ algunos P xs)&amp;quot; &lt;br /&gt;
    by (simp only: algunos.simps)&lt;br /&gt;
  also have &amp;quot;... = (P a ∨ algunos P xs)&amp;quot;  &lt;br /&gt;
    by (simp only: HOL.simp_thms(31))&lt;br /&gt;
  also have &amp;quot;... = algunos P (a#xs)&amp;quot; by (simp only: algunos.simps(2))&lt;br /&gt;
  finally show &amp;quot;?P (a#xs)&amp;quot; .&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber *)&lt;br /&gt;
lemma &amp;quot;algunos P (rev xs) = algunos P xs&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  case Nil&lt;br /&gt;
  show ?case by (simp only: algunos.simps(1) rev.simps(1))&lt;br /&gt;
next&lt;br /&gt;
  case (Cons x xs)&lt;br /&gt;
  assume IH: &amp;quot;algunos P (rev xs) = algunos P xs&amp;quot;&lt;br /&gt;
  have &amp;quot;algunos P (rev (x#xs)) = algunos P ( (rev xs) @ [x] )&amp;quot; &lt;br /&gt;
    by (simp only: rev.simps(2))&lt;br /&gt;
  also have &amp;quot;... = ( algunos P (rev xs) ∨ algunos P [x] )&amp;quot; &lt;br /&gt;
    by (simp only: algunos_append)&lt;br /&gt;
  also have &amp;quot;... = ( algunos P (rev xs) ∨ P x ∨ algunos P [] )&amp;quot; &lt;br /&gt;
    by (simp only: algunos.simps(2))&lt;br /&gt;
  also have &amp;quot;... = ( algunos P (rev xs) ∨ P x )&amp;quot; &lt;br /&gt;
    by (simp only: algunos.simps(1) simp_thms(31))&lt;br /&gt;
  also have &amp;quot;... = (algunos P xs ∨ P x)&amp;quot; by (simp only: IH)&lt;br /&gt;
  also have &amp;quot;... = algunos P (x#xs)&amp;quot; &lt;br /&gt;
    by (simp only: algunos.simps(2) disj_commute)&lt;br /&gt;
  finally show ?case.&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 10. Encontrar un término no trivial Z tal que sea cierta la &lt;br /&gt;
  siguiente ecuación:&lt;br /&gt;
     algunos (λx. P x ∨ Q x) xs = Z&lt;br /&gt;
  y demostrar la equivalencia de forma automática y detallada.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* manperjim pabalagon josgomrom4 alfmarcua raffergon2 cammonagu&lt;br /&gt;
   gleherlop chrgencar benber giafus1 enrparalv marfruman1 antramhur&lt;br /&gt;
   alikan hugrubsan aribatval *)  &lt;br /&gt;
lemma &amp;quot;algunos (λx. P x ∨ Q x) xs = (algunos P xs ∨ algunos Q xs)&amp;quot;&lt;br /&gt;
  by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
(* pabalagon josgomrom4 cammonagu pabbergue marfruman1 antramhur&lt;br /&gt;
   juacanrod alikan *) &lt;br /&gt;
lemma &amp;quot;algunos (λx. P x ∨ Q x) xs = (algunos P xs ∨ algunos Q xs)&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;algunos (λx. P x ∨ Q x) [] = (algunos P [] ∨ algunos Q [])&amp;quot; &lt;br /&gt;
    by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume HI: &amp;quot;algunos (λx. P x ∨ Q x) xs = &lt;br /&gt;
              (algunos P xs ∨ algunos Q xs)&amp;quot;&lt;br /&gt;
  have &amp;quot;algunos (λx. P x ∨ Q x) (a#xs) = &lt;br /&gt;
        (P a ∨ Q a ∨ algunos (λx. P x ∨ Q x) xs)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (P a ∨ Q a ∨ algunos P xs ∨ algunos Q xs)&amp;quot; &lt;br /&gt;
    using HI by simp&lt;br /&gt;
  also have &amp;quot;... = (P a ∨ algunos P xs ∨ Q a ∨ algunos Q xs)&amp;quot; &lt;br /&gt;
    by (simp add: HOL.disj_comms)&lt;br /&gt;
  finally show &amp;quot;algunos (λx. P x ∨ Q x) (a#xs) = &lt;br /&gt;
                (algunos P (a#xs) ∨ algunos Q (a#xs))&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* alfmarcua *)&lt;br /&gt;
lemma &amp;quot;algunos (λx. P x ∨ Q x) xs = (algunos P xs ∨ algunos Q xs)&amp;quot; &lt;br /&gt;
      (is &amp;quot;?P xs&amp;quot;)&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;?P []&amp;quot; by (simp only: algunos.simps(1) HOL.simp_thms(33))&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume HI:&amp;quot;?P xs&amp;quot;&lt;br /&gt;
  have &amp;quot;algunos (λx. P x ∨ Q x) (a # xs) = &lt;br /&gt;
        ((P a ∨ Q a) ∨ algunos (λx. P x ∨ Q x) xs)&amp;quot; &lt;br /&gt;
    by (simp only: algunos.simps(2))&lt;br /&gt;
  also have &amp;quot;... = ((P a ∨ Q a) ∨ algunos P xs ∨ algunos Q xs)&amp;quot; &lt;br /&gt;
    by (simp only: HI)&lt;br /&gt;
  also have &amp;quot;... = ((P a ∨ algunos P xs) ∨ Q a  ∨ algunos Q xs)&amp;quot; &lt;br /&gt;
    by (simp only: HOL.disj_assoc HOL.disj_comms)&lt;br /&gt;
  also have &amp;quot;... = (algunos P (a # xs) ∨ algunos Q (a # xs))&amp;quot; &lt;br /&gt;
    by (simp only: algunos.simps(2))&lt;br /&gt;
  finally show &amp;quot;?P (a#xs)&amp;quot; .&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber *)&lt;br /&gt;
lemma &amp;quot;algunos (λx. P x ∨ Q x) xs = ( algunos P xs ∨ algunos Q xs )&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  case Nil&lt;br /&gt;
  have &amp;quot;algunos (λx. P x ∨ Q x) [] = False&amp;quot; &lt;br /&gt;
    by (simp only: algunos.simps(1))&lt;br /&gt;
  also have &amp;quot;... = ( algunos P [] ∨ algunos Q [] )&amp;quot; &lt;br /&gt;
    by (simp only: algunos.simps(1) simp_thms(31))&lt;br /&gt;
  finally show ?case.&lt;br /&gt;
next&lt;br /&gt;
  case (Cons x xs)&lt;br /&gt;
  let ?R = &amp;quot;λx. P x ∨ Q x&amp;quot;&lt;br /&gt;
  assume IH: &amp;quot;algunos ?R xs = ( algunos P xs ∨ algunos Q xs )&amp;quot;&lt;br /&gt;
  have &amp;quot;algunos ?R (x#xs) = ( ?R x ∨ algunos ?R xs )&amp;quot; &lt;br /&gt;
    by (simp only: algunos.simps(2))&lt;br /&gt;
  also have &amp;quot;... = ( P x ∨ Q x ∨ algunos P xs ∨ algunos Q xs )&amp;quot; &lt;br /&gt;
    by (simp only: IH disj_assoc)&lt;br /&gt;
  also have &amp;quot;... = ( P x ∨ (Q x ∨ algunos P xs) ∨ algunos Q xs )&amp;quot; &lt;br /&gt;
    by (simp only: disj_assoc)&lt;br /&gt;
  also have &amp;quot;... = ( P x ∨ (algunos P xs ∨ Q x) ∨ algunos Q xs )&amp;quot; &lt;br /&gt;
    by (simp only: disj_commute)&lt;br /&gt;
  also have &amp;quot;... = ( algunos P (x#xs) ∨ algunos Q (x#xs) )&amp;quot; &lt;br /&gt;
    by (simp only: algunos.simps(2) disj_assoc)&lt;br /&gt;
  finally show ?case .&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 11.1. Demostrar o refutar automáticamente&lt;br /&gt;
     algunos P xs = (¬ todos (λx. (¬ P x)) xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* manperjim pabalagon josgomrom4 alfmarcua raffergon2 cammonagu&lt;br /&gt;
   gleherlop chrgencar benber giafus1 pabbergue enrparalv marfruman1&lt;br /&gt;
   antramhur juacanrod alikan hugrubsan aribatval *) &lt;br /&gt;
lemma &amp;quot;algunos P xs = (¬ todos (λx. (¬ P 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 11.2. Demostrar o refutar detalladamente&lt;br /&gt;
     algunos P xs = (¬ todos (λx. (¬ P x)) xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* manperjim pabalagon josgomrom4 cammonagu pabbergue enrparalv&lt;br /&gt;
   marfruman1 antramhur juacanrod alikan hugrubsan aribatval *)&lt;br /&gt;
lemma &amp;quot;algunos P xs = (¬ todos (λx. (¬ P x)) xs)&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  have &amp;quot;algunos P [] = False&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (¬ todos (λx. (¬ P x)) [])&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;algunos P [] = (¬ todos (λx. (¬ P x)) [])&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume HI: &amp;quot;algunos P xs = (¬ todos (λx. (¬ P x)) xs)&amp;quot;&lt;br /&gt;
  have &amp;quot;(¬ todos (λx. (¬ P x)) (a#xs)) = &lt;br /&gt;
        (¬ ((¬ P a) ∧ todos (λx. (¬ P x)) xs))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (P a ∨ ¬ todos (λx. (¬ P x)) xs)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (P a ∨ algunos P xs)&amp;quot; using HI by simp&lt;br /&gt;
  finally show &amp;quot;algunos P (a#xs) = (¬ todos (λx. (¬ P x)) (a#xs))&amp;quot; &lt;br /&gt;
    by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* alfmarcua *)&lt;br /&gt;
lemma &amp;quot;algunos P xs = (¬ todos (λx. (¬ P x)) xs)&amp;quot; (is &amp;quot;?P xs&amp;quot;)&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  have &amp;quot;algunos P [] = False&amp;quot; by (simp only:algunos.simps(1))&lt;br /&gt;
  also have &amp;quot;... = (¬ True)&amp;quot; by (simp only: HOL.simp_thms(7))&lt;br /&gt;
  also have &amp;quot;... = (¬ todos (λx. (¬ P x)) [])&amp;quot; &lt;br /&gt;
    by (simp only: todos.simps(1))&lt;br /&gt;
  finally show &amp;quot;?P []&amp;quot; .&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume HI:&amp;quot;?P xs&amp;quot;&lt;br /&gt;
  have &amp;quot;algunos P (a # xs) = (P a ∨ algunos P xs)&amp;quot; &lt;br /&gt;
    by (simp only: algunos.simps(2))&lt;br /&gt;
  also have &amp;quot;... = (P a ∨ ¬ todos (λx. (¬ P x)) xs)&amp;quot; &lt;br /&gt;
    by (simp only: HI)&lt;br /&gt;
  also have &amp;quot;... = (¬ ¬ P a ∨ ¬ todos (λx. (¬ P x)) xs)&amp;quot; &lt;br /&gt;
    by (simp only: HOL.simp_thms(1))&lt;br /&gt;
  also have &amp;quot;... = (¬ (¬ P a ∧ todos (λx. (¬ P x)) xs))&amp;quot; &lt;br /&gt;
    by (simp only: HOL.de_Morgan_conj)&lt;br /&gt;
  also have &amp;quot;... = (¬ todos (λx. (¬ P x)) (a#xs))&amp;quot; &lt;br /&gt;
    by (simp only: todos.simps(2))&lt;br /&gt;
  finally show &amp;quot;?P (a#xs)&amp;quot; .&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber *)&lt;br /&gt;
lemma &amp;quot;algunos P xs = (¬ todos (λx. (¬ P x)) xs)&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  case Nil&lt;br /&gt;
  have &amp;quot;algunos P [] = False&amp;quot; by (simp only: algunos.simps(1))&lt;br /&gt;
  also have &amp;quot;False = (¬ todos (λx. ¬ P x) [])&amp;quot; &lt;br /&gt;
    by (simp only: todos.simps(1) not_True_eq_False)&lt;br /&gt;
  finally show ?case .&lt;br /&gt;
next&lt;br /&gt;
  case (Cons x xs)&lt;br /&gt;
  assume IH: &amp;quot;algunos P xs = (¬ todos (λx. (¬ P x)) xs)&amp;quot;&lt;br /&gt;
  have &amp;quot;algunos P (x#xs) = ( P x ∨ algunos P xs )&amp;quot; &lt;br /&gt;
    by (simp only: algunos.simps(2))&lt;br /&gt;
  also have &amp;quot;... = ( P x ∨ (¬ todos (λx. (¬ P x)) xs) )&amp;quot; &lt;br /&gt;
    by (simp only: IH)&lt;br /&gt;
  also have &amp;quot;... = ( ¬( ¬ P x ∧ todos (λx. (¬ P x)) xs) )&amp;quot; &lt;br /&gt;
    by (simp only: not_not de_Morgan_conj)&lt;br /&gt;
  also have &amp;quot;... = (¬ todos (λx. (¬ P x)) (x#xs))&amp;quot; &lt;br /&gt;
    by (simp only: todos.simps(2))&lt;br /&gt;
  finally show ?case .&lt;br /&gt;
qed&lt;br /&gt;
     &lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 12. Definir la funcion primitiva recursiva &lt;br /&gt;
     estaEn :: &amp;#039;a ⇒ &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (estaEn x xs) se verifica si el elemento x está en la lista&lt;br /&gt;
  xs. Por ejemplo, &lt;br /&gt;
     estaEn (2::nat) [3,2,4] = True&lt;br /&gt;
     estaEn (1::nat) [3,2,4] = False&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* manperjim pabalagon josgomrom4 alfmarcua raffergon2 cammonagu&lt;br /&gt;
   gleherlop chrgencar benber giafus1 pabbergue enrparalv marfruman1&lt;br /&gt;
   antramhur juacanrod alikan hugrubsan aribatval *) &lt;br /&gt;
fun estaEn :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;estaEn x [] = False&amp;quot; |&lt;br /&gt;
  &amp;quot;estaEn x (y#xs) = (x=y ∨ estaEn x xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 13. Expresar la relación existente entre estaEn y algunos. &lt;br /&gt;
  Demostrar dicha relación de forma automática y detallada.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* manperjim pabalagon josgomrom4 alfmarcua cammonagu gleherlop&lt;br /&gt;
   chrgencar benber giafus1 pabbergue marfruman1 antramhur juacanrod&lt;br /&gt;
   alikan *)  &lt;br /&gt;
lemma &amp;quot;estaEn x xs = algunos (λa. x=a) xs&amp;quot;&lt;br /&gt;
  by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
(* pabalagon josgomrom4 cammonagu marfruman1 antramhur *)&lt;br /&gt;
lemma &amp;quot;estaEn x xs = algunos (λa. x=a) xs&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;estaEn x [] = algunos (λa. x=a) []&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix y xs&lt;br /&gt;
  assume HI: &amp;quot;estaEn x xs = algunos (λa. x=a) xs&amp;quot;&lt;br /&gt;
  have &amp;quot;estaEn x (y#xs) = (x=y ∨ estaEn x xs)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (x=y ∨ algunos (λa. x=a) xs)&amp;quot; using HI by simp&lt;br /&gt;
  finally show &amp;quot;estaEn x (y#xs) = algunos (λa. x=a) (y#xs)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* alfmarcua *)&lt;br /&gt;
lemma &amp;quot;estaEn x xs = algunos (λk. x=k) xs&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 only: estaEn.simps(1) algunos.simps(1))&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume HI:&amp;quot;?P xs&amp;quot;&lt;br /&gt;
  have &amp;quot;estaEn x (a # xs) = (x=a ∨ estaEn x xs)&amp;quot; &lt;br /&gt;
    by (simp only: estaEn.simps(2))&lt;br /&gt;
  also have &amp;quot;... = (x=a ∨ algunos (λk. x=k) xs)&amp;quot; by (simp only: HI)&lt;br /&gt;
  (* also have &amp;quot;... = ((λk. x=k) a ∨ algunos (λk. x=k) xs)&amp;quot; by (simp only:HOL.simp_thms(6)) *)&lt;br /&gt;
  also have &amp;quot;... = algunos (λk. x=k) (a#xs)&amp;quot; by (simp only: algunos.simps(2))&lt;br /&gt;
  finally show &amp;quot;?P (a#xs)&amp;quot; .&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber *)&lt;br /&gt;
lemma &amp;quot;estaEn x xs = (algunos (λy. y = x) xs)&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  case Nil&lt;br /&gt;
  have &amp;quot;estaEn x [] = False&amp;quot; by (simp only: estaEn.simps(1))&lt;br /&gt;
  also have &amp;quot;False = (algunos (λy. y = x) [])&amp;quot; &lt;br /&gt;
    by (simp only: algunos.simps(1))&lt;br /&gt;
  finally show ?case .&lt;br /&gt;
next&lt;br /&gt;
  case (Cons z xs)&lt;br /&gt;
  assume IH: &amp;quot;estaEn x xs = algunos (λy. y = x) xs&amp;quot;&lt;br /&gt;
  have &amp;quot;estaEn x (z#xs) = ( z = x ∨ estaEn x xs )&amp;quot; by force&lt;br /&gt;
  also have &amp;quot;... = ( z = x ∨ algunos (λy. y = x) xs)&amp;quot; by (simp only: IH)&lt;br /&gt;
  also have &amp;quot;... = (algunos (λy. y = x) (z#xs))&amp;quot; &lt;br /&gt;
    by (simp only: algunos.simps(2))&lt;br /&gt;
  finally show ?case .&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/RA2018/index.php?title=Relaci%C3%B3n_3&amp;diff=415</id>
		<title>Relación 3</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2018/index.php?title=Relaci%C3%B3n_3&amp;diff=415"/>
		<updated>2019-02-28T13:04:09Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isabelle&amp;quot;&amp;gt;&lt;br /&gt;
chapter {* R3: Razonamiento sobre programas *}&lt;br /&gt;
&lt;br /&gt;
theory R3_Razonamiento_sobre_programas&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1.1. Definir la función&lt;br /&gt;
     sumaImpares :: nat ⇒ nat&lt;br /&gt;
  tal que (sumaImpares n) es la suma de los n primeros números&lt;br /&gt;
  impares. Por ejemplo,&lt;br /&gt;
     sumaImpares 5  =  25&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun sumaImpares :: &amp;quot;nat ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;sumaImpares 0 = 0&amp;quot;&lt;br /&gt;
| &amp;quot;sumaImpares (Suc n) = sumaImpares n + (2*n+1)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1.2. Escribir la demostración detallada de &lt;br /&gt;
     sumaImpares n = n*n&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
(* benber *)&lt;br /&gt;
lemma &amp;quot;sumaImpares n = n*n&amp;quot;&lt;br /&gt;
proof (induct n)&lt;br /&gt;
  show &amp;quot;sumaImpares 0 = 0*0&amp;quot; by (simp only: sumaImpares.simps(1))&lt;br /&gt;
next&lt;br /&gt;
  fix n&lt;br /&gt;
  assume HI: &amp;quot;sumaImpares n = n*n&amp;quot;&lt;br /&gt;
  have &amp;quot;sumaImpares (Suc n) = sumaImpares n + (2*n+1)&amp;quot; &lt;br /&gt;
    by (simp only: sumaImpares.simps(2))&lt;br /&gt;
  also have &amp;quot;... = n*n + (2*n+1)&amp;quot; by (simp only: HI)&lt;br /&gt;
  also have &amp;quot;... = n*n + (n+n+1)&amp;quot; by (simp only:)&lt;br /&gt;
  also have &amp;quot;... = n*n + n + n + 1&amp;quot; by (simp only:)&lt;br /&gt;
  also have &amp;quot;... = n*n + n*1 + n + 1&amp;quot; by (simp only:)&lt;br /&gt;
  also have &amp;quot;... = n*(n+1) + n + 1&amp;quot; &lt;br /&gt;
    by (simp only: Nat.add_mult_distrib2)&lt;br /&gt;
  also have &amp;quot;... = n*(n+1) + (n+1)&amp;quot; by (simp only:)&lt;br /&gt;
  also have &amp;quot;... = (n+1)*n + (n+1)&amp;quot; &lt;br /&gt;
    by (simp only: Groups.ab_semigroup_mult_class.mult.commute)&lt;br /&gt;
  also have &amp;quot;... = (n+1)*n + (n+1)*1&amp;quot; by (simp only: Nat.nat_mult_1_right)&lt;br /&gt;
  also have &amp;quot;... = (n+1)*(n+1)&amp;quot; by (simp only: Nat.add_mult_distrib2)&lt;br /&gt;
  also have &amp;quot;... = (Suc n) * (Suc n)&amp;quot; by (simp only: Nat.Suc_eq_plus1)&lt;br /&gt;
  finally show &amp;quot;sumaImpares (Suc n) = (Suc n) * (Suc n)&amp;quot; .&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* manperjim pabalagon josgomrom4 hugrubsan enrparalv juacanrod *)&lt;br /&gt;
lemma &amp;quot;sumaImpares n = n*n&amp;quot;&lt;br /&gt;
proof (induct n)&lt;br /&gt;
  show &amp;quot;sumaImpares 0 = 0*0&amp;quot; by (simp only: sumaImpares.simps(1))&lt;br /&gt;
next&lt;br /&gt;
  fix n&lt;br /&gt;
  assume HI: &amp;quot;sumaImpares n = n*n&amp;quot;&lt;br /&gt;
  have &amp;quot;sumaImpares (Suc n) = sumaImpares n + 2 * n + 1&amp;quot; &lt;br /&gt;
    by (simp only: sumaImpares.simps(2))&lt;br /&gt;
  also have &amp;quot;... = n*n + 2*n + 1&amp;quot; using HI by simp&lt;br /&gt;
  also have &amp;quot;... = n*n + n + n + 1&amp;quot; by (simp only: Nat.add_mult_distrib)&lt;br /&gt;
  also have &amp;quot;... = (n+1)*n + (n + 1)&amp;quot; by (simp only: Nat.add_mult_distrib)&lt;br /&gt;
  also have &amp;quot;... = (n+1)*n + (n + 1)*1&amp;quot; by (simp only: Nat.nat_mult_1_right)&lt;br /&gt;
  also have &amp;quot;... = (n+1)*(n+1)&amp;quot; by (simp only: Nat.add_mult_distrib2)&lt;br /&gt;
  finally show &amp;quot;sumaImpares (Suc n) = (Suc n)*(Suc n)&amp;quot; &lt;br /&gt;
    by (simp only: Nat.Suc_eq_plus1)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* marfruman1 raffergon2 aribatval alfmarcua cammonagu gleherlop&lt;br /&gt;
   chrgencar alikan pabbergue giafus1 antramhur *) &lt;br /&gt;
lemma &amp;quot;sumaImpares n = n*n&amp;quot;&lt;br /&gt;
proof (induct n)&lt;br /&gt;
  show &amp;quot;sumaImpares 0 = 0*0&amp;quot; by (simp only: sumaImpares.simps(1))&lt;br /&gt;
next&lt;br /&gt;
  fix n&lt;br /&gt;
  assume HI: &amp;quot;sumaImpares n = n*n&amp;quot;&lt;br /&gt;
  have &amp;quot;sumaImpares (Suc n) = sumaImpares n + 2*n +1&amp;quot; &lt;br /&gt;
    by (simp only: sumaImpares.simps(2))&lt;br /&gt;
  also have &amp;quot;... = n*n + 2*n + 1&amp;quot; using HI by simp&lt;br /&gt;
  also have &amp;quot;... = (Suc n)*(Suc n)&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;sumaImpares (Suc n) = (Suc n)*(Suc n)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2.1. Definir la función&lt;br /&gt;
     sumaPotenciasDeDosMasUno :: nat ⇒ nat&lt;br /&gt;
  tal que &lt;br /&gt;
     (sumaPotenciasDeDosMasUno n) = 1 + 2^0 + 2^1 + 2^2 + ... + 2^n. &lt;br /&gt;
  Por ejemplo, &lt;br /&gt;
     sumaPotenciasDeDosMasUno 3  =  16&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun sumaPotenciasDeDosMasUno :: &amp;quot;nat ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;sumaPotenciasDeDosMasUno 0 = 2&amp;quot;&lt;br /&gt;
| &amp;quot;sumaPotenciasDeDosMasUno (Suc n) = &lt;br /&gt;
      sumaPotenciasDeDosMasUno n + 2^(n+1)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2.2. Escribir la demostración detallada de &lt;br /&gt;
     sumaPotenciasDeDosMasUno n = 2^(n+1)&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
(* benber josgomrom4 *)&lt;br /&gt;
lemma &amp;quot;sumaPotenciasDeDosMasUno n = 2^(n+1)&amp;quot;&lt;br /&gt;
proof (induct n)&lt;br /&gt;
  have &amp;quot;sumaPotenciasDeDosMasUno 0 = 2&amp;quot; &lt;br /&gt;
    by (simp only: sumaPotenciasDeDosMasUno.simps(1))&lt;br /&gt;
  also have &amp;quot;... = 2^(0+1)&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;sumaPotenciasDeDosMasUno 0 = 2^(0+1)&amp;quot; .&lt;br /&gt;
next&lt;br /&gt;
  fix n&lt;br /&gt;
  assume HI: &amp;quot;sumaPotenciasDeDosMasUno n = 2^(n+1)&amp;quot;&lt;br /&gt;
  have &amp;quot;sumaPotenciasDeDosMasUno (Suc n) = &lt;br /&gt;
        sumaPotenciasDeDosMasUno n + 2^(n+1)&amp;quot;&lt;br /&gt;
    by (simp only: sumaPotenciasDeDosMasUno.simps(2))&lt;br /&gt;
  also have &amp;quot;... = 2^(n+1) + 2^(n+1)&amp;quot; by (simp only: HI)&lt;br /&gt;
  also have &amp;quot;... = 2 * 2^(n+1)&amp;quot; by (simp only:)&lt;br /&gt;
  also have &amp;quot;... = 2 * 2^(Suc n)&amp;quot; by (simp only: Nat.Suc_eq_plus1)&lt;br /&gt;
  also have &amp;quot;... = 2^(Suc (Suc n))&amp;quot; &lt;br /&gt;
    by (simp only: Power.power_class.power.power_Suc)&lt;br /&gt;
  also have &amp;quot;... = 2^((Suc n)+1)&amp;quot; by (simp only: Nat.Suc_eq_plus1)&lt;br /&gt;
  finally show &amp;quot;sumaPotenciasDeDosMasUno (Suc n) = 2^((Suc n)+1)&amp;quot; .&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* marfruman1 alfmarcua hugrubsan enrparalv gleherlop chrgencar&lt;br /&gt;
   juacanrod alikan *) &lt;br /&gt;
lemma &amp;quot;sumaPotenciasDeDosMasUno n = 2^(n+1)&amp;quot;&lt;br /&gt;
proof (induct n)&lt;br /&gt;
  have &amp;quot;sumaPotenciasDeDosMasUno 0 = 2&amp;quot; &lt;br /&gt;
    by (simp only: sumaPotenciasDeDosMasUno.simps(1))&lt;br /&gt;
  also have &amp;quot;... = 2^(0+1)&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;sumaPotenciasDeDosMasUno 0 = 2^(0+1)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix n&lt;br /&gt;
  assume HI: &amp;quot;sumaPotenciasDeDosMasUno n = 2^(n+1)&amp;quot;&lt;br /&gt;
  have &amp;quot;sumaPotenciasDeDosMasUno (Suc n) = &lt;br /&gt;
        sumaPotenciasDeDosMasUno n + 2^(n+1)&amp;quot;&lt;br /&gt;
    by (simp only: sumaPotenciasDeDosMasUno.simps(2))&lt;br /&gt;
  also have &amp;quot;... = 2^(n+1)+2^(n+1)&amp;quot; using HI by simp&lt;br /&gt;
  also have &amp;quot;... =2*2^(n+1)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = 2^((Suc n)+1)&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;sumaPotenciasDeDosMasUno (Suc n) = 2^((Suc n)+1)&amp;quot; &lt;br /&gt;
    by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* manperjim pabalagon raffergon2 aribatval cammonagu hugrubsan&lt;br /&gt;
   pabbergue giafus1 antramhur*) &lt;br /&gt;
lemma &amp;quot;sumaPotenciasDeDosMasUno n = 2^(n+1)&amp;quot;&lt;br /&gt;
proof (induct n)&lt;br /&gt;
  have &amp;quot;sumaPotenciasDeDosMasUno 0 = 2&amp;quot; &lt;br /&gt;
    by (simp only: sumaPotenciasDeDosMasUno.simps(1))&lt;br /&gt;
  also have &amp;quot;... = 2^1&amp;quot; by (simp only: Power.power_one_right)&lt;br /&gt;
  finally show &amp;quot;sumaPotenciasDeDosMasUno 0 = 2^(0+1)&amp;quot; &lt;br /&gt;
    by (simp only: Nat.add_0)&lt;br /&gt;
next&lt;br /&gt;
  fix n&lt;br /&gt;
  assume HI: &amp;quot;sumaPotenciasDeDosMasUno n = 2^(n+1)&amp;quot;&lt;br /&gt;
  have &amp;quot;sumaPotenciasDeDosMasUno (Suc n) = &lt;br /&gt;
        sumaPotenciasDeDosMasUno n + 2^(n+1)&amp;quot;&lt;br /&gt;
    by (simp only: sumaPotenciasDeDosMasUno.simps(2))&lt;br /&gt;
  also have &amp;quot;... = 2^(n+1) + 2^(n+1)&amp;quot; by (simp only: HI)&lt;br /&gt;
  also have &amp;quot;... = 2*2^(n+1)&amp;quot; by (simp only: Nat.add_mult_distrib)&lt;br /&gt;
  also have &amp;quot;... = 2*2^(Suc n)&amp;quot; by (simp only: Nat.Suc_eq_plus1)&lt;br /&gt;
  also have &amp;quot;... = 2^(Suc n)*2^1&amp;quot; by (simp only: Power.power_one_right)&lt;br /&gt;
  finally show &amp;quot;sumaPotenciasDeDosMasUno (Suc n) = 2^(Suc n + 1)&amp;quot; &lt;br /&gt;
    by (simp only: Power.power_add)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3.1. Definir la función&lt;br /&gt;
     copia :: nat ⇒ &amp;#039;a ⇒ &amp;#039;a list&lt;br /&gt;
  tal que (copia n x) es la lista formado por n copias del elemento&lt;br /&gt;
  x. Por ejemplo, &lt;br /&gt;
     copia 3 x = [x,x,x]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun copia :: &amp;quot;nat ⇒ &amp;#039;a ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;copia 0 x       = []&amp;quot;&lt;br /&gt;
| &amp;quot;copia (Suc n) x = x # copia n x&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3.2. Definir la función&lt;br /&gt;
     todos :: (&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (todos p xs) se verifica si todos los elementos de xs cumplen&lt;br /&gt;
  la propiedad p. Por ejemplo,&lt;br /&gt;
     todos (λx. x&amp;gt;(1::nat)) [2,6,4] = True&lt;br /&gt;
     todos (λx. x&amp;gt;(2::nat)) [2,6,4] = False&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun todos :: &amp;quot;(&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;todos p []     = True&amp;quot;&lt;br /&gt;
| &amp;quot;todos p (x#xs) = (p x ∧ todos p xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3.2. Demostrar detalladamente que todos los elementos de&lt;br /&gt;
  (copia n x) son iguales a x. &lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
(* manperjim benber raffergon2 aribatval josgomrom4 hugrubsan cammonagu&lt;br /&gt;
   gleherlop chrgencar marfruman1 pabbergue giafus1 juacanrod &lt;br /&gt;
   antramhur *)  &lt;br /&gt;
lemma &amp;quot;todos (λy. y=x) (copia n x)&amp;quot;&lt;br /&gt;
proof (induct n)&lt;br /&gt;
  fix x :: &amp;#039;a&lt;br /&gt;
  have &amp;quot;todos (λy. y=x) (copia 0 x) = todos (λy. y=x) []&amp;quot; &lt;br /&gt;
    by (simp only: copia.simps(1))&lt;br /&gt;
  also have &amp;quot;...&amp;quot; by (simp only: todos.simps(1))&lt;br /&gt;
  finally show &amp;quot;todos (λy. y = x) (copia 0 x)&amp;quot; .&lt;br /&gt;
next&lt;br /&gt;
  fix x :: &amp;#039;a&lt;br /&gt;
  fix n :: nat&lt;br /&gt;
  assume HI: &amp;quot;todos (λy. y = x) (copia n x)&amp;quot;&lt;br /&gt;
  have &amp;quot;(todos (λy. y = x) (copia (Suc n) x) ) = &lt;br /&gt;
        (todos (λy. y = x) (x # copia n x))&amp;quot;&lt;br /&gt;
    by (simp only: copia.simps(2))&lt;br /&gt;
  also have &amp;quot;... = (((λy. y = x) x ) ∧ todos (λy. y = x) (copia n x) )&amp;quot;&lt;br /&gt;
    by (simp only: todos.simps(2))&lt;br /&gt;
  also have &amp;quot;...&amp;quot; by (simp only: HI)&lt;br /&gt;
  finally show &amp;quot;todos (λy. y = x) (copia (Suc n) x)&amp;quot; .&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* pabalagon *)&lt;br /&gt;
lemma &amp;quot;todos (λy. y=x) (copia n x)&amp;quot;&lt;br /&gt;
proof (induction n)&lt;br /&gt;
  fix x:: &amp;#039;a&lt;br /&gt;
  have &amp;quot;todos (λy. y=x) (copia 0 x) = todos (λy. y=x) []&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;...&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;todos (λy. y=x) (copia 0 x)&amp;quot; .&lt;br /&gt;
next&lt;br /&gt;
  fix x:: &amp;#039;a&lt;br /&gt;
  fix n:: nat&lt;br /&gt;
  assume HI: &amp;quot;todos (λy. y=x) (copia n x)&amp;quot;&lt;br /&gt;
  have &amp;quot;todos (λy. y=x) (copia (Suc n) x) = &lt;br /&gt;
        todos (λy. y=x) (x#(copia n x))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = ((λy. y=x) x ∧ todos (λy. y=x) (copia n x))&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;todos (λy. y=x) (copia (Suc n) x)&amp;quot; using HI by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* alfmarcua *)&lt;br /&gt;
lemma &amp;quot;todos (λy. y=x) (copia n x)&amp;quot;&lt;br /&gt;
proof (induct n)&lt;br /&gt;
  have &amp;quot;todos (λy. y = x) (copia 0 x) = todos (λy. y = x) []&amp;quot; &lt;br /&gt;
    by (simp only: copia.simps(1))&lt;br /&gt;
  also have &amp;quot;...&amp;quot; by (simp only: todos.simps(1))&lt;br /&gt;
  finally show &amp;quot;todos (λy. y = x) (copia 0 x)&amp;quot; .&lt;br /&gt;
next&lt;br /&gt;
  fix n&lt;br /&gt;
  assume HI:&amp;quot;todos (λy. y = x) (copia n x)&amp;quot;&lt;br /&gt;
  have &amp;quot;(todos (λy. y = x) (copia (Suc n) x) ) = &lt;br /&gt;
        (todos (λy. y = x) (x # copia n x))&amp;quot;&lt;br /&gt;
    by (simp only: copia.simps(2))&lt;br /&gt;
  also have &amp;quot;... = ( ( (λy. y = x) x ) ∧ todos (λy. y = x) (copia n x) )&amp;quot;&lt;br /&gt;
    by (simp only: todos.simps(2))&lt;br /&gt;
  also have &amp;quot;...&amp;quot; by (simp only: HI)&lt;br /&gt;
  finally show &amp;quot;todos (λy. y = x) (copia (Suc n) x)&amp;quot; .&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4.1. Definir la función&lt;br /&gt;
    factR :: nat ⇒ nat&lt;br /&gt;
  tal que (factR n) es el factorial de n. Por ejemplo,&lt;br /&gt;
    factR 4 = 24&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun factR :: &amp;quot;nat ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;factR 0       = 1&amp;quot;&lt;br /&gt;
| &amp;quot;factR (Suc n) = Suc n * factR n&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4.2. Se considera la siguiente definición iterativa de la&lt;br /&gt;
  función factorial &lt;br /&gt;
     factI :: &amp;quot;nat ⇒ nat&amp;quot; where&lt;br /&gt;
     factI n = factI&amp;#039; n 1&lt;br /&gt;
     &lt;br /&gt;
     factI&amp;#039; :: nat ⇒ nat ⇒ nat&amp;quot; where&lt;br /&gt;
     factI&amp;#039; 0       x = x&lt;br /&gt;
     factI&amp;#039; (Suc n) x = factI&amp;#039; n (Suc n)*x&lt;br /&gt;
  Demostrar que, para todo n y todo x, se tiene &lt;br /&gt;
     factI&amp;#039; n x = x * factR n&lt;br /&gt;
  Indicación: La propiedad mult_Suc es &lt;br /&gt;
     (Suc m) * n = n + m * n&lt;br /&gt;
  Puede que se necesite desactivarla en un paso con &lt;br /&gt;
     (simp del: mult_Suc)&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
fun factI&amp;#039; :: &amp;quot;nat ⇒ nat ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;factI&amp;#039; 0       x = x&amp;quot;&lt;br /&gt;
| &amp;quot;factI&amp;#039; (Suc n) x = factI&amp;#039; n (x * Suc n)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
fun factI :: &amp;quot;nat ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;factI n = factI&amp;#039; n 1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* benber *)&lt;br /&gt;
lemma fact: &amp;quot;factI&amp;#039; n x = x * factR n&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  (* Reformulación para aplicar la hipótesis inductiva con un valor &lt;br /&gt;
     distinto de x. *)&lt;br /&gt;
  have &amp;quot;∀x. factI&amp;#039; n x = x * factR n&amp;quot;&lt;br /&gt;
  proof (induct n)&lt;br /&gt;
    show &amp;quot;∀x. factI&amp;#039; 0 x = x * factR 0&amp;quot;&lt;br /&gt;
    proof&lt;br /&gt;
      fix x&lt;br /&gt;
      have &amp;quot;factI&amp;#039; 0 x = x&amp;quot; by (simp only: factI&amp;#039;.simps(1))&lt;br /&gt;
      also have &amp;quot;... = x * 1&amp;quot; by (simp only:)&lt;br /&gt;
      also have &amp;quot;... = x * factR 0&amp;quot; by (simp only: factR.simps(1))&lt;br /&gt;
      finally show &amp;quot;factI&amp;#039; 0 x = x * factR 0&amp;quot; .&lt;br /&gt;
    qed&lt;br /&gt;
  next&lt;br /&gt;
    show &amp;quot;⋀n. ∀x. factI&amp;#039; n x = x * factR n ⟹ &lt;br /&gt;
              ∀x. factI&amp;#039; (Suc n) x = x * factR (Suc n)&amp;quot;&lt;br /&gt;
    proof&lt;br /&gt;
      fix x&lt;br /&gt;
      fix n&lt;br /&gt;
      assume HI: &amp;quot;∀y. factI&amp;#039; n y = y * factR n&amp;quot;&lt;br /&gt;
      have &amp;quot;factI&amp;#039; (Suc n) x =  factI&amp;#039; n (x * Suc n)&amp;quot; &lt;br /&gt;
        by (simp only: factI&amp;#039;.simps(2))&lt;br /&gt;
      also have &amp;quot;... = (x * Suc n) * factR n&amp;quot; by (simp only: HI)&lt;br /&gt;
      also have &amp;quot;... = x * factR (Suc n)&amp;quot; by (simp only: factR.simps(2))&lt;br /&gt;
      finally show &amp;quot;factI&amp;#039; (Suc n) x = x * factR (Suc n)&amp;quot; .&lt;br /&gt;
    qed&lt;br /&gt;
  qed&lt;br /&gt;
  thus &amp;quot;factI&amp;#039; n x = x * factR n&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* manperjim pabalagon raffergon2 aribatval josgomrom4 alfmarcua&lt;br /&gt;
   hugrubsan cammonagu marfruman1 gleherlop chrgencar pabbergue giafus1&lt;br /&gt;
   juacanrod antramhur *)  &lt;br /&gt;
lemma fact2: &amp;quot;factI&amp;#039; n x = x * factR n&amp;quot;&lt;br /&gt;
proof (induction n arbitrary: x)&lt;br /&gt;
  fix x&lt;br /&gt;
  have &amp;quot;factI&amp;#039; 0 x = x&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = x * 1&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;factI&amp;#039; 0 x = x * factR 0&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix n&lt;br /&gt;
  assume HI: &amp;quot;⋀x. factI&amp;#039; n x = x * factR n&amp;quot;&lt;br /&gt;
  show &amp;quot;⋀x. factI&amp;#039; (Suc n) x = x * factR (Suc n)&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    fix x&lt;br /&gt;
    have &amp;quot;factI&amp;#039; (Suc n) x = factI&amp;#039; n (x * Suc n)&amp;quot; &lt;br /&gt;
      by (simp only: factI&amp;#039;.simps(2))&lt;br /&gt;
    also have &amp;quot;... = x * Suc n * factR n&amp;quot; using HI by simp&lt;br /&gt;
    finally show &amp;quot;factI&amp;#039; (Suc n) x = x*factR (Suc n)&amp;quot; &lt;br /&gt;
      by (simp only: factR.simps(2))&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4.3. Escribir la demostración detallada de&lt;br /&gt;
     factI n = factR n&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
(* benber *)&lt;br /&gt;
corollary &amp;quot;factI n = factR n&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  fix n&lt;br /&gt;
  have &amp;quot;factI n = factI&amp;#039; n 1&amp;quot; by (simp only: factI.simps(1))&lt;br /&gt;
  also have &amp;quot;... = 1 * factR n&amp;quot; by (simp only: fact)&lt;br /&gt;
  also have &amp;quot;... = factR n&amp;quot; by (simp only: Groups.mult_1)&lt;br /&gt;
  finally show &amp;quot;factI n = factR n&amp;quot; .&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* manperjim pabalagon raffergon2 josgomrom4 alfmarcua hugrubsan&lt;br /&gt;
   marfruman1 gleherlop chrgencar pabbergue giafus1 juacanrod &lt;br /&gt;
   antramhur *) &lt;br /&gt;
corollary &amp;quot;factI n = factR n&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;factI n = factI&amp;#039; n 1&amp;quot; by (simp only: factI.simps(1))&lt;br /&gt;
  also have &amp;quot;... = 1*factR n&amp;quot; using fact by simp&lt;br /&gt;
  finally show &amp;quot;factI n = factR n&amp;quot; by (simp only: mult_1)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5.1. Definir, recursivamente y sin usar (@), la función&lt;br /&gt;
     amplia :: &amp;#039;a list ⇒ &amp;#039;a ⇒ &amp;#039;a list&lt;br /&gt;
  tal que (amplia xs y) es la lista obtenida añadiendo el elemento y al&lt;br /&gt;
  final de la lista xs. Por ejemplo,&lt;br /&gt;
     amplia [d,a] t = [d,a,t]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun amplia :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;amplia []     y = [y]&amp;quot;&lt;br /&gt;
| &amp;quot;amplia (x#xs) y = x # amplia xs y&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5.2. Escribir la demostración detallada de&lt;br /&gt;
     amplia xs y = xs @ [y]&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
(* benber aribatval alfmarcua giafus1 *)&lt;br /&gt;
lemma &amp;quot;amplia xs y = xs @ [y]&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  have &amp;quot;amplia [] y = [y]&amp;quot; by (simp only: amplia.simps(1))&lt;br /&gt;
  also have &amp;quot;... = [] @ [y]&amp;quot; by (simp only: List.append.left_neutral)&lt;br /&gt;
  finally show &amp;quot;amplia [] y = [] @ [y]&amp;quot; .&lt;br /&gt;
next&lt;br /&gt;
  fix x&lt;br /&gt;
  fix xs&lt;br /&gt;
  assume HI: &amp;quot;amplia xs y = xs @ [y]&amp;quot;&lt;br /&gt;
  have &amp;quot;amplia (x#xs) y = x # amplia xs y&amp;quot; by (simp only: amplia.simps(2))&lt;br /&gt;
  also have &amp;quot;... = x # (xs @ [y])&amp;quot; by (simp only: HI)&lt;br /&gt;
  also have &amp;quot;... = (x#xs) @ [y]&amp;quot; by (simp only: List.append.append_Cons)&lt;br /&gt;
  finally show &amp;quot;amplia (x#xs) y = (x#xs) @ [y]&amp;quot; .&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* marfruman1 raffergon2 enrparalv alikan gleherlop chrgencar &lt;br /&gt;
   juacanrod *)&lt;br /&gt;
lemma &amp;quot;amplia xs y = xs @ [y]&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  have &amp;quot;amplia [] y = [y]&amp;quot; by (simp only: amplia.simps(1))&lt;br /&gt;
  also have &amp;quot;... = [] @ [y]&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;amplia [] y = [] @ [y]&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x xs&lt;br /&gt;
  assume HI: &amp;quot;amplia xs y = xs @ [y]&amp;quot;&lt;br /&gt;
  have &amp;quot;amplia (x#xs) y = x# amplia xs y&amp;quot; by (simp only: amplia.simps(2))&lt;br /&gt;
  also have &amp;quot;... = x# (xs @ [y])&amp;quot; using HI by simp&lt;br /&gt;
  also have &amp;quot;... = (x#xs) @ [y]&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;amplia (x#xs) y =(x#xs) @ [y]&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* manperjim pabalagon josgomrom4 hugrubsan cammonagu pabbergue &lt;br /&gt;
   antramhur*)&lt;br /&gt;
lemma &amp;quot;amplia xs y = xs @ [y]&amp;quot;&lt;br /&gt;
proof (induction xs)&lt;br /&gt;
  have &amp;quot;amplia [] y = [y]&amp;quot; by (simp only: amplia.simps(1))&lt;br /&gt;
  show &amp;quot;amplia [] y = [] @ [y]&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume HI: &amp;quot;amplia xs y = xs @ [y]&amp;quot;&lt;br /&gt;
  have &amp;quot;amplia (a#xs) y = a # amplia xs y&amp;quot; &lt;br /&gt;
    by (simp only: amplia.simps(2))&lt;br /&gt;
  also have &amp;quot;... = a # (xs @ [y])&amp;quot; using HI by simp&lt;br /&gt;
  finally show &amp;quot;amplia (a#xs) y = (a#xs) @ [y]&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/RA2018/index.php?title=Relaci%C3%B3n_2&amp;diff=414</id>
		<title>Relación 2</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2018/index.php?title=Relaci%C3%B3n_2&amp;diff=414"/>
		<updated>2019-02-28T13:03:53Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isabelle&amp;quot;&amp;gt;&lt;br /&gt;
chapter {* R2: Razonamiento sobre programas en Isabelle/HOL *}&lt;br /&gt;
&lt;br /&gt;
theory R2_Razonamiento_automatico_sobre_programas&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;
  Ejercicio 1.1. Definir la función&lt;br /&gt;
     sumaImpares :: nat ⇒ nat&lt;br /&gt;
  tal que (sumaImpares n) es la suma de los n primeros números&lt;br /&gt;
  impares. Por ejemplo,&lt;br /&gt;
     sumaImpares 5  =  25&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* manperjim pabalagon cammonagu juacanrod alfmarcua raffergon2&lt;br /&gt;
   hugrubsan enrparalv gleherlop chrgencar giafus1 pabbergue alikan&lt;br /&gt;
   aribatval *)  &lt;br /&gt;
fun sumaImpares :: &amp;quot;nat ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;sumaImpares 0 = 0&amp;quot; |&lt;br /&gt;
  &amp;quot;sumaImpares n = 2*n-1 + sumaImpares (n-1)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;sumaImpares 1  = 1&amp;quot;&lt;br /&gt;
value &amp;quot;sumaImpares 3  = 9&amp;quot;&lt;br /&gt;
value &amp;quot;sumaImpares 5  = 25&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* josgomrom4 marfruman1 benber antramhur *)&lt;br /&gt;
fun sumaImpares2 :: &amp;quot;nat ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;sumaImpares2 0 = 0&amp;quot; |&lt;br /&gt;
  &amp;quot;sumaImpares2 (Suc n) = 2*n + 1 + sumaImpares2 n&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;sumaImpares2 1  = 1&amp;quot;&lt;br /&gt;
value &amp;quot;sumaImpares2 3  = 9&amp;quot;&lt;br /&gt;
value &amp;quot;sumaImpares2 5  = 25&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1.2. Demostrar que &lt;br /&gt;
     sumaImpares n = n*n&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
(* manperjim pabalagon cammonagu juacanrod josgomrom4 hugrubsan&lt;br /&gt;
   enrparalv gleherlop benber chrgencar giafus1 alikan aribatval *) &lt;br /&gt;
lemma &amp;quot;sumaImpares n = n*n&amp;quot;&lt;br /&gt;
  apply (induction n)&lt;br /&gt;
   apply auto&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
(* pabalagon *)&lt;br /&gt;
lemma &amp;quot;sumaImpares n = n*n&amp;quot;&lt;br /&gt;
  apply (induction n)&lt;br /&gt;
   apply simp&lt;br /&gt;
   apply simp&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
(* pabalagon antramhur *)&lt;br /&gt;
lemma &amp;quot;sumaImpares n = n*n&amp;quot;&lt;br /&gt;
  by (induction n) simp_all&lt;br /&gt;
&lt;br /&gt;
(* alfmarcua raffergon2 marfruman1 pabbergue *)&lt;br /&gt;
lemma &amp;quot;sumaImpares n = n*n&amp;quot;&lt;br /&gt;
  by (induction n) auto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2.1. Definir la función&lt;br /&gt;
     sumaPotenciasDeDosMasUno :: nat ⇒ nat&lt;br /&gt;
  tal que &lt;br /&gt;
     (sumaPotenciasDeDosMasUno n) = 1 + 2^0 + 2^1 + 2^2 + ... + 2^n. &lt;br /&gt;
  Por ejemplo, &lt;br /&gt;
     sumaPotenciasDeDosMasUno 3  =  16&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* manperjim pabalagon cammonagu chrgencar hugrubsan gleherlop benber&lt;br /&gt;
   pabbergue aribatval *) &lt;br /&gt;
fun sumaPotenciasDeDosMasUno :: &amp;quot;nat ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;sumaPotenciasDeDosMasUno 0 = 2&amp;quot; |&lt;br /&gt;
  &amp;quot;sumaPotenciasDeDosMasUno (Suc n) = &lt;br /&gt;
     2^(n+1) + sumaPotenciasDeDosMasUno n&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;sumaPotenciasDeDosMasUno 3  =  16&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* juacanrod josgomrom4 marfruman1 antramhur *)&lt;br /&gt;
fun sumaPotenciasDeDosMasUno2 :: &amp;quot;nat ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;sumaPotenciasDeDosMasUno2 0 = 2&amp;quot; |&lt;br /&gt;
  &amp;quot;sumaPotenciasDeDosMasUno2 (Suc n) = &lt;br /&gt;
     2^(Suc n) + sumaPotenciasDeDosMasUno2 n&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;sumaPotenciasDeDosMasUno2 3  =  16&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* alfmarcua raffergon2 enrparalv alikan giafus1 *)&lt;br /&gt;
fun sumaPotenciasDeDosMasUno3 :: &amp;quot;nat ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;sumaPotenciasDeDosMasUno3 0 = 2&amp;quot; |&lt;br /&gt;
  &amp;quot;sumaPotenciasDeDosMasUno3 n = 2^n + sumaPotenciasDeDosMasUno3 (n-1)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;sumaPotenciasDeDosMasUno3 3  =  16&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2.2. Demostrar que &lt;br /&gt;
     sumaPotenciasDeDosMasUno n = 2^(n+1)&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
(* manperjim pabalagon cammonagu juacanrod alfmarcua raffergon2&lt;br /&gt;
   josgomrom4 hugrubsan enrparalv benber chrgencar gleherlop  giafus1&lt;br /&gt;
   pabbergue alikan aribatval *)  &lt;br /&gt;
lemma &amp;quot;sumaPotenciasDeDosMasUno n = 2^(n+1)&amp;quot;&lt;br /&gt;
  apply (induction n)&lt;br /&gt;
   apply auto&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
(* pabalagon antramhur *)&lt;br /&gt;
lemma &amp;quot;sumaPotenciasDeDosMasUno n = 2^(n+1)&amp;quot;&lt;br /&gt;
  by (induction n) simp_all&lt;br /&gt;
&lt;br /&gt;
(* marfruman1 *)&lt;br /&gt;
lemma &amp;quot;sumaPotenciasDeDosMasUno n = 2^(n+1)&amp;quot;&lt;br /&gt;
  by (induct n) auto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3.1. Definir la función&lt;br /&gt;
     copia :: nat ⇒ &amp;#039;a ⇒ &amp;#039;a list&lt;br /&gt;
  tal que (copia n x) es la lista formado por n copias del elemento&lt;br /&gt;
  x. Por ejemplo, &lt;br /&gt;
     copia 3 x = [x,x,x]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* manperjim pabalagon cammonagu josgomrom4 hugrubsan benber gleherlop&lt;br /&gt;
   chrgencar pabbergue alikan antramhur aribatval *) &lt;br /&gt;
fun copia :: &amp;quot;nat ⇒ &amp;#039;a ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;copia 0 x = []&amp;quot; |&lt;br /&gt;
  &amp;quot;copia (Suc n) x = x#copia n x&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;copia 3 x = [x,x,x]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* juacanrod marfruman1 *)&lt;br /&gt;
fun copia2 :: &amp;quot;nat ⇒ &amp;#039;a ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;copia2 0 x = []&amp;quot; |&lt;br /&gt;
  &amp;quot;copia2 (Suc n) x = [x] @ copia2 n x&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;copia2 3 x = [x,x,x]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* manperjim alfmarcua raffergon2 enrparalv giafus1 *)&lt;br /&gt;
fun copia3 :: &amp;quot;nat ⇒ &amp;#039;a ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;copia3 0 x = []&amp;quot; |&lt;br /&gt;
  &amp;quot;copia3 n x = x#(copia (n-1) x)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;copia3 3 x = [x,x,x]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3.2. Definir la función&lt;br /&gt;
     todos :: (&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (todos p xs) se verifica si todos los elementos de xs cumplen&lt;br /&gt;
  la propiedad p. Por ejemplo,&lt;br /&gt;
     todos (λx. x&amp;gt;(1::nat)) [2,6,4] = True&lt;br /&gt;
     todos (λx. x&amp;gt;(2::nat)) [2,6,4] = False&lt;br /&gt;
  Nota: La conjunción se representa por ∧&lt;br /&gt;
  ----------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
(* manperjim pabalagon cammonagu juacanrod alfmarcua raffergon2&lt;br /&gt;
   josgomrom4 marfruman1 hugrubsan enrparalv benber chrgencar giafus1&lt;br /&gt;
   gleherlop pabbergue alikan antramhur aribatval *)  &lt;br /&gt;
fun todos :: &amp;quot;(&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;todos p [] = True&amp;quot; |&lt;br /&gt;
  &amp;quot;todos p (x#xs) = (p x ∧ todos p xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;todos (λx. x&amp;gt;(1::nat)) [2,6,4] = True&amp;quot;&lt;br /&gt;
value &amp;quot;todos (λx. x&amp;gt;(2::nat)) [2,6,4] = False&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3.3. Demostrar que todos los elementos de (copia n x) son&lt;br /&gt;
  iguales a x. &lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
(* manperjim pabalagon cammonagu juacanrod alfmarcua raffergon2&lt;br /&gt;
   josgomrom4 hugrubsan enrparalv benber giafus1 pabbergue alikan&lt;br /&gt;
   gleherlop chrgencar aribatval *) &lt;br /&gt;
lemma &amp;quot;todos (λy. y=x) (copia n x)&amp;quot;&lt;br /&gt;
  apply (induction n)&lt;br /&gt;
   apply auto&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
(* Comentario: La demostración anterior falla para copia3. *)&lt;br /&gt;
&lt;br /&gt;
(* pabalagon antramhur *)&lt;br /&gt;
lemma &amp;quot;todos (λy. y=x) (copia n x)&amp;quot;&lt;br /&gt;
  by (induction n) simp_all&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4.1. Definir, recursivamente y sin usar (@), la función&lt;br /&gt;
     amplia :: &amp;#039;a list ⇒ &amp;#039;a ⇒ &amp;#039;a list&lt;br /&gt;
  tal que (amplia xs y) es la lista obtenida añadiendo el elemento y al&lt;br /&gt;
  final de la lista xs. Por ejemplo,&lt;br /&gt;
     amplia [d,a] t = [d,a,t]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* manperjim pabalagon cammonagu juacanrod alfmarcua raffergon2&lt;br /&gt;
   josgomrom4 marfruman1 hugrubsan enrparalv benber chrgencar gleherlop&lt;br /&gt;
   giafus1 pabbergue alikan antramhur aribatval *)  &lt;br /&gt;
fun amplia :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;amplia [] y = [y]&amp;quot; |&lt;br /&gt;
  &amp;quot;amplia (x#xs) y = x # amplia xs y&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;amplia [d,a] t = [d,a,t]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4.2. Demostrar que &lt;br /&gt;
     amplia xs y = xs @ [y]&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
(* manperjim pabalagon cammonagu juacanrod alfmarcua raffergon2&lt;br /&gt;
   josgomrom4 hugrubsan gleherlop enrparalv benber chrgencar giafus1&lt;br /&gt;
   pabbergue alikan aribatval *)  &lt;br /&gt;
lemma &amp;quot;amplia xs y = xs @ [y]&amp;quot;&lt;br /&gt;
  apply (induction xs)&lt;br /&gt;
   apply auto&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
(* pabalagon antramhur *)&lt;br /&gt;
lemma &amp;quot;amplia xs y = xs @ [y]&amp;quot;&lt;br /&gt;
  by (induction xs) simp_all&lt;br /&gt;
&lt;br /&gt;
(* marfruman1 *)&lt;br /&gt;
lemma &amp;quot;amplia xs y = xs @ [y]&amp;quot;&lt;br /&gt;
  by (induction xs) 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/RA2018/index.php?title=Relaci%C3%B3n_1&amp;diff=413</id>
		<title>Relación 1</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2018/index.php?title=Relaci%C3%B3n_1&amp;diff=413"/>
		<updated>2019-02-28T13:03:37Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isabelle&amp;quot;&amp;gt;&lt;br /&gt;
chapter {* R1: Programación funcional en Isabelle *}&lt;br /&gt;
&lt;br /&gt;
theory R1_Programacion_funcional_en_Isabelle&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
text {* ----------------------------------------------------------------&lt;br /&gt;
  Ejercicio 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 [a,b,c] = 3&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
(* cammonagu pabalagon raffergon2 aribatval juacanrod josgomrom4&lt;br /&gt;
   marfruman1 gleherlop benber alfmarcua enrparlav manperjim chrgencar &lt;br /&gt;
   antramhur pabbergue alikan*)  &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 [a,b,c] = 3&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* hugrubsan giafus1 *)&lt;br /&gt;
fun longitud2 :: &amp;quot;&amp;#039;a list ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;longitud2 [] = 0 &amp;quot;&lt;br /&gt;
| &amp;quot;longitud2 xs = 1 + longitud2 (tl xs) &amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;longitud2 [a,b,c] = 3&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. 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;
(* manperjim pabalagon cammonagu raffergon2 aribatval juacanrod&lt;br /&gt;
   marfruman1 gleherlop benber hugrubsan alfmarcua enrparalv giafus1&lt;br /&gt;
   chrgencar antramhur alikan pabbergue *)  &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;
(* josgomrom4 *)&lt;br /&gt;
fun intercambia2 :: &amp;quot;&amp;#039;a × &amp;#039;b ⇒ &amp;#039;b × &amp;#039;a&amp;quot; where&lt;br /&gt;
  &amp;quot;intercambia2 xs = (snd xs, fst xs) &amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;intercambia2 (u,v) = (v,u)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* ---------------------------------------------------------------&lt;br /&gt;
  Ejercicio 3. 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;
(* pabalagon *)&lt;br /&gt;
fun aux :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;aux [] a     = a&amp;quot; &lt;br /&gt;
| &amp;quot;aux (x#xs) a = aux xs (x#a)&amp;quot;&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 xs = aux xs []&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;
(* manperjim pabalagon raffergon2 cammonagu josgomrom4 marfruman1&lt;br /&gt;
   gleherlop alfmarcua enrparalv chrgencar antramhur alikan pabbergue *) &lt;br /&gt;
fun inversa2 :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;inversa2 []     = []&amp;quot; &lt;br /&gt;
| &amp;quot;inversa2 (x#xs) = inversa2 xs @ [x]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;inversa2 [a,d,c] = [c,d,a]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* juacanrod hugrubsan giafus1 *)&lt;br /&gt;
fun inversa3 :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;inversa3 []   = []&amp;quot;  &lt;br /&gt;
| &amp;quot;inversa3 (xs) = inversa3(tl xs) @ [ hd (xs)]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;inversa3 [a,d,c] = [c,d,a]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* aribatval *)&lt;br /&gt;
fun inversa4 :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;inversa4 [] = []&amp;quot; &lt;br /&gt;
| &amp;quot;inversa4 xs = last xs # (inversa4 (butlast xs))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;inversa4 [a,d,c] = [c,d,a]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* benber *)&lt;br /&gt;
fun inversa5aux :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;inversa5aux [] y = [y]&amp;quot;&lt;br /&gt;
| &amp;quot;inversa5aux (x#xs) y = x#(inversa5aux xs y)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
fun inversa5 :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;inversa5 [] = []&amp;quot;&lt;br /&gt;
| &amp;quot;inversa5 (x#xs) = inversa5aux (inversa5 xs) x&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;inversa5 [a,d,c] = [c,d,a]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. 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;
(* pabalag aribatval antramhur *)&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;
(* manperjim raffergon2 cammonagu josgomrom4 marfruman1 benber alfmarcua&lt;br /&gt;
   gleherlop giafus1 chrgencar pabbergue alikan *) &lt;br /&gt;
fun repite2 :: &amp;quot;nat ⇒ &amp;#039;a ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;repite2 0 x = [] &amp;quot;&lt;br /&gt;
| &amp;quot;repite2 n x = x # repite2 (n-1) x &amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;repite2 3 a = [a,a,a]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* juacanrod hugrubsan *)&lt;br /&gt;
fun repite3 :: &amp;quot;nat ⇒ &amp;#039;a ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;repite3 0 a = []&amp;quot; &lt;br /&gt;
| &amp;quot;repite3 n a = [a] @ repite3 (n-1) a&amp;quot; &lt;br /&gt;
  &lt;br /&gt;
value &amp;quot;repite3 3 a = [a,a,a]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* enrparalv *)&lt;br /&gt;
fun repite4 :: &amp;quot;nat ⇒ &amp;#039;a ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;repite4 n x = (if n = 0 then [] else repite4 (n-1) x @ [x])&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;repite4 3 a = [a,a,a]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. 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;
(* manperjim pabalagon raffergon2 josgomrom4 aribatval gleherlop&lt;br /&gt;
   chrgencar benber antramhur*) &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;
(* cammonagu marfruman1 pabbergue *)&lt;br /&gt;
fun conc2 :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;conc2 ys []     = ys&amp;quot; |&lt;br /&gt;
  &amp;quot;conc2 xs (y#ys) = xs @y # ys&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;conc2 [a,d] [b,d,a,c] = [a,d,b,d,a,c]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* juacanrod *)&lt;br /&gt;
fun conc3 :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;conc3 [] ys = ys&amp;quot; |&lt;br /&gt;
  &amp;quot;conc3 xs ys = [hd (xs)] @ conc3 (tl (xs)) ys&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;conc3 [a,d] [b,d,a,c] = [a,d,b,d,a,c]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* hugrubsan enrparalv giafus1 alikan *)&lt;br /&gt;
fun conc4 :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;conc4 xs ys = xs @ ys&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* alfmarcua *)&lt;br /&gt;
fun conc5 :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;conc5 [] ys = ys&amp;quot;&lt;br /&gt;
| &amp;quot;conc5 xs ys = conc5 (butlast xs) ((last xs)#ys)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 6. 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;
(* pabalagon raffergon2 antramhur *)&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 0 xs           = []&amp;quot; |&lt;br /&gt;
  &amp;quot;coge n []           = []&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;
(* manperjim cammonagu josgomrom4 marfruman1 benber alfmarcua chrgencar&lt;br /&gt;
   gleherlop giafus1 pabbergue *) &lt;br /&gt;
fun coge2 :: &amp;quot;nat ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;coge2 0 xs = []&amp;quot; |&lt;br /&gt;
  &amp;quot;coge2 n [] = []&amp;quot; |&lt;br /&gt;
  &amp;quot;coge2 n (x#xs) = x # coge2 (n-1) xs&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;coge2 2 [a,c,d,b,e] = [a,c]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* juacanrod *)&lt;br /&gt;
fun coge3 :: &amp;quot;nat ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;coge3 0 xs = []&amp;quot; |&lt;br /&gt;
  &amp;quot;coge3 n xs = [hd (xs)] @ coge3 (n-1) (tl (xs))&amp;quot; &lt;br /&gt;
&lt;br /&gt;
value &amp;quot;coge3 2 [a,c,d,b,e] = [a,c]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* aribatval hugrubsan *)&lt;br /&gt;
fun coge4 :: &amp;quot;nat ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
 &amp;quot;coge4 0 xs = []&amp;quot; |&lt;br /&gt;
 &amp;quot;coge4 n [] = []&amp;quot; |&lt;br /&gt;
 &amp;quot;coge4 n xs = (hd xs) # coge4 (n-1) (tl xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;coge4 2 [a,c,d,b,e] = [a,c]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* enrparalv *)&lt;br /&gt;
fun coge5 :: &amp;quot;nat ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;coge5 n []      = []&amp;quot;&lt;br /&gt;
| &amp;quot;coge5 n (x#xs) = (if (n=0) then [] else [x] @ coge5 (n-1) xs )&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;coge5 2 [a,c,d,b,e] = [a,c]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* alikan *)&lt;br /&gt;
fun coge6 :: &amp;quot;nat ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;coge6 n [] = []&amp;quot;|&lt;br /&gt;
  &amp;quot;coge6 n (x#xs) = (case n of 0 ⇒ [] | Suc n ⇒ x # coge6 n xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;coge6 2 [a,c,d,b,e] = [a,c]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 7. 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;
(* pabalagon antramhur *)&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 0 xs           = []&amp;quot; |&lt;br /&gt;
  &amp;quot;elimina n []           = []&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;
(* manperjim raffergon2 cammonagu josgomrom4 marfruman1 benber alfmarcua&lt;br /&gt;
   enrparalv aribatval gleherlop chrgencar giafus1 pabbergue*) &lt;br /&gt;
fun elimina2 :: &amp;quot;nat ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;elimina2 0 xs     = xs&amp;quot; |&lt;br /&gt;
  &amp;quot;elimina2 n []     = []&amp;quot; |&lt;br /&gt;
  &amp;quot;elimina2 n (x#xs) = elimina2 (n-1) xs&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;elimina2 2 [a,c,d,b,e] = [d,b,e]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* juacanrod hugrubsan *)&lt;br /&gt;
fun elimina3 :: &amp;quot;nat ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;elimina3 0 xs = xs&amp;quot; |&lt;br /&gt;
  &amp;quot;elimina3 n xs = elimina3 (n-1) (tl xs)&amp;quot; &lt;br /&gt;
&lt;br /&gt;
value &amp;quot;elimina3 2 [a,c,d,b,e] = [d,b,e]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* alikan *)&lt;br /&gt;
fun elimina4 :: &amp;quot;nat ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;elimina4 n [] = []&amp;quot;|&lt;br /&gt;
  &amp;quot;elimina4 n (x#xs) = (case n of 0 ⇒ x#xs | Suc n ⇒ elimina4 n xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;elimina4 2 [a,c,d,b,e] = [d,b,e]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 8. 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 [a] = False&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* manperjim pabalagon raffergon2 josgomrom4 marfruman1 benber hugrubsan&lt;br /&gt;
   alfmarcua enrparalv aribatval chrgencar giafus1 alikan pabbergue&lt;br /&gt;
   antramhur *)  &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 xs = False&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;esVacia [a] = False&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
(* cammonagu juacanrod *)&lt;br /&gt;
fun esVacia2 :: &amp;quot;&amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;esVacia2 xs = (longitud xs = 0)&amp;quot; &lt;br /&gt;
&lt;br /&gt;
value &amp;quot;esVacia2 [a] = False&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 9. 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;
(* manperjim pabalagon cammonagu josgomrom4 marfruman1 benber alfmarcua&lt;br /&gt;
   enrparalv aribatval gleherlop chrgencar giafus1 alikan pabbergue&lt;br /&gt;
   antramhur *)  &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;
(* juacanrod *)&lt;br /&gt;
fun inversaAcAux2 :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;inversaAcAux2 [] ys = ys&amp;quot; |&lt;br /&gt;
  &amp;quot;inversaAcAux2 xs ys = inversaAcAux2 (tl xs) ([hd xs]) @ ys&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;inversaAcAux2 [a,b,c] []&amp;quot;&lt;br /&gt;
&lt;br /&gt;
fun inversaAc2 :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;inversaAc2 xs = inversaAcAux2 xs []&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;inversaAc2 [a,c,b,e] = [e,b,c,a]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* hugrubsan *)&lt;br /&gt;
fun inversaAcAux3 :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;inversaAcAux3 [] ys = ys&amp;quot;&lt;br /&gt;
  |&amp;quot;inversaAcAux3 xs ys = inversaAcAux3 (tl xs) [(hd xs)] @ ys&amp;quot;&lt;br /&gt;
&lt;br /&gt;
fun inversaAc3 :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;inversaAc3 xs =  inversaAcAux3 (tl xs) [(hd xs)]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;inversaAc3 [a,c,b,e] = [e,b,c,a]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 10. 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;
(* manperjim pabalagon raffergon2 josgomrom4 marfruman1 benber alfmarcua&lt;br /&gt;
   enrparalv aribatval gleherlop chrgencar giafus1 pabbergue antramhur&lt;br /&gt;
   alikan *)  &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;
(* cammonagu *)&lt;br /&gt;
fun sum2:: &amp;quot;nat list ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;sum2 []     = 0&amp;quot; |&lt;br /&gt;
  &amp;quot;sum2 [x]    = x&amp;quot; |&lt;br /&gt;
  &amp;quot;sum2 (x#xs) = x + sum2 xs&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;sum2 [3,2,5] = 10&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* juacanrod hugrubsan *)&lt;br /&gt;
fun sum3 :: &amp;quot;nat list ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;sum3 [] = 0&amp;quot; |&lt;br /&gt;
  &amp;quot;sum3 xs = (hd xs) + sum3 (tl xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;sum3 [3,2,5,1]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 11. 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;
(* manperjim pabalagon raffergon2 cammonagu josgomrom4 marfruman1 benber&lt;br /&gt;
   alfmarcua aribatval gleherlop chrgencar giafus1 pabbergue antramhur *) &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 (λn. Suc n) [2,3,4,5]&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
(* juacanrod *)&lt;br /&gt;
fun map2 :: &amp;quot;(&amp;#039;a ⇒ &amp;#039;b) ⇒ &amp;#039;a list ⇒ &amp;#039;b list&amp;quot; where&lt;br /&gt;
  &amp;quot;map2 f []     = []&amp;quot; |&lt;br /&gt;
  &amp;quot;map2 f (x#xs) = [(f x)] @ map2 f xs&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;map2 (λn. Suc n) [2,3,4,5]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* hugrubsan *)&lt;br /&gt;
fun map3 :: &amp;quot;(&amp;#039;a ⇒ &amp;#039;b) ⇒ &amp;#039;a list ⇒ &amp;#039;b list&amp;quot; where&lt;br /&gt;
  &amp;quot;map3 f [] = []&amp;quot; |&lt;br /&gt;
  &amp;quot;map3 f xs = f (hd xs) # map3 f (tl xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;map3 (λn. Suc n) [2,3,4,5]&amp;quot;&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/RA2018/index.php?title=Relaci%C3%B3n_6&amp;diff=412</id>
		<title>Relación 6</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2018/index.php?title=Relaci%C3%B3n_6&amp;diff=412"/>
		<updated>2019-02-28T12:57:41Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isabelle&amp;quot;&amp;gt;&lt;br /&gt;
chapter {* R6: Deducción natural proposicional *}&lt;br /&gt;
&lt;br /&gt;
theory R6_Deduccion_natural_proposicional_alu&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 relación es demostrar cada uno de los ejercicios&lt;br /&gt;
  usando sólo las reglas básicas de deducción natural de la lógica&lt;br /&gt;
  proposicional (sin usar el método auto).&lt;br /&gt;
&lt;br /&gt;
  Las reglas básicas de la deducción natural son las siguientes:&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;
  · notnotI:    P ⟹ ¬¬ P&lt;br /&gt;
  · mp:         ⟦P ⟶ Q; P⟧ ⟹ Q &lt;br /&gt;
  · mt:         ⟦F ⟶ G; ¬G⟧ ⟹ ¬F &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;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Se usarán las reglas notnotI y mt que demostramos a continuación. *}&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;
section {* Implicaciones *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. Demostrar&lt;br /&gt;
       p ⟶ q, p ⊢ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim josgomrom4 cammonagu raffergon2 chrgencar&lt;br /&gt;
   gleherlop giafus1 marfruman1 enrparalv pabbergue antramhur alikan&lt;br /&gt;
   juacanrod hugrubsan *) &lt;br /&gt;
lemma ejercicio_1:&lt;br /&gt;
  assumes 1: &amp;quot;p ⟶ q&amp;quot; and&lt;br /&gt;
          2: &amp;quot;p&amp;quot;&lt;br /&gt;
  shows &amp;quot;q&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  show &amp;quot;q&amp;quot; using 1 2 by (rule mp)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber alfmarcua *)&lt;br /&gt;
lemma ejercicio_1_1:&lt;br /&gt;
  assumes &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
          &amp;quot;p&amp;quot;&lt;br /&gt;
  shows &amp;quot;q&amp;quot;&lt;br /&gt;
  using assms by (rule mp)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Demostrar&lt;br /&gt;
     p ⟶ q, q ⟶ r, p ⊢ r&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim josgomrom4 cammonagu gleherlop raffergon2&lt;br /&gt;
   chrgencar giafus1 marfruman1 alfmarcua enrparalv pabbergue antramhur&lt;br /&gt;
   alikan juacanrod hugrubsan *) &lt;br /&gt;
lemma ejercicio_2:&lt;br /&gt;
  assumes 1: &amp;quot;p ⟶ q&amp;quot; and&lt;br /&gt;
          2: &amp;quot;q ⟶ r&amp;quot; and&lt;br /&gt;
          3: &amp;quot;p&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 1 3 by (rule mp)&lt;br /&gt;
  show &amp;quot;r&amp;quot; using 2 4 by (rule mp)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber *)&lt;br /&gt;
lemma ejercicio_2_1:&lt;br /&gt;
  assumes &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
          &amp;quot;q ⟶ r&amp;quot;&lt;br /&gt;
          &amp;quot;p&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 `p ⟶ q` `p` by (rule mp)&lt;br /&gt;
  with `q ⟶ r` show &amp;quot;r&amp;quot; by (rule mp)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. Demostrar&lt;br /&gt;
     p ⟶ (q ⟶ r), p ⟶ q, p ⊢ r&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim josgomrom4 cammonagu gleherlop raffergon2&lt;br /&gt;
   chrgencar giafus1 marfruman1 alfmarcua enrparalv pabbergue antramhur&lt;br /&gt;
   alikan juacanrod hugrubsan *) &lt;br /&gt;
lemma ejercicio_3:&lt;br /&gt;
  assumes 1: &amp;quot;p ⟶ (q ⟶ r)&amp;quot; and&lt;br /&gt;
          2: &amp;quot;p ⟶ q&amp;quot; and&lt;br /&gt;
          3: &amp;quot;p&amp;quot;&lt;br /&gt;
  shows &amp;quot;r&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have 4: &amp;quot;q ⟶ r&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 &amp;quot;r&amp;quot; using 4 5 by (rule mp)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber *)&lt;br /&gt;
lemma ejercicio_3_1:&lt;br /&gt;
  assumes &amp;quot;p ⟶ (q ⟶ r)&amp;quot;&lt;br /&gt;
          &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
          &amp;quot;p&amp;quot;&lt;br /&gt;
  shows &amp;quot;r&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;q ⟶ r&amp;quot; using `p ⟶ (q ⟶ r)` `p` by (rule mp)&lt;br /&gt;
  moreover have &amp;quot;q&amp;quot; using `p ⟶ q` `p` by (rule mp)&lt;br /&gt;
  ultimately show &amp;quot;r&amp;quot; by (rule mp)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Demostrar&lt;br /&gt;
     p ⟶ q, q ⟶ r ⊢ p ⟶ r&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim josgomrom4 cammonagu chrgencar raffergon2&lt;br /&gt;
   gleherlop giafus1 marfruman1 alfmarcua enrparalv pabbergue antramhur&lt;br /&gt;
   alikan juacanrod hugrubsan *) &lt;br /&gt;
lemma ejercicio_4:&lt;br /&gt;
  assumes 1: &amp;quot;p ⟶ q&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;
  { 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;r&amp;quot; using 2 4 by (rule mp)}&lt;br /&gt;
  thus &amp;quot;p ⟶ r&amp;quot; by (rule impI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber *)&lt;br /&gt;
lemma ejercicio_4_1:&lt;br /&gt;
  assumes &amp;quot;p ⟶ q&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;
  assume p&lt;br /&gt;
  with `p ⟶ q` have &amp;quot;q&amp;quot; by (rule mp)&lt;br /&gt;
  with `q ⟶ r` show &amp;quot;r&amp;quot; by (rule mp)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. Demostrar&lt;br /&gt;
     p ⟶ (q ⟶ r) ⊢ q ⟶ (p ⟶ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim raffergon2 giafus1 gleherlop marfruman1 alfmarcua&lt;br /&gt;
   enrparalv chrgencar pabbergue antramhur alikan hugrubsan *) &lt;br /&gt;
lemma ejercicio_5:&lt;br /&gt;
  assumes 1: &amp;quot;p ⟶ (q ⟶ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;q ⟶ (p ⟶ r)&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume 2: &amp;quot;q&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;q ⟶ r&amp;quot; using 1 3 by (rule mp)&lt;br /&gt;
    show &amp;quot;r&amp;quot; using 4 2 by (rule mp)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber josgomrom4 juacanrod cammonagu  *)&lt;br /&gt;
lemma ejercicio_5_1:&lt;br /&gt;
  assumes &amp;quot;p ⟶ (q ⟶ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;q ⟶ (p ⟶ r)&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume &amp;quot;q&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;
    with `p ⟶ (q ⟶ r)` have &amp;quot;q ⟶ r&amp;quot; by (rule mp)&lt;br /&gt;
    thus &amp;quot;r&amp;quot; using `q` by (rule mp)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* pabalagon *)&lt;br /&gt;
lemma ejercicio_5_2:&lt;br /&gt;
  assumes 1: &amp;quot;p ⟶ (q ⟶ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;q ⟶ (p ⟶ r)&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  { assume 2: &amp;quot;q&amp;quot;&lt;br /&gt;
    { assume 3: &amp;quot;p&amp;quot;&lt;br /&gt;
      have 4: &amp;quot;q ⟶ r&amp;quot; using 1 3 by (rule mp)&lt;br /&gt;
      have 5: &amp;quot;r&amp;quot; using 4 2 by (rule mp)}&lt;br /&gt;
    hence &amp;quot;p ⟶ r&amp;quot; by (rule impI)&lt;br /&gt;
  }&lt;br /&gt;
  thus &amp;quot;q ⟶ (p ⟶ r)&amp;quot; by (rule impI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 6. Demostrar&lt;br /&gt;
     p ⟶ (q ⟶ r) ⊢ (p ⟶ q) ⟶ (p ⟶ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim cammonagu chrgencar raffergon2 gleherlop giafus1 &lt;br /&gt;
   marfruman1 alfmarcua enrparalv pabbergue  antramhur alikan juacanrod&lt;br /&gt;
   hugrubsan *) &lt;br /&gt;
lemma ejercicio_6:&lt;br /&gt;
  assumes 1: &amp;quot;p ⟶ (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;
  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;q ⟶ r&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 &amp;quot;r&amp;quot; using 4 5 by (rule mp)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber josgomrom4 *)&lt;br /&gt;
lemma ejercicio_6_1:&lt;br /&gt;
  assumes &amp;quot;p ⟶ (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;
  show &amp;quot;p ⟶ r&amp;quot;&lt;br /&gt;
  proof&lt;br /&gt;
    assume &amp;quot;p&amp;quot;&lt;br /&gt;
    with `p ⟶ (q ⟶ r)` have &amp;quot;q ⟶ r&amp;quot; by (rule mp)&lt;br /&gt;
    moreover from `p ⟶ q` `p` have &amp;quot;q&amp;quot; by (rule mp)&lt;br /&gt;
    ultimately show &amp;quot;r&amp;quot; by (rule mp)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 7. Demostrar&lt;br /&gt;
     p ⊢ q ⟶ p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim josgomrom4 raffergon2 giafus1 gleherlop&lt;br /&gt;
   marfruman1 enrparalv pabbergue antramhur alikan hugrubsan *) &lt;br /&gt;
lemma ejercicio_7:&lt;br /&gt;
  assumes 1: &amp;quot;p&amp;quot;  &lt;br /&gt;
  shows   &amp;quot;q ⟶ p&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume 2: &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;
&lt;br /&gt;
(* benber cammonagu juacanrod chrgencar *)&lt;br /&gt;
lemma ejercicio_7_1:&lt;br /&gt;
  assumes &amp;quot;p&amp;quot;  &lt;br /&gt;
  shows   &amp;quot;q ⟶ p&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  show &amp;quot;p&amp;quot; using `p` .&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* alfmarcua *)&lt;br /&gt;
lemma ejercicio_7_2:&lt;br /&gt;
  assumes &amp;quot;p&amp;quot;  &lt;br /&gt;
  shows   &amp;quot;q ⟶ p&amp;quot;&lt;br /&gt;
  using assms by (rule impI)&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 8. Demostrar&lt;br /&gt;
     ⊢ p ⟶ (q ⟶ p)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim josgomrom4 raffergon2 giafus1 marfruman1&lt;br /&gt;
   enrparalv pabbergue antramhur alikan hugrubsan *) &lt;br /&gt;
lemma ejercicio_8:&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 2: &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;
(* benber cammonagu gleherlop chrgencar juacanrod alfmarcua *)&lt;br /&gt;
lemma ejercicio_8_1:&lt;br /&gt;
  &amp;quot;p ⟶ (q ⟶ p)&amp;quot;&lt;br /&gt;
  using ejercicio_7_1 by (rule impI)&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 9. Demostrar&lt;br /&gt;
     p ⟶ q ⊢ (q ⟶ r) ⟶ (p ⟶ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim raffergon2 giafus1 marfruman1 alfmarcua enrparalv&lt;br /&gt;
   gleherlop antramhur alikan hugrubsan *) &lt;br /&gt;
lemma ejercicio_9:&lt;br /&gt;
  assumes 1: &amp;quot;p ⟶ q&amp;quot; &lt;br /&gt;
  shows   &amp;quot;(q ⟶ r) ⟶ (p ⟶ r)&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume 2: &amp;quot;q ⟶ r&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;q&amp;quot; using 1 3 by (rule mp)&lt;br /&gt;
    show &amp;quot;r&amp;quot; using 2 4 by (rule mp)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber josgomrom4 cammonagu chrgencar juacanrod pabbergue *)&lt;br /&gt;
lemma ejercicio_9_1:&lt;br /&gt;
  assumes &amp;quot;p ⟶ q&amp;quot; &lt;br /&gt;
  shows   &amp;quot;(q ⟶ r) ⟶ (p ⟶ r)&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume &amp;quot;q ⟶ r&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;
    with `p ⟶ q` have &amp;quot;q&amp;quot; by (rule mp)&lt;br /&gt;
    with `q ⟶ r` show &amp;quot;r&amp;quot; by (rule mp)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 10. Demostrar&lt;br /&gt;
     p ⟶ (q ⟶ (r ⟶ s)) ⊢ r ⟶ (q ⟶ (p ⟶ s))&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim raffergon2 marfruman1 gleherlop alfmarcua&lt;br /&gt;
   enrparalv pabbergue antramhur alikan juacanrod hugrubsan *) &lt;br /&gt;
lemma ejercicio_10:&lt;br /&gt;
  assumes 1: &amp;quot;p ⟶ (q ⟶ (r ⟶ s))&amp;quot; &lt;br /&gt;
  shows   &amp;quot;r ⟶ (q ⟶ (p ⟶ s))&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume 2: &amp;quot;r&amp;quot;&lt;br /&gt;
  show &amp;quot;q ⟶ (p ⟶ s)&amp;quot;&lt;br /&gt;
  proof (rule impI)&lt;br /&gt;
    assume 3: &amp;quot;q&amp;quot;&lt;br /&gt;
    show &amp;quot;p ⟶ s&amp;quot;&lt;br /&gt;
    proof (rule impI)&lt;br /&gt;
      assume 4: &amp;quot;p&amp;quot;&lt;br /&gt;
      have 5: &amp;quot;q ⟶ (r ⟶ s)&amp;quot; using 1 4 by (rule mp)&lt;br /&gt;
      have 6: &amp;quot;r ⟶ s&amp;quot; using 5 3 by (rule mp)&lt;br /&gt;
      show &amp;quot;s&amp;quot; using 6 2 by (rule mp)&lt;br /&gt;
    qed&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber josgomrom4 cammonagu chrgencar giafus1 *)&lt;br /&gt;
lemma ejercicio_10_1:&lt;br /&gt;
  assumes &amp;quot;p ⟶ (q ⟶ (r ⟶ s))&amp;quot; &lt;br /&gt;
  shows   &amp;quot;r ⟶ (q ⟶ (p ⟶ s))&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume &amp;quot;r&amp;quot;&lt;br /&gt;
  show &amp;quot;q ⟶ (p ⟶ s)&amp;quot;&lt;br /&gt;
  proof&lt;br /&gt;
    assume &amp;quot;q&amp;quot;&lt;br /&gt;
    show &amp;quot;p ⟶ s&amp;quot;&lt;br /&gt;
    proof&lt;br /&gt;
      assume &amp;quot;p&amp;quot;&lt;br /&gt;
      with `p ⟶ (q ⟶ (r ⟶ s))`&lt;br /&gt;
        have &amp;quot;q ⟶ (r ⟶ s)&amp;quot; by (rule mp)&lt;br /&gt;
      hence &amp;quot;r ⟶ s&amp;quot; using `q` by (rule mp)&lt;br /&gt;
      thus &amp;quot;s&amp;quot; using `r` by (rule mp)&lt;br /&gt;
    qed&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 11. Demostrar&lt;br /&gt;
     ⊢ (p ⟶ (q ⟶ r)) ⟶ ((p ⟶ q) ⟶ (p ⟶ r))&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim josgomrom4 gleherlop cammonagu giafus1 alfmarcua&lt;br /&gt;
   chrgencar pabbergue alikan juacanrod hugrubsan *) &lt;br /&gt;
lemma ejercicio_11:&lt;br /&gt;
  &amp;quot;(p ⟶ (q ⟶ r)) ⟶ ((p ⟶ q) ⟶ (p ⟶ r))&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume 1: &amp;quot;p ⟶ (q ⟶ r)&amp;quot;&lt;br /&gt;
  show &amp;quot;(p ⟶ q) ⟶ (p ⟶ r)&amp;quot; using 1 ejercicio_6 by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* pabalagon raffergon2 marfruman1 enrparalv antramhur *)&lt;br /&gt;
lemma ejercicio_11_2:&lt;br /&gt;
  &amp;quot;(p ⟶ (q ⟶ r)) ⟶ ((p ⟶ q) ⟶ (p ⟶ r))&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume 1: &amp;quot;p ⟶ (q ⟶ r)&amp;quot;&lt;br /&gt;
  show &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;
    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;q ⟶ r&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 &amp;quot;r&amp;quot; using 4 5 by (rule mp)&lt;br /&gt;
    qed&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber *)&lt;br /&gt;
lemma ejercicio_11_1:&lt;br /&gt;
  &amp;quot;(p ⟶ (q ⟶ r)) ⟶ ((p ⟶ q) ⟶ (p ⟶ r))&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume &amp;quot;p ⟶ (q ⟶ r)&amp;quot;&lt;br /&gt;
  show &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;
    show &amp;quot;p ⟶ r&amp;quot;&lt;br /&gt;
    proof&lt;br /&gt;
      assume p&lt;br /&gt;
      with `p ⟶ (q ⟶ r)` have &amp;quot;q ⟶ r&amp;quot; by (rule mp)&lt;br /&gt;
      moreover have &amp;quot;q&amp;quot; using `p ⟶ q` `p` by (rule mp)&lt;br /&gt;
      ultimately show r by (rule mp)&lt;br /&gt;
    qed&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 12. Demostrar&lt;br /&gt;
     (p ⟶ q) ⟶ r ⊢ p ⟶ (q ⟶ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim raffergon2 marfruman1 gleherlop enrparalv&lt;br /&gt;
   pabbergue antramhur alikan juacanrod hugrubsan *) &lt;br /&gt;
lemma ejercicio_12:&lt;br /&gt;
  assumes 1: &amp;quot;(p ⟶ q) ⟶ r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ⟶ (q ⟶ r)&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume 2: &amp;quot;p&amp;quot;&lt;br /&gt;
  show &amp;quot;q ⟶ r&amp;quot;&lt;br /&gt;
  proof (rule impI)&lt;br /&gt;
    assume 3: &amp;quot;q&amp;quot;&lt;br /&gt;
    have 4: &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
    proof (rule impI)&lt;br /&gt;
      assume 5: &amp;quot;p&amp;quot;&lt;br /&gt;
      show &amp;quot;q&amp;quot; using 3 by this&lt;br /&gt;
    qed&lt;br /&gt;
    show &amp;quot;r&amp;quot; using 1 4 by (rule mp)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber  josgomrom4 cammonagu giafus1 alfmarcua chrgencar *)&lt;br /&gt;
lemma ejercicio_12_1:&lt;br /&gt;
  assumes &amp;quot;(p ⟶ q) ⟶ r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ⟶ (q ⟶ r)&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume &amp;quot;p&amp;quot;&lt;br /&gt;
  show &amp;quot;q ⟶ r&amp;quot;&lt;br /&gt;
  proof&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;
    with `(p ⟶ q) ⟶ r` show &amp;quot;r&amp;quot; by (rule mp)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
section {* Conjunciones *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 13. Demostrar&lt;br /&gt;
     p, q ⊢  p ∧ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon *)&lt;br /&gt;
lemma ejercicio_13:&lt;br /&gt;
  assumes &amp;quot;p&amp;quot;&lt;br /&gt;
          &amp;quot;q&amp;quot; &lt;br /&gt;
  shows &amp;quot;p ∧ q&amp;quot;&lt;br /&gt;
using assms(1, 2) by (rule conjI)&lt;br /&gt;
&lt;br /&gt;
(* benber manperjim josgomrom4 cammonagu raffergon2 marfruman1 alfmarcua&lt;br /&gt;
   enrparalv chrgencar gleherlop pabbergue antramhur juacanrod hugrubsan  &lt;br /&gt;
   alikan *)&lt;br /&gt;
lemma ejercicio_13_1:&lt;br /&gt;
  assumes &amp;quot;p&amp;quot;&lt;br /&gt;
          &amp;quot;q&amp;quot; &lt;br /&gt;
  shows &amp;quot;p ∧ q&amp;quot;&lt;br /&gt;
  using assms by (rule conjI)&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 14. Demostrar&lt;br /&gt;
     p ∧ q ⊢ p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon  josgomrom4 *)&lt;br /&gt;
lemma ejercicio_14:&lt;br /&gt;
  assumes &amp;quot;p ∧ q&amp;quot;  &lt;br /&gt;
  shows   &amp;quot;p&amp;quot;&lt;br /&gt;
  using assms(1) by (rule conjunct1)&lt;br /&gt;
&lt;br /&gt;
(* benber manperjim cammonagu raffergon2 marfruman1 alfmarcua enrparalv&lt;br /&gt;
   chrgencar pabbergue gleherlop antramhur hugrubsan juacanrod alikan *) &lt;br /&gt;
lemma ejercicio_14_1:&lt;br /&gt;
  assumes &amp;quot;p ∧ q&amp;quot;  &lt;br /&gt;
  shows   &amp;quot;p&amp;quot;&lt;br /&gt;
  using assms by (rule conjunct1)&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 15. Demostrar&lt;br /&gt;
     p ∧ q ⊢ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim juacanrod josgomrom4 *)&lt;br /&gt;
lemma ejercicio_15:&lt;br /&gt;
  assumes &amp;quot;p ∧ q&amp;quot; &lt;br /&gt;
  shows   &amp;quot;q&amp;quot;&lt;br /&gt;
  using assms(1) by (rule conjunct2)&lt;br /&gt;
&lt;br /&gt;
(* benber cammonagu raffergon2 marfruman1 alfmarcua enrparalv chrgencar&lt;br /&gt;
   pabbergue antramhur gleherlop hugrubsan alikan *) &lt;br /&gt;
lemma ejercicio_15_1:&lt;br /&gt;
  assumes &amp;quot;p ∧ q&amp;quot; &lt;br /&gt;
  shows   &amp;quot;q&amp;quot;&lt;br /&gt;
  using assms by (rule conjunct2)&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 16. Demostrar&lt;br /&gt;
     p ∧ (q ∧ r) ⊢ (p ∧ q) ∧ r&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim josgomrom4 raffergon2 marfruman1 alfmarcua&lt;br /&gt;
   cammmonagu enrparalv chrgencar gleherlop pabbergue antramhur&lt;br /&gt;
   hugrubsan alikan juacanrod cammonagu *)  &lt;br /&gt;
lemma ejercicio_16:&lt;br /&gt;
  assumes &amp;quot;p ∧ (q ∧ r)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;(p ∧ q) ∧ r&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have 1: &amp;quot;p&amp;quot; using assms(1) by (rule conjunct1)&lt;br /&gt;
  have 2: &amp;quot;q ∧ r&amp;quot; using assms(1) by (rule conjunct2)&lt;br /&gt;
  have 3: &amp;quot;q&amp;quot; using 2 by (rule conjunct1)&lt;br /&gt;
  have 4: &amp;quot;r&amp;quot; using 2 by (rule conjunct2)&lt;br /&gt;
  have 5: &amp;quot;p ∧ q&amp;quot; using 1 3 by (rule conjI)&lt;br /&gt;
  show &amp;quot;(p ∧ q) ∧ r&amp;quot; using 5 4 by (rule conjI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber *)&lt;br /&gt;
lemma ejercicio_16_1:&lt;br /&gt;
  assumes &amp;quot;p ∧ (q ∧ r)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;(p ∧ q) ∧ r&amp;quot;&lt;br /&gt;
proof - (* TODO? *)&lt;br /&gt;
  have &amp;quot;q ∧ r&amp;quot; using assms by (rule conjunct2)&lt;br /&gt;
  have &amp;quot;p&amp;quot; using assms by (rule conjunct1)&lt;br /&gt;
  moreover have &amp;quot;q&amp;quot; using `q ∧ r` by (rule conjunct1)&lt;br /&gt;
  ultimately have &amp;quot;p ∧ q&amp;quot; by (rule conjI)&lt;br /&gt;
  moreover have &amp;quot;r&amp;quot; using `q ∧ r` by (rule conjunct2)&lt;br /&gt;
  ultimately show &amp;quot;(p ∧ q) ∧ r&amp;quot; by (rule conjI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 17. Demostrar&lt;br /&gt;
     (p ∧ q) ∧ r ⊢ p ∧ (q ∧ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim josgomrom4 raffergon2 marfruman1 alfmarcua&lt;br /&gt;
   cammonagu chrgencar gleherlop pabbergue antramhur enrparalv hugrubsan&lt;br /&gt;
   juacanrod alikan *)  &lt;br /&gt;
lemma ejercicio_17:&lt;br /&gt;
  assumes 1: &amp;quot;(p ∧ q) ∧ r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ∧ (q ∧ r)&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have 2: &amp;quot;r&amp;quot; using 1 by (rule conjunct2)&lt;br /&gt;
  have 3: &amp;quot;p ∧ q&amp;quot; using 1 by (rule conjunct1)&lt;br /&gt;
  have 4: &amp;quot;p&amp;quot; using 3 by (rule conjunct1)&lt;br /&gt;
  have 5: &amp;quot;q&amp;quot; using 3 by (rule conjunct2)&lt;br /&gt;
  have 6: &amp;quot;q ∧ r&amp;quot; using 5 2 by (rule conjI)&lt;br /&gt;
  show ?thesis using 4 6 by (rule conjI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber *)&lt;br /&gt;
lemma ejercicio_17_1:&lt;br /&gt;
  assumes &amp;quot;(p ∧ q) ∧ r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ∧ (q ∧ r)&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;p ∧ q&amp;quot; using assms by (rule conjunct1)&lt;br /&gt;
  have &amp;quot;p&amp;quot; using `p ∧ q` by (rule conjunct1)&lt;br /&gt;
  moreover have &amp;quot;q ∧ r&amp;quot;&lt;br /&gt;
  proof (rule conjI)&lt;br /&gt;
    show &amp;quot;q&amp;quot; using `p ∧ q` by (rule conjunct2)&lt;br /&gt;
  next&lt;br /&gt;
    show &amp;quot;r&amp;quot; using assms by (rule conjunct2)&lt;br /&gt;
  qed&lt;br /&gt;
  ultimately show ?thesis by (rule conjI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 18. Demostrar&lt;br /&gt;
     p ∧ q ⊢ p ⟶ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon raffergon2 marfruman1 juacanrod alikan*)&lt;br /&gt;
lemma ejercicio_18:&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 impI)&lt;br /&gt;
  assume &amp;quot;p&amp;quot;&lt;br /&gt;
  show &amp;quot;q&amp;quot; using assms(1) by (rule conjunct2)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber manperjim josgomrom4 cammonagu alfmarcua chrgencar pabbergue&lt;br /&gt;
   gleherlop antramhur enrparalv hugrubsan *) &lt;br /&gt;
lemma ejercicio_18_1:&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;q&amp;quot; using assms by (rule conjunct2)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 19. Demostrar&lt;br /&gt;
     (p ⟶ q) ∧ (p ⟶ r) ⊢ p ⟶ q ∧ r   &lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim josgomrom4 raffergon2 marfruman1 alfmarcua&lt;br /&gt;
   cammonagu chrgencar gleherlop pabbergue antramhur enrparalv juacanrod&lt;br /&gt;
   hugrubsan alikan *)  &lt;br /&gt;
lemma ejercicio_19:&lt;br /&gt;
  assumes 1: &amp;quot;(p ⟶ q) ∧ (p ⟶ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ⟶ q ∧ r&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume 2: &amp;quot;p&amp;quot;&lt;br /&gt;
  have 3: &amp;quot;p ⟶ q&amp;quot; using 1 by (rule conjunct1)&lt;br /&gt;
  have 4: &amp;quot;p ⟶ r&amp;quot; using 1 by (rule conjunct2)&lt;br /&gt;
  have 5: &amp;quot;q&amp;quot; using 3 2 by (rule mp)&lt;br /&gt;
  have 6: &amp;quot;r&amp;quot; using 4 2 by (rule mp)&lt;br /&gt;
  show &amp;quot;q ∧ r&amp;quot; using 5 6 by (rule conjI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber cammonagu *)&lt;br /&gt;
lemma ejercicio_19_1:&lt;br /&gt;
  assumes &amp;quot;(p ⟶ q) ∧ (p ⟶ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ⟶ q ∧ r&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume p&lt;br /&gt;
  show &amp;quot;q ∧ r&amp;quot;&lt;br /&gt;
  proof&lt;br /&gt;
    have &amp;quot;p ⟶ q&amp;quot; using assms by (rule conjunct1)&lt;br /&gt;
    thus &amp;quot;q&amp;quot; using `p` by (rule mp)&lt;br /&gt;
  next&lt;br /&gt;
    have &amp;quot;p ⟶ r&amp;quot; using assms by (rule conjunct2)&lt;br /&gt;
    thus &amp;quot;r&amp;quot; using `p` by (rule mp)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 20. Demostrar&lt;br /&gt;
     p ⟶ q ∧ r ⊢ (p ⟶ q) ∧ (p ⟶ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim josgomrom4 raffergon2 marfruman1 alfmarcua&lt;br /&gt;
   cammonagu chrgencar gleherlop pabbergue antramhur enrparalv juacanrod&lt;br /&gt;
   hugrubsan alikan *)  &lt;br /&gt;
lemma ejercicio_20:&lt;br /&gt;
  assumes 1: &amp;quot;p ⟶ q ∧ r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;(p ⟶ q) ∧ (p ⟶ r)&amp;quot;&lt;br /&gt;
proof (rule conjI)&lt;br /&gt;
  show &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;
    have 3: &amp;quot;q ∧ r&amp;quot; using 1 2 by (rule mp)&lt;br /&gt;
    show 4: &amp;quot;q&amp;quot; using 3 by (rule conjunct1)&lt;br /&gt;
  qed&lt;br /&gt;
  show &amp;quot;p ⟶ r&amp;quot;&lt;br /&gt;
  proof (rule impI)&lt;br /&gt;
    assume 2: &amp;quot;p&amp;quot;&lt;br /&gt;
    have 3: &amp;quot;q ∧ r&amp;quot; using 1 2 by (rule mp)&lt;br /&gt;
    show 4: &amp;quot;r&amp;quot; using 3 by (rule conjunct2)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber *)&lt;br /&gt;
lemma ejercicio_20_1:&lt;br /&gt;
  assumes &amp;quot;p ⟶ q ∧ r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;(p ⟶ q) ∧ (p ⟶ r)&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  show &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
  proof&lt;br /&gt;
    assume &amp;quot;p&amp;quot;&lt;br /&gt;
    with assms have &amp;quot;q ∧ r&amp;quot; by (rule mp)&lt;br /&gt;
    thus &amp;quot;q&amp;quot; by (rule conjunct1)&lt;br /&gt;
  qed&lt;br /&gt;
next&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;
    with assms have &amp;quot;q ∧ r&amp;quot; by (rule mp)&lt;br /&gt;
    thus &amp;quot;r&amp;quot; by (rule conjunct2)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 21. Demostrar&lt;br /&gt;
     p ⟶ (q ⟶ r) ⊢ p ∧ q ⟶ r&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim josgomrom4 raffergon2 marfruman1 alfmarcua&lt;br /&gt;
   cammonagu chrgencar pabbergue gleherlop antramhur enrparalv juacanrod&lt;br /&gt;
   hugrubsan alikan *)  &lt;br /&gt;
lemma ejercicio_21:&lt;br /&gt;
  assumes 1: &amp;quot;p ⟶ (q ⟶ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ∧ q ⟶ r&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume 2: &amp;quot;p ∧ q&amp;quot;&lt;br /&gt;
  have 3: &amp;quot;p&amp;quot; using 2 by (rule conjunct1)&lt;br /&gt;
  have 4: &amp;quot;q ⟶ r&amp;quot; using 1 3 by (rule mp)&lt;br /&gt;
  have 5: &amp;quot;q&amp;quot; using 2 by (rule conjunct2)&lt;br /&gt;
  show &amp;quot;r&amp;quot; using 4 5 by (rule mp)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber *)&lt;br /&gt;
lemma ejercicio_21_1:&lt;br /&gt;
  assumes &amp;quot;p ⟶ (q ⟶ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ∧ q ⟶ r&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume &amp;quot;p ∧ q&amp;quot;&lt;br /&gt;
  hence &amp;quot;p&amp;quot; by (rule conjunct1)&lt;br /&gt;
  with `p ⟶ (q ⟶ r)` have &amp;quot;q ⟶ r&amp;quot; by (rule mp)&lt;br /&gt;
  moreover from `p ∧ q` have &amp;quot;q&amp;quot; by (rule conjunct2)&lt;br /&gt;
  ultimately show &amp;quot;r&amp;quot; by (rule mp)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 22. Demostrar&lt;br /&gt;
     p ∧ q ⟶ r ⊢ p ⟶ (q ⟶ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim josgomrom4 raffergon2 marfruman1 alfmarcua&lt;br /&gt;
   chrgencar pabbergue gleherlop antramhur enrparalv juacanrod hugrubsan&lt;br /&gt;
   alikan *)  &lt;br /&gt;
lemma ejercicio_22:&lt;br /&gt;
  assumes 1: &amp;quot;p ∧ q ⟶ r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ⟶ (q ⟶ r)&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume 2: &amp;quot;p&amp;quot;&lt;br /&gt;
  show &amp;quot;q ⟶ r&amp;quot;&lt;br /&gt;
  proof (rule impI)&lt;br /&gt;
    assume 3: &amp;quot;q&amp;quot;&lt;br /&gt;
    have 4: &amp;quot;p ∧ q&amp;quot; using 2 3 by (rule conjI)&lt;br /&gt;
    show &amp;quot;r&amp;quot; using 1 4 by (rule mp)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber cammonagu *)&lt;br /&gt;
lemma ejercicio_22_1:&lt;br /&gt;
  assumes &amp;quot;p ∧ q ⟶ r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ⟶ (q ⟶ r)&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume &amp;quot;p&amp;quot;&lt;br /&gt;
  show &amp;quot;q ⟶ r&amp;quot;&lt;br /&gt;
  proof&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 `p ∧ q ⟶ r` show &amp;quot;r&amp;quot; by (rule mp)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 23. Demostrar&lt;br /&gt;
     (p ⟶ q) ⟶ r ⊢ p ∧ q ⟶ r&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim josgomrom4 raffergon2 marfruman1 alfmarcua&lt;br /&gt;
   chrgencar pabbergue gleherlop antramhur enrparalv juacanrod hugrubsan&lt;br /&gt;
   alikan *)  &lt;br /&gt;
lemma ejercicio_23:&lt;br /&gt;
  assumes 1: &amp;quot;(p ⟶ q) ⟶ r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ∧ q ⟶ r&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume 2: &amp;quot;p ∧ q&amp;quot;&lt;br /&gt;
  have 3: &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
  proof (rule impI)&lt;br /&gt;
    assume &amp;quot;p&amp;quot;&lt;br /&gt;
    show &amp;quot;q&amp;quot; using 2 by (rule conjunct2)&lt;br /&gt;
  qed&lt;br /&gt;
  show &amp;quot;r&amp;quot; using 1 3 by (rule mp)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber cammonagu *)&lt;br /&gt;
lemma ejercicio_23_1:&lt;br /&gt;
  assumes &amp;quot;(p ⟶ q) ⟶ r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ∧ q ⟶ r&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume &amp;quot;p ∧ q&amp;quot;&lt;br /&gt;
  hence &amp;quot;q&amp;quot; by (rule conjunct2)&lt;br /&gt;
  hence &amp;quot;p ⟶ q&amp;quot; by (rule impI)&lt;br /&gt;
  with `(p ⟶ q) ⟶ r` show &amp;quot;r&amp;quot; by (rule mp)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 24. Demostrar&lt;br /&gt;
     p ∧ (q ⟶ r) ⊢ (p ⟶ q) ⟶ r&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim josgomrom4 raffergon2 marfruman1 alfmarcua&lt;br /&gt;
   chrgencar pabbergue gleherlop antramhur enrparalv hugrubsan juacanrod&lt;br /&gt;
   cammonagu alikan *)  &lt;br /&gt;
lemma ejercicio_24:&lt;br /&gt;
  assumes 1: &amp;quot;p ∧ (q ⟶ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;(p ⟶ q) ⟶ r&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume 2: &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
  have 3: &amp;quot;p&amp;quot; using 1 by (rule conjunct1)&lt;br /&gt;
  have 4: &amp;quot;q ⟶ r&amp;quot; using 1 by (rule conjunct2)&lt;br /&gt;
  have 5: &amp;quot;q&amp;quot; using 2 3 by (rule mp)&lt;br /&gt;
  show 6: &amp;quot;r&amp;quot; using 4 5 by (rule mp)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber *)&lt;br /&gt;
lemma ejercicio_24_1:&lt;br /&gt;
  assumes &amp;quot;p ∧ (q ⟶ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;(p ⟶ q) ⟶ r&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  have &amp;quot;q ⟶ r&amp;quot; using assms by (rule conjunct2)&lt;br /&gt;
  assume &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
  moreover have &amp;quot;p&amp;quot; using assms by (rule conjunct1)&lt;br /&gt;
  ultimately have &amp;quot;q&amp;quot; by (rule mp)&lt;br /&gt;
  with `q ⟶ r` show r by (rule mp)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
section {* Disyunciones *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 25. Demostrar&lt;br /&gt;
     p ⊢ p ∨ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim josgomrom4 benber cammonagu raffergon2 marfruman1&lt;br /&gt;
   alfmarcua chrgencar gleherlop pabbergue antramhur enrparalv juacanrod&lt;br /&gt;
   hugrubsan alikan *)  &lt;br /&gt;
lemma ejercicio_25:&lt;br /&gt;
  assumes &amp;quot;p&amp;quot;&lt;br /&gt;
  shows   &amp;quot;p ∨ q&amp;quot;&lt;br /&gt;
  using assms(1) by (rule disjI1)&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 26. Demostrar&lt;br /&gt;
     q ⊢ p ∨ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim josgomrom4 benber cammonagu marfruman1 alfmarcua&lt;br /&gt;
   chrgencar pabbergue gleherlop antramhur enrparalv juacanrod hugrubsan&lt;br /&gt;
   alikan *)  &lt;br /&gt;
lemma ejercicio_26:&lt;br /&gt;
  assumes &amp;quot;q&amp;quot;&lt;br /&gt;
  shows   &amp;quot;p ∨ q&amp;quot;&lt;br /&gt;
  using assms(1) by (rule disjI2)&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 27. Demostrar&lt;br /&gt;
     p ∨ q ⊢ q ∨ p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim josgomrom4 raffergon2 marfruman1 chrgencar&lt;br /&gt;
   pabbergue antramhur enrparalv juacanrod hugrubsan cammonagu alikan *) &lt;br /&gt;
lemma ejercicio_27:&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 proof (rule disjE)&lt;br /&gt;
  assume 2: &amp;quot;p&amp;quot; thus &amp;quot;q ∨ p&amp;quot; by (rule disjI2)&lt;br /&gt;
next&lt;br /&gt;
  assume 3: &amp;quot;q&amp;quot; thus &amp;quot;q ∨ p&amp;quot; by (rule disjI1)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber alfmarcua gleherlop *)&lt;br /&gt;
lemma ejercicio_27_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 .&lt;br /&gt;
  moreover have &amp;quot;p ⟹ q ∨ p&amp;quot; by (rule disjI2)&lt;br /&gt;
  moreover have &amp;quot;q ⟹ q ∨ p&amp;quot; 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;
  Ejercicio 28. Demostrar&lt;br /&gt;
     q ⟶ r ⊢ p ∨ q ⟶ p ∨ r&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim josgomrom4 raffergon2 marfruman1 chrgencar&lt;br /&gt;
   gleherlop alfmarcua pabbergue antramhur enrparalv juacanrod hugrubsan&lt;br /&gt;
   cammonagu alikan *) &lt;br /&gt;
lemma ejercicio_28:&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; show &amp;quot;p ∨ r&amp;quot; using 2&lt;br /&gt;
  proof (rule disjE)&lt;br /&gt;
    assume 3: p thus &amp;quot;p ∨ r&amp;quot; by (rule disjI1)&lt;br /&gt;
  next&lt;br /&gt;
    assume 4: q have r using 1 4 by (rule mp)&lt;br /&gt;
    thus &amp;quot;p ∨ r&amp;quot; by (rule disjI2)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber *)&lt;br /&gt;
lemma ejercicio_28_1:&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;
  moreover have &amp;quot;p ⟹ p ∨ r&amp;quot; by (rule disjI1)&lt;br /&gt;
  moreover have &amp;quot;q ⟹ p ∨ r&amp;quot;&lt;br /&gt;
  proof (rule disjI2)&lt;br /&gt;
    assume &amp;quot;q&amp;quot;&lt;br /&gt;
    with `q ⟶ r` show &amp;quot;r&amp;quot; by (rule mp)&lt;br /&gt;
  qed&lt;br /&gt;
  ultimately show &amp;quot;p ∨ r&amp;quot; by (rule disjE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 29. Demostrar&lt;br /&gt;
     p ∨ p ⊢ p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon juacanrod marfruman1 *)&lt;br /&gt;
lemma ejercicio_29:&lt;br /&gt;
  assumes 1: &amp;quot;p ∨ p&amp;quot;&lt;br /&gt;
  shows   &amp;quot;p&amp;quot;&lt;br /&gt;
using 1 proof (rule disjE)&lt;br /&gt;
  assume &amp;quot;p&amp;quot; thus &amp;quot;p&amp;quot; .&lt;br /&gt;
next&lt;br /&gt;
  assume &amp;quot;p&amp;quot; thus &amp;quot;p&amp;quot; .&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber manperjim cammonagu josgomrom4 raffergon2 chrgencar alfmarcua&lt;br /&gt;
   gleherlop pabbergue antramhur enrparalv hugrubsan alikan *) &lt;br /&gt;
lemma ejercicio_29_1:&lt;br /&gt;
  assumes &amp;quot;p ∨ p&amp;quot;&lt;br /&gt;
  shows   &amp;quot;p&amp;quot;&lt;br /&gt;
  using assms by (rule disjE)&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 30. Demostrar&lt;br /&gt;
     p ⊢ p ∨ p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim  benber josgomrom4 raffergon2 marfruman1&lt;br /&gt;
   chrgencar alfmarcua pabbergue gleherlop antramhur enrparalv hugrubsan&lt;br /&gt;
   juacanrod cammonagu alikan *)  &lt;br /&gt;
lemma ejercicio_30:&lt;br /&gt;
  assumes &amp;quot;p&amp;quot;&lt;br /&gt;
  shows   &amp;quot;p ∨ p&amp;quot;&lt;br /&gt;
  using assms(1) by (rule disjI1)&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 31. Demostrar&lt;br /&gt;
     p ∨ (q ∨ r) ⊢ (p ∨ q) ∨ r&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim marfruman1 josgomrom4 alfmarcua pabbergue&lt;br /&gt;
   gleherlop antramhur enrparalv juacanrod hugrubsan alikan *) &lt;br /&gt;
lemma ejercicio_31:&lt;br /&gt;
  assumes 1: &amp;quot;p ∨ (q ∨ r)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;(p ∨ q) ∨ r&amp;quot; (is &amp;quot;?R&amp;quot;)&lt;br /&gt;
using 1 proof (rule disjE)&lt;br /&gt;
  assume &amp;quot;p&amp;quot; hence &amp;quot;p ∨ q&amp;quot; by (rule disjI1)&lt;br /&gt;
  thus ?R by (rule disjI1)&lt;br /&gt;
next&lt;br /&gt;
  assume &amp;quot;q ∨ r&amp;quot; thus ?R&lt;br /&gt;
  proof (rule disjE)&lt;br /&gt;
    assume &amp;quot;q&amp;quot; hence &amp;quot;p ∨ q&amp;quot; by (rule disjI2)&lt;br /&gt;
    thus &amp;quot;(p ∨ q) ∨ r&amp;quot; by (rule disjI1)&lt;br /&gt;
  next&lt;br /&gt;
    assume &amp;quot;r&amp;quot; thus ?thesis by (rule disjI2)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber cammonagu *)&lt;br /&gt;
lemma ejercicio_31_1:&lt;br /&gt;
  assumes &amp;quot;p ∨ (q ∨ r)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;(p ∨ q) ∨ r&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;p ∨ (q ∨ r)&amp;quot; using assms .&lt;br /&gt;
  moreover {&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) ∨ r&amp;quot; by (rule disjI1)&lt;br /&gt;
  }&lt;br /&gt;
  moreover {&lt;br /&gt;
    assume &amp;quot;q ∨ r&amp;quot;&lt;br /&gt;
    moreover {&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;
      hence &amp;quot;(p ∨ q) ∨ r&amp;quot; by (rule disjI1)&lt;br /&gt;
    }&lt;br /&gt;
    moreover {&lt;br /&gt;
      assume &amp;quot;r&amp;quot;&lt;br /&gt;
      hence &amp;quot;(p ∨ q) ∨ r&amp;quot; by (rule disjI2)&lt;br /&gt;
    }&lt;br /&gt;
    ultimately have &amp;quot;(p ∨ q) ∨ r&amp;quot; by (rule disjE)&lt;br /&gt;
  }&lt;br /&gt;
  ultimately show &amp;quot;(p ∨ q) ∨ r&amp;quot; by (rule disjE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 32. Demostrar&lt;br /&gt;
     (p ∨ q) ∨ r ⊢ p ∨ (q ∨ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim marfruman1 josgomrom4 alfmarcua gleherlop&lt;br /&gt;
   pabbergue antramhur enrparalv juacanrod hugrubsan alikan *) &lt;br /&gt;
lemma ejercicio_32:&lt;br /&gt;
  assumes 1: &amp;quot;(p ∨ q) ∨ r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ∨ (q ∨ r)&amp;quot;&lt;br /&gt;
using 1 proof (rule disjE)&lt;br /&gt;
  assume &amp;quot;p ∨ q&amp;quot; thus ?thesis&lt;br /&gt;
  proof (rule disjE)&lt;br /&gt;
    assume p thus ?thesis by (rule disjI1)&lt;br /&gt;
  next&lt;br /&gt;
    assume q hence &amp;quot;q ∨ r&amp;quot; by (rule disjI1)&lt;br /&gt;
    thus ?thesis by (rule disjI2)&lt;br /&gt;
  qed&lt;br /&gt;
next&lt;br /&gt;
  assume r hence &amp;quot;q ∨ r&amp;quot; by (rule disjI2)&lt;br /&gt;
  thus ?thesis by (rule disjI2)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber cammonagu *)&lt;br /&gt;
lemma ejercicio_32_1:&lt;br /&gt;
  assumes &amp;quot;(p ∨ q) ∨ r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ∨ (q ∨ r)&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;(p ∨ q) ∨ r&amp;quot; using assms .&lt;br /&gt;
  moreover {&lt;br /&gt;
    assume &amp;quot;p ∨ q&amp;quot;&lt;br /&gt;
    moreover {&lt;br /&gt;
      assume &amp;quot;p&amp;quot;&lt;br /&gt;
      hence ?thesis by (rule disjI1)&lt;br /&gt;
    }&lt;br /&gt;
    moreover {&lt;br /&gt;
      assume &amp;quot;q&amp;quot;&lt;br /&gt;
      hence &amp;quot;q ∨ r&amp;quot; by (rule disjI1)&lt;br /&gt;
      hence ?thesis by (rule disjI2)&lt;br /&gt;
    }&lt;br /&gt;
    ultimately have ?thesis by (rule disjE)&lt;br /&gt;
  }&lt;br /&gt;
  moreover {&lt;br /&gt;
    assume &amp;quot;r&amp;quot;&lt;br /&gt;
    hence &amp;quot;q ∨ r&amp;quot; by (rule disjI2)&lt;br /&gt;
    hence ?thesis by (rule disjI2)&lt;br /&gt;
  }&lt;br /&gt;
  ultimately show ?thesis by (rule disjE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 33. Demostrar&lt;br /&gt;
     p ∧ (q ∨ r) ⊢ (p ∧ q) ∨ (p ∧ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim marfruman1 josgomrom4 chrgencar gleherlop&lt;br /&gt;
   alfmarcua pabbergue antramhur enrparalv juacanrod hugrubsan alikan *) &lt;br /&gt;
lemma ejercicio_33:&lt;br /&gt;
  assumes 1: &amp;quot;p ∧ (q ∨ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;(p ∧ q) ∨ (p ∧ r)&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have 2: p using 1 by (rule conjunct1)&lt;br /&gt;
  show ?thesis&lt;br /&gt;
  proof (rule disjE)&lt;br /&gt;
    assume 3: q have &amp;quot;p ∧ q&amp;quot; using 2 3 by (rule conjI)&lt;br /&gt;
    thus ?thesis by (rule disjI1)&lt;br /&gt;
  next&lt;br /&gt;
    assume 4: r have &amp;quot;p ∧ r&amp;quot; using 2 4 by (rule conjI)&lt;br /&gt;
    thus ?thesis by (rule disjI2)&lt;br /&gt;
  next&lt;br /&gt;
    show &amp;quot;q ∨ r&amp;quot; using 1 by (rule conjunct2)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber cammonagu *)&lt;br /&gt;
lemma ejercicio_33_1:&lt;br /&gt;
  assumes &amp;quot;p ∧ (q ∨ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;(p ∧ q) ∨ (p ∧ r)&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;p&amp;quot; using assms by (rule conjunct1)&lt;br /&gt;
  have &amp;quot;q ∨ r&amp;quot; using assms by (rule conjunct2)&lt;br /&gt;
  moreover {&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;
    hence ?thesis by (rule disjI1)&lt;br /&gt;
  }&lt;br /&gt;
  moreover {&lt;br /&gt;
    assume &amp;quot;r&amp;quot;&lt;br /&gt;
    with `p` have &amp;quot;p ∧ r&amp;quot; by (rule conjI)&lt;br /&gt;
    hence ?thesis by (rule disjI2)&lt;br /&gt;
  }&lt;br /&gt;
  ultimately show ?thesis by (rule disjE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 34. Demostrar&lt;br /&gt;
     (p ∧ q) ∨ (p ∧ r) ⊢ p ∧ (q ∨ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim marfruman1 josgomrom4 chrgencar alfmarcua&lt;br /&gt;
   gleherlop pabbergue antramhur enrparalv juacanrod hugrubsan alikan *) &lt;br /&gt;
lemma ejercicio_34:&lt;br /&gt;
  assumes &amp;quot;(p ∧ q) ∨ (p ∧ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ∧ (q ∨ r)&amp;quot;&lt;br /&gt;
using assms(1) proof (rule disjE)&lt;br /&gt;
  assume 2: &amp;quot;p ∧ q&amp;quot; hence q by (rule conjunct2)&lt;br /&gt;
  hence 3: &amp;quot;q ∨ r&amp;quot; by (rule disjI1)&lt;br /&gt;
  have p using 2 by (rule conjunct1)&lt;br /&gt;
  thus ?thesis using 3 by (rule conjI)&lt;br /&gt;
next&lt;br /&gt;
  assume 4: &amp;quot;p ∧ r&amp;quot; hence r by (rule conjunct2)&lt;br /&gt;
  hence 5: &amp;quot;q ∨ r&amp;quot; by (rule disjI2)&lt;br /&gt;
  have p using 4 by (rule conjunct1)&lt;br /&gt;
  thus ?thesis using 5 by (rule conjI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber cammonagu *)&lt;br /&gt;
lemma ejercicio_34_1:&lt;br /&gt;
  assumes &amp;quot;(p ∧ q) ∨ (p ∧ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ∧ (q ∨ r)&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;(p ∧ q) ∨ (p ∧ r)&amp;quot; using assms .&lt;br /&gt;
  moreover {&lt;br /&gt;
    assume &amp;quot;p ∧ q&amp;quot;&lt;br /&gt;
    hence &amp;quot;p&amp;quot; by (rule conjunct1)&lt;br /&gt;
    moreover {&lt;br /&gt;
      have &amp;quot;q&amp;quot; using `p ∧ q` by (rule conjunct2)&lt;br /&gt;
      hence &amp;quot;q ∨ r&amp;quot; by (rule disjI1)&lt;br /&gt;
    }&lt;br /&gt;
    ultimately have ?thesis by (rule conjI)&lt;br /&gt;
  }&lt;br /&gt;
  moreover {&lt;br /&gt;
    assume &amp;quot;p ∧ r&amp;quot;&lt;br /&gt;
    hence &amp;quot;p&amp;quot; by (rule conjunct1)&lt;br /&gt;
    moreover {&lt;br /&gt;
      have &amp;quot;r&amp;quot; using `p ∧ r` by (rule conjunct2)&lt;br /&gt;
      hence &amp;quot;q ∨ r&amp;quot; by (rule disjI2)&lt;br /&gt;
    }&lt;br /&gt;
    ultimately have ?thesis by (rule conjI)&lt;br /&gt;
  }&lt;br /&gt;
  ultimately show ?thesis by (rule disjE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 35. Demostrar&lt;br /&gt;
     p ∨ (q ∧ r) ⊢ (p ∨ q) ∧ (p ∨ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim marfruman1 josgomrom4 chrgencar alfmarcua&lt;br /&gt;
   gleherlop pabbergue antramhur enrparalv juacanrod hugrubsan alikan *) &lt;br /&gt;
lemma ejercicio_35:&lt;br /&gt;
  assumes &amp;quot;p ∨ (q ∧ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;(p ∨ q) ∧ (p ∨ r)&amp;quot;&lt;br /&gt;
using assms(1) proof (rule disjE)&lt;br /&gt;
  assume 1: p hence 2: &amp;quot;p ∨ r&amp;quot; by (rule disjI1)&lt;br /&gt;
  have &amp;quot;p ∨ q&amp;quot; using 1 by (rule disjI1)&lt;br /&gt;
  thus ?thesis using 2 by (rule conjI)&lt;br /&gt;
next&lt;br /&gt;
  assume 3: &amp;quot;q ∧ r&amp;quot; hence r by (rule conjunct2)&lt;br /&gt;
  hence 4: &amp;quot;p ∨ r&amp;quot; by (rule disjI2)&lt;br /&gt;
  have q using 3 by (rule conjunct1)&lt;br /&gt;
  hence &amp;quot;p ∨ q&amp;quot; by (rule disjI2)&lt;br /&gt;
  thus ?thesis using 4 by (rule conjI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber cammonagu *)&lt;br /&gt;
lemma ejercicio_35_1:&lt;br /&gt;
  assumes &amp;quot;p ∨ (q ∧ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;(p ∨ q) ∧ (p ∨ r)&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;p ∨ (q ∧ r)&amp;quot; using assms .&lt;br /&gt;
  moreover {&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;
    moreover have &amp;quot;p ∨ r&amp;quot; using `p` by (rule disjI1)&lt;br /&gt;
    ultimately have ?thesis by (rule conjI)&lt;br /&gt;
  }&lt;br /&gt;
  moreover {&lt;br /&gt;
    assume &amp;quot;q ∧ r&amp;quot;&lt;br /&gt;
    {&lt;br /&gt;
      have &amp;quot;q&amp;quot; using `q ∧ r` by (rule conjunct1)&lt;br /&gt;
      hence &amp;quot;p ∨ q&amp;quot; by (rule disjI2)&lt;br /&gt;
    }&lt;br /&gt;
    moreover {&lt;br /&gt;
      have &amp;quot;r&amp;quot; using `q ∧ r` by (rule conjunct2)&lt;br /&gt;
      hence &amp;quot;p ∨ r&amp;quot; by (rule disjI2)&lt;br /&gt;
    }&lt;br /&gt;
    ultimately have ?thesis by (rule conjI)&lt;br /&gt;
  }&lt;br /&gt;
  ultimately show ?thesis by (rule disjE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 36. Demostrar&lt;br /&gt;
     (p ∨ q) ∧ (p ∨ r) ⊢ p ∨ (q ∧ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim marfruman1 josgomrom4 chrgencar alfmarcua&lt;br /&gt;
   gleherlop pabbergue antramhur enrparalv juacanrod hugrubsan alikan *) &lt;br /&gt;
lemma ejercicio_36:&lt;br /&gt;
  assumes 1: &amp;quot;(p ∨ q) ∧ (p ∨ r)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;p ∨ (q ∧ r)&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have 2: &amp;quot;p ∨ q&amp;quot; using 1 by (rule conjunct1)&lt;br /&gt;
  have 3: &amp;quot;p ∨ r&amp;quot; using 1 by (rule conjunct2)&lt;br /&gt;
  show ?thesis using 2&lt;br /&gt;
  proof (rule disjE)&lt;br /&gt;
    assume p thus ?thesis by (rule disjI1)&lt;br /&gt;
  next&lt;br /&gt;
    assume 4: q show ?thesis using 3&lt;br /&gt;
    proof (rule disjE)&lt;br /&gt;
      assume p thus ?thesis by (rule disjI1)&lt;br /&gt;
    next&lt;br /&gt;
      assume 5: r have &amp;quot;q ∧ r&amp;quot; using 4 5 by (rule conjI)&lt;br /&gt;
      thus ?thesis by (rule disjI2)&lt;br /&gt;
    qed&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber cammonagu *)&lt;br /&gt;
lemma ejercicio_36_1:&lt;br /&gt;
  assumes &amp;quot;(p ∨ q) ∧ (p ∨ r)&amp;quot;&lt;br /&gt;
  shows   &amp;quot;p ∨ (q ∧ r)&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;p ∨ q&amp;quot; using assms by (rule conjunct1)&lt;br /&gt;
  moreover {&lt;br /&gt;
    assume &amp;quot;p&amp;quot;&lt;br /&gt;
    hence ?thesis by (rule disjI1)&lt;br /&gt;
  }&lt;br /&gt;
  moreover {&lt;br /&gt;
    assume &amp;quot;q&amp;quot;&lt;br /&gt;
    have &amp;quot;p ∨ r&amp;quot; using assms by (rule conjunct2)&lt;br /&gt;
    moreover {&lt;br /&gt;
      assume &amp;quot;p&amp;quot;&lt;br /&gt;
      hence ?thesis by (rule disjI1)&lt;br /&gt;
    }&lt;br /&gt;
    moreover {&lt;br /&gt;
      assume &amp;quot;r&amp;quot;&lt;br /&gt;
      with `q` have &amp;quot;q ∧ r&amp;quot; by (rule conjI)&lt;br /&gt;
      hence ?thesis by (rule disjI2)&lt;br /&gt;
    }&lt;br /&gt;
    ultimately have ?thesis by (rule disjE)&lt;br /&gt;
  }&lt;br /&gt;
  ultimately show ?thesis by (rule disjE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 37. Demostrar&lt;br /&gt;
     (p ⟶ r) ∧ (q ⟶ r) ⊢ p ∨ q ⟶ r&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim marfruman1 josgomrom4 alfmarcua gleherlop&lt;br /&gt;
   pabbergue antramhur enrparalv juacanrod hugrubsan alikan *) &lt;br /&gt;
lemma ejercicio_37:&lt;br /&gt;
  assumes 1: &amp;quot;(p ⟶ r) ∧ (q ⟶ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ∨ q ⟶ r&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  have 2: &amp;quot;p ⟶ r&amp;quot; using 1 by (rule conjunct1)&lt;br /&gt;
  have 3: &amp;quot;q ⟶ r&amp;quot; using 1 by (rule conjunct2)&lt;br /&gt;
  assume 4: &amp;quot;p ∨ q&amp;quot; show &amp;quot;r&amp;quot; using 4&lt;br /&gt;
  proof (rule disjE)&lt;br /&gt;
    assume 5: &amp;quot;p&amp;quot; show &amp;quot;r&amp;quot; using 2 5 by (rule mp)&lt;br /&gt;
  next&lt;br /&gt;
    assume 6: &amp;quot;q&amp;quot; show &amp;quot;r&amp;quot; using 3 6 by (rule mp)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber cammonagu *)&lt;br /&gt;
lemma ejercicio_37_1:&lt;br /&gt;
  assumes &amp;quot;(p ⟶ r) ∧ (q ⟶ r)&amp;quot; &lt;br /&gt;
  shows   &amp;quot;p ∨ q ⟶ r&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume &amp;quot;p ∨ q&amp;quot;&lt;br /&gt;
  moreover {&lt;br /&gt;
    have &amp;quot;p ⟶ r&amp;quot; using assms by (rule conjunct1)&lt;br /&gt;
    moreover assume &amp;quot;p&amp;quot;&lt;br /&gt;
    ultimately have &amp;quot;r&amp;quot; by (rule mp)&lt;br /&gt;
  }&lt;br /&gt;
  moreover {&lt;br /&gt;
    have &amp;quot;q ⟶ r&amp;quot; using assms by (rule conjunct2)&lt;br /&gt;
    moreover assume &amp;quot;q&amp;quot;&lt;br /&gt;
    ultimately have &amp;quot;r&amp;quot; by (rule mp)&lt;br /&gt;
  }&lt;br /&gt;
  ultimately show &amp;quot;r&amp;quot; by (rule disjE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 38. Demostrar&lt;br /&gt;
     p ∨ q ⟶ r ⊢ (p ⟶ r) ∧ (q ⟶ r)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim marfruman1 josgomrom4 alfmarcua gleherlop&lt;br /&gt;
   pabbergue antramhur enrparalv juacanrod hugrubsan alikan *) &lt;br /&gt;
lemma ejercicio_38:&lt;br /&gt;
  assumes &amp;quot;p ∨ q ⟶ r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;(p ⟶ r) ∧ (q ⟶ r)&amp;quot;&lt;br /&gt;
proof (rule conjI)&lt;br /&gt;
  show &amp;quot;p ⟶ r&amp;quot;&lt;br /&gt;
  proof (rule impI)&lt;br /&gt;
    assume &amp;quot;p&amp;quot; hence 1: &amp;quot;p ∨ q&amp;quot; by (rule disjI1)&lt;br /&gt;
    show &amp;quot;r&amp;quot; using assms(1) 1 by (rule mp)&lt;br /&gt;
  qed&lt;br /&gt;
next&lt;br /&gt;
  show &amp;quot;q ⟶ r&amp;quot;&lt;br /&gt;
  proof (rule impI)&lt;br /&gt;
    assume q hence 2: &amp;quot;p ∨ q&amp;quot; by (rule disjI2)&lt;br /&gt;
    show r using assms(1) 2 by (rule mp)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber cammonagu*)&lt;br /&gt;
lemma ejercicio_38_1:&lt;br /&gt;
  assumes &amp;quot;p ∨ q ⟶ r&amp;quot; &lt;br /&gt;
  shows   &amp;quot;(p ⟶ r) ∧ (q ⟶ r)&amp;quot;&lt;br /&gt;
proof&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 ∨ q&amp;quot; by (rule disjI1)&lt;br /&gt;
    with assms show &amp;quot;r&amp;quot; by (rule mp)&lt;br /&gt;
  qed&lt;br /&gt;
next&lt;br /&gt;
  show &amp;quot;q ⟶ r&amp;quot;&lt;br /&gt;
  proof&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 show &amp;quot;r&amp;quot; by (rule mp)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
section {* Negaciones *}&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 39. Demostrar&lt;br /&gt;
     p ⊢ ¬¬p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim  benber josgomrom4 raffergon2 gleherlop&lt;br /&gt;
   marfruman1 chrgencar alfmarcua pabbergue enrparalv juacanrod&lt;br /&gt;
   hugrubsan cammonagu alikan *)  &lt;br /&gt;
lemma ejercicio_39:&lt;br /&gt;
  assumes &amp;quot;p&amp;quot;&lt;br /&gt;
  shows   &amp;quot;¬¬p&amp;quot;&lt;br /&gt;
  using assms(1) by (rule notnotI)&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 40. Demostrar&lt;br /&gt;
     ¬p ⊢ p ⟶ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim marfruman1 josgomrom4 alfmarcua pabbergue&lt;br /&gt;
   gleherlop juacanrod enrparalv hugrubsan alikan *) &lt;br /&gt;
lemma ejercicio_40:&lt;br /&gt;
  assumes 1: &amp;quot;¬p&amp;quot;&lt;br /&gt;
  shows   &amp;quot;p ⟶ q&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume 2: p show q using 1 2 by (rule notE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber cammonagu *)&lt;br /&gt;
lemma ejercicio_40_1:&lt;br /&gt;
  assumes &amp;quot;¬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;
  with `¬p` show &amp;quot;q&amp;quot; by (rule notE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 41. Demostrar&lt;br /&gt;
     p ⟶ q ⊢ ¬q ⟶ ¬p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim raffergon2 josgomrom4 marfruman1 alfmarcua&lt;br /&gt;
   pabbergue gleherlop enrparalv juacanrod hugrubsan alikan *) &lt;br /&gt;
lemma ejercicio_41:&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 (rule impI)&lt;br /&gt;
  assume 2: &amp;quot;¬q&amp;quot; show &amp;quot;¬p&amp;quot; using 1 2 by (rule mt)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber cammonagu *)&lt;br /&gt;
lemma ejercicio_41_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;
  assume &amp;quot;¬q&amp;quot;&lt;br /&gt;
  with `p ⟶ q` show &amp;quot;¬p&amp;quot; by (rule mt)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 42. Demostrar&lt;br /&gt;
     p∨q, ¬q ⊢ p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim raffergon2 josgomrom4 marfruman1 alfmarcua&lt;br /&gt;
   pabbergue gleherlop enrparalv juacanrod hugrubsan alikan *) &lt;br /&gt;
lemma ejercicio_42:&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;
using assms(1) proof (rule disjE)&lt;br /&gt;
  assume &amp;quot;p&amp;quot; thus &amp;quot;p&amp;quot; .&lt;br /&gt;
next&lt;br /&gt;
  assume 2: &amp;quot;q&amp;quot; show &amp;quot;p&amp;quot; using assms(2) 2 by (rule notE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber cammonagu *)&lt;br /&gt;
lemma ejercicio_42_1:&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;
  note `p ∨ q`&lt;br /&gt;
  moreover have &amp;quot;p ⟹ p&amp;quot; .&lt;br /&gt;
  moreover {&lt;br /&gt;
    assume &amp;quot;q&amp;quot;&lt;br /&gt;
    with `¬q` have &amp;quot;p&amp;quot; by (rule notE)&lt;br /&gt;
  }&lt;br /&gt;
  ultimately show &amp;quot;p&amp;quot; by (rule disjE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 43. Demostrar&lt;br /&gt;
     p ∨ q, ¬p ⊢ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim raffergon2 josgomrom4 marfruman1 alfmarcua&lt;br /&gt;
   pabbergue gleherlop enrparalv juacanrod hugrubsan alikan *) &lt;br /&gt;
lemma ejercicio_43:&lt;br /&gt;
  assumes &amp;quot;p ∨ q&amp;quot;&lt;br /&gt;
          &amp;quot;¬p&amp;quot; &lt;br /&gt;
  shows   &amp;quot;q&amp;quot;&lt;br /&gt;
using assms(1) proof (rule disjE)&lt;br /&gt;
  assume 1: &amp;quot;p&amp;quot; show &amp;quot;q&amp;quot; using assms(2) 1 by (rule notE)&lt;br /&gt;
next&lt;br /&gt;
  assume &amp;quot;q&amp;quot; thus &amp;quot;q&amp;quot; .&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber cammonagu*)&lt;br /&gt;
lemma ejercicio_43_1:&lt;br /&gt;
  assumes &amp;quot;p ∨ q&amp;quot;&lt;br /&gt;
          &amp;quot;¬p&amp;quot; &lt;br /&gt;
  shows   &amp;quot;q&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;
    with `¬p` have &amp;quot;q&amp;quot; by (rule notE)&lt;br /&gt;
  }&lt;br /&gt;
  moreover have &amp;quot;q ⟹ q&amp;quot; .&lt;br /&gt;
  ultimately show &amp;quot;q&amp;quot; by (rule disjE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 44. Demostrar&lt;br /&gt;
     p ∨ q ⊢ ¬(¬p ∧ ¬q)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim gleherlop josgomrom4 marfruman1 pabbergue&lt;br /&gt;
   juacanrod hugrubsan alikan *) &lt;br /&gt;
lemma ejercicio_44:&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 notI)&lt;br /&gt;
  assume 1: &amp;quot;¬p ∧ ¬q&amp;quot; hence 2: &amp;quot;¬p&amp;quot; by (rule conjunct1)&lt;br /&gt;
  have 3: &amp;quot;¬q&amp;quot; using 1 by (rule conjunct2)&lt;br /&gt;
  show &amp;quot;False&amp;quot;&lt;br /&gt;
  using assms(1) proof (rule disjE)&lt;br /&gt;
    assume 4: &amp;quot;p&amp;quot; show ?thesis using 2 4 by (rule notE)&lt;br /&gt;
  next&lt;br /&gt;
    assume 5: &amp;quot;q&amp;quot; show ?thesis using 3 5 by (rule notE)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber alfmarcua cammonagu *)&lt;br /&gt;
lemma ejercicio_44_1:&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;
  note `p ∨ q`&lt;br /&gt;
  moreover {&lt;br /&gt;
    from `¬p ∧ ¬q` have &amp;quot;¬p&amp;quot; by (rule conjunct1)&lt;br /&gt;
    moreover assume &amp;quot;p&amp;quot;&lt;br /&gt;
    ultimately have &amp;quot;False&amp;quot; by (rule notE)&lt;br /&gt;
  }&lt;br /&gt;
  moreover {&lt;br /&gt;
    from `¬p ∧ ¬q` have &amp;quot;¬q&amp;quot; by (rule conjunct2)&lt;br /&gt;
    moreover assume &amp;quot;q&amp;quot;&lt;br /&gt;
    ultimately have &amp;quot;False&amp;quot; by (rule notE)&lt;br /&gt;
  }&lt;br /&gt;
  ultimately show &amp;quot;False&amp;quot; by (rule disjE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 45. Demostrar&lt;br /&gt;
     p ∧ q ⊢ ¬(¬p ∨ ¬q)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim marfruman1 josgomrom4 gleherlop pabbergue&lt;br /&gt;
   juacanrod hugrubsan alikan *) &lt;br /&gt;
lemma ejercicio_45:&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 notI)&lt;br /&gt;
  assume 2: &amp;quot;¬p ∨ ¬q&amp;quot; have 3: &amp;quot;p&amp;quot; using 1 by (rule conjunct1)&lt;br /&gt;
  have 4: &amp;quot;q&amp;quot; using 1 by (rule conjunct2)&lt;br /&gt;
  show &amp;quot;False&amp;quot; using 2&lt;br /&gt;
  proof (rule disjE)&lt;br /&gt;
    assume &amp;quot;¬p&amp;quot; thus ?thesis using 3 by (rule notE)&lt;br /&gt;
  next&lt;br /&gt;
    assume &amp;quot;¬q&amp;quot; thus ?thesis using 4 by (rule notE)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber alfmarcua cammonagu *)&lt;br /&gt;
lemma ejercicio_45_1:&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;
  moreover {&lt;br /&gt;
    assume &amp;quot;¬p&amp;quot;&lt;br /&gt;
    moreover have &amp;quot;p&amp;quot; using `p ∧ q` by (rule conjunct1)&lt;br /&gt;
    ultimately have &amp;quot;False&amp;quot; by (rule notE)&lt;br /&gt;
  }&lt;br /&gt;
  moreover {&lt;br /&gt;
    assume &amp;quot;¬q&amp;quot;&lt;br /&gt;
    moreover have &amp;quot;q&amp;quot; using `p ∧ q` by (rule conjunct2)&lt;br /&gt;
    ultimately have &amp;quot;False&amp;quot; by (rule notE)&lt;br /&gt;
  }&lt;br /&gt;
  ultimately show False by (rule disjE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 46. Demostrar&lt;br /&gt;
     ¬(p ∨ q) ⊢ ¬p ∧ ¬q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim marfruman1 josgomrom4 gleherlop pabbergue&lt;br /&gt;
   juacanrod hugrubsan alikan *) &lt;br /&gt;
lemma ejercicio_46:&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 conjI)&lt;br /&gt;
  show &amp;quot;¬p&amp;quot;&lt;br /&gt;
  proof (rule notI)&lt;br /&gt;
    assume p hence 2: &amp;quot;p ∨ q&amp;quot; by (rule disjI1)&lt;br /&gt;
    show False using 1 2 by (rule notE)&lt;br /&gt;
  qed&lt;br /&gt;
  show &amp;quot;¬q&amp;quot;&lt;br /&gt;
  proof (rule notI)&lt;br /&gt;
    assume q hence 3: &amp;quot;p ∨ q&amp;quot; by (rule disjI2)&lt;br /&gt;
    show False using 1 3 by (rule notE)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber cammmonagu *)&lt;br /&gt;
lemma ejercicio_46_1:&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&amp;quot;&lt;br /&gt;
  proof (rule ccontr)&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;
    with assms show &amp;quot;False&amp;quot; by (rule notE)&lt;br /&gt;
  qed&lt;br /&gt;
next&lt;br /&gt;
  show &amp;quot;¬q&amp;quot;&lt;br /&gt;
  proof (rule ccontr)&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;
    with assms show &amp;quot;False&amp;quot; by (rule notE)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* alfmarcua *)&lt;br /&gt;
lemma ejercicio_46_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 (rule conjI)&lt;br /&gt;
  have &amp;quot;p ⟹ p ∨ q&amp;quot; by (rule disjI1)&lt;br /&gt;
  then have &amp;quot;p ⟶ p ∨ q&amp;quot; by (rule impI)&lt;br /&gt;
  then show &amp;quot;¬ p&amp;quot; using assms by (rule mt)&lt;br /&gt;
next&lt;br /&gt;
  have &amp;quot;q ⟹ p ∨ q&amp;quot; by (rule disjI2)&lt;br /&gt;
  then have &amp;quot;q ⟶ p ∨ q&amp;quot; by (rule impI)&lt;br /&gt;
  then show &amp;quot;¬ q&amp;quot; using assms by (rule mt)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 47. Demostrar&lt;br /&gt;
     ¬p ∧ ¬q ⊢ ¬(p ∨ q)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim marfruman1 josgomrom4 pabbregue juacanrod&lt;br /&gt;
   hugrubsan alikan *) &lt;br /&gt;
lemma ejercicio_47:&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 notI)&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;
  assume 4: &amp;quot;p ∨ q&amp;quot;&lt;br /&gt;
  show False&lt;br /&gt;
  using 4 proof (rule disjE)&lt;br /&gt;
    assume 5: p show ?thesis using 2 5 by (rule notE)&lt;br /&gt;
  next&lt;br /&gt;
    assume 6: q show ?thesis using 3 6 by (rule notE)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber gleherlop cammonagu*)&lt;br /&gt;
lemma ejercicio_47_1:&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;
  hence &amp;quot;¬(¬p ∧ ¬q)&amp;quot; by (rule ejercicio_44_1)&lt;br /&gt;
  thus &amp;quot;False&amp;quot; using assms by (rule notE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* alfmarcua *)&lt;br /&gt;
lemma ejercicio_47_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 (rule notI)&lt;br /&gt;
  have &amp;quot;¬ p&amp;quot; using assms by (rule conjunct1)&lt;br /&gt;
  have &amp;quot;¬ q&amp;quot; using assms by (rule conjunct2)&lt;br /&gt;
  assume &amp;quot;p ∨ q&amp;quot;&lt;br /&gt;
  then have &amp;quot;q&amp;quot; using `¬ p` by (rule ejercicio_43)&lt;br /&gt;
  show False using `¬ q` `q` by (rule notE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 48. Demostrar&lt;br /&gt;
     ¬p ∨ ¬q ⊢ ¬(p ∧ q)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim marfruman1 josgomrom4 pabbergue juacanrod&lt;br /&gt;
   hugrubsan alikan *) &lt;br /&gt;
lemma ejercicio_48:&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 notI)&lt;br /&gt;
  assume 2: &amp;quot;p ∧ q&amp;quot; hence 3: p by (rule conjunct1)&lt;br /&gt;
  have 4: q using 2 by (rule conjunct2)&lt;br /&gt;
  show False&lt;br /&gt;
  using 1 proof (rule disjE)&lt;br /&gt;
    assume &amp;quot;¬p&amp;quot; thus ?thesis using 3 by (rule notE)&lt;br /&gt;
  next&lt;br /&gt;
    assume &amp;quot;¬q&amp;quot; thus ?thesis using 4 by (rule notE)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber alfmarcua gleherlop cammonagu *)&lt;br /&gt;
lemma ejercicio_48_1:&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;
  hence &amp;quot;¬(¬p ∨ ¬q)&amp;quot; by (rule ejercicio_45_1)&lt;br /&gt;
  thus &amp;quot;False&amp;quot; using assms by (rule notE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 49. Demostrar&lt;br /&gt;
     ⊢ ¬(p ∧ ¬p)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim marfruman1 josgomrom4 alfmarcu gleherlop&lt;br /&gt;
   hugrubsan juacanrod cammonagu alikan *) &lt;br /&gt;
lemma ejercicio_49:&lt;br /&gt;
  &amp;quot;¬(p ∧ ¬p)&amp;quot;&lt;br /&gt;
proof (rule notI)&lt;br /&gt;
  assume 1: &amp;quot;p ∧ ¬p&amp;quot; hence 2: p by (rule conjunct1)&lt;br /&gt;
  have &amp;quot;¬p&amp;quot; using 1 by (rule conjunct2)&lt;br /&gt;
  thus &amp;quot;False&amp;quot; using 2 by (rule notE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber *)&lt;br /&gt;
lemma ejercicio_49_1:&lt;br /&gt;
  &amp;quot;¬(p ∧ ¬p)&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume &amp;quot;p ∧ ¬p&amp;quot;&lt;br /&gt;
  hence &amp;quot;¬p&amp;quot; by (rule conjunct2)&lt;br /&gt;
  moreover have &amp;quot;p&amp;quot; using `p ∧ ¬p` by (rule conjunct1)&lt;br /&gt;
  ultimately show &amp;quot;False&amp;quot; by (rule notE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 50. Demostrar&lt;br /&gt;
     p ∧ ¬p ⊢ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim raffergon2 josgomrom4 marfruman1 gleherlop&lt;br /&gt;
   alfmarcua enrparalv pabbergue juacanrod hugrubsan alikan *) &lt;br /&gt;
lemma ejercicio_50:&lt;br /&gt;
  assumes 1: &amp;quot;p ∧ ¬p&amp;quot;&lt;br /&gt;
  shows   &amp;quot;q&amp;quot;&lt;br /&gt;
proof (rule notE)&lt;br /&gt;
  show p using 1 by (rule conjunct1)&lt;br /&gt;
  show &amp;quot;¬p&amp;quot; using 1 by (rule conjunct2)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber cammonagu*)&lt;br /&gt;
lemma ejercicio_50_1:&lt;br /&gt;
  assumes &amp;quot;p ∧ ¬p&amp;quot; &lt;br /&gt;
  shows   &amp;quot;q&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;¬p&amp;quot; using `p ∧ ¬p` by (rule conjunct2)&lt;br /&gt;
  moreover have &amp;quot;p&amp;quot; using `p ∧ ¬p` by (rule conjunct1)&lt;br /&gt;
  ultimately show &amp;quot;q&amp;quot; by (rule notE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 51. Demostrar&lt;br /&gt;
     ¬¬p ⊢ p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim benber raffergon2 josgomrom4 marfruman1 gleherlop&lt;br /&gt;
   alfmarcua enrparalv pabbergue juacanrod hugrubsan cammmonagu alikan *) &lt;br /&gt;
lemma ejercicio_51:&lt;br /&gt;
  assumes &amp;quot;¬¬p&amp;quot;&lt;br /&gt;
  shows   &amp;quot;p&amp;quot;&lt;br /&gt;
  using assms(1) by (rule notnotD)&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 52. Demostrar&lt;br /&gt;
     ⊢ p ∨ ¬p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim marfruman1 josgomrom4 juacanrod pabbergue alikan *)&lt;br /&gt;
lemma ejercicio_52:&lt;br /&gt;
  &amp;quot;p ∨ ¬p&amp;quot;&lt;br /&gt;
proof (rule ccontr)&lt;br /&gt;
  assume 1: &amp;quot;¬(p ∨ ¬p)&amp;quot;&lt;br /&gt;
  have 2: &amp;quot;¬p&amp;quot; proof (rule notI)&lt;br /&gt;
    assume p hence 3: &amp;quot;p ∨ ¬p&amp;quot; by (rule disjI1)&lt;br /&gt;
    show &amp;quot;False&amp;quot; using 1 3 by (rule notE)&lt;br /&gt;
  qed&lt;br /&gt;
  have 4: &amp;quot;p ∨ ¬p&amp;quot; using 2 by (rule disjI2)&lt;br /&gt;
  show &amp;quot;False&amp;quot; using 1 4 by (rule notE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber cammonagu *)&lt;br /&gt;
lemma ejercicio_52_1:&lt;br /&gt;
  &amp;quot;p ∨ ¬p&amp;quot;&lt;br /&gt;
proof (rule ccontr)&lt;br /&gt;
  assume &amp;quot;¬ (p ∨ ¬ p)&amp;quot;&lt;br /&gt;
  hence &amp;quot;¬p ∧ ¬¬p&amp;quot; by (rule ejercicio_46_1)&lt;br /&gt;
  hence &amp;quot;¬p&amp;quot; by (rule conjunct1)&lt;br /&gt;
  moreover {&lt;br /&gt;
    have &amp;quot;¬¬p&amp;quot; using `¬p ∧ ¬¬p` by (rule conjunct2)&lt;br /&gt;
    hence &amp;quot;p&amp;quot; by (rule notnotD)&lt;br /&gt;
  }&lt;br /&gt;
  ultimately show &amp;quot;False&amp;quot; by (rule notE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* alfmarcua *)&lt;br /&gt;
lemma ejercicio_52_2:&lt;br /&gt;
  &amp;quot;p ∨ ¬p&amp;quot;&lt;br /&gt;
proof (rule ccontr)&lt;br /&gt;
  assume &amp;quot;¬ (p ∨ ¬ p)&amp;quot;&lt;br /&gt;
  then have &amp;quot;¬ p ∧ ¬¬ p&amp;quot; by (rule ejercicio_46)&lt;br /&gt;
  then show False by (rule ejercicio_50)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 53. Demostrar&lt;br /&gt;
     ⊢ ((p ⟶ q) ⟶ p) ⟶ p&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim marfruman1 josgomrom4 alfmarcua gleherlop&lt;br /&gt;
   juacanrod pabbergue *) &lt;br /&gt;
lemma ejercicio_53:&lt;br /&gt;
  &amp;quot;((p ⟶ q) ⟶ p) ⟶ p&amp;quot;&lt;br /&gt;
proof (rule impI)&lt;br /&gt;
  assume 1: &amp;quot;(p ⟶ q) ⟶ p&amp;quot;&lt;br /&gt;
  show p proof (rule ccontr)&lt;br /&gt;
    assume 2: &amp;quot;¬p&amp;quot;&lt;br /&gt;
    have 3: &amp;quot;¬(p ⟶ q)&amp;quot; using 1 2 by (rule mt)&lt;br /&gt;
    have 4: &amp;quot;p ⟶ q&amp;quot; proof (rule impI)&lt;br /&gt;
      assume 5: p show q using 2 5 by (rule notE)&lt;br /&gt;
    qed&lt;br /&gt;
    show False using 3 4 by (rule notE)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber cammonagu *)&lt;br /&gt;
lemma ejercicio_53_1:&lt;br /&gt;
  &amp;quot;((p ⟶ q) ⟶ p) ⟶ p&amp;quot;&lt;br /&gt;
proof&lt;br /&gt;
  assume &amp;quot;(p ⟶ q) ⟶ p&amp;quot;&lt;br /&gt;
  have &amp;quot;p ∨ ¬p&amp;quot; by (rule ejercicio_52_1)&lt;br /&gt;
  moreover have &amp;quot;p ⟹ p&amp;quot; .&lt;br /&gt;
  moreover {&lt;br /&gt;
    assume &amp;quot;¬ p&amp;quot;&lt;br /&gt;
    hence &amp;quot;p ⟶ q&amp;quot; by (rule ejercicio_40_1)&lt;br /&gt;
    with `(p ⟶ q) ⟶ p` have &amp;quot;p&amp;quot; by (rule mp)&lt;br /&gt;
  }&lt;br /&gt;
  ultimately show &amp;quot;p&amp;quot; by (rule disjE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 54. Demostrar&lt;br /&gt;
     ¬q ⟶ ¬p ⊢ p ⟶ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim marfruman1 josgomrom4 gleherlop juacanrod&lt;br /&gt;
   pabbergue *) &lt;br /&gt;
lemma ejercicio_54:&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 (rule impI)&lt;br /&gt;
  assume 2: &amp;quot;p&amp;quot; hence 3: &amp;quot;¬¬p&amp;quot; by (rule notnotI)&lt;br /&gt;
  have &amp;quot;¬¬q&amp;quot; using 1 3 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;
(* benber alfmarcua  cammonagu *)&lt;br /&gt;
lemma ejercicio_54_1:&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;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 55. Demostrar&lt;br /&gt;
     ¬(¬p ∧ ¬q) ⊢ p ∨ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon marfruman1*)&lt;br /&gt;
lemma ejercicio_55:&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 2: &amp;quot;¬(p ∨ q)&amp;quot;&lt;br /&gt;
  have 3: &amp;quot;p&amp;quot;&lt;br /&gt;
  proof (rule ccontr)&lt;br /&gt;
    assume 4: &amp;quot;¬p&amp;quot;&lt;br /&gt;
    have 5: &amp;quot;q&amp;quot;&lt;br /&gt;
    proof (rule ccontr)&lt;br /&gt;
      assume 6: &amp;quot;¬q&amp;quot; have 7: &amp;quot;¬p ∧ ¬q&amp;quot; using 4 6 by (rule conjI)&lt;br /&gt;
      show False using 1 7 by (rule notE)&lt;br /&gt;
    qed&lt;br /&gt;
    have 8: &amp;quot;p ∨ q&amp;quot; using 5 by (rule disjI2)&lt;br /&gt;
    show False using 2 8 by (rule notE)&lt;br /&gt;
  qed&lt;br /&gt;
  have 9: &amp;quot;p ∨ q&amp;quot; using 3 by (rule disjI1)&lt;br /&gt;
  show False using 2 9 by (rule notE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber alfmarcua josgomrom4 manperjim pabbergue juacanrod cammonagu *)&lt;br /&gt;
lemma ejercicio_55_1:&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 ejercicio_46_1)&lt;br /&gt;
  with assms show False by (rule notE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 56. Demostrar&lt;br /&gt;
     ¬(¬p ∨ ¬q) ⊢ p ∧ q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim marfruman1 josgomrom4 gleherlop juacanrod&lt;br /&gt;
   pabbergue *) &lt;br /&gt;
lemma ejercicio_56:&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 conjI)&lt;br /&gt;
  show 3: p&lt;br /&gt;
  proof (rule ccontr)&lt;br /&gt;
    assume &amp;quot;¬p&amp;quot; hence 4: &amp;quot;¬p ∨ ¬q&amp;quot; by (rule disjI1)&lt;br /&gt;
    show False using 1 4 by (rule notE)&lt;br /&gt;
  qed&lt;br /&gt;
  show 5: q&lt;br /&gt;
  proof (rule ccontr)&lt;br /&gt;
    assume &amp;quot;¬q&amp;quot; hence 6: &amp;quot;¬p ∨ ¬q&amp;quot; by (rule disjI2)&lt;br /&gt;
    show False using 1 6 by (rule notE)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber alfmarcua cammonagu *)&lt;br /&gt;
lemma ejercicio_56_1:&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 ejercicio_46_1)&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;
  moreover {&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;
  }&lt;br /&gt;
  ultimately show &amp;quot;p ∧ q&amp;quot; by (rule conjI)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 57. Demostrar&lt;br /&gt;
     ¬(p ∧ q) ⊢ ¬p ∨ ¬q&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim marfruman1 josgomrom4 gleherlop juacanrod&lt;br /&gt;
   pabbergue *) &lt;br /&gt;
lemma ejercicio_57:&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 2: &amp;quot;¬(¬p ∨ ¬q)&amp;quot;&lt;br /&gt;
  show False using 1&lt;br /&gt;
  proof (rule notE)&lt;br /&gt;
    show 3: &amp;quot;p ∧ q&amp;quot;&lt;br /&gt;
    proof (rule conjI)&lt;br /&gt;
      show p&lt;br /&gt;
      proof (rule ccontr)&lt;br /&gt;
        assume &amp;quot;¬p&amp;quot; hence 4: &amp;quot;¬p ∨ ¬q&amp;quot; by (rule disjI1)&lt;br /&gt;
        show False using 2 4 by (rule notE)&lt;br /&gt;
      qed&lt;br /&gt;
    next&lt;br /&gt;
      show q&lt;br /&gt;
      proof (rule ccontr)&lt;br /&gt;
        assume &amp;quot;¬q&amp;quot; hence 5: &amp;quot;¬p ∨ ¬q&amp;quot; by (rule disjI2)&lt;br /&gt;
        show False using 2 5 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;
(* benber alfmarcua cammonagu *)&lt;br /&gt;
lemma ejercicio_57_1:&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 ejercicio_56_1)&lt;br /&gt;
  with assms show &amp;quot;False&amp;quot; by (rule notE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 58. Demostrar&lt;br /&gt;
     ⊢ (p ⟶ q) ∨ (q ⟶ p)&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon manperjim josgomrom4 marfruman1 juacanrod pabbergue *)&lt;br /&gt;
lemma ejercicio_58:&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; proof (rule ccontr)&lt;br /&gt;
    assume 1: &amp;quot;¬((p ⟶ q) ∨ ¬(p ⟶ q))&amp;quot;&lt;br /&gt;
    have 2: &amp;quot;¬(p ⟶ q)&amp;quot; proof (rule notI)&lt;br /&gt;
      assume &amp;quot;p ⟶ q&amp;quot; &lt;br /&gt;
      hence 3: &amp;quot;(p ⟶ q) ∨ ¬(p ⟶ q)&amp;quot; by (rule disjI1)&lt;br /&gt;
      show False using 1 3 by (rule notE)&lt;br /&gt;
    qed&lt;br /&gt;
    hence 4: &amp;quot;(p ⟶ q) ∨ ¬(p ⟶ q)&amp;quot; by (rule disjI2)&lt;br /&gt;
    show &amp;quot;False&amp;quot; using 1 4 by (rule notE)&lt;br /&gt;
  qed&lt;br /&gt;
  thus ?thesis proof (rule disjE)&lt;br /&gt;
    assume &amp;quot;p ⟶ q&amp;quot; thus ?thesis by (rule disjI1)&lt;br /&gt;
  next&lt;br /&gt;
    assume 1: &amp;quot;¬(p ⟶ q)&amp;quot;&lt;br /&gt;
    have &amp;quot;q ⟶ p&amp;quot; proof (rule impI)&lt;br /&gt;
      assume 2: q&lt;br /&gt;
      have 3: &amp;quot;p ⟶ q&amp;quot; proof (rule impI)&lt;br /&gt;
        assume p show q using 2 .&lt;br /&gt;
      qed&lt;br /&gt;
      show p using 1 3 by (rule notE)&lt;br /&gt;
    qed&lt;br /&gt;
    thus ?thesis by (rule disjI2)&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* pabalagon gleherlop *)&lt;br /&gt;
lemma ejercicio_58_2:&lt;br /&gt;
  &amp;quot;(p ⟶ q) ∨ (q ⟶ p)&amp;quot;&lt;br /&gt;
proof (rule ccontr)&lt;br /&gt;
  assume 1: &amp;quot;¬((p ⟶ q) ∨ (q ⟶ p))&amp;quot;&lt;br /&gt;
  hence 1: &amp;quot;(p ∧ ¬q) ∧ (q ∧ ¬p)&amp;quot; by simp&lt;br /&gt;
  hence &amp;quot;p ∧ ¬q&amp;quot; ..&lt;br /&gt;
  hence 2: p ..&lt;br /&gt;
  have &amp;quot;q ∧ ¬p&amp;quot; using 1 ..&lt;br /&gt;
  hence 3: &amp;quot;¬p&amp;quot; ..&lt;br /&gt;
  show False using 3 2 by (rule notE)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber cammonagu *)&lt;br /&gt;
lemma ejercicio_58_1:&lt;br /&gt;
  &amp;quot;(p ⟶ q) ∨ (q ⟶ p)&amp;quot;&lt;br /&gt;
proof (rule ccontr)&lt;br /&gt;
  assume &amp;quot;¬ ((p ⟶ q) ∨ (q ⟶ p))&amp;quot;&lt;br /&gt;
  hence 1: &amp;quot;¬(p ⟶ q) ∧ ¬(q ⟶ p)&amp;quot; by (rule ejercicio_46_1)&lt;br /&gt;
&lt;br /&gt;
  have &amp;quot;p ∨ ¬p&amp;quot; by (rule ejercicio_52_1)&lt;br /&gt;
  moreover {&lt;br /&gt;
    assume &amp;quot;p&amp;quot;&lt;br /&gt;
    hence &amp;quot;q ⟶ p&amp;quot; by (rule ejercicio_7_1)&lt;br /&gt;
&lt;br /&gt;
    have &amp;quot;¬(q ⟶ p)&amp;quot; using 1 by (rule conjunct2)&lt;br /&gt;
    hence &amp;quot;False&amp;quot; using `q ⟶ p` by (rule notE)&lt;br /&gt;
  }&lt;br /&gt;
  moreover {&lt;br /&gt;
    assume &amp;quot;¬p&amp;quot;&lt;br /&gt;
    hence &amp;quot;p ⟶ q&amp;quot; by (rule ejercicio_40_1)&lt;br /&gt;
&lt;br /&gt;
    have &amp;quot;¬(p ⟶ q)&amp;quot; using 1 by (rule conjunct1)&lt;br /&gt;
    hence &amp;quot;False&amp;quot; using `p ⟶ q` by (rule notE)&lt;br /&gt;
  }&lt;br /&gt;
  ultimately show &amp;quot;False&amp;quot; by (rule disjE)&lt;br /&gt;
  moreover {&lt;br /&gt;
    assume &amp;quot;p&amp;quot;&lt;br /&gt;
    hence &amp;quot;q ⟶ p&amp;quot; by (rule ejercicio_7_1)&lt;br /&gt;
&lt;br /&gt;
    have &amp;quot;¬(q ⟶ p)&amp;quot; using 1 by (rule conjunct2)&lt;br /&gt;
    hence &amp;quot;False&amp;quot; using `q ⟶ p` by (rule notE)&lt;br /&gt;
  }&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* alfmarcua *)&lt;br /&gt;
lemma ejercicio_58_3:&lt;br /&gt;
  &amp;quot;(p ⟶ q) ∨ (q ⟶ p)&amp;quot;&lt;br /&gt;
proof (rule disjE)&lt;br /&gt;
  show &amp;quot;p ∨ ¬ p&amp;quot; by (rule ejercicio_52)&lt;br /&gt;
next&lt;br /&gt;
  assume &amp;quot;¬p&amp;quot;&lt;br /&gt;
  then have &amp;quot;p ⟶ q&amp;quot; by (rule ejercicio_40)&lt;br /&gt;
  then show ?thesis by (rule disjI1)&lt;br /&gt;
next&lt;br /&gt;
  assume &amp;quot;p&amp;quot;&lt;br /&gt;
  then have &amp;quot;q ⟶ p&amp;quot; by (rule ejercicio_7)&lt;br /&gt;
  then show ?thesis by (rule disjI2)&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/RA2018/index.php?title=Relaci%C3%B3n_5&amp;diff=411</id>
		<title>Relación 5</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2018/index.php?title=Relaci%C3%B3n_5&amp;diff=411"/>
		<updated>2019-02-28T12:40:58Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isabelle&amp;quot;&amp;gt;&lt;br /&gt;
chapter {* R5: Recorridos de árboles *}&lt;br /&gt;
&lt;br /&gt;
theory R5_Recorridos_de_arboles_alu&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   h &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;
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;
(* pabalagon manperjim raffergon2 aribatval benber josgomrom4 hugrubsan&lt;br /&gt;
   cammonagu antramhur alfmarcua enrparalv marfruman1 gleherlop&lt;br /&gt;
   chrgencar giafus1 pabbergue alikan juacanrod *)  &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 x)     = [x]&amp;quot; |&lt;br /&gt;
  &amp;quot;preOrden (N x i d) = x # preOrden i @ preOrden 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;
&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;
(* pabalagon manperjim raffergon2 aribatval benber josgomrom4 hugrubsan&lt;br /&gt;
   cammonagu antramhur alfmarcua enrparalv marfruman1 gleherlop&lt;br /&gt;
   chrgencar giafus1 pabbergue alikan juacanrod *)  &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 x)     = [x]&amp;quot; |&lt;br /&gt;
  &amp;quot;postOrden (N x i d) = postOrden i @ postOrden d @ [x]&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;
(* pabalagon manperjim raffergon2 aribatval benber josgomrom4 hugrubsan&lt;br /&gt;
   gleherlop cammonagu alfmarcua enrparalv marfruman1 chrgencar giafus1&lt;br /&gt;
   pabbergue alikan juacanrod antramhur *)  &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 x)     = [x]&amp;quot; |&lt;br /&gt;
  &amp;quot;inOrden (N x i d) = inOrden i @ [x] @ inOrden 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;
&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;
(* pabalagon manperjim raffergon2 aribatval benber josgomrom4 hugrubsan&lt;br /&gt;
   gleherlop cammonagu alfmarcua enrparalv marfruman1 chrgencar giafus1&lt;br /&gt;
   pabbergue alikan juacanrod antramhur *)  &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 x)     = H x&amp;quot; |&lt;br /&gt;
  &amp;quot;espejo (N x i d) = N x (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;
(* pabalagon manperjim raffergon2 josgomrom4 hugrubsan cammonagu&lt;br /&gt;
   alfmarcua gleherlop enrparalv marfruman1 chrgencar pabbergue giafus1&lt;br /&gt;
  alikan juacanrod aribatval antramhur *) &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;... = rev (postOrden d @ [x]) @ rev (postOrden i)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = rev (postOrden i @ postOrden d @ [x])&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;
(* benber *)&lt;br /&gt;
lemma  &amp;quot;preOrden (espejo a) = rev (postOrden a)&amp;quot;&lt;br /&gt;
proof (induction a)&lt;br /&gt;
  case (H v)&lt;br /&gt;
  show ?case by simp&lt;br /&gt;
next&lt;br /&gt;
  case IS: (N v l r)&lt;br /&gt;
  have &amp;quot;preOrden (espejo (N v l r)) = &lt;br /&gt;
        preOrden (N v (espejo r) (espejo l))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = v # (preOrden (espejo r)) @ (preOrden (espejo l))&amp;quot; &lt;br /&gt;
    by simp&lt;br /&gt;
  also have &amp;quot;... = v # rev (postOrden r) @ rev (postOrden l)&amp;quot; &lt;br /&gt;
    using IS.IH by simp&lt;br /&gt;
  also have &amp;quot;... = rev ((postOrden l) @ (postOrden r) @ [v])&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = rev (postOrden (N v l r))&amp;quot; by simp&lt;br /&gt;
  finally show ?case .&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* cammonagu *)&lt;br /&gt;
lemma &amp;quot;preOrden (espejo a) = rev (postOrden a)&amp;quot;&lt;br /&gt;
  by (induction a) auto&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;
(* pabalagon manperjim josgomrom4 hugrubsan cammonagu enrparalv&lt;br /&gt;
   gleherlop chrgencar giafus1 pabbergue alikan aribatval *) &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; and 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 i @ preOrden d) @ rev [x]&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = rev (x # preOrden i @ preOrden 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;
(* raffergon2 alfmarcua marfruman1 juacanrod antramhur *)&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;
  finally show &amp;quot;?P (N x i d)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber cammonagu *)&lt;br /&gt;
lemma &amp;quot;postOrden (espejo a) = rev (preOrden a)&amp;quot;&lt;br /&gt;
  by (induction a) auto&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;
(* pabalagon manperjim josgomrom4 hugrubsan cammonagu enrparalv&lt;br /&gt;
   gleherlop chrgencar giafus1 pabbergue alikan juacanrod aribatval *) &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 H1: &amp;quot;?P i&amp;quot; and H2: &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;&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;
  also have &amp;quot;... = rev (inOrden i @ [x] @ inOrden 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;
(* raffergon2 alfmarcua marfruman1 antramhur *)&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 H1: &amp;quot;?P i&amp;quot;&lt;br /&gt;
  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;
  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;
  finally show &amp;quot;?P (N x i d)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber *)&lt;br /&gt;
theorem &amp;quot;inOrden (espejo a) = rev (inOrden a)&amp;quot;&lt;br /&gt;
proof (induction a)&lt;br /&gt;
  case (H v)&lt;br /&gt;
  show ?case by simp&lt;br /&gt;
next&lt;br /&gt;
  case IS: (N v l r)&lt;br /&gt;
  have &amp;quot;inOrden (espejo (N v l r)) = &lt;br /&gt;
        inOrden (N v (espejo r) (espejo l))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (inOrden (espejo r)) @ [v] @ (inOrden (espejo l))&amp;quot; &lt;br /&gt;
    by simp&lt;br /&gt;
  also have &amp;quot;... = (rev (inOrden r)) @ [v] @ (rev (inOrden l))&amp;quot; &lt;br /&gt;
    using IS.IH by simp&lt;br /&gt;
  also have &amp;quot;... = rev ((inOrden l) @ [v] @ (inOrden r))&amp;quot; by simp&lt;br /&gt;
  also have&amp;quot;... = rev (inOrden (N v l r))&amp;quot; by simp&lt;br /&gt;
  finally show ?case .&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* cammonagu*)&lt;br /&gt;
lemma &amp;quot;inOrden (espejo a) = rev (inOrden a)&amp;quot;&lt;br /&gt;
  by (induction a) auto&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;
(* pabalagon manperjim raffergon2 aribatval benber josgomrom4 hugrubsan&lt;br /&gt;
   cammonagu antramhur alfmarcua enrparalv marfruman1 gleherlop&lt;br /&gt;
   chrgencar giafus1 pabbergue alikan juacanrod *)  &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;
(* pabalagon manperjim raffergon2 benber josgomrom4 gleherlop hugrubsan&lt;br /&gt;
   cammonagu alfmarcua enrparalv marfruman1 chrgencar giafus1 pabbergue&lt;br /&gt;
   alikan juacanrod aribatval antramhur *) &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;
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;
(* pabalagon manperjim raffergon2 benber josgomrom4 hugrubsan cammonagu&lt;br /&gt;
   alfmarcua gleherlop enrparalv marfruman1 chrgencar giafus1 pabbergue&lt;br /&gt;
   alikan juacanrod antramhur *) &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;
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;
(* pabalagon manperjim josgomrom4 hugrubsan cammonagu alfmarcua&lt;br /&gt;
   enrparalv gleherlop chrgencar marfruman1 giafus1 pabbergue alikan&lt;br /&gt;
   juacanrod antramhur *)  &lt;br /&gt;
lemma inOrdenNotNil: &amp;quot;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;
  have &amp;quot;?P (N x i d) = ((inOrden i @ [x] @ inOrden d) ≠ [])&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = ((inOrden i ≠ []) ∨ ([x] ≠ []) ∨ (inOrden d ≠ []))&amp;quot; &lt;br /&gt;
    by simp&lt;br /&gt;
  also have &amp;quot;... = ([x] ≠ [])&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;
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 HI: &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&lt;br /&gt;
  also have &amp;quot;... = last (x # inOrden d)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = last (inOrden d)&amp;quot; by (simp add: inOrdenNotNil)&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;?P (N x i d)&amp;quot; .&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber *)&lt;br /&gt;
theorem &amp;quot;last (inOrden a) = extremo_derecha a&amp;quot;&lt;br /&gt;
proof (induction a)&lt;br /&gt;
  case (H v)&lt;br /&gt;
  show ?case by simp&lt;br /&gt;
next&lt;br /&gt;
  case IS: (N v l r)&lt;br /&gt;
  have 1: &amp;quot;last (xs@ys) = last ys&amp;quot; if &amp;quot;ys ≠ []&amp;quot; for xs ys :: &amp;quot;&amp;#039;a list&amp;quot;&lt;br /&gt;
  proof (induction xs)&lt;br /&gt;
    case Nil&lt;br /&gt;
    show ?case by simp&lt;br /&gt;
  next&lt;br /&gt;
    case IS: (Cons x xs)&lt;br /&gt;
    have &amp;quot;last ((x#xs)@ys) = last (x#(xs@ys))&amp;quot; by simp&lt;br /&gt;
    also have &amp;quot;... = last (xs @ ys)&amp;quot; using `ys ≠ []` by simp&lt;br /&gt;
    also have &amp;quot;... = last ys&amp;quot; using IS.IH by simp&lt;br /&gt;
    finally show ?case .&lt;br /&gt;
  qed&lt;br /&gt;
  have 2: &amp;quot;inOrden a ≠ []&amp;quot; for a :: &amp;quot;&amp;#039;a arbol&amp;quot;&lt;br /&gt;
    by (induction a) auto&lt;br /&gt;
  have &amp;quot;last (inOrden (N v l r)) = &lt;br /&gt;
        last ( (inOrden l) @ [v] @ (inOrden r) )&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = last (inOrden r)&amp;quot; using 1 2 by auto&lt;br /&gt;
  also have &amp;quot;... = extremo_derecha r&amp;quot; using IS.IH by simp&lt;br /&gt;
  also have &amp;quot;... = extremo_derecha (N v l r)&amp;quot; by simp&lt;br /&gt;
  finally show ?case .&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;
(* pabalagon manperjim josgomrom4 hugrubsan cammonagu alfmarcua&lt;br /&gt;
   gleherlop enrparalv marfruman1 chrgencar giafus1 pabbergue alikan&lt;br /&gt;
   juacanrod aribatval antramhur *) &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::&amp;#039;a&lt;br /&gt;
  have &amp;quot;hd (inOrden (H x)) = hd [x]&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = x&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = extremo_izquierda (H x)&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (H x)&amp;quot; .&lt;br /&gt;
next&lt;br /&gt;
  fix x i d&lt;br /&gt;
  assume HI: &amp;quot;?P i&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 @ [x]) @ inOrden d)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = hd (inOrden i)&amp;quot; by (simp add: inOrdenNotNil)&lt;br /&gt;
  also have &amp;quot;... = extremo_izquierda i&amp;quot; using HI 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; .&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber *)&lt;br /&gt;
theorem &amp;quot;hd (inOrden a) = extremo_izquierda a&amp;quot;&lt;br /&gt;
proof (induction a)&lt;br /&gt;
  case (H v)&lt;br /&gt;
  show ?case by simp&lt;br /&gt;
next&lt;br /&gt;
  case IS: (N v l r)&lt;br /&gt;
  moreover have &amp;quot;inOrden a ≠ []&amp;quot; for a :: &amp;quot;&amp;#039;a arbol&amp;quot;&lt;br /&gt;
    by (induction a) auto&lt;br /&gt;
  ultimately show ?case by simp&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;
(* pabalagon manperjim josgomrom4 hugrubsan cammonagu alfmarcua&lt;br /&gt;
   gleherlop marfruman1 chrgencar giafus1 pabbergue alikan juacanrod&lt;br /&gt;
   aribatval antramhur *)  &lt;br /&gt;
theorem hdPreOrden_lastPostOrden: &lt;br /&gt;
  &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::&amp;#039;a &lt;br /&gt;
  fix i d&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 [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;
  finally show &amp;quot;?P (N x i d)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* enrparalv *)&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::&amp;#039;a&lt;br /&gt;
  have &amp;quot;hd (preOrden (H x)) = hd [x]&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = x&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = last [x]&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = last (postOrden (H x))&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (H x)&amp;quot; by simp &lt;br /&gt;
next&lt;br /&gt;
  fix x i d&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] @ preOrden i)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = x&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = last [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;
oops&lt;br /&gt;
&lt;br /&gt;
(* benber cammonagu *)&lt;br /&gt;
theorem &amp;quot;hd (preOrden a) = last (postOrden a)&amp;quot;&lt;br /&gt;
  by (cases a) auto&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;
(* pabalagon manperjim josgomrom4 hugrubsan cammonagu alfmarcua&lt;br /&gt;
   gleherlop marfruman1 chrgencar giafus1 pabbergue alikan juacanrod&lt;br /&gt;
   aribatval antramhur *) &lt;br /&gt;
theorem hdPreOrden_raiz: &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::&amp;#039;a&lt;br /&gt;
  fix i d&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;
  finally show &amp;quot;?P (N x i d)&amp;quot; by (simp only: raiz.simps(2))&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* enrparalv *)&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::&amp;#039;a&lt;br /&gt;
  have &amp;quot;hd (preOrden (H x)) = hd [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 (H x)&amp;quot; by (simp only: raiz.simps(1))&lt;br /&gt;
  finally show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x i d&lt;br /&gt;
  have &amp;quot;hd (preOrden (N x i d)) = hd ([x] @ preOrden i @ preOrden d)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = hd (([x] @ preOrden i) @ preOrden d)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = hd ([x] @ preOrden i)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = hd ([x])&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = x&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;?P (N x i d)&amp;quot; by (simp only: raiz.simps(2))&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
(* benber cammonagu*)&lt;br /&gt;
theorem &amp;quot;hd (preOrden a) = raiz a&amp;quot;&lt;br /&gt;
  by (cases a) auto&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;
(* pabalagon manperjim cammonagu alfmarcua marfruman1 gleherlop&lt;br /&gt;
   chrgencar giafus1 pabbergue juacanrod hugrubsan alikan aribatval&lt;br /&gt;
   antramhur *) &lt;br /&gt;
theorem &amp;quot;hd (inOrden a) = raiz a&amp;quot;&lt;br /&gt;
  quickcheck&lt;br /&gt;
(*&lt;br /&gt;
Quickcheck found a counterexample:&lt;br /&gt;
  a = N a⇩1 (H a⇩2) (H a⇩1)&lt;br /&gt;
Evaluated terms:&lt;br /&gt;
  hd (inOrden a) = a⇩2&lt;br /&gt;
  raiz a = a⇩1 *)&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
(* benber josgomrom4 *)&lt;br /&gt;
(* El teorema no es cierto para arboles sobre numeros naturales *)&lt;br /&gt;
theorem &amp;quot;¬(∀ a :: nat arbol. hd (inOrden a) = raiz a)&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  let ?a = &amp;quot;(N 0 (H 1) (H 2)) :: nat arbol&amp;quot;&lt;br /&gt;
  have &amp;quot;hd (inOrden ?a) = 1&amp;quot; by simp&lt;br /&gt;
  moreover have &amp;quot;raiz ?a = 0&amp;quot; by simp&lt;br /&gt;
  ultimately have &amp;quot;hd (inOrden ?a) ≠ raiz ?a&amp;quot; by simp&lt;br /&gt;
  hence &amp;quot;∃ a :: nat arbol. hd (inOrden a) ≠ raiz a&amp;quot; by (simp only: exI)&lt;br /&gt;
  thus ?thesis by auto&lt;br /&gt;
qed&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;
(* pabalagon manperjim josgomrom4 cammonagu marfruman1 gleherlop&lt;br /&gt;
   chrgencar giafus1 pabbergue juacanrod hugrubsan aribatval antramhur *) &lt;br /&gt;
theorem &amp;quot;last (postOrden a) = raiz a&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;last (postOrden a) = hd (preOrden a)&amp;quot;&lt;br /&gt;
    by (simp add: hdPreOrden_lastPostOrden)&lt;br /&gt;
  also have &amp;quot;... = raiz a&amp;quot; by (simp add: hdPreOrden_raiz)&lt;br /&gt;
  finally show &amp;quot;?thesis&amp;quot; .&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber cammonagu*)&lt;br /&gt;
theorem &amp;quot;last (postOrden a) = raiz a&amp;quot;&lt;br /&gt;
  by (cases a) auto&lt;br /&gt;
&lt;br /&gt;
(* alfmarcua *)&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::&amp;#039;a&lt;br /&gt;
  fix i d&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;
  finally show &amp;quot;?P (N x i d)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* enrparalv *)&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::&amp;#039;a&lt;br /&gt;
  have &amp;quot;last (postOrden (H x)) = last [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 (H x)&amp;quot; by (simp only: raiz.simps(1))&lt;br /&gt;
  finally show &amp;quot;?P (H x)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x i d&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 only: raiz.simps(2))&lt;br /&gt;
  finally show &amp;quot;?P (N x i d)&amp;quot; by simp&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/RA2018/index.php?title=Relaci%C3%B3n_4&amp;diff=410</id>
		<title>Relación 4</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2018/index.php?title=Relaci%C3%B3n_4&amp;diff=410"/>
		<updated>2019-02-28T11:04:31Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isabelle&amp;quot;&amp;gt;&lt;br /&gt;
chapter {* R4: Cuantificadores sobre listas *}&lt;br /&gt;
&lt;br /&gt;
theory R4_Cuantificadores_sobre_listas_alu&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 la función &lt;br /&gt;
     todos :: (&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (todos p xs) se verifica si todos los elementos de la lista &lt;br /&gt;
  xs cumplen la propiedad p. Por ejemplo, se verifica &lt;br /&gt;
     todos (λx. 1&amp;lt;length x) [[2,1,4],[1,3]]&lt;br /&gt;
     ¬todos (λx. 1&amp;lt;length x) [[2,1,4],[3]]&lt;br /&gt;
&lt;br /&gt;
  Nota: La función todos es equivalente a la predefinida list_all. &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* manperjim pabalagon alfmarcua josgomrom4 aribatval cammonagu&lt;br /&gt;
   raffergon2 enrparalv gleherlop chrgencar benber giafus1 pabbergue &lt;br /&gt;
   alikan marfruman1 antramhur juacanrod hugrubsan *) &lt;br /&gt;
fun todos :: &amp;quot;(&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;todos p [] = True&amp;quot; |&lt;br /&gt;
  &amp;quot;todos p (x#xs) = (p x ∧ todos p xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Definir la función &lt;br /&gt;
     algunos :: (&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (algunos p xs) se verifica si algunos elementos de la lista &lt;br /&gt;
  xs cumplen la propiedad p. Por ejemplo, se verifica &lt;br /&gt;
     algunos (λx. 1&amp;lt;length x) [[2,1,4],[3]]&lt;br /&gt;
     ¬algunos (λx. 1&amp;lt;length x) [[],[3]]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  Nota: La función algunos es equivalente a la predefinida list_ex. &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* manperjim pabalagon alfmarcua josgomrom4 cammonagu aribatval&lt;br /&gt;
   raffergon2 enrparalv gleherlop chrgencar benber giafus1 pabbergue&lt;br /&gt;
   alikan marfruman1 antramhur juacanrod hugrubsan *) &lt;br /&gt;
fun algunos  :: &amp;quot;(&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;algunos p [] = False&amp;quot; |&lt;br /&gt;
  &amp;quot;algunos p (x#xs) = (p x ∨ algunos p xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3.1. Demostrar o refutar automáticamente &lt;br /&gt;
     todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* manperjim pabalagon alfmarcua josgomrom4 cammonagu raffergon2&lt;br /&gt;
   enrparalv gleherlop chrgencar benber giafus1 pabbergue alikan &lt;br /&gt;
   marfruman1 antramhur juacanrod hugrubsan aribatval *) &lt;br /&gt;
lemma &amp;quot;todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)&amp;quot;&lt;br /&gt;
  by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3.2. Demostrar o refutar detalladamente&lt;br /&gt;
     todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon *)&lt;br /&gt;
lemma &amp;quot;todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)&amp;quot; (is &amp;quot;?P P Q xs&amp;quot;)&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  fix P Q&lt;br /&gt;
  show &amp;quot;?P P Q []&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume HI: &amp;quot;?P P Q xs&amp;quot;&lt;br /&gt;
  have &amp;quot;todos (λx. P x ∧ Q x) (a#xs) = &lt;br /&gt;
        ((P a ∧ Q a) ∧ todos (λx. P x ∧ Q x) xs)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (P a ∧ Q a ∧ todos P xs ∧ todos Q xs)&amp;quot; &lt;br /&gt;
    using HI by simp&lt;br /&gt;
  also have &amp;quot;... = ((P a ∧ todos P xs) ∧ (Q a ∧ todos Q xs))&amp;quot; &lt;br /&gt;
    by (simp add: HOL.conj_comms)&lt;br /&gt;
  also have &amp;quot;... = (todos P (a#xs) ∧ (Q a ∧ todos Q xs))&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;todos (λx. P x ∧ Q x) (a#xs) = &lt;br /&gt;
                (todos P (a#xs) ∧ todos Q (a#xs))&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* alfmarcua juacanrod *)&lt;br /&gt;
lemma &amp;quot;todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)&amp;quot; (is &amp;quot;?P xs&amp;quot;)&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  have &amp;quot;todos (λx. P x ∧ Q x) [] = (True)&amp;quot; &lt;br /&gt;
    by (simp only: todos.simps(1))&lt;br /&gt;
  also have &amp;quot;... = (True ∧ True)&amp;quot; by (simp only: conj_absorb)&lt;br /&gt;
  also have &amp;quot;... = (todos P [] ∧ todos Q [])&amp;quot; &lt;br /&gt;
    by (simp only: todos.simps(1))&lt;br /&gt;
  finally show &amp;quot;?P []&amp;quot; .&lt;br /&gt;
next&lt;br /&gt;
  fix x xs&lt;br /&gt;
  assume HI: &amp;quot;?P xs&amp;quot;&lt;br /&gt;
  have &amp;quot;todos (λx. P x ∧ Q x) (x # xs) = &lt;br /&gt;
        ((P x ∧ Q x) ∧ todos (λx. P x ∧ Q x) xs)&amp;quot;&lt;br /&gt;
    by (simp only: todos.simps(2))&lt;br /&gt;
  also have &amp;quot;... = ((P x ∧ Q x) ∧  (todos P xs ∧ todos Q xs))&amp;quot; &lt;br /&gt;
    by (simp only: HI)&lt;br /&gt;
  also have &amp;quot;... = ((P x ∧ todos P xs) ∧ (Q x ∧ todos Q xs))&amp;quot; &lt;br /&gt;
    by (simp only: HOL.conj_comms)&lt;br /&gt;
  also have &amp;quot;... = (todos P (x # xs) ∧ todos Q (x # xs))&amp;quot; &lt;br /&gt;
    by (simp only: todos.simps(2))&lt;br /&gt;
  finally show &amp;quot;?P (x#xs)&amp;quot; .&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* manperjim josgomrom4 raffergon2 cammonagu enrparalv gleherlop&lt;br /&gt;
   chrgencar giafus1 pabbergue alikan marfruman1 antramhur hugrubsan&lt;br /&gt;
   aribatval *)  &lt;br /&gt;
lemma &amp;quot;todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;todos (λx. P x ∧ Q x) [] = (todos P [] ∧ todos Q [])&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix n xs&lt;br /&gt;
  assume HI: &amp;quot;todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)&amp;quot; &lt;br /&gt;
  have &amp;quot;todos (λx. P x ∧ Q x) (n # xs) =  &lt;br /&gt;
        ((P n ∧ Q n) ∧ (todos P xs ∧ todos Q xs))&amp;quot; using HI by simp&lt;br /&gt;
  also have &amp;quot;... = ((P n ∧ todos P xs) ∧ (Q n ∧ todos Q xs))&amp;quot; by arith&lt;br /&gt;
  also have &amp;quot;... = ((todos P(n#xs)) ∧ (todos Q(n#xs)))&amp;quot; by simp&lt;br /&gt;
 finally show &amp;quot;todos (λx. P x ∧ Q x) (n#xs) = &lt;br /&gt;
               (todos P (n#xs) ∧ todos Q (n#xs))&amp;quot; by simp &lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber *)&lt;br /&gt;
lemma &amp;quot;todos (λx. P x ∧ Q x) xs = (todos P xs ∧ todos Q xs)&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  case Nil&lt;br /&gt;
  have &amp;quot;todos (λx. P x ∧ Q x) [] = True&amp;quot; by (simp only: todos.simps(1))&lt;br /&gt;
  also have &amp;quot;... = (todos P [] ∧ todos Q [])&amp;quot; &lt;br /&gt;
    by (simp only: todos.simps(1) conj_absorb)&lt;br /&gt;
  finally show ?case.&lt;br /&gt;
next&lt;br /&gt;
  case (Cons x xs)&lt;br /&gt;
  assume IH: &amp;quot;todos (λy. P y ∧ Q y) xs = (todos P xs ∧ todos Q xs)&amp;quot;&lt;br /&gt;
  have &amp;quot;todos (λy. P y ∧ Q y) (x # xs) = &lt;br /&gt;
       ( (P x ∧ Q x) ∧ todos (λy. P y ∧ Q y) xs )&amp;quot;&lt;br /&gt;
    by (simp only: todos.simps(2))&lt;br /&gt;
  also have &amp;quot;... = ( (P x ∧ Q x) ∧ todos P xs ∧ todos Q xs )&amp;quot; &lt;br /&gt;
    by (simp only: IH)&lt;br /&gt;
  also have &amp;quot;... = ( P x ∧ (Q x ∧ todos P xs) ∧ todos Q xs )&amp;quot; &lt;br /&gt;
    by (simp only: conj_assoc)&lt;br /&gt;
  also have &amp;quot;... = ( P x ∧ (todos P xs ∧ Q x) ∧ todos Q xs )&amp;quot; &lt;br /&gt;
    by (simp only: conj_commute)&lt;br /&gt;
  also have &amp;quot;... = ( (P x ∧ todos P xs) ∧ Q x ∧ todos Q xs )&amp;quot; &lt;br /&gt;
    by (simp only: conj_assoc)&lt;br /&gt;
  also have &amp;quot;... = ( todos P (x#xs) ∧ todos Q (x#xs) )&amp;quot; &lt;br /&gt;
    by (simp only: todos.simps(2))&lt;br /&gt;
  finally show ?case.&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4.1. Demostrar o refutar automáticamente&lt;br /&gt;
     todos P (x @ y) = (todos P x ∧ todos P y)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* manperjim pabalagon alfmarcua josgomrom4 aritbatval cammonagu&lt;br /&gt;
   raffergon2 enrparalv benber gleherlop chrgencar giafus1 pabbergue&lt;br /&gt;
   alikan marfruman1 antramhur juacanrod hugrubsan aribatval *) &lt;br /&gt;
lemma &amp;quot;todos P (x @ y) = (todos P x ∧ todos P y)&amp;quot;&lt;br /&gt;
  by (induct x) auto&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4.2. Demostrar o refutar detalladamente&lt;br /&gt;
     todos P (x @ y) = (todos P x ∧ todos P y)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* manperjim pabalagon josgomrom4 raffergon2 cammonagu enrparalv&lt;br /&gt;
   gleherlop chrgencar giafus1 pabbergue alikan antramhur juacanrod&lt;br /&gt;
   hugrubsan *)  &lt;br /&gt;
lemma todos_append:&lt;br /&gt;
  &amp;quot;todos P (x @ y) = (todos P x ∧ todos P y)&amp;quot;&lt;br /&gt;
proof (induct x)&lt;br /&gt;
  show &amp;quot;todos P ([] @ y) = (todos P [] ∧ todos P y)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a x&lt;br /&gt;
  assume HI: &amp;quot;todos P (x @ y) = (todos P x ∧ todos P y)&amp;quot;&lt;br /&gt;
  have &amp;quot;todos P ((a#x) @ y) = (P a ∧ todos P (x @ y))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (P a ∧ todos P x ∧ todos P y)&amp;quot; using HI by simp&lt;br /&gt;
  finally show &amp;quot;todos P ((a#x) @ y) = (todos P (a#x) ∧ todos P y)&amp;quot; &lt;br /&gt;
    by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* alfmarcua marfruman1 *)&lt;br /&gt;
lemma todos_append_2:&lt;br /&gt;
  &amp;quot;todos P (x @ y) = (todos P x ∧ todos P y)&amp;quot; (is &amp;quot;?P x&amp;quot;)&lt;br /&gt;
proof (induct x)&lt;br /&gt;
  have &amp;quot;todos P ([] @ y) = todos P y&amp;quot; by (simp only: append_Nil)&lt;br /&gt;
  also have &amp;quot;... = (True ∧ todos P y)&amp;quot; by (simp only: simp_thms(22))&lt;br /&gt;
  also have &amp;quot;... = (todos P [] ∧ todos P y)&amp;quot; &lt;br /&gt;
    by (simp only: todos.simps(1))&lt;br /&gt;
  finally show &amp;quot;?P []&amp;quot; .&lt;br /&gt;
next&lt;br /&gt;
  fix a x&lt;br /&gt;
  assume HI:&amp;quot;?P x&amp;quot;&lt;br /&gt;
  have &amp;quot;todos P ((a # x) @ y) = todos P (a # (x @ y))&amp;quot;&lt;br /&gt;
    by (simp only:List.append.append_Cons)&lt;br /&gt;
  also have &amp;quot;... = (P a ∧ todos P (x @ y))&amp;quot; &lt;br /&gt;
    by (simp only: todos.simps(2))&lt;br /&gt;
  also have &amp;quot;... = (P a ∧ todos P x ∧ todos P y)&amp;quot; by (simp only:HI)&lt;br /&gt;
  also have &amp;quot;... = ((P a ∧ todos P x) ∧ todos P y)&amp;quot;  &lt;br /&gt;
    by (simp only:HOL.conj_assoc)&lt;br /&gt;
  also have &amp;quot;... = (todos P (a#x) ∧ todos P y)&amp;quot; &lt;br /&gt;
    by (simp only: todos.simps(2))&lt;br /&gt;
  finally show &amp;quot;?P (a#x)&amp;quot; .&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber *)&lt;br /&gt;
lemma todos_append_3:&lt;br /&gt;
  &amp;quot;todos P (x @ y) = (todos P x ∧ todos P y)&amp;quot;&lt;br /&gt;
proof (induct x )&lt;br /&gt;
  case Nil&lt;br /&gt;
  have &amp;quot;todos P ( [] @ y ) = todos P y&amp;quot; &lt;br /&gt;
    by (simp only: List.append.left_neutral)&lt;br /&gt;
  also have &amp;quot;... = (todos P [] ∧ todos P y)&amp;quot; &lt;br /&gt;
    by (simp only: todos.simps(1) simp_thms(22))&lt;br /&gt;
  finally show ?case.&lt;br /&gt;
next&lt;br /&gt;
  case (Cons a x)&lt;br /&gt;
  assume IH: &amp;quot;todos P (x @ y) = (todos P x ∧ todos P y)&amp;quot;&lt;br /&gt;
  have &amp;quot;todos P ((a # x) @ y) = (P a ∧ todos P (x @ y))&amp;quot;&lt;br /&gt;
    by (simp only: todos.simps(2) List.append.append_Cons)&lt;br /&gt;
  also have &amp;quot;... = (P a ∧ todos P x ∧ todos P y)&amp;quot; by (simp only: IH)&lt;br /&gt;
  also have &amp;quot;... = (todos P (a#x) ∧ todos P y)&amp;quot; &lt;br /&gt;
    by (simp only: todos.simps(2) conj_assoc )&lt;br /&gt;
  finally show ?case.&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5.1. Demostrar o refutar automáticamente &lt;br /&gt;
     todos P (rev xs) = todos P xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* manperjim pabalagon josgomrom4 alfmarcua aribatval cammonagu&lt;br /&gt;
   raffergon2 giafus1 pabbergue enrparalv alikan antramhur juacanrod&lt;br /&gt;
   hugrubsan *)  &lt;br /&gt;
lemma &amp;quot;todos P (rev xs) = todos P xs&amp;quot;&lt;br /&gt;
  by (induct xs) (simp_all add: HOL.conj_comms todos_append)&lt;br /&gt;
&lt;br /&gt;
(* benber marfruman1*)&lt;br /&gt;
lemma &amp;quot;todos P (rev xs) = todos P xs&amp;quot;&lt;br /&gt;
  using todos_append by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5.2. Demostrar o refutar detalladamente&lt;br /&gt;
     todos P (rev xs) = todos P xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* manperjim pabalagon josgomrom4 raffergon2 cammonagu gleherlop giafus1&lt;br /&gt;
   pabbergue enrparalv marfruman1 alikan chrgencar antramhur juacanrod&lt;br /&gt;
   hugrubsan aribatval *)  &lt;br /&gt;
lemma &amp;quot;todos P (rev xs) = todos P xs&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;todos P (rev []) = todos P []&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume HI: &amp;quot;todos P (rev xs) = todos P xs&amp;quot;&lt;br /&gt;
  have &amp;quot;todos P (rev (a#xs)) = todos P ((rev xs) @ [a])&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (todos P (rev xs) ∧ todos P [a])&amp;quot; &lt;br /&gt;
    by (simp add: todos_append)&lt;br /&gt;
  also have &amp;quot;... = (todos P xs ∧ todos P [a])&amp;quot; using HI by simp&lt;br /&gt;
  also have &amp;quot;... = (todos P xs ∧ P a)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (P a ∧ todos P xs)&amp;quot; by (simp add: HOL.conj_comms)&lt;br /&gt;
  finally show &amp;quot;todos P (rev (a#xs)) = todos P (a#xs)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* alfmarcua *)&lt;br /&gt;
lemma &amp;quot;todos P (rev xs) = todos P xs&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 only: rev.simps(1))&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume HI:&amp;quot;?P xs&amp;quot;&lt;br /&gt;
  have &amp;quot;todos P (rev (a # xs)) = todos P (rev xs @ [a])&amp;quot; &lt;br /&gt;
    by (simp only: rev.simps(2))&lt;br /&gt;
  also have &amp;quot;... = (todos P (rev xs) ∧ todos P [a])&amp;quot; &lt;br /&gt;
    by (simp only: todos_append)&lt;br /&gt;
  also have &amp;quot;... = (todos P xs ∧ todos P [a])&amp;quot; by (simp only: HI)&lt;br /&gt;
  also have &amp;quot;... = (todos P (a#[]) ∧ todos P xs)&amp;quot; &lt;br /&gt;
    by (simp only: HOL.conj_comms)&lt;br /&gt;
  also have &amp;quot;... = ((P a ∧ True) ∧ todos P xs)&amp;quot; &lt;br /&gt;
    by (simp only: todos.simps)&lt;br /&gt;
  also have &amp;quot;... = (P a ∧ todos P xs)&amp;quot;  &lt;br /&gt;
    by (simp only: HOL.simp_thms(21))&lt;br /&gt;
  also have &amp;quot;... = todos P (a#xs)&amp;quot; by (simp only: todos.simps(2))&lt;br /&gt;
  finally show &amp;quot;?P (a#xs)&amp;quot; .&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber *)&lt;br /&gt;
lemma &amp;quot;todos P (rev xs) = todos P xs&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  case Nil&lt;br /&gt;
  show &amp;quot;todos P (rev []) = todos P []&amp;quot; by (simp only: rev.simps(1))&lt;br /&gt;
next&lt;br /&gt;
  case (Cons x xs)&lt;br /&gt;
  assume IH: &amp;quot;todos P (rev xs) = todos P xs&amp;quot;&lt;br /&gt;
  have &amp;quot;todos P (rev (x#xs)) = todos P (rev xs @ [x])&amp;quot; &lt;br /&gt;
    by (simp only: rev.simps(2))&lt;br /&gt;
  also have &amp;quot;... = (todos P (rev xs) ∧ todos P [x] )&amp;quot; &lt;br /&gt;
    by (simp only: todos_append)&lt;br /&gt;
  also have &amp;quot;... = (todos P (rev xs) ∧ P x ∧ todos P [])&amp;quot; &lt;br /&gt;
    by (simp only: todos.simps(2))&lt;br /&gt;
  also have &amp;quot;... = (todos P (rev xs) ∧ P x)&amp;quot; &lt;br /&gt;
    by (simp only: todos.simps(1) simp_thms(21))&lt;br /&gt;
  also have &amp;quot;... = (todos P xs ∧ P x)&amp;quot; by (simp only: IH)&lt;br /&gt;
  also have &amp;quot;... = (todos P (x#xs))&amp;quot; &lt;br /&gt;
    by (simp only: todos.simps(2) conj_commute)&lt;br /&gt;
  finally show ?case.&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 6. Demostrar o refutar:&lt;br /&gt;
    algunos (λx. P x ∧ Q x) xs = (algunos P xs ∧ algunos Q xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon *)&lt;br /&gt;
lemma &amp;quot;algunos (λx. P x ∧ Q x) xs = (algunos P xs ∧ algunos Q xs)&amp;quot;&lt;br /&gt;
  nitpick&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
(* Contraejemplo *)&lt;br /&gt;
value &amp;quot;algunos (λx. even x ∧ odd x) [1, 2::nat] ≠&lt;br /&gt;
  algunos even [1, 2::nat] ∧ algunos odd [1, 2::nat]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* manperjim alfmarcua raffergon2 gleherlop chrgencar cammonagu giafus1&lt;br /&gt;
   pabbergue marfruman1 alikan antramhur juacanrod hugrubsan &lt;br /&gt;
   aribatval *) &lt;br /&gt;
lemma &amp;quot;algunos (λx. P x ∧ Q x) xs = (algunos P xs ∧ algunos Q xs)&amp;quot;&lt;br /&gt;
  quickcheck&lt;br /&gt;
  oops&lt;br /&gt;
&lt;br /&gt;
(* benber (demostración no completa) *)&lt;br /&gt;
fun is_zero :: &amp;quot;nat ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;is_zero n = (n = 0)&amp;quot;&lt;br /&gt;
fun is_one :: &amp;quot;nat ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;is_one n = (n = 1)&amp;quot;&lt;br /&gt;
lemma &amp;quot;¬( ∀P Q xs. algunos (λx. P x ∧ Q x) xs = (algunos P xs ∧ algunos Q xs) )&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  let ?P = is_one&lt;br /&gt;
  let ?Q = is_zero&lt;br /&gt;
  have &amp;quot;algunos (λx. ?P x ∧ ?Q x) [0,1] ≠ &lt;br /&gt;
       (algunos ?P [0,1] ∧ algunos ?Q [0,1])&amp;quot; by simp&lt;br /&gt;
  hence &amp;quot;∃ xs. algunos (λx. ?P x ∧ ?Q x) xs ≠ &lt;br /&gt;
         (algunos ?P xs ∧ algunos ?Q xs)&amp;quot; by (simp only: exI)&lt;br /&gt;
  hence &amp;quot;∃Q xs. algunos (λx. ?P x ∧ Q x) xs ≠ &lt;br /&gt;
         (algunos ?P xs ∧ algunos Q xs)&amp;quot;&lt;br /&gt;
    by  (simp only: exI[of &amp;quot;λQ. ∃ xs. algunos (λx. ?P x ∧ Q x) xs ≠ (algunos ?P xs ∧ algunos Q xs)&amp;quot;])&lt;br /&gt;
  hence &amp;quot;∃P Q xs. algunos (λx. P x ∧ Q x) xs ≠ (algunos P xs ∧ algunos Q xs)&amp;quot;&lt;br /&gt;
    (*&lt;br /&gt;
      No sé por qué esto no funciona:&lt;br /&gt;
      by (simp only: exI[of &amp;quot;λP Q xs. algunos (λx. P x ∧ Q x) xs ≠ (algunos P xs ∧ algunos Q xs)&amp;quot; ?P])&lt;br /&gt;
&lt;br /&gt;
      Parece que el problema es la expresión lambda.&lt;br /&gt;
    *)&lt;br /&gt;
    sorry&lt;br /&gt;
  thus ?thesis by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 7.1. Demostrar o refutar automáticamente &lt;br /&gt;
     algunos P (map f xs) = algunos (P ∘ f) xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* manperjim pabalagon josgomrom4 alfmarcua raffergon2 gleherlop&lt;br /&gt;
   cammonagu benber giafus1 pabbergue enrparalv marfruman1 alikan&lt;br /&gt;
   antramhur juacanrod hugrubsan aribatval *)  &lt;br /&gt;
lemma &amp;quot;algunos P (map f xs) = algunos (P o f) 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.2. Demostrar o refutar detalladamente&lt;br /&gt;
     algunos P (map f xs) = algunos (P ∘ f) xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* manperjim pabalagon cammonagu giafus1 gleherlop chrgencar pabbergue&lt;br /&gt;
   enrparalv marfruman1 alikan antramhur juacanrod hugrubsan *)&lt;br /&gt;
lemma &amp;quot;algunos P (map f xs) = algunos (P o f) xs&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;algunos P (map f []) = algunos (P ∘ f) []&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume HI: &amp;quot;algunos P (map f xs) = algunos (P ∘ f) xs&amp;quot;&lt;br /&gt;
  have &amp;quot;algunos P (map f (a#xs)) = (P (f a) ∨ algunos P (map f xs))&amp;quot; &lt;br /&gt;
    by simp&lt;br /&gt;
  also have &amp;quot;... = (P (f a) ∨ algunos (P ∘ f) xs)&amp;quot; using HI by simp&lt;br /&gt;
  also have &amp;quot;... = ((P ∘ f) a ∨ algunos (P ∘ f) xs)&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;algunos P (map f (a#xs)) = algunos (P ∘ f) (a#xs)&amp;quot; &lt;br /&gt;
    by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* josgomrom4 *)&lt;br /&gt;
lemma &amp;quot;algunos P (map f xs) = algunos (P o f) xs&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;algunos P (map f []) = algunos (P o f) []&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x xs&lt;br /&gt;
  assume HI: &amp;quot;algunos P (map f xs) = algunos (P o f) xs&amp;quot;&lt;br /&gt;
  have &amp;quot;algunos P (map f (x#xs)) = (P (f x) ∨ algunos P (map f xs))&amp;quot; &lt;br /&gt;
    by simp&lt;br /&gt;
  also have &amp;quot;... = (P (f x) ∨ algunos (P o f) xs)&amp;quot; using HI by simp&lt;br /&gt;
  finally show &amp;quot;algunos P (map f (x#xs)) = algunos (P o f) (x#xs)&amp;quot; &lt;br /&gt;
    by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* alfmarcua *)&lt;br /&gt;
lemma &amp;quot;algunos P (map f xs) = algunos (P o f) xs&amp;quot; (is &amp;quot;?P xs&amp;quot;)&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  have &amp;quot;algunos P (map f []) = algunos P []&amp;quot; &lt;br /&gt;
    by (simp only: List.list.map(1))&lt;br /&gt;
  also have &amp;quot;... =  algunos (P o f) []&amp;quot; by (simp only: algunos.simps(1))&lt;br /&gt;
  finally show &amp;quot;?P []&amp;quot; .&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume HI:&amp;quot;?P xs&amp;quot;&lt;br /&gt;
  have &amp;quot;algunos P (map f (a # xs)) =  algunos P (f a # map f xs)&amp;quot; &lt;br /&gt;
    by (simp only: List.list.map(2))&lt;br /&gt;
  also have &amp;quot;... = (P (f a) ∨ algunos P (map f xs))&amp;quot; &lt;br /&gt;
    by (simp only: algunos.simps(2))&lt;br /&gt;
  also have &amp;quot;... = (P (f a) ∨ algunos (P o f) xs)&amp;quot; by (simp only:HI)&lt;br /&gt;
  also have &amp;quot;... = ((P o f) a ∨ algunos (P o f) xs)&amp;quot; &lt;br /&gt;
    by (simp only: Fun.comp_apply)&lt;br /&gt;
  also have &amp;quot;... = algunos (P o f) (a#xs)&amp;quot; by (simp only: algunos.simps(2))&lt;br /&gt;
  finally show &amp;quot;?P (a#xs)&amp;quot; .&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber *)&lt;br /&gt;
lemma &amp;quot;algunos P (map f xs) = algunos (P o f) xs&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  case Nil&lt;br /&gt;
  have &amp;quot;algunos P (map f []) = algunos P []&amp;quot; by (simp only: list.map(1))&lt;br /&gt;
  also have &amp;quot;... = False&amp;quot; by (simp only: algunos.simps(1))&lt;br /&gt;
  also have &amp;quot;False = algunos (P ∘ f) []&amp;quot; by (simp only: algunos.simps(1))&lt;br /&gt;
  finally show ?case.&lt;br /&gt;
next&lt;br /&gt;
  case (Cons x xs)&lt;br /&gt;
  assume IH: &amp;quot;algunos P (map f xs) = algunos (P ∘ f) xs&amp;quot;&lt;br /&gt;
  have &amp;quot;algunos P (map f (x # xs)) = algunos P (f x # map f xs)&amp;quot; &lt;br /&gt;
    by (simp only: list.map(2))&lt;br /&gt;
  also have &amp;quot;... = ( (P ∘ f) x ∨ algunos P (map f xs) )&amp;quot; &lt;br /&gt;
    by (simp only: algunos.simps(2) o_apply)&lt;br /&gt;
  also have &amp;quot;... = ( (P ∘ f) x ∨ algunos (P ∘ f) xs )&amp;quot; &lt;br /&gt;
    by (simp only: IH)&lt;br /&gt;
  also have &amp;quot;... = algunos (P ∘ f) (x#xs)&amp;quot; &lt;br /&gt;
    by (simp only: algunos.simps(2))&lt;br /&gt;
  finally show ?case .&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 8.1. Demostrar o refutar automáticamente &lt;br /&gt;
     algunos P (xs @ ys) = (algunos P xs ∨ algunos P ys)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* manperjim pabalagon josgomrom4 alfmarcua raffergon2 cammonagu&lt;br /&gt;
   gleherlop chrgencar benber giafus1 pabbergue enrparalv marfruman1 &lt;br /&gt;
   alikan antramhur juacanrod hugrubsan aribatval *) &lt;br /&gt;
lemma &amp;quot;algunos P (xs @ ys) = (algunos P xs ∨ algunos P ys)&amp;quot;&lt;br /&gt;
  by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 8.2. Demostrar o refutar detalladamente&lt;br /&gt;
     algunos P (xs @ ys) = (algunos P xs ∨ algunos P ys)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* manperjim pabalagon josgomrom4 raffergon2 gleherlop cammonagu giafus1&lt;br /&gt;
   pabbergue enrparalv marfruman1 alikan antramhur juacanrod hugrubsan *) &lt;br /&gt;
lemma algunos_append:&lt;br /&gt;
  &amp;quot;algunos P (xs @ ys) = (algunos P xs ∨ algunos P ys)&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;algunos P ([] @ ys) = (algunos P [] ∨ algunos P ys)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume HI: &amp;quot;algunos P (xs @ ys) = (algunos P xs ∨ algunos P ys)&amp;quot;&lt;br /&gt;
  have &amp;quot;algunos P ((a#xs) @ ys) = (P a ∨ algunos P (xs @ ys))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (P a ∨ algunos P xs ∨ algunos P ys)&amp;quot; using HI by simp&lt;br /&gt;
  finally show  &amp;quot;algunos P ((a#xs) @ ys) = &lt;br /&gt;
                 (algunos P (a#xs) ∨ algunos P ys)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* alfmarcua *)&lt;br /&gt;
lemma algunos_append_2:&lt;br /&gt;
  &amp;quot;algunos P (xs @ ys) = (algunos P xs ∨ algunos P ys)&amp;quot; (is &amp;quot;?P xs&amp;quot;)&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  have &amp;quot;algunos P ([] @ ys) = algunos P ys&amp;quot; by (simp only: append_Nil)&lt;br /&gt;
  also have &amp;quot;... = (False ∨ algunos P ys)&amp;quot; by (simp only: simp_thms(32))&lt;br /&gt;
  also have &amp;quot;... = (algunos P [] ∨ algunos P ys)&amp;quot; &lt;br /&gt;
    by (simp only: algunos.simps(1))&lt;br /&gt;
  finally show &amp;quot;?P []&amp;quot; .&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume HI:&amp;quot;?P xs&amp;quot;&lt;br /&gt;
  have &amp;quot;algunos P ((a # xs) @ ys) = algunos P (a # (xs @ ys))&amp;quot;&lt;br /&gt;
    by (simp only:List.append.append_Cons)&lt;br /&gt;
  also have &amp;quot;... = (P a ∨ algunos P (xs @ ys))&amp;quot; &lt;br /&gt;
    by (simp only: algunos.simps(2))&lt;br /&gt;
  also have &amp;quot;... = (P a ∨ algunos P xs ∨ algunos P ys)&amp;quot; &lt;br /&gt;
    by (simp only:HI)&lt;br /&gt;
  also have &amp;quot;... = ((P a ∨ algunos P xs) ∨ algunos P ys)&amp;quot;  &lt;br /&gt;
    by (simp only:HOL.disj_assoc)&lt;br /&gt;
  also have &amp;quot;... = (algunos P (a#xs) ∨ algunos P ys)&amp;quot; &lt;br /&gt;
    by (simp only: algunos.simps(2))&lt;br /&gt;
  finally show &amp;quot;?P (a#xs)&amp;quot; .&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber *)&lt;br /&gt;
lemma algunos_append_3:&lt;br /&gt;
  &amp;quot;algunos P (xs @ ys) = (algunos P xs ∨ algunos P ys)&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  case Nil&lt;br /&gt;
  have &amp;quot;algunos P ([] @ ys) = algunos P ys&amp;quot; &lt;br /&gt;
    by (simp only: append.left_neutral)&lt;br /&gt;
  also have &amp;quot;... = ( algunos P [] ∨ algunos P ys )&amp;quot; &lt;br /&gt;
    by (simp only: algunos.simps(1) simp_thms(32))&lt;br /&gt;
  finally show ?case .&lt;br /&gt;
next&lt;br /&gt;
  case (Cons x xs)&lt;br /&gt;
  assume IH: &amp;quot;algunos P (xs @ ys) = ( algunos P xs ∨ algunos P ys )&amp;quot;&lt;br /&gt;
  have &amp;quot;algunos P ((x#xs) @ ys) = algunos P (x#(xs @ ys))&amp;quot; &lt;br /&gt;
    by (simp only: append_Cons)&lt;br /&gt;
  also have &amp;quot;... = ( P x ∨ algunos P (xs @ ys) )&amp;quot; &lt;br /&gt;
    by (simp only: algunos.simps(2))&lt;br /&gt;
  also have &amp;quot;... = ( P x ∨ algunos P xs ∨ algunos P ys )&amp;quot; &lt;br /&gt;
    by (simp only: IH)&lt;br /&gt;
  also have &amp;quot;... = ( algunos P (x#xs) ∨ algunos P ys )&amp;quot; &lt;br /&gt;
    by (simp only: algunos.simps(2) disj_assoc)&lt;br /&gt;
  finally show ?case .&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 9.1. Demostrar o refutar automáticamente&lt;br /&gt;
     algunos P (rev xs) = algunos P xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* manperjim pabalagon josgomrom4 alfmarcua raffergon2 gleherlop chrgencar &lt;br /&gt;
   cammonagu giafus1 pabbergue enrparalv alikan antramhur juacanrod&lt;br /&gt;
   hugrubsan aribatval *)  &lt;br /&gt;
lemma &amp;quot;algunos P (rev xs) = algunos P xs&amp;quot;&lt;br /&gt;
  by (induct xs) (simp_all add: HOL.disj_comms algunos_append)&lt;br /&gt;
&lt;br /&gt;
(* benber marfruman1 *)&lt;br /&gt;
lemma &amp;quot;algunos P (rev xs) = algunos P xs&amp;quot;&lt;br /&gt;
  using algunos_append by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 9.2. Demostrar o refutar detalladamente&lt;br /&gt;
     algunos P (rev xs) = algunos P xs&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* pabalagon juacanrod *)&lt;br /&gt;
lemma &amp;quot;algunos P (rev xs) = algunos P xs&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;algunos P (rev []) = algunos P []&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume HI: &amp;quot;algunos P (rev xs) = algunos P xs&amp;quot;&lt;br /&gt;
  have &amp;quot;algunos P (rev (a#xs)) = algunos P (rev xs @ [a])&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (algunos P (rev xs) ∨ algunos P [a])&amp;quot; &lt;br /&gt;
    by (simp add: algunos_append)&lt;br /&gt;
  also have &amp;quot;... = (algunos P xs ∨ algunos P [a])&amp;quot; using HI by simp&lt;br /&gt;
  also have &amp;quot;... = (algunos P xs ∨ P a)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (P a ∨ algunos P xs)&amp;quot; by (simp add: HOL.disj_comms)&lt;br /&gt;
  finally show &amp;quot;algunos P (rev (a#xs)) = algunos P (a#xs)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* manperjim josgomrom4 raffergon2 gleherlop chrgencar cammonagu giafus1&lt;br /&gt;
   pabbergue enrparalv marfruman1 alikan antramhur hugrubsan *)&lt;br /&gt;
lemma &amp;quot;algunos P (rev xs) = algunos P xs&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;algunos P (rev []) = algunos P []&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume HI:&amp;quot;algunos P (rev xs) = algunos P xs&amp;quot;&lt;br /&gt;
  have &amp;quot;algunos P (rev (a # xs)) = algunos P ((rev xs) @ [a])&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = ((algunos P (rev xs)) ∨ (algunos P [a]))&amp;quot; &lt;br /&gt;
    by (simp add: algunos_append)&lt;br /&gt;
  also have &amp;quot;... = ((algunos P xs) ∨ (algunos P [a]))&amp;quot; using HI by simp&lt;br /&gt;
  also have &amp;quot;... = ((algunos P [a]) ∨ (algunos P xs))&amp;quot; by arith&lt;br /&gt;
  finally show &amp;quot;algunos P (rev (a # xs)) = algunos P (a # xs)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* alfmarcua *)&lt;br /&gt;
lemma &amp;quot;algunos P (rev xs) = algunos P xs&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 only: rev.simps(1))&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume HI:&amp;quot;?P xs&amp;quot;&lt;br /&gt;
  have &amp;quot;algunos P (rev (a # xs)) = algunos P (rev xs @ [a])&amp;quot; &lt;br /&gt;
    by (simp only: rev.simps(2))&lt;br /&gt;
  also have &amp;quot;... = (algunos P (rev xs) ∨ algunos P [a])&amp;quot; &lt;br /&gt;
    by (simp only: algunos_append)&lt;br /&gt;
  also have &amp;quot;... = (algunos P xs ∨ algunos P [a])&amp;quot; by (simp only: HI)&lt;br /&gt;
  also have &amp;quot;... = (algunos P (a#[]) ∨ algunos P xs)&amp;quot; &lt;br /&gt;
    by (simp only: HOL.disj_comms)&lt;br /&gt;
  also have &amp;quot;... = ((P a ∨ False) ∨ algunos P xs)&amp;quot; &lt;br /&gt;
    by (simp only: algunos.simps)&lt;br /&gt;
  also have &amp;quot;... = (P a ∨ algunos P xs)&amp;quot;  &lt;br /&gt;
    by (simp only: HOL.simp_thms(31))&lt;br /&gt;
  also have &amp;quot;... = algunos P (a#xs)&amp;quot; by (simp only: algunos.simps(2))&lt;br /&gt;
  finally show &amp;quot;?P (a#xs)&amp;quot; .&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber *)&lt;br /&gt;
lemma &amp;quot;algunos P (rev xs) = algunos P xs&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  case Nil&lt;br /&gt;
  show ?case by (simp only: algunos.simps(1) rev.simps(1))&lt;br /&gt;
next&lt;br /&gt;
  case (Cons x xs)&lt;br /&gt;
  assume IH: &amp;quot;algunos P (rev xs) = algunos P xs&amp;quot;&lt;br /&gt;
  have &amp;quot;algunos P (rev (x#xs)) = algunos P ( (rev xs) @ [x] )&amp;quot; &lt;br /&gt;
    by (simp only: rev.simps(2))&lt;br /&gt;
  also have &amp;quot;... = ( algunos P (rev xs) ∨ algunos P [x] )&amp;quot; &lt;br /&gt;
    by (simp only: algunos_append)&lt;br /&gt;
  also have &amp;quot;... = ( algunos P (rev xs) ∨ P x ∨ algunos P [] )&amp;quot; &lt;br /&gt;
    by (simp only: algunos.simps(2))&lt;br /&gt;
  also have &amp;quot;... = ( algunos P (rev xs) ∨ P x )&amp;quot; &lt;br /&gt;
    by (simp only: algunos.simps(1) simp_thms(31))&lt;br /&gt;
  also have &amp;quot;... = (algunos P xs ∨ P x)&amp;quot; by (simp only: IH)&lt;br /&gt;
  also have &amp;quot;... = algunos P (x#xs)&amp;quot; &lt;br /&gt;
    by (simp only: algunos.simps(2) disj_commute)&lt;br /&gt;
  finally show ?case.&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 10. Encontrar un término no trivial Z tal que sea cierta la &lt;br /&gt;
  siguiente ecuación:&lt;br /&gt;
     algunos (λx. P x ∨ Q x) xs = Z&lt;br /&gt;
  y demostrar la equivalencia de forma automática y detallada.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* manperjim pabalagon josgomrom4 alfmarcua raffergon2 cammonagu&lt;br /&gt;
   gleherlop chrgencar benber giafus1 enrparalv marfruman1 antramhur&lt;br /&gt;
   alikan hugrubsan aribatval *)  &lt;br /&gt;
lemma &amp;quot;algunos (λx. P x ∨ Q x) xs = (algunos P xs ∨ algunos Q xs)&amp;quot;&lt;br /&gt;
  by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
(* pabalagon josgomrom4 cammonagu pabbergue marfruman1 antramhur&lt;br /&gt;
   juacanrod alikan *) &lt;br /&gt;
lemma &amp;quot;algunos (λx. P x ∨ Q x) xs = (algunos P xs ∨ algunos Q xs)&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;algunos (λx. P x ∨ Q x) [] = (algunos P [] ∨ algunos Q [])&amp;quot; &lt;br /&gt;
    by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume HI: &amp;quot;algunos (λx. P x ∨ Q x) xs = &lt;br /&gt;
              (algunos P xs ∨ algunos Q xs)&amp;quot;&lt;br /&gt;
  have &amp;quot;algunos (λx. P x ∨ Q x) (a#xs) = &lt;br /&gt;
        (P a ∨ Q a ∨ algunos (λx. P x ∨ Q x) xs)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (P a ∨ Q a ∨ algunos P xs ∨ algunos Q xs)&amp;quot; &lt;br /&gt;
    using HI by simp&lt;br /&gt;
  also have &amp;quot;... = (P a ∨ algunos P xs ∨ Q a ∨ algunos Q xs)&amp;quot; &lt;br /&gt;
    by (simp add: HOL.disj_comms)&lt;br /&gt;
  finally show &amp;quot;algunos (λx. P x ∨ Q x) (a#xs) = &lt;br /&gt;
                (algunos P (a#xs) ∨ algunos Q (a#xs))&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* alfmarcua *)&lt;br /&gt;
lemma &amp;quot;algunos (λx. P x ∨ Q x) xs = (algunos P xs ∨ algunos Q xs)&amp;quot; &lt;br /&gt;
      (is &amp;quot;?P xs&amp;quot;)&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;?P []&amp;quot; by (simp only: algunos.simps(1) HOL.simp_thms(33))&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume HI:&amp;quot;?P xs&amp;quot;&lt;br /&gt;
  have &amp;quot;algunos (λx. P x ∨ Q x) (a # xs) = &lt;br /&gt;
        ((P a ∨ Q a) ∨ algunos (λx. P x ∨ Q x) xs)&amp;quot; &lt;br /&gt;
    by (simp only: algunos.simps(2))&lt;br /&gt;
  also have &amp;quot;... = ((P a ∨ Q a) ∨ algunos P xs ∨ algunos Q xs)&amp;quot; &lt;br /&gt;
    by (simp only: HI)&lt;br /&gt;
  also have &amp;quot;... = ((P a ∨ algunos P xs) ∨ Q a  ∨ algunos Q xs)&amp;quot; &lt;br /&gt;
    by (simp only: HOL.disj_assoc HOL.disj_comms)&lt;br /&gt;
  also have &amp;quot;... = (algunos P (a # xs) ∨ algunos Q (a # xs))&amp;quot; &lt;br /&gt;
    by (simp only: algunos.simps(2))&lt;br /&gt;
  finally show &amp;quot;?P (a#xs)&amp;quot; .&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber *)&lt;br /&gt;
lemma &amp;quot;algunos (λx. P x ∨ Q x) xs = ( algunos P xs ∨ algunos Q xs )&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  case Nil&lt;br /&gt;
  have &amp;quot;algunos (λx. P x ∨ Q x) [] = False&amp;quot; &lt;br /&gt;
    by (simp only: algunos.simps(1))&lt;br /&gt;
  also have &amp;quot;... = ( algunos P [] ∨ algunos Q [] )&amp;quot; &lt;br /&gt;
    by (simp only: algunos.simps(1) simp_thms(31))&lt;br /&gt;
  finally show ?case.&lt;br /&gt;
next&lt;br /&gt;
  case (Cons x xs)&lt;br /&gt;
  let ?R = &amp;quot;λx. P x ∨ Q x&amp;quot;&lt;br /&gt;
  assume IH: &amp;quot;algunos ?R xs = ( algunos P xs ∨ algunos Q xs )&amp;quot;&lt;br /&gt;
  have &amp;quot;algunos ?R (x#xs) = ( ?R x ∨ algunos ?R xs )&amp;quot; &lt;br /&gt;
    by (simp only: algunos.simps(2))&lt;br /&gt;
  also have &amp;quot;... = ( P x ∨ Q x ∨ algunos P xs ∨ algunos Q xs )&amp;quot; &lt;br /&gt;
    by (simp only: IH disj_assoc)&lt;br /&gt;
  also have &amp;quot;... = ( P x ∨ (Q x ∨ algunos P xs) ∨ algunos Q xs )&amp;quot; &lt;br /&gt;
    by (simp only: disj_assoc)&lt;br /&gt;
  also have &amp;quot;... = ( P x ∨ (algunos P xs ∨ Q x) ∨ algunos Q xs )&amp;quot; &lt;br /&gt;
    by (simp only: disj_commute)&lt;br /&gt;
  also have &amp;quot;... = ( algunos P (x#xs) ∨ algunos Q (x#xs) )&amp;quot; &lt;br /&gt;
    by (simp only: algunos.simps(2) disj_assoc)&lt;br /&gt;
  finally show ?case .&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 11.1. Demostrar o refutar automáticamente&lt;br /&gt;
     algunos P xs = (¬ todos (λx. (¬ P x)) xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* manperjim pabalagon josgomrom4 alfmarcua raffergon2 cammonagu&lt;br /&gt;
   gleherlop chrgencar benber giafus1 pabbergue enrparalv marfruman1&lt;br /&gt;
   antramhur juacanrod alikan hugrubsan aribatval *) &lt;br /&gt;
lemma &amp;quot;algunos P xs = (¬ todos (λx. (¬ P 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 11.2. Demostrar o refutar detalladamente&lt;br /&gt;
     algunos P xs = (¬ todos (λx. (¬ P x)) xs)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* manperjim pabalagon josgomrom4 cammonagu pabbergue enrparalv&lt;br /&gt;
   marfruman1 antramhur juacanrod alikan hugrubsan aribatval *)&lt;br /&gt;
lemma &amp;quot;algunos P xs = (¬ todos (λx. (¬ P x)) xs)&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  have &amp;quot;algunos P [] = False&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (¬ todos (λx. (¬ P x)) [])&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;algunos P [] = (¬ todos (λx. (¬ P x)) [])&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume HI: &amp;quot;algunos P xs = (¬ todos (λx. (¬ P x)) xs)&amp;quot;&lt;br /&gt;
  have &amp;quot;(¬ todos (λx. (¬ P x)) (a#xs)) = &lt;br /&gt;
        (¬ ((¬ P a) ∧ todos (λx. (¬ P x)) xs))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (P a ∨ ¬ todos (λx. (¬ P x)) xs)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (P a ∨ algunos P xs)&amp;quot; using HI by simp&lt;br /&gt;
  finally show &amp;quot;algunos P (a#xs) = (¬ todos (λx. (¬ P x)) (a#xs))&amp;quot; &lt;br /&gt;
    by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* alfmarcua *)&lt;br /&gt;
lemma &amp;quot;algunos P xs = (¬ todos (λx. (¬ P x)) xs)&amp;quot; (is &amp;quot;?P xs&amp;quot;)&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  have &amp;quot;algunos P [] = False&amp;quot; by (simp only:algunos.simps(1))&lt;br /&gt;
  also have &amp;quot;... = (¬ True)&amp;quot; by (simp only: HOL.simp_thms(7))&lt;br /&gt;
  also have &amp;quot;... = (¬ todos (λx. (¬ P x)) [])&amp;quot; &lt;br /&gt;
    by (simp only: todos.simps(1))&lt;br /&gt;
  finally show &amp;quot;?P []&amp;quot; .&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume HI:&amp;quot;?P xs&amp;quot;&lt;br /&gt;
  have &amp;quot;algunos P (a # xs) = (P a ∨ algunos P xs)&amp;quot; &lt;br /&gt;
    by (simp only: algunos.simps(2))&lt;br /&gt;
  also have &amp;quot;... = (P a ∨ ¬ todos (λx. (¬ P x)) xs)&amp;quot; &lt;br /&gt;
    by (simp only: HI)&lt;br /&gt;
  also have &amp;quot;... = (¬ ¬ P a ∨ ¬ todos (λx. (¬ P x)) xs)&amp;quot; &lt;br /&gt;
    by (simp only: HOL.simp_thms(1))&lt;br /&gt;
  also have &amp;quot;... = (¬ (¬ P a ∧ todos (λx. (¬ P x)) xs))&amp;quot; &lt;br /&gt;
    by (simp only: HOL.de_Morgan_conj)&lt;br /&gt;
  also have &amp;quot;... = (¬ todos (λx. (¬ P x)) (a#xs))&amp;quot; &lt;br /&gt;
    by (simp only: todos.simps(2))&lt;br /&gt;
  finally show &amp;quot;?P (a#xs)&amp;quot; .&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber *)&lt;br /&gt;
lemma &amp;quot;algunos P xs = (¬ todos (λx. (¬ P x)) xs)&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  case Nil&lt;br /&gt;
  have &amp;quot;algunos P [] = False&amp;quot; by (simp only: algunos.simps(1))&lt;br /&gt;
  also have &amp;quot;False = (¬ todos (λx. ¬ P x) [])&amp;quot; &lt;br /&gt;
    by (simp only: todos.simps(1) not_True_eq_False)&lt;br /&gt;
  finally show ?case .&lt;br /&gt;
next&lt;br /&gt;
  case (Cons x xs)&lt;br /&gt;
  assume IH: &amp;quot;algunos P xs = (¬ todos (λx. (¬ P x)) xs)&amp;quot;&lt;br /&gt;
  have &amp;quot;algunos P (x#xs) = ( P x ∨ algunos P xs )&amp;quot; &lt;br /&gt;
    by (simp only: algunos.simps(2))&lt;br /&gt;
  also have &amp;quot;... = ( P x ∨ (¬ todos (λx. (¬ P x)) xs) )&amp;quot; &lt;br /&gt;
    by (simp only: IH)&lt;br /&gt;
  also have &amp;quot;... = ( ¬( ¬ P x ∧ todos (λx. (¬ P x)) xs) )&amp;quot; &lt;br /&gt;
    by (simp only: not_not de_Morgan_conj)&lt;br /&gt;
  also have &amp;quot;... = (¬ todos (λx. (¬ P x)) (x#xs))&amp;quot; &lt;br /&gt;
    by (simp only: todos.simps(2))&lt;br /&gt;
  finally show ?case .&lt;br /&gt;
qed&lt;br /&gt;
     &lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 12. Definir la funcion primitiva recursiva &lt;br /&gt;
     estaEn :: &amp;#039;a ⇒ &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (estaEn x xs) se verifica si el elemento x está en la lista&lt;br /&gt;
  xs. Por ejemplo, &lt;br /&gt;
     estaEn (2::nat) [3,2,4] = True&lt;br /&gt;
     estaEn (1::nat) [3,2,4] = False&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* manperjim pabalagon josgomrom4 alfmarcua raffergon2 cammonagu&lt;br /&gt;
   gleherlop chrgencar benber giafus1 pabbergue enrparalv marfruman1&lt;br /&gt;
   antramhur juacanrod alikan hugrubsan aribatval *) &lt;br /&gt;
fun estaEn :: &amp;quot;&amp;#039;a ⇒ &amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;estaEn x [] = False&amp;quot; |&lt;br /&gt;
  &amp;quot;estaEn x (y#xs) = (x=y ∨ estaEn x xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 13. Expresar la relación existente entre estaEn y algunos. &lt;br /&gt;
  Demostrar dicha relación de forma automática y detallada.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
(* manperjim pabalagon josgomrom4 alfmarcua cammonagu gleherlop&lt;br /&gt;
   chrgencar benber giafus1 pabbergue marfruman1 antramhur juacanrod&lt;br /&gt;
   alikan *)  &lt;br /&gt;
lemma &amp;quot;estaEn x xs = algunos (λa. x=a) xs&amp;quot;&lt;br /&gt;
  by (induct xs) auto&lt;br /&gt;
&lt;br /&gt;
(* pabalagon josgomrom4 cammonagu marfruman1 antramhur *)&lt;br /&gt;
lemma &amp;quot;estaEn x xs = algunos (λa. x=a) xs&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  show &amp;quot;estaEn x [] = algunos (λa. x=a) []&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix y xs&lt;br /&gt;
  assume HI: &amp;quot;estaEn x xs = algunos (λa. x=a) xs&amp;quot;&lt;br /&gt;
  have &amp;quot;estaEn x (y#xs) = (x=y ∨ estaEn x xs)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = (x=y ∨ algunos (λa. x=a) xs)&amp;quot; using HI by simp&lt;br /&gt;
  finally show &amp;quot;estaEn x (y#xs) = algunos (λa. x=a) (y#xs)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* alfmarcua *)&lt;br /&gt;
lemma &amp;quot;estaEn x xs = algunos (λk. x=k) xs&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 only: estaEn.simps(1) algunos.simps(1))&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume HI:&amp;quot;?P xs&amp;quot;&lt;br /&gt;
  have &amp;quot;estaEn x (a # xs) = (x=a ∨ estaEn x xs)&amp;quot; &lt;br /&gt;
    by (simp only: estaEn.simps(2))&lt;br /&gt;
  also have &amp;quot;... = (x=a ∨ algunos (λk. x=k) xs)&amp;quot; by (simp only: HI)&lt;br /&gt;
  (* also have &amp;quot;... = ((λk. x=k) a ∨ algunos (λk. x=k) xs)&amp;quot; by (simp only:HOL.simp_thms(6)) *)&lt;br /&gt;
  also have &amp;quot;... = algunos (λk. x=k) (a#xs)&amp;quot; by (simp only: algunos.simps(2))&lt;br /&gt;
  finally show &amp;quot;?P (a#xs)&amp;quot; .&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* benber *)&lt;br /&gt;
lemma &amp;quot;estaEn x xs = (algunos (λy. y = x) xs)&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  case Nil&lt;br /&gt;
  have &amp;quot;estaEn x [] = False&amp;quot; by (simp only: estaEn.simps(1))&lt;br /&gt;
  also have &amp;quot;False = (algunos (λy. y = x) [])&amp;quot; &lt;br /&gt;
    by (simp only: algunos.simps(1))&lt;br /&gt;
  finally show ?case .&lt;br /&gt;
next&lt;br /&gt;
  case (Cons z xs)&lt;br /&gt;
  assume IH: &amp;quot;estaEn x xs = algunos (λy. y = x) xs&amp;quot;&lt;br /&gt;
  have &amp;quot;estaEn x (z#xs) = ( z = x ∨ estaEn x xs )&amp;quot; by force&lt;br /&gt;
  also have &amp;quot;... = ( z = x ∨ algunos (λy. y = x) xs)&amp;quot; by (simp only: IH)&lt;br /&gt;
  also have &amp;quot;... = (algunos (λy. y = x) (z#xs))&amp;quot; &lt;br /&gt;
    by (simp only: algunos.simps(2))&lt;br /&gt;
  finally show ?case .&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/RA2018/index.php?title=Relaci%C3%B3n_3&amp;diff=409</id>
		<title>Relación 3</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2018/index.php?title=Relaci%C3%B3n_3&amp;diff=409"/>
		<updated>2019-02-28T10:56:36Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isabelle&amp;quot;&amp;gt;&lt;br /&gt;
chapter {* R3: Razonamiento sobre programas *}&lt;br /&gt;
&lt;br /&gt;
theory R3_Razonamiento_sobre_programas_alu&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1.1. Definir la función&lt;br /&gt;
     sumaImpares :: nat ⇒ nat&lt;br /&gt;
  tal que (sumaImpares n) es la suma de los n primeros números&lt;br /&gt;
  impares. Por ejemplo,&lt;br /&gt;
     sumaImpares 5  =  25&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun sumaImpares :: &amp;quot;nat ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;sumaImpares 0 = 0&amp;quot;&lt;br /&gt;
| &amp;quot;sumaImpares (Suc n) = sumaImpares n + (2*n+1)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1.2. Escribir la demostración detallada de &lt;br /&gt;
     sumaImpares n = n*n&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
(* benber *)&lt;br /&gt;
lemma &amp;quot;sumaImpares n = n*n&amp;quot;&lt;br /&gt;
proof (induct n)&lt;br /&gt;
  show &amp;quot;sumaImpares 0 = 0*0&amp;quot; by (simp only: sumaImpares.simps(1))&lt;br /&gt;
next&lt;br /&gt;
  fix n&lt;br /&gt;
  assume HI: &amp;quot;sumaImpares n = n*n&amp;quot;&lt;br /&gt;
  have &amp;quot;sumaImpares (Suc n) = sumaImpares n + (2*n+1)&amp;quot; &lt;br /&gt;
    by (simp only: sumaImpares.simps(2))&lt;br /&gt;
  also have &amp;quot;... = n*n + (2*n+1)&amp;quot; by (simp only: HI)&lt;br /&gt;
  also have &amp;quot;... = n*n + (n+n+1)&amp;quot; by (simp only:)&lt;br /&gt;
  also have &amp;quot;... = n*n + n + n + 1&amp;quot; by (simp only:)&lt;br /&gt;
  also have &amp;quot;... = n*n + n*1 + n + 1&amp;quot; by (simp only:)&lt;br /&gt;
  also have &amp;quot;... = n*(n+1) + n + 1&amp;quot; &lt;br /&gt;
    by (simp only: Nat.add_mult_distrib2)&lt;br /&gt;
  also have &amp;quot;... = n*(n+1) + (n+1)&amp;quot; by (simp only:)&lt;br /&gt;
  also have &amp;quot;... = (n+1)*n + (n+1)&amp;quot; &lt;br /&gt;
    by (simp only: Groups.ab_semigroup_mult_class.mult.commute)&lt;br /&gt;
  also have &amp;quot;... = (n+1)*n + (n+1)*1&amp;quot; by (simp only: Nat.nat_mult_1_right)&lt;br /&gt;
  also have &amp;quot;... = (n+1)*(n+1)&amp;quot; by (simp only: Nat.add_mult_distrib2)&lt;br /&gt;
  also have &amp;quot;... = (Suc n) * (Suc n)&amp;quot; by (simp only: Nat.Suc_eq_plus1)&lt;br /&gt;
  finally show &amp;quot;sumaImpares (Suc n) = (Suc n) * (Suc n)&amp;quot; .&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* manperjim pabalagon josgomrom4 hugrubsan enrparalv juacanrod *)&lt;br /&gt;
lemma &amp;quot;sumaImpares n = n*n&amp;quot;&lt;br /&gt;
proof (induct n)&lt;br /&gt;
  show &amp;quot;sumaImpares 0 = 0*0&amp;quot; by (simp only: sumaImpares.simps(1))&lt;br /&gt;
next&lt;br /&gt;
  fix n&lt;br /&gt;
  assume HI: &amp;quot;sumaImpares n = n*n&amp;quot;&lt;br /&gt;
  have &amp;quot;sumaImpares (Suc n) = sumaImpares n + 2 * n + 1&amp;quot; &lt;br /&gt;
    by (simp only: sumaImpares.simps(2))&lt;br /&gt;
  also have &amp;quot;... = n*n + 2*n + 1&amp;quot; using HI by simp&lt;br /&gt;
  also have &amp;quot;... = n*n + n + n + 1&amp;quot; by (simp only: Nat.add_mult_distrib)&lt;br /&gt;
  also have &amp;quot;... = (n+1)*n + (n + 1)&amp;quot; by (simp only: Nat.add_mult_distrib)&lt;br /&gt;
  also have &amp;quot;... = (n+1)*n + (n + 1)*1&amp;quot; by (simp only: Nat.nat_mult_1_right)&lt;br /&gt;
  also have &amp;quot;... = (n+1)*(n+1)&amp;quot; by (simp only: Nat.add_mult_distrib2)&lt;br /&gt;
  finally show &amp;quot;sumaImpares (Suc n) = (Suc n)*(Suc n)&amp;quot; &lt;br /&gt;
    by (simp only: Nat.Suc_eq_plus1)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* marfruman1 raffergon2 aribatval alfmarcua cammonagu gleherlop&lt;br /&gt;
   chrgencar alikan pabbergue giafus1 antramhur *) &lt;br /&gt;
lemma &amp;quot;sumaImpares n = n*n&amp;quot;&lt;br /&gt;
proof (induct n)&lt;br /&gt;
  show &amp;quot;sumaImpares 0 = 0*0&amp;quot; by (simp only: sumaImpares.simps(1))&lt;br /&gt;
next&lt;br /&gt;
  fix n&lt;br /&gt;
  assume HI: &amp;quot;sumaImpares n = n*n&amp;quot;&lt;br /&gt;
  have &amp;quot;sumaImpares (Suc n) = sumaImpares n + 2*n +1&amp;quot; &lt;br /&gt;
    by (simp only: sumaImpares.simps(2))&lt;br /&gt;
  also have &amp;quot;... = n*n + 2*n + 1&amp;quot; using HI by simp&lt;br /&gt;
  also have &amp;quot;... = (Suc n)*(Suc n)&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;sumaImpares (Suc n) = (Suc n)*(Suc n)&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2.1. Definir la función&lt;br /&gt;
     sumaPotenciasDeDosMasUno :: nat ⇒ nat&lt;br /&gt;
  tal que &lt;br /&gt;
     (sumaPotenciasDeDosMasUno n) = 1 + 2^0 + 2^1 + 2^2 + ... + 2^n. &lt;br /&gt;
  Por ejemplo, &lt;br /&gt;
     sumaPotenciasDeDosMasUno 3  =  16&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun sumaPotenciasDeDosMasUno :: &amp;quot;nat ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;sumaPotenciasDeDosMasUno 0 = 2&amp;quot;&lt;br /&gt;
| &amp;quot;sumaPotenciasDeDosMasUno (Suc n) = &lt;br /&gt;
      sumaPotenciasDeDosMasUno n + 2^(n+1)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2.2. Escribir la demostración detallada de &lt;br /&gt;
     sumaPotenciasDeDosMasUno n = 2^(n+1)&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
(* benber josgomrom4 *)&lt;br /&gt;
lemma &amp;quot;sumaPotenciasDeDosMasUno n = 2^(n+1)&amp;quot;&lt;br /&gt;
proof (induct n)&lt;br /&gt;
  have &amp;quot;sumaPotenciasDeDosMasUno 0 = 2&amp;quot; &lt;br /&gt;
    by (simp only: sumaPotenciasDeDosMasUno.simps(1))&lt;br /&gt;
  also have &amp;quot;... = 2^(0+1)&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;sumaPotenciasDeDosMasUno 0 = 2^(0+1)&amp;quot; .&lt;br /&gt;
next&lt;br /&gt;
  fix n&lt;br /&gt;
  assume HI: &amp;quot;sumaPotenciasDeDosMasUno n = 2^(n+1)&amp;quot;&lt;br /&gt;
  have &amp;quot;sumaPotenciasDeDosMasUno (Suc n) = &lt;br /&gt;
        sumaPotenciasDeDosMasUno n + 2^(n+1)&amp;quot;&lt;br /&gt;
    by (simp only: sumaPotenciasDeDosMasUno.simps(2))&lt;br /&gt;
  also have &amp;quot;... = 2^(n+1) + 2^(n+1)&amp;quot; by (simp only: HI)&lt;br /&gt;
  also have &amp;quot;... = 2 * 2^(n+1)&amp;quot; by (simp only:)&lt;br /&gt;
  also have &amp;quot;... = 2 * 2^(Suc n)&amp;quot; by (simp only: Nat.Suc_eq_plus1)&lt;br /&gt;
  also have &amp;quot;... = 2^(Suc (Suc n))&amp;quot; &lt;br /&gt;
    by (simp only: Power.power_class.power.power_Suc)&lt;br /&gt;
  also have &amp;quot;... = 2^((Suc n)+1)&amp;quot; by (simp only: Nat.Suc_eq_plus1)&lt;br /&gt;
  finally show &amp;quot;sumaPotenciasDeDosMasUno (Suc n) = 2^((Suc n)+1)&amp;quot; .&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* marfruman1 alfmarcua hugrubsan enrparalv gleherlop chrgencar&lt;br /&gt;
   juacanrod alikan *) &lt;br /&gt;
lemma &amp;quot;sumaPotenciasDeDosMasUno n = 2^(n+1)&amp;quot;&lt;br /&gt;
proof (induct n)&lt;br /&gt;
  have &amp;quot;sumaPotenciasDeDosMasUno 0 = 2&amp;quot; &lt;br /&gt;
    by (simp only: sumaPotenciasDeDosMasUno.simps(1))&lt;br /&gt;
  also have &amp;quot;... = 2^(0+1)&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;sumaPotenciasDeDosMasUno 0 = 2^(0+1)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix n&lt;br /&gt;
  assume HI: &amp;quot;sumaPotenciasDeDosMasUno n = 2^(n+1)&amp;quot;&lt;br /&gt;
  have &amp;quot;sumaPotenciasDeDosMasUno (Suc n) = &lt;br /&gt;
        sumaPotenciasDeDosMasUno n + 2^(n+1)&amp;quot;&lt;br /&gt;
    by (simp only: sumaPotenciasDeDosMasUno.simps(2))&lt;br /&gt;
  also have &amp;quot;... = 2^(n+1)+2^(n+1)&amp;quot; using HI by simp&lt;br /&gt;
  also have &amp;quot;... =2*2^(n+1)&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = 2^((Suc n)+1)&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;sumaPotenciasDeDosMasUno (Suc n) = 2^((Suc n)+1)&amp;quot; &lt;br /&gt;
    by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* manperjim pabalagon raffergon2 aribatval cammonagu hugrubsan&lt;br /&gt;
   pabbergue giafus1 antramhur*) &lt;br /&gt;
lemma &amp;quot;sumaPotenciasDeDosMasUno n = 2^(n+1)&amp;quot;&lt;br /&gt;
proof (induct n)&lt;br /&gt;
  have &amp;quot;sumaPotenciasDeDosMasUno 0 = 2&amp;quot; &lt;br /&gt;
    by (simp only: sumaPotenciasDeDosMasUno.simps(1))&lt;br /&gt;
  also have &amp;quot;... = 2^1&amp;quot; by (simp only: Power.power_one_right)&lt;br /&gt;
  finally show &amp;quot;sumaPotenciasDeDosMasUno 0 = 2^(0+1)&amp;quot; &lt;br /&gt;
    by (simp only: Nat.add_0)&lt;br /&gt;
next&lt;br /&gt;
  fix n&lt;br /&gt;
  assume HI: &amp;quot;sumaPotenciasDeDosMasUno n = 2^(n+1)&amp;quot;&lt;br /&gt;
  have &amp;quot;sumaPotenciasDeDosMasUno (Suc n) = &lt;br /&gt;
        sumaPotenciasDeDosMasUno n + 2^(n+1)&amp;quot;&lt;br /&gt;
    by (simp only: sumaPotenciasDeDosMasUno.simps(2))&lt;br /&gt;
  also have &amp;quot;... = 2^(n+1) + 2^(n+1)&amp;quot; by (simp only: HI)&lt;br /&gt;
  also have &amp;quot;... = 2*2^(n+1)&amp;quot; by (simp only: Nat.add_mult_distrib)&lt;br /&gt;
  also have &amp;quot;... = 2*2^(Suc n)&amp;quot; by (simp only: Nat.Suc_eq_plus1)&lt;br /&gt;
  also have &amp;quot;... = 2^(Suc n)*2^1&amp;quot; by (simp only: Power.power_one_right)&lt;br /&gt;
  finally show &amp;quot;sumaPotenciasDeDosMasUno (Suc n) = 2^(Suc n + 1)&amp;quot; &lt;br /&gt;
    by (simp only: Power.power_add)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3.1. Definir la función&lt;br /&gt;
     copia :: nat ⇒ &amp;#039;a ⇒ &amp;#039;a list&lt;br /&gt;
  tal que (copia n x) es la lista formado por n copias del elemento&lt;br /&gt;
  x. Por ejemplo, &lt;br /&gt;
     copia 3 x = [x,x,x]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun copia :: &amp;quot;nat ⇒ &amp;#039;a ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;copia 0 x       = []&amp;quot;&lt;br /&gt;
| &amp;quot;copia (Suc n) x = x # copia n x&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3.2. Definir la función&lt;br /&gt;
     todos :: (&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (todos p xs) se verifica si todos los elementos de xs cumplen&lt;br /&gt;
  la propiedad p. Por ejemplo,&lt;br /&gt;
     todos (λx. x&amp;gt;(1::nat)) [2,6,4] = True&lt;br /&gt;
     todos (λx. x&amp;gt;(2::nat)) [2,6,4] = False&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun todos :: &amp;quot;(&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;todos p []     = True&amp;quot;&lt;br /&gt;
| &amp;quot;todos p (x#xs) = (p x ∧ todos p xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3.2. Demostrar detalladamente que todos los elementos de&lt;br /&gt;
  (copia n x) son iguales a x. &lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
(* manperjim benber raffergon2 aribatval josgomrom4 hugrubsan cammonagu&lt;br /&gt;
   gleherlop chrgencar marfruman1 pabbergue giafus1 juacanrod &lt;br /&gt;
   antramhur *)  &lt;br /&gt;
lemma &amp;quot;todos (λy. y=x) (copia n x)&amp;quot;&lt;br /&gt;
proof (induct n)&lt;br /&gt;
  fix x :: &amp;#039;a&lt;br /&gt;
  have &amp;quot;todos (λy. y=x) (copia 0 x) = todos (λy. y=x) []&amp;quot; &lt;br /&gt;
    by (simp only: copia.simps(1))&lt;br /&gt;
  also have &amp;quot;...&amp;quot; by (simp only: todos.simps(1))&lt;br /&gt;
  finally show &amp;quot;todos (λy. y = x) (copia 0 x)&amp;quot; .&lt;br /&gt;
next&lt;br /&gt;
  fix x :: &amp;#039;a&lt;br /&gt;
  fix n :: nat&lt;br /&gt;
  assume HI: &amp;quot;todos (λy. y = x) (copia n x)&amp;quot;&lt;br /&gt;
  have &amp;quot;(todos (λy. y = x) (copia (Suc n) x) ) = &lt;br /&gt;
        (todos (λy. y = x) (x # copia n x))&amp;quot;&lt;br /&gt;
    by (simp only: copia.simps(2))&lt;br /&gt;
  also have &amp;quot;... = (((λy. y = x) x ) ∧ todos (λy. y = x) (copia n x) )&amp;quot;&lt;br /&gt;
    by (simp only: todos.simps(2))&lt;br /&gt;
  also have &amp;quot;...&amp;quot; by (simp only: HI)&lt;br /&gt;
  finally show &amp;quot;todos (λy. y = x) (copia (Suc n) x)&amp;quot; .&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* pabalagon *)&lt;br /&gt;
lemma &amp;quot;todos (λy. y=x) (copia n x)&amp;quot;&lt;br /&gt;
proof (induction n)&lt;br /&gt;
  fix x:: &amp;#039;a&lt;br /&gt;
  have &amp;quot;todos (λy. y=x) (copia 0 x) = todos (λy. y=x) []&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;...&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;todos (λy. y=x) (copia 0 x)&amp;quot; .&lt;br /&gt;
next&lt;br /&gt;
  fix x:: &amp;#039;a&lt;br /&gt;
  fix n:: nat&lt;br /&gt;
  assume HI: &amp;quot;todos (λy. y=x) (copia n x)&amp;quot;&lt;br /&gt;
  have &amp;quot;todos (λy. y=x) (copia (Suc n) x) = &lt;br /&gt;
        todos (λy. y=x) (x#(copia n x))&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = ((λy. y=x) x ∧ todos (λy. y=x) (copia n x))&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;todos (λy. y=x) (copia (Suc n) x)&amp;quot; using HI by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* alfmarcua *)&lt;br /&gt;
lemma &amp;quot;todos (λy. y=x) (copia n x)&amp;quot;&lt;br /&gt;
proof (induct n)&lt;br /&gt;
  have &amp;quot;todos (λy. y = x) (copia 0 x) = todos (λy. y = x) []&amp;quot; &lt;br /&gt;
    by (simp only: copia.simps(1))&lt;br /&gt;
  also have &amp;quot;...&amp;quot; by (simp only: todos.simps(1))&lt;br /&gt;
  finally show &amp;quot;todos (λy. y = x) (copia 0 x)&amp;quot; .&lt;br /&gt;
next&lt;br /&gt;
  fix n&lt;br /&gt;
  assume HI:&amp;quot;todos (λy. y = x) (copia n x)&amp;quot;&lt;br /&gt;
  have &amp;quot;(todos (λy. y = x) (copia (Suc n) x) ) = &lt;br /&gt;
        (todos (λy. y = x) (x # copia n x))&amp;quot;&lt;br /&gt;
    by (simp only: copia.simps(2))&lt;br /&gt;
  also have &amp;quot;... = ( ( (λy. y = x) x ) ∧ todos (λy. y = x) (copia n x) )&amp;quot;&lt;br /&gt;
    by (simp only: todos.simps(2))&lt;br /&gt;
  also have &amp;quot;...&amp;quot; by (simp only: HI)&lt;br /&gt;
  finally show &amp;quot;todos (λy. y = x) (copia (Suc n) x)&amp;quot; .&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4.1. Definir la función&lt;br /&gt;
    factR :: nat ⇒ nat&lt;br /&gt;
  tal que (factR n) es el factorial de n. Por ejemplo,&lt;br /&gt;
    factR 4 = 24&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun factR :: &amp;quot;nat ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;factR 0       = 1&amp;quot;&lt;br /&gt;
| &amp;quot;factR (Suc n) = Suc n * factR n&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4.2. Se considera la siguiente definición iterativa de la&lt;br /&gt;
  función factorial &lt;br /&gt;
     factI :: &amp;quot;nat ⇒ nat&amp;quot; where&lt;br /&gt;
     factI n = factI&amp;#039; n 1&lt;br /&gt;
     &lt;br /&gt;
     factI&amp;#039; :: nat ⇒ nat ⇒ nat&amp;quot; where&lt;br /&gt;
     factI&amp;#039; 0       x = x&lt;br /&gt;
     factI&amp;#039; (Suc n) x = factI&amp;#039; n (Suc n)*x&lt;br /&gt;
  Demostrar que, para todo n y todo x, se tiene &lt;br /&gt;
     factI&amp;#039; n x = x * factR n&lt;br /&gt;
  Indicación: La propiedad mult_Suc es &lt;br /&gt;
     (Suc m) * n = n + m * n&lt;br /&gt;
  Puede que se necesite desactivarla en un paso con &lt;br /&gt;
     (simp del: mult_Suc)&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
fun factI&amp;#039; :: &amp;quot;nat ⇒ nat ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;factI&amp;#039; 0       x = x&amp;quot;&lt;br /&gt;
| &amp;quot;factI&amp;#039; (Suc n) x = factI&amp;#039; n (x * Suc n)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
fun factI :: &amp;quot;nat ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;factI n = factI&amp;#039; n 1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* benber *)&lt;br /&gt;
lemma fact: &amp;quot;factI&amp;#039; n x = x * factR n&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  (* Reformulación para aplicar la hipótesis inductiva con un valor &lt;br /&gt;
     distinto de x. *)&lt;br /&gt;
  have &amp;quot;∀x. factI&amp;#039; n x = x * factR n&amp;quot;&lt;br /&gt;
  proof (induct n)&lt;br /&gt;
    show &amp;quot;∀x. factI&amp;#039; 0 x = x * factR 0&amp;quot;&lt;br /&gt;
    proof&lt;br /&gt;
      fix x&lt;br /&gt;
      have &amp;quot;factI&amp;#039; 0 x = x&amp;quot; by (simp only: factI&amp;#039;.simps(1))&lt;br /&gt;
      also have &amp;quot;... = x * 1&amp;quot; by (simp only:)&lt;br /&gt;
      also have &amp;quot;... = x * factR 0&amp;quot; by (simp only: factR.simps(1))&lt;br /&gt;
      finally show &amp;quot;factI&amp;#039; 0 x = x * factR 0&amp;quot; .&lt;br /&gt;
    qed&lt;br /&gt;
  next&lt;br /&gt;
    show &amp;quot;⋀n. ∀x. factI&amp;#039; n x = x * factR n ⟹ &lt;br /&gt;
              ∀x. factI&amp;#039; (Suc n) x = x * factR (Suc n)&amp;quot;&lt;br /&gt;
    proof&lt;br /&gt;
      fix x&lt;br /&gt;
      fix n&lt;br /&gt;
      assume HI: &amp;quot;∀y. factI&amp;#039; n y = y * factR n&amp;quot;&lt;br /&gt;
      have &amp;quot;factI&amp;#039; (Suc n) x =  factI&amp;#039; n (x * Suc n)&amp;quot; &lt;br /&gt;
        by (simp only: factI&amp;#039;.simps(2))&lt;br /&gt;
      also have &amp;quot;... = (x * Suc n) * factR n&amp;quot; by (simp only: HI)&lt;br /&gt;
      also have &amp;quot;... = x * factR (Suc n)&amp;quot; by (simp only: factR.simps(2))&lt;br /&gt;
      finally show &amp;quot;factI&amp;#039; (Suc n) x = x * factR (Suc n)&amp;quot; .&lt;br /&gt;
    qed&lt;br /&gt;
  qed&lt;br /&gt;
  thus &amp;quot;factI&amp;#039; n x = x * factR n&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* manperjim pabalagon raffergon2 aribatval josgomrom4 alfmarcua&lt;br /&gt;
   hugrubsan cammonagu marfruman1 gleherlop chrgencar pabbergue giafus1&lt;br /&gt;
   juacanrod antramhur *)  &lt;br /&gt;
lemma fact2: &amp;quot;factI&amp;#039; n x = x * factR n&amp;quot;&lt;br /&gt;
proof (induction n arbitrary: x)&lt;br /&gt;
  fix x&lt;br /&gt;
  have &amp;quot;factI&amp;#039; 0 x = x&amp;quot; by simp&lt;br /&gt;
  also have &amp;quot;... = x * 1&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;factI&amp;#039; 0 x = x * factR 0&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix n&lt;br /&gt;
  assume HI: &amp;quot;⋀x. factI&amp;#039; n x = x * factR n&amp;quot;&lt;br /&gt;
  show &amp;quot;⋀x. factI&amp;#039; (Suc n) x = x * factR (Suc n)&amp;quot;&lt;br /&gt;
  proof -&lt;br /&gt;
    fix x&lt;br /&gt;
    have &amp;quot;factI&amp;#039; (Suc n) x = factI&amp;#039; n (x * Suc n)&amp;quot; &lt;br /&gt;
      by (simp only: factI&amp;#039;.simps(2))&lt;br /&gt;
    also have &amp;quot;... = x * Suc n * factR n&amp;quot; using HI by simp&lt;br /&gt;
    finally show &amp;quot;factI&amp;#039; (Suc n) x = x*factR (Suc n)&amp;quot; &lt;br /&gt;
      by (simp only: factR.simps(2))&lt;br /&gt;
  qed&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4.3. Escribir la demostración detallada de&lt;br /&gt;
     factI n = factR n&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
(* benber *)&lt;br /&gt;
corollary &amp;quot;factI n = factR n&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  fix n&lt;br /&gt;
  have &amp;quot;factI n = factI&amp;#039; n 1&amp;quot; by (simp only: factI.simps(1))&lt;br /&gt;
  also have &amp;quot;... = 1 * factR n&amp;quot; by (simp only: fact)&lt;br /&gt;
  also have &amp;quot;... = factR n&amp;quot; by (simp only: Groups.mult_1)&lt;br /&gt;
  finally show &amp;quot;factI n = factR n&amp;quot; .&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* manperjim pabalagon raffergon2 josgomrom4 alfmarcua hugrubsan&lt;br /&gt;
   marfruman1 gleherlop chrgencar pabbergue giafus1 juacanrod &lt;br /&gt;
   antramhur *) &lt;br /&gt;
corollary &amp;quot;factI n = factR n&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;factI n = factI&amp;#039; n 1&amp;quot; by (simp only: factI.simps(1))&lt;br /&gt;
  also have &amp;quot;... = 1*factR n&amp;quot; using fact by simp&lt;br /&gt;
  finally show &amp;quot;factI n = factR n&amp;quot; by (simp only: mult_1)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5.1. Definir, recursivamente y sin usar (@), la función&lt;br /&gt;
     amplia :: &amp;#039;a list ⇒ &amp;#039;a ⇒ &amp;#039;a list&lt;br /&gt;
  tal que (amplia xs y) es la lista obtenida añadiendo el elemento y al&lt;br /&gt;
  final de la lista xs. Por ejemplo,&lt;br /&gt;
     amplia [d,a] t = [d,a,t]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
fun amplia :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;amplia []     y = [y]&amp;quot;&lt;br /&gt;
| &amp;quot;amplia (x#xs) y = x # amplia xs y&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5.2. Escribir la demostración detallada de&lt;br /&gt;
     amplia xs y = xs @ [y]&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
(* benber aribatval alfmarcua giafus1 *)&lt;br /&gt;
lemma &amp;quot;amplia xs y = xs @ [y]&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  have &amp;quot;amplia [] y = [y]&amp;quot; by (simp only: amplia.simps(1))&lt;br /&gt;
  also have &amp;quot;... = [] @ [y]&amp;quot; by (simp only: List.append.left_neutral)&lt;br /&gt;
  finally show &amp;quot;amplia [] y = [] @ [y]&amp;quot; .&lt;br /&gt;
next&lt;br /&gt;
  fix x&lt;br /&gt;
  fix xs&lt;br /&gt;
  assume HI: &amp;quot;amplia xs y = xs @ [y]&amp;quot;&lt;br /&gt;
  have &amp;quot;amplia (x#xs) y = x # amplia xs y&amp;quot; by (simp only: amplia.simps(2))&lt;br /&gt;
  also have &amp;quot;... = x # (xs @ [y])&amp;quot; by (simp only: HI)&lt;br /&gt;
  also have &amp;quot;... = (x#xs) @ [y]&amp;quot; by (simp only: List.append.append_Cons)&lt;br /&gt;
  finally show &amp;quot;amplia (x#xs) y = (x#xs) @ [y]&amp;quot; .&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* marfruman1 raffergon2 enrparalv alikan gleherlop chrgencar &lt;br /&gt;
   juacanrod *)&lt;br /&gt;
lemma &amp;quot;amplia xs y = xs @ [y]&amp;quot;&lt;br /&gt;
proof (induct xs)&lt;br /&gt;
  have &amp;quot;amplia [] y = [y]&amp;quot; by (simp only: amplia.simps(1))&lt;br /&gt;
  also have &amp;quot;... = [] @ [y]&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;amplia [] y = [] @ [y]&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix x xs&lt;br /&gt;
  assume HI: &amp;quot;amplia xs y = xs @ [y]&amp;quot;&lt;br /&gt;
  have &amp;quot;amplia (x#xs) y = x# amplia xs y&amp;quot; by (simp only: amplia.simps(2))&lt;br /&gt;
  also have &amp;quot;... = x# (xs @ [y])&amp;quot; using HI by simp&lt;br /&gt;
  also have &amp;quot;... = (x#xs) @ [y]&amp;quot; by simp&lt;br /&gt;
  finally show &amp;quot;amplia (x#xs) y =(x#xs) @ [y]&amp;quot; by simp&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
(* manperjim pabalagon josgomrom4 hugrubsan cammonagu pabbergue &lt;br /&gt;
   antramhur*)&lt;br /&gt;
lemma &amp;quot;amplia xs y = xs @ [y]&amp;quot;&lt;br /&gt;
proof (induction xs)&lt;br /&gt;
  have &amp;quot;amplia [] y = [y]&amp;quot; by (simp only: amplia.simps(1))&lt;br /&gt;
  show &amp;quot;amplia [] y = [] @ [y]&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix a xs&lt;br /&gt;
  assume HI: &amp;quot;amplia xs y = xs @ [y]&amp;quot;&lt;br /&gt;
  have &amp;quot;amplia (a#xs) y = a # amplia xs y&amp;quot; &lt;br /&gt;
    by (simp only: amplia.simps(2))&lt;br /&gt;
  also have &amp;quot;... = a # (xs @ [y])&amp;quot; using HI by simp&lt;br /&gt;
  finally show &amp;quot;amplia (a#xs) y = (a#xs) @ [y]&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/RA2018/index.php?title=Relaci%C3%B3n_2&amp;diff=408</id>
		<title>Relación 2</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2018/index.php?title=Relaci%C3%B3n_2&amp;diff=408"/>
		<updated>2019-02-28T10:51:46Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isabelle&amp;quot;&amp;gt;&lt;br /&gt;
chapter {* R2: Razonamiento sobre programas en Isabelle/HOL *}&lt;br /&gt;
&lt;br /&gt;
theory R2_Razonamiento_automatico_sobre_programas_alu&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;
  Ejercicio 1.1. Definir la función&lt;br /&gt;
     sumaImpares :: nat ⇒ nat&lt;br /&gt;
  tal que (sumaImpares n) es la suma de los n primeros números&lt;br /&gt;
  impares. Por ejemplo,&lt;br /&gt;
     sumaImpares 5  =  25&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* manperjim pabalagon cammonagu juacanrod alfmarcua raffergon2&lt;br /&gt;
   hugrubsan enrparalv gleherlop chrgencar giafus1 pabbergue alikan&lt;br /&gt;
   aribatval *)  &lt;br /&gt;
fun sumaImpares :: &amp;quot;nat ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;sumaImpares 0 = 0&amp;quot; |&lt;br /&gt;
  &amp;quot;sumaImpares n = 2*n-1 + sumaImpares (n-1)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;sumaImpares 1  = 1&amp;quot;&lt;br /&gt;
value &amp;quot;sumaImpares 3  = 9&amp;quot;&lt;br /&gt;
value &amp;quot;sumaImpares 5  = 25&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* josgomrom4 marfruman1 benber antramhur *)&lt;br /&gt;
fun sumaImpares2 :: &amp;quot;nat ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;sumaImpares2 0 = 0&amp;quot; |&lt;br /&gt;
  &amp;quot;sumaImpares2 (Suc n) = 2*n + 1 + sumaImpares2 n&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;sumaImpares2 1  = 1&amp;quot;&lt;br /&gt;
value &amp;quot;sumaImpares2 3  = 9&amp;quot;&lt;br /&gt;
value &amp;quot;sumaImpares2 5  = 25&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1.2. Demostrar que &lt;br /&gt;
     sumaImpares n = n*n&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
(* manperjim pabalagon cammonagu juacanrod josgomrom4 hugrubsan&lt;br /&gt;
   enrparalv gleherlop benber chrgencar giafus1 alikan aribatval *) &lt;br /&gt;
lemma &amp;quot;sumaImpares n = n*n&amp;quot;&lt;br /&gt;
  apply (induction n)&lt;br /&gt;
   apply auto&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
(* pabalagon *)&lt;br /&gt;
lemma &amp;quot;sumaImpares n = n*n&amp;quot;&lt;br /&gt;
  apply (induction n)&lt;br /&gt;
   apply simp&lt;br /&gt;
   apply simp&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
(* pabalagon antramhur *)&lt;br /&gt;
lemma &amp;quot;sumaImpares n = n*n&amp;quot;&lt;br /&gt;
  by (induction n) simp_all&lt;br /&gt;
&lt;br /&gt;
(* alfmarcua raffergon2 marfruman1 pabbergue *)&lt;br /&gt;
lemma &amp;quot;sumaImpares n = n*n&amp;quot;&lt;br /&gt;
  by (induction n) auto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2.1. Definir la función&lt;br /&gt;
     sumaPotenciasDeDosMasUno :: nat ⇒ nat&lt;br /&gt;
  tal que &lt;br /&gt;
     (sumaPotenciasDeDosMasUno n) = 1 + 2^0 + 2^1 + 2^2 + ... + 2^n. &lt;br /&gt;
  Por ejemplo, &lt;br /&gt;
     sumaPotenciasDeDosMasUno 3  =  16&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* manperjim pabalagon cammonagu chrgencar hugrubsan gleherlop benber&lt;br /&gt;
   pabbergue aribatval *) &lt;br /&gt;
fun sumaPotenciasDeDosMasUno :: &amp;quot;nat ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;sumaPotenciasDeDosMasUno 0 = 2&amp;quot; |&lt;br /&gt;
  &amp;quot;sumaPotenciasDeDosMasUno (Suc n) = &lt;br /&gt;
     2^(n+1) + sumaPotenciasDeDosMasUno n&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;sumaPotenciasDeDosMasUno 3  =  16&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* juacanrod josgomrom4 marfruman1 antramhur *)&lt;br /&gt;
fun sumaPotenciasDeDosMasUno2 :: &amp;quot;nat ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;sumaPotenciasDeDosMasUno2 0 = 2&amp;quot; |&lt;br /&gt;
  &amp;quot;sumaPotenciasDeDosMasUno2 (Suc n) = &lt;br /&gt;
     2^(Suc n) + sumaPotenciasDeDosMasUno2 n&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;sumaPotenciasDeDosMasUno2 3  =  16&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* alfmarcua raffergon2 enrparalv alikan giafus1 *)&lt;br /&gt;
fun sumaPotenciasDeDosMasUno3 :: &amp;quot;nat ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;sumaPotenciasDeDosMasUno3 0 = 2&amp;quot; |&lt;br /&gt;
  &amp;quot;sumaPotenciasDeDosMasUno3 n = 2^n + sumaPotenciasDeDosMasUno3 (n-1)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;sumaPotenciasDeDosMasUno3 3  =  16&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2.2. Demostrar que &lt;br /&gt;
     sumaPotenciasDeDosMasUno n = 2^(n+1)&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
(* manperjim pabalagon cammonagu juacanrod alfmarcua raffergon2&lt;br /&gt;
   josgomrom4 hugrubsan enrparalv benber chrgencar gleherlop  giafus1&lt;br /&gt;
   pabbergue alikan aribatval *)  &lt;br /&gt;
lemma &amp;quot;sumaPotenciasDeDosMasUno n = 2^(n+1)&amp;quot;&lt;br /&gt;
  apply (induction n)&lt;br /&gt;
   apply auto&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
(* pabalagon antramhur *)&lt;br /&gt;
lemma &amp;quot;sumaPotenciasDeDosMasUno n = 2^(n+1)&amp;quot;&lt;br /&gt;
  by (induction n) simp_all&lt;br /&gt;
&lt;br /&gt;
(* marfruman1 *)&lt;br /&gt;
lemma &amp;quot;sumaPotenciasDeDosMasUno n = 2^(n+1)&amp;quot;&lt;br /&gt;
  by (induct n) auto&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3.1. Definir la función&lt;br /&gt;
     copia :: nat ⇒ &amp;#039;a ⇒ &amp;#039;a list&lt;br /&gt;
  tal que (copia n x) es la lista formado por n copias del elemento&lt;br /&gt;
  x. Por ejemplo, &lt;br /&gt;
     copia 3 x = [x,x,x]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* manperjim pabalagon cammonagu josgomrom4 hugrubsan benber gleherlop&lt;br /&gt;
   chrgencar pabbergue alikan antramhur aribatval *) &lt;br /&gt;
fun copia :: &amp;quot;nat ⇒ &amp;#039;a ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;copia 0 x = []&amp;quot; |&lt;br /&gt;
  &amp;quot;copia (Suc n) x = x#copia n x&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;copia 3 x = [x,x,x]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* juacanrod marfruman1 *)&lt;br /&gt;
fun copia2 :: &amp;quot;nat ⇒ &amp;#039;a ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;copia2 0 x = []&amp;quot; |&lt;br /&gt;
  &amp;quot;copia2 (Suc n) x = [x] @ copia2 n x&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;copia2 3 x = [x,x,x]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* manperjim alfmarcua raffergon2 enrparalv giafus1 *)&lt;br /&gt;
fun copia3 :: &amp;quot;nat ⇒ &amp;#039;a ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;copia3 0 x = []&amp;quot; |&lt;br /&gt;
  &amp;quot;copia3 n x = x#(copia (n-1) x)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;copia3 3 x = [x,x,x]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3.2. Definir la función&lt;br /&gt;
     todos :: (&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&lt;br /&gt;
  tal que (todos p xs) se verifica si todos los elementos de xs cumplen&lt;br /&gt;
  la propiedad p. Por ejemplo,&lt;br /&gt;
     todos (λx. x&amp;gt;(1::nat)) [2,6,4] = True&lt;br /&gt;
     todos (λx. x&amp;gt;(2::nat)) [2,6,4] = False&lt;br /&gt;
  Nota: La conjunción se representa por ∧&lt;br /&gt;
  ----------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
(* manperjim pabalagon cammonagu juacanrod alfmarcua raffergon2&lt;br /&gt;
   josgomrom4 marfruman1 hugrubsan enrparalv benber chrgencar giafus1&lt;br /&gt;
   gleherlop pabbergue alikan antramhur aribatval *)  &lt;br /&gt;
fun todos :: &amp;quot;(&amp;#039;a ⇒ bool) ⇒ &amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;todos p [] = True&amp;quot; |&lt;br /&gt;
  &amp;quot;todos p (x#xs) = (p x ∧ todos p xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;todos (λx. x&amp;gt;(1::nat)) [2,6,4] = True&amp;quot;&lt;br /&gt;
value &amp;quot;todos (λx. x&amp;gt;(2::nat)) [2,6,4] = False&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3.3. Demostrar que todos los elementos de (copia n x) son&lt;br /&gt;
  iguales a x. &lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
(* manperjim pabalagon cammonagu juacanrod alfmarcua raffergon2&lt;br /&gt;
   josgomrom4 hugrubsan enrparalv benber giafus1 pabbergue alikan&lt;br /&gt;
   gleherlop chrgencar aribatval *) &lt;br /&gt;
lemma &amp;quot;todos (λy. y=x) (copia n x)&amp;quot;&lt;br /&gt;
  apply (induction n)&lt;br /&gt;
   apply auto&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
(* Comentario: La demostración anterior falla para copia3. *)&lt;br /&gt;
&lt;br /&gt;
(* pabalagon antramhur *)&lt;br /&gt;
lemma &amp;quot;todos (λy. y=x) (copia n x)&amp;quot;&lt;br /&gt;
  by (induction n) simp_all&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4.1. Definir, recursivamente y sin usar (@), la función&lt;br /&gt;
     amplia :: &amp;#039;a list ⇒ &amp;#039;a ⇒ &amp;#039;a list&lt;br /&gt;
  tal que (amplia xs y) es la lista obtenida añadiendo el elemento y al&lt;br /&gt;
  final de la lista xs. Por ejemplo,&lt;br /&gt;
     amplia [d,a] t = [d,a,t]&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* manperjim pabalagon cammonagu juacanrod alfmarcua raffergon2&lt;br /&gt;
   josgomrom4 marfruman1 hugrubsan enrparalv benber chrgencar gleherlop&lt;br /&gt;
   giafus1 pabbergue alikan antramhur aribatval *)  &lt;br /&gt;
fun amplia :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;amplia [] y = [y]&amp;quot; |&lt;br /&gt;
  &amp;quot;amplia (x#xs) y = x # amplia xs y&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;amplia [d,a] t = [d,a,t]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4.2. Demostrar que &lt;br /&gt;
     amplia xs y = xs @ [y]&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
(* manperjim pabalagon cammonagu juacanrod alfmarcua raffergon2&lt;br /&gt;
   josgomrom4 hugrubsan gleherlop enrparalv benber chrgencar giafus1&lt;br /&gt;
   pabbergue alikan aribatval *)  &lt;br /&gt;
lemma &amp;quot;amplia xs y = xs @ [y]&amp;quot;&lt;br /&gt;
  apply (induction xs)&lt;br /&gt;
   apply auto&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
(* pabalagon antramhur *)&lt;br /&gt;
lemma &amp;quot;amplia xs y = xs @ [y]&amp;quot;&lt;br /&gt;
  by (induction xs) simp_all&lt;br /&gt;
&lt;br /&gt;
(* marfruman1 *)&lt;br /&gt;
lemma &amp;quot;amplia xs y = xs @ [y]&amp;quot;&lt;br /&gt;
  by (induction xs) 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/RA2018/index.php?title=Relaci%C3%B3n_1&amp;diff=407</id>
		<title>Relación 1</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2018/index.php?title=Relaci%C3%B3n_1&amp;diff=407"/>
		<updated>2019-02-28T10:48:27Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isabelle&amp;quot;&amp;gt;&lt;br /&gt;
chapter {* R1: Programación funcional en Isabelle *}&lt;br /&gt;
&lt;br /&gt;
theory R1_Programacion_funcional_en_Isabelle_alu&lt;br /&gt;
imports Main &lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
text {* ----------------------------------------------------------------&lt;br /&gt;
  Ejercicio 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 [a,b,c] = 3&lt;br /&gt;
  ------------------------------------------------------------------- *}&lt;br /&gt;
&lt;br /&gt;
(* cammonagu pabalagon raffergon2 aribatval juacanrod josgomrom4&lt;br /&gt;
   marfruman1 gleherlop benber alfmarcua enrparlav manperjim chrgencar &lt;br /&gt;
   antramhur pabbergue alikan*)  &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 [a,b,c] = 3&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* hugrubsan giafus1 *)&lt;br /&gt;
fun longitud2 :: &amp;quot;&amp;#039;a list ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;longitud2 [] = 0 &amp;quot;&lt;br /&gt;
| &amp;quot;longitud2 xs = 1 + longitud2 (tl xs) &amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;longitud2 [a,b,c] = 3&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. 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;
(* manperjim pabalagon cammonagu raffergon2 aribatval juacanrod&lt;br /&gt;
   marfruman1 gleherlop benber hugrubsan alfmarcua enrparalv giafus1&lt;br /&gt;
   chrgencar antramhur alikan pabbergue *)  &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;
(* josgomrom4 *)&lt;br /&gt;
fun intercambia2 :: &amp;quot;&amp;#039;a × &amp;#039;b ⇒ &amp;#039;b × &amp;#039;a&amp;quot; where&lt;br /&gt;
  &amp;quot;intercambia2 xs = (snd xs, fst xs) &amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;intercambia2 (u,v) = (v,u)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* ---------------------------------------------------------------&lt;br /&gt;
  Ejercicio 3. 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;
(* pabalagon *)&lt;br /&gt;
fun aux :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;aux [] a     = a&amp;quot; &lt;br /&gt;
| &amp;quot;aux (x#xs) a = aux xs (x#a)&amp;quot;&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 xs = aux xs []&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;
(* manperjim pabalagon raffergon2 cammonagu josgomrom4 marfruman1&lt;br /&gt;
   gleherlop alfmarcua enrparalv chrgencar antramhur alikan pabbergue *) &lt;br /&gt;
fun inversa2 :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;inversa2 []     = []&amp;quot; &lt;br /&gt;
| &amp;quot;inversa2 (x#xs) = inversa2 xs @ [x]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;inversa2 [a,d,c] = [c,d,a]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* juacanrod hugrubsan giafus1 *)&lt;br /&gt;
fun inversa3 :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;inversa3 []   = []&amp;quot;  &lt;br /&gt;
| &amp;quot;inversa3 (xs) = inversa3(tl xs) @ [ hd (xs)]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;inversa3 [a,d,c] = [c,d,a]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* aribatval *)&lt;br /&gt;
fun inversa4 :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;inversa4 [] = []&amp;quot; &lt;br /&gt;
| &amp;quot;inversa4 xs = last xs # (inversa4 (butlast xs))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;inversa4 [a,d,c] = [c,d,a]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* benber *)&lt;br /&gt;
fun inversa5aux :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;inversa5aux [] y = [y]&amp;quot;&lt;br /&gt;
| &amp;quot;inversa5aux (x#xs) y = x#(inversa5aux xs y)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
fun inversa5 :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;inversa5 [] = []&amp;quot;&lt;br /&gt;
| &amp;quot;inversa5 (x#xs) = inversa5aux (inversa5 xs) x&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;inversa5 [a,d,c] = [c,d,a]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. 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;
(* pabalag aribatval antramhur *)&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;
(* manperjim raffergon2 cammonagu josgomrom4 marfruman1 benber alfmarcua&lt;br /&gt;
   gleherlop giafus1 chrgencar pabbergue alikan *) &lt;br /&gt;
fun repite2 :: &amp;quot;nat ⇒ &amp;#039;a ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;repite2 0 x = [] &amp;quot;&lt;br /&gt;
| &amp;quot;repite2 n x = x # repite2 (n-1) x &amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;repite2 3 a = [a,a,a]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* juacanrod hugrubsan *)&lt;br /&gt;
fun repite3 :: &amp;quot;nat ⇒ &amp;#039;a ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;repite3 0 a = []&amp;quot; &lt;br /&gt;
| &amp;quot;repite3 n a = [a] @ repite3 (n-1) a&amp;quot; &lt;br /&gt;
  &lt;br /&gt;
value &amp;quot;repite3 3 a = [a,a,a]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* enrparalv *)&lt;br /&gt;
fun repite4 :: &amp;quot;nat ⇒ &amp;#039;a ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;repite4 n x = (if n = 0 then [] else repite4 (n-1) x @ [x])&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;repite4 3 a = [a,a,a]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. 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;
(* manperjim pabalagon raffergon2 josgomrom4 aribatval gleherlop&lt;br /&gt;
   chrgencar benber antramhur*) &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;
(* cammonagu marfruman1 pabbergue *)&lt;br /&gt;
fun conc2 :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;conc2 ys []     = ys&amp;quot; |&lt;br /&gt;
  &amp;quot;conc2 xs (y#ys) = xs @y # ys&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;conc2 [a,d] [b,d,a,c] = [a,d,b,d,a,c]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* juacanrod *)&lt;br /&gt;
fun conc3 :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;conc3 [] ys = ys&amp;quot; |&lt;br /&gt;
  &amp;quot;conc3 xs ys = [hd (xs)] @ conc3 (tl (xs)) ys&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;conc3 [a,d] [b,d,a,c] = [a,d,b,d,a,c]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* hugrubsan enrparalv giafus1 alikan *)&lt;br /&gt;
fun conc4 :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;conc4 xs ys = xs @ ys&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* alfmarcua *)&lt;br /&gt;
fun conc5 :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;conc5 [] ys = ys&amp;quot;&lt;br /&gt;
| &amp;quot;conc5 xs ys = conc5 (butlast xs) ((last xs)#ys)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 6. 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;
(* pabalagon raffergon2 antramhur *)&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 0 xs           = []&amp;quot; |&lt;br /&gt;
  &amp;quot;coge n []           = []&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;
(* manperjim cammonagu josgomrom4 marfruman1 benber alfmarcua chrgencar&lt;br /&gt;
   gleherlop giafus1 pabbergue *) &lt;br /&gt;
fun coge2 :: &amp;quot;nat ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;coge2 0 xs = []&amp;quot; |&lt;br /&gt;
  &amp;quot;coge2 n [] = []&amp;quot; |&lt;br /&gt;
  &amp;quot;coge2 n (x#xs) = x # coge2 (n-1) xs&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;coge2 2 [a,c,d,b,e] = [a,c]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* juacanrod *)&lt;br /&gt;
fun coge3 :: &amp;quot;nat ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;coge3 0 xs = []&amp;quot; |&lt;br /&gt;
  &amp;quot;coge3 n xs = [hd (xs)] @ coge3 (n-1) (tl (xs))&amp;quot; &lt;br /&gt;
&lt;br /&gt;
value &amp;quot;coge3 2 [a,c,d,b,e] = [a,c]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* aribatval hugrubsan *)&lt;br /&gt;
fun coge4 :: &amp;quot;nat ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
 &amp;quot;coge4 0 xs = []&amp;quot; |&lt;br /&gt;
 &amp;quot;coge4 n [] = []&amp;quot; |&lt;br /&gt;
 &amp;quot;coge4 n xs = (hd xs) # coge4 (n-1) (tl xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;coge4 2 [a,c,d,b,e] = [a,c]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* enrparalv *)&lt;br /&gt;
fun coge5 :: &amp;quot;nat ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;coge5 n []      = []&amp;quot;&lt;br /&gt;
| &amp;quot;coge5 n (x#xs) = (if (n=0) then [] else [x] @ coge5 (n-1) xs )&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;coge5 2 [a,c,d,b,e] = [a,c]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* alikan *)&lt;br /&gt;
fun coge6 :: &amp;quot;nat ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;coge6 n [] = []&amp;quot;|&lt;br /&gt;
  &amp;quot;coge6 n (x#xs) = (case n of 0 ⇒ [] | Suc n ⇒ x # coge6 n xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;coge6 2 [a,c,d,b,e] = [a,c]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 7. 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;
(* pabalagon antramhur *)&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 0 xs           = []&amp;quot; |&lt;br /&gt;
  &amp;quot;elimina n []           = []&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;
(* manperjim raffergon2 cammonagu josgomrom4 marfruman1 benber alfmarcua&lt;br /&gt;
   enrparalv aribatval gleherlop chrgencar giafus1 pabbergue*) &lt;br /&gt;
fun elimina2 :: &amp;quot;nat ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;elimina2 0 xs     = xs&amp;quot; |&lt;br /&gt;
  &amp;quot;elimina2 n []     = []&amp;quot; |&lt;br /&gt;
  &amp;quot;elimina2 n (x#xs) = elimina2 (n-1) xs&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;elimina2 2 [a,c,d,b,e] = [d,b,e]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* juacanrod hugrubsan *)&lt;br /&gt;
fun elimina3 :: &amp;quot;nat ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;elimina3 0 xs = xs&amp;quot; |&lt;br /&gt;
  &amp;quot;elimina3 n xs = elimina3 (n-1) (tl xs)&amp;quot; &lt;br /&gt;
&lt;br /&gt;
value &amp;quot;elimina3 2 [a,c,d,b,e] = [d,b,e]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* alikan *)&lt;br /&gt;
fun elimina4 :: &amp;quot;nat ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;elimina4 n [] = []&amp;quot;|&lt;br /&gt;
  &amp;quot;elimina4 n (x#xs) = (case n of 0 ⇒ x#xs | Suc n ⇒ elimina4 n xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;elimina4 2 [a,c,d,b,e] = [d,b,e]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 8. 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 [a] = False&lt;br /&gt;
  ------------------------------------------------------------------ *}&lt;br /&gt;
&lt;br /&gt;
(* manperjim pabalagon raffergon2 josgomrom4 marfruman1 benber hugrubsan&lt;br /&gt;
   alfmarcua enrparalv aribatval chrgencar giafus1 alikan pabbergue&lt;br /&gt;
   antramhur *)  &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 xs = False&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;esVacia [a] = False&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
(* cammonagu juacanrod *)&lt;br /&gt;
fun esVacia2 :: &amp;quot;&amp;#039;a list ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;esVacia2 xs = (longitud xs = 0)&amp;quot; &lt;br /&gt;
&lt;br /&gt;
value &amp;quot;esVacia2 [a] = False&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 9. 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;
(* manperjim pabalagon cammonagu josgomrom4 marfruman1 benber alfmarcua&lt;br /&gt;
   enrparalv aribatval gleherlop chrgencar giafus1 alikan pabbergue&lt;br /&gt;
   antramhur *)  &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;
(* juacanrod *)&lt;br /&gt;
fun inversaAcAux2 :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;inversaAcAux2 [] ys = ys&amp;quot; |&lt;br /&gt;
  &amp;quot;inversaAcAux2 xs ys = inversaAcAux2 (tl xs) ([hd xs]) @ ys&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;inversaAcAux2 [a,b,c] []&amp;quot;&lt;br /&gt;
&lt;br /&gt;
fun inversaAc2 :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;inversaAc2 xs = inversaAcAux2 xs []&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;inversaAc2 [a,c,b,e] = [e,b,c,a]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* hugrubsan *)&lt;br /&gt;
fun inversaAcAux3 :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;inversaAcAux3 [] ys = ys&amp;quot;&lt;br /&gt;
  |&amp;quot;inversaAcAux3 xs ys = inversaAcAux3 (tl xs) [(hd xs)] @ ys&amp;quot;&lt;br /&gt;
&lt;br /&gt;
fun inversaAc3 :: &amp;quot;&amp;#039;a list ⇒ &amp;#039;a list&amp;quot; where&lt;br /&gt;
  &amp;quot;inversaAc3 xs =  inversaAcAux3 (tl xs) [(hd xs)]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;inversaAc3 [a,c,b,e] = [e,b,c,a]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 10. 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;
(* manperjim pabalagon raffergon2 josgomrom4 marfruman1 benber alfmarcua&lt;br /&gt;
   enrparalv aribatval gleherlop chrgencar giafus1 pabbergue antramhur&lt;br /&gt;
   alikan *)  &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;
(* cammonagu *)&lt;br /&gt;
fun sum2:: &amp;quot;nat list ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;sum2 []     = 0&amp;quot; |&lt;br /&gt;
  &amp;quot;sum2 [x]    = x&amp;quot; |&lt;br /&gt;
  &amp;quot;sum2 (x#xs) = x + sum2 xs&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;sum2 [3,2,5] = 10&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* juacanrod hugrubsan *)&lt;br /&gt;
fun sum3 :: &amp;quot;nat list ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;sum3 [] = 0&amp;quot; |&lt;br /&gt;
  &amp;quot;sum3 xs = (hd xs) + sum3 (tl xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;sum3 [3,2,5,1]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {* --------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 11. 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;
(* manperjim pabalagon raffergon2 cammonagu josgomrom4 marfruman1 benber&lt;br /&gt;
   alfmarcua aribatval gleherlop chrgencar giafus1 pabbergue antramhur *) &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 (λn. Suc n) [2,3,4,5]&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
(* juacanrod *)&lt;br /&gt;
fun map2 :: &amp;quot;(&amp;#039;a ⇒ &amp;#039;b) ⇒ &amp;#039;a list ⇒ &amp;#039;b list&amp;quot; where&lt;br /&gt;
  &amp;quot;map2 f []     = []&amp;quot; |&lt;br /&gt;
  &amp;quot;map2 f (x#xs) = [(f x)] @ map2 f xs&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;map2 (λn. Suc n) [2,3,4,5]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(* hugrubsan *)&lt;br /&gt;
fun map3 :: &amp;quot;(&amp;#039;a ⇒ &amp;#039;b) ⇒ &amp;#039;a list ⇒ &amp;#039;b list&amp;quot; where&lt;br /&gt;
  &amp;quot;map3 f [] = []&amp;quot; |&lt;br /&gt;
  &amp;quot;map3 f xs = f (hd xs) # map3 f (tl xs)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;map3 (λn. Suc n) [2,3,4,5]&amp;quot;&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/RA2018/index.php?title=Documentaci%C3%B3n&amp;diff=385</id>
		<title>Documentación</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2018/index.php?title=Documentaci%C3%B3n&amp;diff=385"/>
		<updated>2019-02-14T13:21:08Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: /* Otros cursos */&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 &amp;quot;Razonamiento automático&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Vídeos ==&lt;br /&gt;
&lt;br /&gt;
* Vídeos de deducción natural con Pandora: [http://bit.ly/1tqZIOe ejemplo 1] y [http://bit.ly/1nWAVp4 ejemplo 2].&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/article/fulltext/sadh/034/01/0003-0025 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;
# J. Gross [https://blogs.ams.org/mathgradblog/2017/10/15/machine-checked-proof Machine-checked proof]. &amp;#039;&amp;#039;AMS Notices&amp;#039;&amp;#039;, 15 de octubre de 2017.&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 [http://www.bcs.org/server.php?show=ConWebDoc.4364 Computers and the sociology of mathematical proof].&lt;br /&gt;
# G. Sutcliffe. [http://www.cs.miami.edu/~tptp/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, [http://mizar.org/trybulec65/8.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 [http://dream.inf.ed.ac.uk/projects/isabelle/Isabelle_Primer.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 [http://isabelle.in.tum.de/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;
# M. Wenzel [http://isabelle.in.tum.de/doc/isar-ref.pdf The Isabelle/Isar Reference Manual]. &lt;br /&gt;
# M. Wenzel [http://typessummerschool07.cs.unibo.it/courses/wenzel-isar-quickref.pdf The Isabelle/Isar quick reference].&lt;br /&gt;
# J. Siek [http://ecee.colorado.edu/~siek/ecen3703/spring10/quick-ref.pdf Quick Reference for Isabelle/Isar Propositional Logic].&lt;br /&gt;
# J. Siek [http://ecee.colorado.edu/~siek/ecen3703/spring10/quick-ref2.pdf Quick Reference for Isabelle/Isar More Proof Techniques].&lt;br /&gt;
# J. Siek [http://ecee.colorado.edu/~siek/ecen3703/spring10/quick-ref3.pdf Quick Reference for Isabelle/Isar First-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 [https://www.cs.us.es/~jalonso/cursos/i1m-16/temas/2016-17-IM-temas-PF.pdf  Temas de &amp;quot;Programación funcional&amp;quot;]. Publicaciones del Grupo de Lógica Computacional. Universidad de Sevilla, 2016.&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 [https://www.cs.us.es/~jalonso/cursos/li-15/temas/temas-LI-2015-16.pdf Temas de &amp;quot;Lógica informática&amp;quot; (2015-16)]. Publicaciones del Grupo de Lógica Computacional. Universidad de Sevilla, 2015.&lt;br /&gt;
# K. Broda, S. Eisenbach, H. Khoshnevisan y S. Vickers [http://pubs.doc.ic.ac.uk/reasoned-programming/reasoned-programming.pdf Reasoned programming]. Imperial College, 1994.&lt;br /&gt;
# K. Doets y J. van Eijck [http://www.ldc.usb.ve/~astorga/Haskell.Road.pdf The Haskell Road to Logic, Maths and Programming].&lt;br /&gt;
# M. Huth y M. Ryan [http://bit.ly/2e8dFEm 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;
# Jeremy Avigad. [http://www.phil.cmu.edu/~avigad/formal/ Logic and Formal Verification]. (Carnegie Mellon, 2009).&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. [http://www4.in.tum.de/~ballarin/belgrade08-tut/ Introduction to the Isabelle Proof Assistant]. (Belgrado, 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;
# Jasmin Blanchette, Mathias Fleury y Daniel Wand [http://people.mpi-inf.mpg.de/~jblanche/cswi/ss2015/ Concrete semantics with Isabelle/HOL]. (Univ. del Sarre, 2015-16).&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. [http://www.inf.ed.ac.uk/teaching/courses/ar Automated reasoning]. (Univ. de Edimburgo, 2016-17).&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. [http://www21.in.tum.de/teaching/semantik/WS1617/ 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;
# Arnd Poetzsch-Heffter. [https://softech.informatik.uni-kl.de/homepage/de/teaching/SVHOL14/ Specification and Verification with Higher-Order Logic]. &lt;br /&gt;
# Jeremy G. Siek. [http://www.cs.colorado.edu/~siek/7000/spring07/ Practical Theorem Proving with Isabelle/Isar]. (Univ. de Colorado, 2007).&lt;br /&gt;
# Jeremy G. Siek. [http://ecee.colorado.edu/~siek/ecen5013/spring11/ Theorem proving in Isabelle]. (Univ. de Colorado, 2011).&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;
=== Cursos con Coq ===&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;
# Adam Chlipala [http://stellar.mit.edu/S/course/6/fa11/6.892/ Interactive computer theorem proving]. (MIT, 2012-13).&lt;br /&gt;
# Adam Chlipala y Armando Solar Lezama [https://stellar.mit.edu/S/course/6/fa13/6.820/index.html Foundations of program analysis]. (MIT, 2013-14).&lt;br /&gt;
# M. Greenberg [http://www.cs.pomona.edu/~michael/courses/csci054s18/ Discrete mathematics and functional programming]. &lt;br /&gt;
# Benjamin C. Pierce et als. [https://softwarefoundations.cis.upenn.edu/lf-current/index.html Software foundations (Vol. 1: Logical foundations)].&lt;br /&gt;
# Benjamin C. Pierce [https://www.seas.upenn.edu/~cis500/current/index.html Software foundations] (Univ. de Pensilvania, 2018).&lt;br /&gt;
# G. Smolka [https://courses.ps.uni-saarland.de/icl_18/2/Resources Introduction to computational logic] (Univ. de Sarre, 2018).&lt;br /&gt;
&lt;br /&gt;
=== Otros cursos ===&lt;br /&gt;
# José A. Alonso [http://www.cs.us.es/~jalonso/cursos/li/ Lógica informática] (Univ. de Sevilla, 2012-13).&lt;br /&gt;
# Thorsten Altenkirch y Peter Morris [http://www.cs.nott.ac.uk/~txa/g52ifr Introduction to formal reasoning] (Univ. de Nottingham, 2010-11).&lt;br /&gt;
# J. Blanchette y J. Höltz [https://lean-forward.github.io/logical-verification/2018 Logical verification]. (Vrije Universiteit Amsterdam, 2018-19). &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;
# Robby Findler [http://www.eecs.northwestern.edu/~robby/courses/395-495-2013-fall Certified programming with dependent types]. (Northwestern, 2013-14).&lt;br /&gt;
# Carlos Luna y Gustavo Betarte. [https://eva.fing.edu.uy/course/view.php?id=363 Construcción formal de programas en teoría de tipos]. (Univ. de la República, Uruguay, 2013-14).&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;
# David Pichardie [http://www.irisa.fr/celtique/pichardie/teaching/M2/MDV/ Méthode de vérification] (Universidad de Rennes, 2006-07).&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;br /&gt;
# [http://automatedreasoning.net/ Larry Wos&amp;#039; Notebooks].&lt;br /&gt;
# [http://www.cs.miami.edu/~tptp/ The TPTP Problem Library for Automated Theorem Proving].&lt;br /&gt;
# [http://www.macs.hw.ac.uk/vstte10/Competition.html The 1st Verified Software Competition].&lt;br /&gt;
# [https://sites.google.com/site/vstte2012/compet The 2nd Verified Software Competition].&lt;br /&gt;
# [http://verifythis.cost-ic0701.org VerifyThis (A collection of verification benchmarks].&lt;br /&gt;
&lt;br /&gt;
== Artículos recientes ==&lt;br /&gt;
&lt;br /&gt;
Hay dos listas de artículos recientes:&lt;br /&gt;
&lt;br /&gt;
* en [https://twitter.com/search?f=tweets&amp;amp;q=%23ITP%20OR%20%23IsabelleHOL%20OR%20%23Coq%20OR%20%23Agda%20OR%20%23LeanProver%20OR%20%23MULCIA%20from%3AJose_A_Alonso&amp;amp;src=typd Twitter] que contiene enlaces a los artículos de razonamiento automático y demostración asistida por ordenador que se están publicando y&lt;br /&gt;
* en [https://www.glc.us.es/~jalonso/vestigium/category/resena/ Vestigium] que contiene una reseña de los más destacados.&lt;br /&gt;
&lt;br /&gt;
== Ofertas de trabajo ==&lt;br /&gt;
&lt;br /&gt;
En [https://github.com/jaalonso/Recopilaciones/blob/master/Trabajos-MULCIA.org GitHub] se encuentra una recopilaciónn las ofertas de trabajo de interés para los estudiantes del Máster Universitario en Lógica, Computación e Inteligencia Artificial de la Universidad de Sevilla.&lt;br /&gt;
&lt;br /&gt;
Están en orden cronológico inverso por la fecha de su publicación en [https://twitter.com/search?l=&amp;amp;q=%23MULCIA%20from%3AJose_A_Alonso&amp;amp;src=typd&amp;amp;lang=es Twitter].&lt;/div&gt;</summary>
		<author><name>Jalonso</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2018/index.php?title=Documentaci%C3%B3n&amp;diff=384</id>
		<title>Documentación</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2018/index.php?title=Documentaci%C3%B3n&amp;diff=384"/>
		<updated>2019-02-14T13:20:10Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: /* Cursos con Coq */&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 &amp;quot;Razonamiento automático&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Vídeos ==&lt;br /&gt;
&lt;br /&gt;
* Vídeos de deducción natural con Pandora: [http://bit.ly/1tqZIOe ejemplo 1] y [http://bit.ly/1nWAVp4 ejemplo 2].&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/article/fulltext/sadh/034/01/0003-0025 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;
# J. Gross [https://blogs.ams.org/mathgradblog/2017/10/15/machine-checked-proof Machine-checked proof]. &amp;#039;&amp;#039;AMS Notices&amp;#039;&amp;#039;, 15 de octubre de 2017.&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 [http://www.bcs.org/server.php?show=ConWebDoc.4364 Computers and the sociology of mathematical proof].&lt;br /&gt;
# G. Sutcliffe. [http://www.cs.miami.edu/~tptp/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, [http://mizar.org/trybulec65/8.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 [http://dream.inf.ed.ac.uk/projects/isabelle/Isabelle_Primer.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 [http://isabelle.in.tum.de/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;
# M. Wenzel [http://isabelle.in.tum.de/doc/isar-ref.pdf The Isabelle/Isar Reference Manual]. &lt;br /&gt;
# M. Wenzel [http://typessummerschool07.cs.unibo.it/courses/wenzel-isar-quickref.pdf The Isabelle/Isar quick reference].&lt;br /&gt;
# J. Siek [http://ecee.colorado.edu/~siek/ecen3703/spring10/quick-ref.pdf Quick Reference for Isabelle/Isar Propositional Logic].&lt;br /&gt;
# J. Siek [http://ecee.colorado.edu/~siek/ecen3703/spring10/quick-ref2.pdf Quick Reference for Isabelle/Isar More Proof Techniques].&lt;br /&gt;
# J. Siek [http://ecee.colorado.edu/~siek/ecen3703/spring10/quick-ref3.pdf Quick Reference for Isabelle/Isar First-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 [https://www.cs.us.es/~jalonso/cursos/i1m-16/temas/2016-17-IM-temas-PF.pdf  Temas de &amp;quot;Programación funcional&amp;quot;]. Publicaciones del Grupo de Lógica Computacional. Universidad de Sevilla, 2016.&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 [https://www.cs.us.es/~jalonso/cursos/li-15/temas/temas-LI-2015-16.pdf Temas de &amp;quot;Lógica informática&amp;quot; (2015-16)]. Publicaciones del Grupo de Lógica Computacional. Universidad de Sevilla, 2015.&lt;br /&gt;
# K. Broda, S. Eisenbach, H. Khoshnevisan y S. Vickers [http://pubs.doc.ic.ac.uk/reasoned-programming/reasoned-programming.pdf Reasoned programming]. Imperial College, 1994.&lt;br /&gt;
# K. Doets y J. van Eijck [http://www.ldc.usb.ve/~astorga/Haskell.Road.pdf The Haskell Road to Logic, Maths and Programming].&lt;br /&gt;
# M. Huth y M. Ryan [http://bit.ly/2e8dFEm 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;
# Jeremy Avigad. [http://www.phil.cmu.edu/~avigad/formal/ Logic and Formal Verification]. (Carnegie Mellon, 2009).&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. [http://www4.in.tum.de/~ballarin/belgrade08-tut/ Introduction to the Isabelle Proof Assistant]. (Belgrado, 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;
# Jasmin Blanchette, Mathias Fleury y Daniel Wand [http://people.mpi-inf.mpg.de/~jblanche/cswi/ss2015/ Concrete semantics with Isabelle/HOL]. (Univ. del Sarre, 2015-16).&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. [http://www.inf.ed.ac.uk/teaching/courses/ar Automated reasoning]. (Univ. de Edimburgo, 2016-17).&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. [http://www21.in.tum.de/teaching/semantik/WS1617/ 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;
# Arnd Poetzsch-Heffter. [https://softech.informatik.uni-kl.de/homepage/de/teaching/SVHOL14/ Specification and Verification with Higher-Order Logic]. &lt;br /&gt;
# Jeremy G. Siek. [http://www.cs.colorado.edu/~siek/7000/spring07/ Practical Theorem Proving with Isabelle/Isar]. (Univ. de Colorado, 2007).&lt;br /&gt;
# Jeremy G. Siek. [http://ecee.colorado.edu/~siek/ecen5013/spring11/ Theorem proving in Isabelle]. (Univ. de Colorado, 2011).&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;
=== Cursos con Coq ===&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;
# Adam Chlipala [http://stellar.mit.edu/S/course/6/fa11/6.892/ Interactive computer theorem proving]. (MIT, 2012-13).&lt;br /&gt;
# Adam Chlipala y Armando Solar Lezama [https://stellar.mit.edu/S/course/6/fa13/6.820/index.html Foundations of program analysis]. (MIT, 2013-14).&lt;br /&gt;
# M. Greenberg [http://www.cs.pomona.edu/~michael/courses/csci054s18/ Discrete mathematics and functional programming]. &lt;br /&gt;
# Benjamin C. Pierce et als. [https://softwarefoundations.cis.upenn.edu/lf-current/index.html Software foundations (Vol. 1: Logical foundations)].&lt;br /&gt;
# Benjamin C. Pierce [https://www.seas.upenn.edu/~cis500/current/index.html Software foundations] (Univ. de Pensilvania, 2018).&lt;br /&gt;
# G. Smolka [https://courses.ps.uni-saarland.de/icl_18/2/Resources Introduction to computational logic] (Univ. de Sarre, 2018).&lt;br /&gt;
&lt;br /&gt;
=== Otros cursos ===&lt;br /&gt;
# José A. Alonso [http://www.cs.us.es/~jalonso/cursos/li/ Lógica informática] (Univ. de Sevilla, 2012-13).&lt;br /&gt;
# Thorsten Altenkirch y Peter Morris [http://www.cs.nott.ac.uk/~txa/g52ifr Introduction to formal reasoning] (Univ. de Nottingham, 2010-11).&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;
# Robby Findler [http://www.eecs.northwestern.edu/~robby/courses/395-495-2013-fall Certified programming with dependent types]. (Northwestern, 2013-14).&lt;br /&gt;
# Carlos Luna y Gustavo Betarte. [https://eva.fing.edu.uy/course/view.php?id=363 Construcción formal de programas en teoría de tipos]. (Univ. de la República, Uruguay, 2013-14).&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;
# David Pichardie [http://www.irisa.fr/celtique/pichardie/teaching/M2/MDV/ Méthode de vérification] (Universidad de Rennes, 2006-07).&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;br /&gt;
# [http://automatedreasoning.net/ Larry Wos&amp;#039; Notebooks].&lt;br /&gt;
# [http://www.cs.miami.edu/~tptp/ The TPTP Problem Library for Automated Theorem Proving].&lt;br /&gt;
# [http://www.macs.hw.ac.uk/vstte10/Competition.html The 1st Verified Software Competition].&lt;br /&gt;
# [https://sites.google.com/site/vstte2012/compet The 2nd Verified Software Competition].&lt;br /&gt;
# [http://verifythis.cost-ic0701.org VerifyThis (A collection of verification benchmarks].&lt;br /&gt;
&lt;br /&gt;
== Artículos recientes ==&lt;br /&gt;
&lt;br /&gt;
Hay dos listas de artículos recientes:&lt;br /&gt;
&lt;br /&gt;
* en [https://twitter.com/search?f=tweets&amp;amp;q=%23ITP%20OR%20%23IsabelleHOL%20OR%20%23Coq%20OR%20%23Agda%20OR%20%23LeanProver%20OR%20%23MULCIA%20from%3AJose_A_Alonso&amp;amp;src=typd Twitter] que contiene enlaces a los artículos de razonamiento automático y demostración asistida por ordenador que se están publicando y&lt;br /&gt;
* en [https://www.glc.us.es/~jalonso/vestigium/category/resena/ Vestigium] que contiene una reseña de los más destacados.&lt;br /&gt;
&lt;br /&gt;
== Ofertas de trabajo ==&lt;br /&gt;
&lt;br /&gt;
En [https://github.com/jaalonso/Recopilaciones/blob/master/Trabajos-MULCIA.org GitHub] se encuentra una recopilaciónn las ofertas de trabajo de interés para los estudiantes del Máster Universitario en Lógica, Computación e Inteligencia Artificial de la Universidad de Sevilla.&lt;br /&gt;
&lt;br /&gt;
Están en orden cronológico inverso por la fecha de su publicación en [https://twitter.com/search?l=&amp;amp;q=%23MULCIA%20from%3AJose_A_Alonso&amp;amp;src=typd&amp;amp;lang=es Twitter].&lt;/div&gt;</summary>
		<author><name>Jalonso</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2018/index.php?title=Documentaci%C3%B3n&amp;diff=383</id>
		<title>Documentación</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2018/index.php?title=Documentaci%C3%B3n&amp;diff=383"/>
		<updated>2019-02-14T13:19:02Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: /* Cursos con Coq */&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 &amp;quot;Razonamiento automático&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Vídeos ==&lt;br /&gt;
&lt;br /&gt;
* Vídeos de deducción natural con Pandora: [http://bit.ly/1tqZIOe ejemplo 1] y [http://bit.ly/1nWAVp4 ejemplo 2].&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/article/fulltext/sadh/034/01/0003-0025 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;
# J. Gross [https://blogs.ams.org/mathgradblog/2017/10/15/machine-checked-proof Machine-checked proof]. &amp;#039;&amp;#039;AMS Notices&amp;#039;&amp;#039;, 15 de octubre de 2017.&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 [http://www.bcs.org/server.php?show=ConWebDoc.4364 Computers and the sociology of mathematical proof].&lt;br /&gt;
# G. Sutcliffe. [http://www.cs.miami.edu/~tptp/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, [http://mizar.org/trybulec65/8.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 [http://dream.inf.ed.ac.uk/projects/isabelle/Isabelle_Primer.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 [http://isabelle.in.tum.de/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;
# M. Wenzel [http://isabelle.in.tum.de/doc/isar-ref.pdf The Isabelle/Isar Reference Manual]. &lt;br /&gt;
# M. Wenzel [http://typessummerschool07.cs.unibo.it/courses/wenzel-isar-quickref.pdf The Isabelle/Isar quick reference].&lt;br /&gt;
# J. Siek [http://ecee.colorado.edu/~siek/ecen3703/spring10/quick-ref.pdf Quick Reference for Isabelle/Isar Propositional Logic].&lt;br /&gt;
# J. Siek [http://ecee.colorado.edu/~siek/ecen3703/spring10/quick-ref2.pdf Quick Reference for Isabelle/Isar More Proof Techniques].&lt;br /&gt;
# J. Siek [http://ecee.colorado.edu/~siek/ecen3703/spring10/quick-ref3.pdf Quick Reference for Isabelle/Isar First-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 [https://www.cs.us.es/~jalonso/cursos/i1m-16/temas/2016-17-IM-temas-PF.pdf  Temas de &amp;quot;Programación funcional&amp;quot;]. Publicaciones del Grupo de Lógica Computacional. Universidad de Sevilla, 2016.&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 [https://www.cs.us.es/~jalonso/cursos/li-15/temas/temas-LI-2015-16.pdf Temas de &amp;quot;Lógica informática&amp;quot; (2015-16)]. Publicaciones del Grupo de Lógica Computacional. Universidad de Sevilla, 2015.&lt;br /&gt;
# K. Broda, S. Eisenbach, H. Khoshnevisan y S. Vickers [http://pubs.doc.ic.ac.uk/reasoned-programming/reasoned-programming.pdf Reasoned programming]. Imperial College, 1994.&lt;br /&gt;
# K. Doets y J. van Eijck [http://www.ldc.usb.ve/~astorga/Haskell.Road.pdf The Haskell Road to Logic, Maths and Programming].&lt;br /&gt;
# M. Huth y M. Ryan [http://bit.ly/2e8dFEm 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;
# Jeremy Avigad. [http://www.phil.cmu.edu/~avigad/formal/ Logic and Formal Verification]. (Carnegie Mellon, 2009).&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. [http://www4.in.tum.de/~ballarin/belgrade08-tut/ Introduction to the Isabelle Proof Assistant]. (Belgrado, 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;
# Jasmin Blanchette, Mathias Fleury y Daniel Wand [http://people.mpi-inf.mpg.de/~jblanche/cswi/ss2015/ Concrete semantics with Isabelle/HOL]. (Univ. del Sarre, 2015-16).&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. [http://www.inf.ed.ac.uk/teaching/courses/ar Automated reasoning]. (Univ. de Edimburgo, 2016-17).&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. [http://www21.in.tum.de/teaching/semantik/WS1617/ 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;
# Arnd Poetzsch-Heffter. [https://softech.informatik.uni-kl.de/homepage/de/teaching/SVHOL14/ Specification and Verification with Higher-Order Logic]. &lt;br /&gt;
# Jeremy G. Siek. [http://www.cs.colorado.edu/~siek/7000/spring07/ Practical Theorem Proving with Isabelle/Isar]. (Univ. de Colorado, 2007).&lt;br /&gt;
# Jeremy G. Siek. [http://ecee.colorado.edu/~siek/ecen5013/spring11/ Theorem proving in Isabelle]. (Univ. de Colorado, 2011).&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;
=== Cursos con Coq ===&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;
# Adam Chlipala [http://stellar.mit.edu/S/course/6/fa11/6.892/ Interactive computer theorem proving]. (MIT, 2012-13).&lt;br /&gt;
# Adam Chlipala y Armando Solar Lezama [https://stellar.mit.edu/S/course/6/fa13/6.820/index.html Foundations of program analysis]. (MIT, 2013-14).&lt;br /&gt;
# Benjamin C. Pierce et als. [https://softwarefoundations.cis.upenn.edu/lf-current/index.html Software foundations (Vol. 1: Logical foundations)].&lt;br /&gt;
# Benjamin C. Pierce [https://www.seas.upenn.edu/~cis500/current/index.html Software foundations] (Univ. de Pensilvania, 2018).&lt;br /&gt;
# G. Smolka [https://courses.ps.uni-saarland.de/icl_18/2/Resources Introduction to computational logic] (Univ. de Sarre, 2018).&lt;br /&gt;
&lt;br /&gt;
=== Otros cursos ===&lt;br /&gt;
# José A. Alonso [http://www.cs.us.es/~jalonso/cursos/li/ Lógica informática] (Univ. de Sevilla, 2012-13).&lt;br /&gt;
# Thorsten Altenkirch y Peter Morris [http://www.cs.nott.ac.uk/~txa/g52ifr Introduction to formal reasoning] (Univ. de Nottingham, 2010-11).&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;
# Robby Findler [http://www.eecs.northwestern.edu/~robby/courses/395-495-2013-fall Certified programming with dependent types]. (Northwestern, 2013-14).&lt;br /&gt;
# Carlos Luna y Gustavo Betarte. [https://eva.fing.edu.uy/course/view.php?id=363 Construcción formal de programas en teoría de tipos]. (Univ. de la República, Uruguay, 2013-14).&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;
# David Pichardie [http://www.irisa.fr/celtique/pichardie/teaching/M2/MDV/ Méthode de vérification] (Universidad de Rennes, 2006-07).&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;br /&gt;
# [http://automatedreasoning.net/ Larry Wos&amp;#039; Notebooks].&lt;br /&gt;
# [http://www.cs.miami.edu/~tptp/ The TPTP Problem Library for Automated Theorem Proving].&lt;br /&gt;
# [http://www.macs.hw.ac.uk/vstte10/Competition.html The 1st Verified Software Competition].&lt;br /&gt;
# [https://sites.google.com/site/vstte2012/compet The 2nd Verified Software Competition].&lt;br /&gt;
# [http://verifythis.cost-ic0701.org VerifyThis (A collection of verification benchmarks].&lt;br /&gt;
&lt;br /&gt;
== Artículos recientes ==&lt;br /&gt;
&lt;br /&gt;
Hay dos listas de artículos recientes:&lt;br /&gt;
&lt;br /&gt;
* en [https://twitter.com/search?f=tweets&amp;amp;q=%23ITP%20OR%20%23IsabelleHOL%20OR%20%23Coq%20OR%20%23Agda%20OR%20%23LeanProver%20OR%20%23MULCIA%20from%3AJose_A_Alonso&amp;amp;src=typd Twitter] que contiene enlaces a los artículos de razonamiento automático y demostración asistida por ordenador que se están publicando y&lt;br /&gt;
* en [https://www.glc.us.es/~jalonso/vestigium/category/resena/ Vestigium] que contiene una reseña de los más destacados.&lt;br /&gt;
&lt;br /&gt;
== Ofertas de trabajo ==&lt;br /&gt;
&lt;br /&gt;
En [https://github.com/jaalonso/Recopilaciones/blob/master/Trabajos-MULCIA.org GitHub] se encuentra una recopilaciónn las ofertas de trabajo de interés para los estudiantes del Máster Universitario en Lógica, Computación e Inteligencia Artificial de la Universidad de Sevilla.&lt;br /&gt;
&lt;br /&gt;
Están en orden cronológico inverso por la fecha de su publicación en [https://twitter.com/search?l=&amp;amp;q=%23MULCIA%20from%3AJose_A_Alonso&amp;amp;src=typd&amp;amp;lang=es Twitter].&lt;/div&gt;</summary>
		<author><name>Jalonso</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2018/index.php?title=Documentaci%C3%B3n&amp;diff=382</id>
		<title>Documentación</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2018/index.php?title=Documentaci%C3%B3n&amp;diff=382"/>
		<updated>2019-02-14T13:16:13Z</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 &amp;quot;Razonamiento automático&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Vídeos ==&lt;br /&gt;
&lt;br /&gt;
* Vídeos de deducción natural con Pandora: [http://bit.ly/1tqZIOe ejemplo 1] y [http://bit.ly/1nWAVp4 ejemplo 2].&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/article/fulltext/sadh/034/01/0003-0025 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;
# J. Gross [https://blogs.ams.org/mathgradblog/2017/10/15/machine-checked-proof Machine-checked proof]. &amp;#039;&amp;#039;AMS Notices&amp;#039;&amp;#039;, 15 de octubre de 2017.&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 [http://www.bcs.org/server.php?show=ConWebDoc.4364 Computers and the sociology of mathematical proof].&lt;br /&gt;
# G. Sutcliffe. [http://www.cs.miami.edu/~tptp/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, [http://mizar.org/trybulec65/8.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 [http://dream.inf.ed.ac.uk/projects/isabelle/Isabelle_Primer.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 [http://isabelle.in.tum.de/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;
# M. Wenzel [http://isabelle.in.tum.de/doc/isar-ref.pdf The Isabelle/Isar Reference Manual]. &lt;br /&gt;
# M. Wenzel [http://typessummerschool07.cs.unibo.it/courses/wenzel-isar-quickref.pdf The Isabelle/Isar quick reference].&lt;br /&gt;
# J. Siek [http://ecee.colorado.edu/~siek/ecen3703/spring10/quick-ref.pdf Quick Reference for Isabelle/Isar Propositional Logic].&lt;br /&gt;
# J. Siek [http://ecee.colorado.edu/~siek/ecen3703/spring10/quick-ref2.pdf Quick Reference for Isabelle/Isar More Proof Techniques].&lt;br /&gt;
# J. Siek [http://ecee.colorado.edu/~siek/ecen3703/spring10/quick-ref3.pdf Quick Reference for Isabelle/Isar First-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 [https://www.cs.us.es/~jalonso/cursos/i1m-16/temas/2016-17-IM-temas-PF.pdf  Temas de &amp;quot;Programación funcional&amp;quot;]. Publicaciones del Grupo de Lógica Computacional. Universidad de Sevilla, 2016.&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 [https://www.cs.us.es/~jalonso/cursos/li-15/temas/temas-LI-2015-16.pdf Temas de &amp;quot;Lógica informática&amp;quot; (2015-16)]. Publicaciones del Grupo de Lógica Computacional. Universidad de Sevilla, 2015.&lt;br /&gt;
# K. Broda, S. Eisenbach, H. Khoshnevisan y S. Vickers [http://pubs.doc.ic.ac.uk/reasoned-programming/reasoned-programming.pdf Reasoned programming]. Imperial College, 1994.&lt;br /&gt;
# K. Doets y J. van Eijck [http://www.ldc.usb.ve/~astorga/Haskell.Road.pdf The Haskell Road to Logic, Maths and Programming].&lt;br /&gt;
# M. Huth y M. Ryan [http://bit.ly/2e8dFEm 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;
# Jeremy Avigad. [http://www.phil.cmu.edu/~avigad/formal/ Logic and Formal Verification]. (Carnegie Mellon, 2009).&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. [http://www4.in.tum.de/~ballarin/belgrade08-tut/ Introduction to the Isabelle Proof Assistant]. (Belgrado, 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;
# Jasmin Blanchette, Mathias Fleury y Daniel Wand [http://people.mpi-inf.mpg.de/~jblanche/cswi/ss2015/ Concrete semantics with Isabelle/HOL]. (Univ. del Sarre, 2015-16).&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. [http://www.inf.ed.ac.uk/teaching/courses/ar Automated reasoning]. (Univ. de Edimburgo, 2016-17).&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. [http://www21.in.tum.de/teaching/semantik/WS1617/ 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;
# Arnd Poetzsch-Heffter. [https://softech.informatik.uni-kl.de/homepage/de/teaching/SVHOL14/ Specification and Verification with Higher-Order Logic]. &lt;br /&gt;
# Jeremy G. Siek. [http://www.cs.colorado.edu/~siek/7000/spring07/ Practical Theorem Proving with Isabelle/Isar]. (Univ. de Colorado, 2007).&lt;br /&gt;
# Jeremy G. Siek. [http://ecee.colorado.edu/~siek/ecen5013/spring11/ Theorem proving in Isabelle]. (Univ. de Colorado, 2011).&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;
=== Cursos con Coq ===&lt;br /&gt;
# Benjamin C. Pierce et als. [https://softwarefoundations.cis.upenn.edu/lf-current/index.html Software foundations (Vol. 1: Logical foundations)].&lt;br /&gt;
# Benjamin C. Pierce [https://www.seas.upenn.edu/~cis500/current/index.html Software foundations].&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;
# Adam Chlipala [http://stellar.mit.edu/S/course/6/fa11/6.892/ Interactive computer theorem proving]. (MIT, 2012-13).&lt;br /&gt;
# Adam Chlipala y Armando Solar Lezama [https://stellar.mit.edu/S/course/6/fa13/6.820/index.html Foundations of program analysis]. (MIT, 2013-14).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Otros cursos ===&lt;br /&gt;
# José A. Alonso [http://www.cs.us.es/~jalonso/cursos/li/ Lógica informática] (Univ. de Sevilla, 2012-13).&lt;br /&gt;
# Thorsten Altenkirch y Peter Morris [http://www.cs.nott.ac.uk/~txa/g52ifr Introduction to formal reasoning] (Univ. de Nottingham, 2010-11).&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;
# Robby Findler [http://www.eecs.northwestern.edu/~robby/courses/395-495-2013-fall Certified programming with dependent types]. (Northwestern, 2013-14).&lt;br /&gt;
# Carlos Luna y Gustavo Betarte. [https://eva.fing.edu.uy/course/view.php?id=363 Construcción formal de programas en teoría de tipos]. (Univ. de la República, Uruguay, 2013-14).&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;
# David Pichardie [http://www.irisa.fr/celtique/pichardie/teaching/M2/MDV/ Méthode de vérification] (Universidad de Rennes, 2006-07).&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;br /&gt;
# [http://automatedreasoning.net/ Larry Wos&amp;#039; Notebooks].&lt;br /&gt;
# [http://www.cs.miami.edu/~tptp/ The TPTP Problem Library for Automated Theorem Proving].&lt;br /&gt;
# [http://www.macs.hw.ac.uk/vstte10/Competition.html The 1st Verified Software Competition].&lt;br /&gt;
# [https://sites.google.com/site/vstte2012/compet The 2nd Verified Software Competition].&lt;br /&gt;
# [http://verifythis.cost-ic0701.org VerifyThis (A collection of verification benchmarks].&lt;br /&gt;
&lt;br /&gt;
== Artículos recientes ==&lt;br /&gt;
&lt;br /&gt;
Hay dos listas de artículos recientes:&lt;br /&gt;
&lt;br /&gt;
* en [https://twitter.com/search?f=tweets&amp;amp;q=%23ITP%20OR%20%23IsabelleHOL%20OR%20%23Coq%20OR%20%23Agda%20OR%20%23LeanProver%20OR%20%23MULCIA%20from%3AJose_A_Alonso&amp;amp;src=typd Twitter] que contiene enlaces a los artículos de razonamiento automático y demostración asistida por ordenador que se están publicando y&lt;br /&gt;
* en [https://www.glc.us.es/~jalonso/vestigium/category/resena/ Vestigium] que contiene una reseña de los más destacados.&lt;br /&gt;
&lt;br /&gt;
== Ofertas de trabajo ==&lt;br /&gt;
&lt;br /&gt;
En [https://github.com/jaalonso/Recopilaciones/blob/master/Trabajos-MULCIA.org GitHub] se encuentra una recopilaciónn las ofertas de trabajo de interés para los estudiantes del Máster Universitario en Lógica, Computación e Inteligencia Artificial de la Universidad de Sevilla.&lt;br /&gt;
&lt;br /&gt;
Están en orden cronológico inverso por la fecha de su publicación en [https://twitter.com/search?l=&amp;amp;q=%23MULCIA%20from%3AJose_A_Alonso&amp;amp;src=typd&amp;amp;lang=es Twitter].&lt;/div&gt;</summary>
		<author><name>Jalonso</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2018/index.php?title=Tema_6:_L%C3%B3gica_en_Coq&amp;diff=381</id>
		<title>Tema 6: Lógica en Coq</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2018/index.php?title=Tema_6:_L%C3%B3gica_en_Coq&amp;diff=381"/>
		<updated>2019-02-14T13:08:41Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: Protegió «Tema 6: Lógica en Coq» ([Editar=Solo administradores] (indefinido) [Trasladar=Solo administradores] (indefinido))&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;coq&amp;quot;&amp;gt;&lt;br /&gt;
Set Warnings &amp;quot;-notation-overridden,-parsing&amp;quot;.&lt;br /&gt;
Require Export T5_Tacticas.&lt;br /&gt;
&lt;br /&gt;
(* El contenido del tema es&lt;br /&gt;
   1. Introducción&lt;br /&gt;
   2. Conectivas lógicas &lt;br /&gt;
      1. Conjunción &lt;br /&gt;
      2. Disyunción  &lt;br /&gt;
      3. Falsedad y negación  &lt;br /&gt;
      4. Verdad&lt;br /&gt;
      5. Equivalencia lógica&lt;br /&gt;
      6. Cuantificación existencial  &lt;br /&gt;
   3. Programación con proposiciones &lt;br /&gt;
   4. Aplicando teoremas a argumentos &lt;br /&gt;
   5. Coq vs. teoría de conjuntos &lt;br /&gt;
      1. Extensionalidad funcional&lt;br /&gt;
      2. Proposiciones y booleanos  &lt;br /&gt;
      3. Lógica clásica vs. constructiva  &lt;br /&gt;
   Bibliografía&lt;br /&gt;
 *)&lt;br /&gt;
&lt;br /&gt;
(* =====================================================================&lt;br /&gt;
   § 1. Introducción &lt;br /&gt;
   ================================================================== *)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 1.1. Calcular el tipo de las siguientes expresiones&lt;br /&gt;
      3 = 3.&lt;br /&gt;
      3 = 4.&lt;br /&gt;
      forall n m : nat, n + m = m + n.&lt;br /&gt;
      forall n : nat, n = 2.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Check 3 = 3.&lt;br /&gt;
(* ===&amp;gt; Prop *)&lt;br /&gt;
&lt;br /&gt;
Check 3 = 4.&lt;br /&gt;
(* ===&amp;gt; Prop *)&lt;br /&gt;
&lt;br /&gt;
Check forall n m : nat, n + m = m + n.&lt;br /&gt;
(* ===&amp;gt; Prop *)&lt;br /&gt;
&lt;br /&gt;
Check forall n : nat, n = 2.&lt;br /&gt;
(* ===&amp;gt; Prop *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Nota. El tipo de las fórmulas es Prop.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 1.2.3. Demostrar que 2 más dos es 4.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Theorem suma_2_y_2:&lt;br /&gt;
  2 + 2 = 4.&lt;br /&gt;
Proof. reflexivity.  Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Nota. Usa la proposición &amp;#039;2 + 2 = 4&amp;#039;.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 1.2.2. Definir la proposición &lt;br /&gt;
      prop_suma: Prop&lt;br /&gt;
   que afirma que la suma de 2 y 2 es 4. &lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Definition prop_suma: Prop := 2 + 2 = 4.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 1.2.3. Calcular el tipo de prop_suma&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Check prop_suma.&lt;br /&gt;
(* ===&amp;gt; prop_suma : Prop *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 1.2.4. Usando prop_suma, demostrar que la suma de 2 y 2 es 4.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Theorem prop_suma_es_verdadera:&lt;br /&gt;
  prop_suma.&lt;br /&gt;
Proof. reflexivity.  Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 1.3.1. Definir la proposición &lt;br /&gt;
      es_tres (n : nat) : Prop&lt;br /&gt;
   tal que (es_tres n) se verifica si n es el número 3.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Definition es_tres (n : nat) : Prop :=&lt;br /&gt;
  n = 3.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 1.3.2. Calcular el tipo de las siguientes expresiones&lt;br /&gt;
      es_tres.&lt;br /&gt;
      es_tres 3.&lt;br /&gt;
      es_tres 5.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Check es_tres.&lt;br /&gt;
(* ===&amp;gt; nat -&amp;gt; Prop *)&lt;br /&gt;
&lt;br /&gt;
Check es_tres 3.&lt;br /&gt;
(* ===&amp;gt; Prop *)&lt;br /&gt;
&lt;br /&gt;
Check es_tres 5.&lt;br /&gt;
(* ===&amp;gt; Prop *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Nota. Ejemplo de proposición parametrizada.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 1.4.1. Definir la función&lt;br /&gt;
      inyectiva {A B : Type} (f : A -&amp;gt; B) : Prop :=&lt;br /&gt;
   tal que (inyectiva f) se verifica si f es inyectiva.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Definition inyectiva {A B : Type} (f : A -&amp;gt; B) : Prop :=&lt;br /&gt;
  forall x y : A, f x = f y -&amp;gt; x = y.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 1.4.2. Demostrar que la funcion sucesor es inyectiva; es&lt;br /&gt;
   decir, &lt;br /&gt;
      inyectiva S.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Lemma suc_iny: inyectiva S.&lt;br /&gt;
Proof.&lt;br /&gt;
  intros n m H. (* n, m : nat&lt;br /&gt;
                   H : S n = S m&lt;br /&gt;
                   ============================&lt;br /&gt;
                   n = m *)&lt;br /&gt;
  inversion H.  (* n, m : nat&lt;br /&gt;
                   H : S n = S m&lt;br /&gt;
                   H1 : n = m&lt;br /&gt;
                   ============================&lt;br /&gt;
                   m = m *)&lt;br /&gt;
  reflexivity.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 1.5. Calcular los tipos de las siguientes expresiones&lt;br /&gt;
      3 = 5.&lt;br /&gt;
      eq 3 5.&lt;br /&gt;
      eq 3.&lt;br /&gt;
      @eq.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Check (3 = 5).&lt;br /&gt;
(* ===&amp;gt; Prop *)&lt;br /&gt;
&lt;br /&gt;
Check (eq 3 5).&lt;br /&gt;
(* ===&amp;gt; Prop *)&lt;br /&gt;
&lt;br /&gt;
Check (eq 3).&lt;br /&gt;
(* ===&amp;gt; nat -&amp;gt; Prop *)&lt;br /&gt;
&lt;br /&gt;
Check @eq.&lt;br /&gt;
(* ===&amp;gt; forall A : Type, A -&amp;gt; A -&amp;gt; Prop *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Notas.&lt;br /&gt;
   1. La expresión (x = y) es una abreviatura de (eq x y).&lt;br /&gt;
   2. Se escribe @eq en lugar de eq para ver los argumentos implícitos.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
(* =====================================================================&lt;br /&gt;
   § 2. Conectivas lógicas &lt;br /&gt;
   ================================================================== *)&lt;br /&gt;
&lt;br /&gt;
(* =====================================================================&lt;br /&gt;
   §§ 2.1. Conjunción &lt;br /&gt;
   ================================================================== *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 2.1.1. Demostrar que&lt;br /&gt;
      3 + 4 = 7 /\ 2 * 2 = 4.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Example ej_conjuncion: 3 + 4 = 7 /\ 2 * 2 = 4.&lt;br /&gt;
Proof.&lt;br /&gt;
  split.         &lt;br /&gt;
  -              (* &lt;br /&gt;
                    ============================&lt;br /&gt;
                    3 + 4 = 7 *)&lt;br /&gt;
    reflexivity. &lt;br /&gt;
  -              (* &lt;br /&gt;
                    ============================&lt;br /&gt;
                    2 * 2 = 4 *)&lt;br /&gt;
    reflexivity.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Notas.&lt;br /&gt;
   1. El símbolo de conjunción se escribe con /\&lt;br /&gt;
   2. La táctica &amp;#039;split&amp;#039; sustituye el objetivo (P /\ Q) por los&lt;br /&gt;
   subobjetivos P y Q. &lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 2.1.2. Demostrar que&lt;br /&gt;
      forall A B : Prop, A -&amp;gt; B -&amp;gt; A /\ B.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Lemma conj_intro: forall A B : Prop, A -&amp;gt; B -&amp;gt; A /\ B.&lt;br /&gt;
Proof.&lt;br /&gt;
  intros A B HA HB. (* A, B : Prop&lt;br /&gt;
                       HA : A&lt;br /&gt;
                       HB : B&lt;br /&gt;
                       ============================&lt;br /&gt;
                       A /\ B *)&lt;br /&gt;
  split.&lt;br /&gt;
  -                 (* A, B : Prop&lt;br /&gt;
                       HA : A&lt;br /&gt;
                       HB : B&lt;br /&gt;
                       ============================&lt;br /&gt;
                       A *)&lt;br /&gt;
    apply HA.&lt;br /&gt;
  -                 (* A, B : Prop&lt;br /&gt;
                       HA : A&lt;br /&gt;
                       HB : B&lt;br /&gt;
                       ============================&lt;br /&gt;
                       B *)&lt;br /&gt;
    apply HB.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 2.1.3. Demostrar, con conj_intro, que&lt;br /&gt;
      3 + 4 = 7 /\ 2 * 2 = 4.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Example ej_conjuncion&amp;#039;: 3 + 4 = 7 /\ 2 * 2 = 4.&lt;br /&gt;
Proof.&lt;br /&gt;
  apply conj_intro. &lt;br /&gt;
  -                 (* 3 + 4 = 7 *)&lt;br /&gt;
    reflexivity.&lt;br /&gt;
  -                 (* 2 * 2 = 4 *)&lt;br /&gt;
    reflexivity.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 2.1.4. Demostrar que&lt;br /&gt;
      forall n m : nat, n = 0 /\ m = 0 -&amp;gt; n + m = 0.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Lemma ej_conjuncion2 :&lt;br /&gt;
  forall n m : nat, n = 0 /\ m = 0 -&amp;gt; n + m = 0.&lt;br /&gt;
Proof.&lt;br /&gt;
  intros n m H.          (* n, m : nat&lt;br /&gt;
                            H : n = 0 /\ m = 0&lt;br /&gt;
                            ============================&lt;br /&gt;
                            n + m = 0 *)&lt;br /&gt;
  destruct H as [Hn Hm]. (* n, m : nat&lt;br /&gt;
                            Hn : n = 0&lt;br /&gt;
                            Hm : m = 0&lt;br /&gt;
                            ============================&lt;br /&gt;
                            n + m = 0 *)&lt;br /&gt;
  rewrite Hn.            (* 0 + m = 0 *)&lt;br /&gt;
  rewrite Hm.            (* 0 + 0 = 0 *)&lt;br /&gt;
  reflexivity.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Nota. Uso de la táctica &amp;#039;destruct H as [HA HB]&amp;#039; que  sustituye la&lt;br /&gt;
   hipótesis H de la forma (A /\ B) por las hipótesis HA (que afirma&lt;br /&gt;
   que A es verdad) y HB (que afirma que B es verdad).&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 2.1.5. Demostrar que&lt;br /&gt;
      forall n m : nat, n = 0 /\ m = 0 -&amp;gt; n + m = 0.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Lemma ej_conjuncion2&amp;#039; :&lt;br /&gt;
  forall n m : nat, n = 0 /\ m = 0 -&amp;gt; n + m = 0.&lt;br /&gt;
Proof.&lt;br /&gt;
  intros n m [Hn Hm].    (* n, m : nat&lt;br /&gt;
                            Hn : n = 0&lt;br /&gt;
                            Hm : m = 0&lt;br /&gt;
                            ============================&lt;br /&gt;
                            n + m = 0 *)&lt;br /&gt;
  rewrite Hn.            (* 0 + m = 0 *)&lt;br /&gt;
  rewrite Hm.            (* 0 + 0 = 0 *)&lt;br /&gt;
  reflexivity.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Nota. La táctica &amp;#039;intros x [HA HB]&amp;#039;, cuando el objetivo es de la&lt;br /&gt;
   forma (forall x, A /\ B -&amp;gt; C), introduce la variable x y las&lt;br /&gt;
   hipótesis HA y HB afirmando la certeza de A y de B, respectivamente.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 2.1.6. Demostrar que&lt;br /&gt;
      forall n m : nat, n = 0 -&amp;gt; m = 0 -&amp;gt; n + m = 0.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Lemma ej_conjuncion2&amp;#039;&amp;#039; :&lt;br /&gt;
  forall n m : nat, n = 0 -&amp;gt; m = 0 -&amp;gt; n + m = 0.&lt;br /&gt;
Proof.&lt;br /&gt;
  intros n m Hn Hm. (* n, m : nat&lt;br /&gt;
                       Hn : n = 0&lt;br /&gt;
                       Hm : m = 0&lt;br /&gt;
                       ============================&lt;br /&gt;
                       n + m = 0 *)&lt;br /&gt;
  rewrite Hn.       (* 0 + m = 0 *)&lt;br /&gt;
  rewrite Hm.       (* 0 + 0 = 0 *)&lt;br /&gt;
  reflexivity.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 2.1.8. Demostrar que&lt;br /&gt;
      forall P Q : Prop,&lt;br /&gt;
        P /\ Q -&amp;gt; P.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Lemma conj_e1 : forall P Q : Prop,&lt;br /&gt;
  P /\ Q -&amp;gt; P.&lt;br /&gt;
Proof.&lt;br /&gt;
  intros P Q [HP HQ]. (* P, Q : Prop&lt;br /&gt;
                         HP : P&lt;br /&gt;
                         HQ : Q&lt;br /&gt;
                         ============================&lt;br /&gt;
                         P *)&lt;br /&gt;
  apply HP.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 2.1.9. Demostrar que&lt;br /&gt;
      forall P Q : Prop,&lt;br /&gt;
        P /\ Q -&amp;gt; Q /\ P.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Theorem conj_conmutativa: forall P Q : Prop,&lt;br /&gt;
  P /\ Q -&amp;gt; Q /\ P.&lt;br /&gt;
Proof.&lt;br /&gt;
  intros P Q [HP HQ]. (* P, Q : Prop&lt;br /&gt;
                         HP : P&lt;br /&gt;
                         HQ : Q&lt;br /&gt;
                         ============================&lt;br /&gt;
                         Q /\ P *)&lt;br /&gt;
  split.&lt;br /&gt;
  -                   (* P, Q : Prop&lt;br /&gt;
                         HP : P&lt;br /&gt;
                         HQ : Q&lt;br /&gt;
                         ============================&lt;br /&gt;
                         Q *)&lt;br /&gt;
    apply HQ.&lt;br /&gt;
  -                   (* P, Q : Prop&lt;br /&gt;
                         HP : P&lt;br /&gt;
                         HQ : Q&lt;br /&gt;
                         ============================&lt;br /&gt;
                         P *)&lt;br /&gt;
    apply HP.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 2.1.10. Calcular el tipo de la expresión&lt;br /&gt;
      and&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Check and.&lt;br /&gt;
(* ===&amp;gt; and : Prop -&amp;gt; Prop -&amp;gt; Prop *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Nota. (x /\ y) es una abreviatura de (and x y).&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
(* =====================================================================&lt;br /&gt;
   §§ 2.2. Disyunción  &lt;br /&gt;
   ================================================================== *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 2.2.1. Demostrar que&lt;br /&gt;
      forall n m : nat, n = 0 \/ m = 0 -&amp;gt; n * m = 0.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
(* 1ª demostración *)&lt;br /&gt;
Lemma disy_ej1:&lt;br /&gt;
  forall n m : nat, n = 0 \/ m = 0 -&amp;gt; n * m = 0.&lt;br /&gt;
Proof.&lt;br /&gt;
  intros n m H.&lt;br /&gt;
  destruct H as [Hn | Hm]. &lt;br /&gt;
  -                        (* n, m : nat&lt;br /&gt;
                              Hn : n = 0&lt;br /&gt;
                              ============================&lt;br /&gt;
                              n * m = 0 *)&lt;br /&gt;
    rewrite Hn.            (* 0 * m = 0 *)&lt;br /&gt;
    reflexivity.           &lt;br /&gt;
  -                        (* n, m : nat&lt;br /&gt;
                              Hm : m = 0&lt;br /&gt;
                              ============================&lt;br /&gt;
                              n * m = 0 *)&lt;br /&gt;
    rewrite Hm.            (* n * 0 = 0 *)&lt;br /&gt;
    rewrite &amp;lt;- mult_n_O.    (* 0 = 0 *)&lt;br /&gt;
    reflexivity.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* 2ª demostración *)&lt;br /&gt;
Lemma disy_ej:&lt;br /&gt;
  forall n m : nat, n = 0 \/ m = 0 -&amp;gt; n * m = 0.&lt;br /&gt;
Proof.&lt;br /&gt;
  intros n m [Hn | Hm]. &lt;br /&gt;
  -                     (* n, m : nat&lt;br /&gt;
                           Hn : n = 0&lt;br /&gt;
                           ============================&lt;br /&gt;
                           n * m = 0 *)&lt;br /&gt;
    rewrite Hn.         (* 0 * m = 0 *)&lt;br /&gt;
    reflexivity.&lt;br /&gt;
  -                     (* n, m : nat&lt;br /&gt;
                           Hm : m = 0&lt;br /&gt;
                           ============================&lt;br /&gt;
                           n * m = 0 *)&lt;br /&gt;
    rewrite Hm.         (* n * 0 = 0 *)&lt;br /&gt;
    rewrite &amp;lt;- mult_n_O. (* 0 = 0 *)&lt;br /&gt;
    reflexivity.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Notas.&lt;br /&gt;
   1. La táctica &amp;#039;destruct H as [Hn | Hm]&amp;#039;, cuando la hipótesis H es de&lt;br /&gt;
      la forma (A \/ B), la divide en dos casos: uno con hipótesis HA&lt;br /&gt;
      (afirmando la certeza de A) y otro con la hipótesis HB (afirmando&lt;br /&gt;
      la certeza de B).   &lt;br /&gt;
   2. La táctica &amp;#039;intros x [HA | HB]&amp;#039;, cuando el objetivo es de la&lt;br /&gt;
      forma (forall x, A \/ B -&amp;gt; C), intoduce la variable x y dos casos:&lt;br /&gt;
      uno con hipótesis HA (afirmando la certeza de A) y otro con la&lt;br /&gt;
      hipótesis HB (afirmando la certeza de B).&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 2.2.2. Demostrar que&lt;br /&gt;
      forall A B : Prop, A -&amp;gt; A \/ B.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Lemma disy_intro: forall A B : Prop, A -&amp;gt; A \/ B.&lt;br /&gt;
Proof.&lt;br /&gt;
  intros A B HA. (* A, B : Prop&lt;br /&gt;
                    HA : A&lt;br /&gt;
                    ============================&lt;br /&gt;
                    A \/ B *)&lt;br /&gt;
  left.          (* A *)&lt;br /&gt;
  apply HA.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Nota. La táctica &amp;#039;left&amp;#039; sustituye el objetivo de la forma (A \/ B)&lt;br /&gt;
   por A.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 2.2.3. Demostrar que&lt;br /&gt;
      forall n : nat, n = 0 \/ n = S (pred n).&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Lemma cero_o_sucesor:&lt;br /&gt;
  forall n : nat, n = 0 \/ n = S (pred n).&lt;br /&gt;
Proof.&lt;br /&gt;
  intros [|n].&lt;br /&gt;
  -              (* &lt;br /&gt;
                    ============================&lt;br /&gt;
                    0 = 0 \/ 0 = S (Nat.pred 0) *)&lt;br /&gt;
    left.        (* 0 = 0 *)&lt;br /&gt;
    reflexivity. &lt;br /&gt;
  -              (* n : nat&lt;br /&gt;
                    ============================&lt;br /&gt;
                    S n = 0 \/ S n = S (Nat.pred (S n)) *)&lt;br /&gt;
    right.       (* S n = S (Nat.pred (S n)) *)&lt;br /&gt;
    reflexivity.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Nota. La táctica &amp;#039;right&amp;#039; sustituye el objetivo de la forma (A \/ B)&lt;br /&gt;
   por B.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
  &lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 2.2.4. Calcular el tipo de la expresión&lt;br /&gt;
      or&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Check or.&lt;br /&gt;
(* ===&amp;gt; or : Prop -&amp;gt; Prop -&amp;gt; Prop *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Nota. (x \/ y) es una abreviatura de (or x y).&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
(* =====================================================================&lt;br /&gt;
   §§ 2.3. Falsedad y negación  &lt;br /&gt;
   ================================================================== *)&lt;br /&gt;
&lt;br /&gt;
Module DefNot.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 2.3.1. Definir la función&lt;br /&gt;
      not (P : Prop) : Prop&lt;br /&gt;
   tal que (not P) es la negación de P&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Definition not (P:Prop) : Prop :=&lt;br /&gt;
    P -&amp;gt; False.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 2.3.2. Definir (~ x) como abreviatura de (not x).&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Notation &amp;quot;~ x&amp;quot; := (not x) : type_scope.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Nota. Esta es la forma como está definida la negación en Coq.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
End DefNot.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 2.3.3. Demostrar que&lt;br /&gt;
      forall (P:Prop),&lt;br /&gt;
        False -&amp;gt; P.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Theorem ex_falso_quodlibet: forall (P:Prop),&lt;br /&gt;
  False -&amp;gt; P.&lt;br /&gt;
Proof.&lt;br /&gt;
  intros P H. (* P : Prop&lt;br /&gt;
                 H : False&lt;br /&gt;
                 ============================&lt;br /&gt;
                 P *)&lt;br /&gt;
  destruct H.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Nota. En latín, &amp;quot;ex falso quodlibet&amp;quot; significa &amp;quot;de lo falso (se&lt;br /&gt;
   sigue) cualquier cosa&amp;quot;. &lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 2.3.4. Demostrar que&lt;br /&gt;
      ~(0 = 1).&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Theorem cero_no_es_uno: ~(0 = 1).&lt;br /&gt;
Proof.&lt;br /&gt;
  intros H.       (* H : 0 = 1&lt;br /&gt;
                     ============================&lt;br /&gt;
                     False *)&lt;br /&gt;
  inversion H.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Nota. La expresión (x &amp;lt;&amp;gt; y) es una abreviatura de ~(x = y).&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Theorem cero_no_es_uno&amp;#039;: 0 &amp;lt;&amp;gt; 1.&lt;br /&gt;
Proof.&lt;br /&gt;
  intros H.       (* H : 0 = 1&lt;br /&gt;
                     ============================&lt;br /&gt;
                     False *)&lt;br /&gt;
  inversion H. &lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 2.3.5. Demostrar que&lt;br /&gt;
      ~ False&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Theorem not_False :&lt;br /&gt;
  ~ False.&lt;br /&gt;
Proof.&lt;br /&gt;
  unfold not. (* &lt;br /&gt;
                 ============================&lt;br /&gt;
                 False -&amp;gt; False *)&lt;br /&gt;
  intros H.   (* H : False&lt;br /&gt;
                 ============================&lt;br /&gt;
                 False *)&lt;br /&gt;
  destruct H. &lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 2.3.6. Demostrar que&lt;br /&gt;
      forall P Q : Prop,&lt;br /&gt;
        (P /\ ~P) -&amp;gt; Q.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Theorem contradiccion_implica_cualquiera: forall P Q : Prop,&lt;br /&gt;
  (P /\ ~P) -&amp;gt; Q.&lt;br /&gt;
Proof.&lt;br /&gt;
  intros P Q [HP HNP]. (* P, Q : Prop&lt;br /&gt;
                          HP : P&lt;br /&gt;
                          HNP : ~ P&lt;br /&gt;
                          ============================&lt;br /&gt;
                          Q *)&lt;br /&gt;
  unfold not in HNP. (* P, Q : Prop&lt;br /&gt;
                          HP : P&lt;br /&gt;
                          HNP : P -&amp;gt; False&lt;br /&gt;
                          ============================&lt;br /&gt;
                          Q *)&lt;br /&gt;
  apply HNP in HP. (* P, Q : Prop&lt;br /&gt;
                          HP : False&lt;br /&gt;
                          HNP : P -&amp;gt; False&lt;br /&gt;
                          ============================&lt;br /&gt;
                          Q *)&lt;br /&gt;
  destruct HP.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 2.3.7. Demostrar que&lt;br /&gt;
      forall P : Prop,&lt;br /&gt;
        P -&amp;gt; ~~P.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Theorem doble_neg: forall P : Prop,&lt;br /&gt;
  P -&amp;gt; ~~P.&lt;br /&gt;
Proof.&lt;br /&gt;
  intros P H. (* P : Prop&lt;br /&gt;
                 H : P&lt;br /&gt;
                 ============================&lt;br /&gt;
                 ~ ~ P *)&lt;br /&gt;
  unfold not. (* (P -&amp;gt; False) -&amp;gt; False *)&lt;br /&gt;
  intros G.   (* P : Prop&lt;br /&gt;
                 H : P&lt;br /&gt;
                 G : P -&amp;gt; False&lt;br /&gt;
                 ============================&lt;br /&gt;
                 False *)&lt;br /&gt;
  apply G.    (* P *)&lt;br /&gt;
  apply H.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 2.3.8. Demostrar que&lt;br /&gt;
      forall b : bool,&lt;br /&gt;
        b &amp;lt;&amp;gt; true -&amp;gt; b = false.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
(* 1ª demostración *)&lt;br /&gt;
Theorem no_verdadero_es_falso: forall b : bool,&lt;br /&gt;
  b &amp;lt;&amp;gt; true -&amp;gt; b = false.&lt;br /&gt;
Proof.&lt;br /&gt;
  intros [] H.&lt;br /&gt;
  -                           (* H : true &amp;lt;&amp;gt; true&lt;br /&gt;
                                 ============================&lt;br /&gt;
                                 true = false *)&lt;br /&gt;
    unfold not in H.          (* H : true = true -&amp;gt; False&lt;br /&gt;
                                 ============================&lt;br /&gt;
                                 true = false *)&lt;br /&gt;
    apply ex_falso_quodlibet. (* H : true = true -&amp;gt; False&lt;br /&gt;
                                 ============================&lt;br /&gt;
                                 False *)&lt;br /&gt;
    apply H.                  (* true = true *)&lt;br /&gt;
    reflexivity.&lt;br /&gt;
  -                           (* H : false &amp;lt;&amp;gt; true&lt;br /&gt;
                                 ============================&lt;br /&gt;
                                 false = false *)&lt;br /&gt;
    reflexivity.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* 2ª demostración *)&lt;br /&gt;
Theorem no_verdadero_es_falso&amp;#039;: forall b : bool,&lt;br /&gt;
  b &amp;lt;&amp;gt; true -&amp;gt; b = false.&lt;br /&gt;
Proof.&lt;br /&gt;
  intros [] H.&lt;br /&gt;
  -                  (* H : true &amp;lt;&amp;gt; true&lt;br /&gt;
                        ============================&lt;br /&gt;
                        true = false *)&lt;br /&gt;
    unfold not in H. (* H : true = true -&amp;gt; False&lt;br /&gt;
                        ============================&lt;br /&gt;
                        true = false *)&lt;br /&gt;
    exfalso.         (* H : true = true -&amp;gt; False&lt;br /&gt;
                        ============================&lt;br /&gt;
                        False *)&lt;br /&gt;
    apply H.         (* true = true *)&lt;br /&gt;
    reflexivity.&lt;br /&gt;
  -                  (* H : false &amp;lt;&amp;gt; true&lt;br /&gt;
                        ============================&lt;br /&gt;
                        false = false *)&lt;br /&gt;
    reflexivity.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Notas. &lt;br /&gt;
   1. Uso de &amp;#039;apply ex_falso_quodlibet&amp;#039; en la primera demostración.&lt;br /&gt;
   2. Uso de &amp;#039;exfalso&amp;#039; en la segunda demostración.&lt;br /&gt;
   3. La táctica &amp;#039;exfalso&amp;#039; sustituye el objetivo por falso. &lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
(* =====================================================================&lt;br /&gt;
   §§ 2.4. Verdad&lt;br /&gt;
   ================================================================== *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 2.4.1. Demostrar que la proposición True es verdadera.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Lemma True_es_verdadera : True.&lt;br /&gt;
Proof.&lt;br /&gt;
  apply I.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Nota. Uso del constructor I.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
(* =====================================================================&lt;br /&gt;
   §§ 2.5. Equivalencia lógica  &lt;br /&gt;
   ================================================================== *)&lt;br /&gt;
&lt;br /&gt;
Module DefIff.&lt;br /&gt;
&lt;br /&gt;
  (* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 2.5.1. Definir la función&lt;br /&gt;
      iff (P Q : Prop) : Prop&lt;br /&gt;
   tal que  (iff P Q) es la equivalencia de P y Q.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Definition iff (P Q : Prop) : Prop := (P -&amp;gt; Q) /\ (Q -&amp;gt; P).&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 2.5.2. Definir (P &amp;lt;-&amp;gt; Q) como una abreviatura de (iff P Q). &lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Notation &amp;quot;P &amp;lt;-&amp;gt; Q&amp;quot; := (iff P Q)&lt;br /&gt;
                      (at level 95, no associativity)&lt;br /&gt;
                      : type_scope.&lt;br /&gt;
&lt;br /&gt;
End DefIff.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 2.5.3. Demostrar que&lt;br /&gt;
      forall P Q : Prop,&lt;br /&gt;
        (P &amp;lt;-&amp;gt; Q) -&amp;gt; (Q &amp;lt;-&amp;gt; P).&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Theorem iff_sim : forall P Q : Prop,&lt;br /&gt;
  (P &amp;lt;-&amp;gt; Q) -&amp;gt; (Q &amp;lt;-&amp;gt; P).&lt;br /&gt;
Proof.&lt;br /&gt;
  intros P Q [HPQ HQP]. (* P, Q : Prop&lt;br /&gt;
                           HPQ : P -&amp;gt; Q&lt;br /&gt;
                           HQP : Q -&amp;gt; P&lt;br /&gt;
                           ============================&lt;br /&gt;
                           Q &amp;lt;-&amp;gt; P *)&lt;br /&gt;
  split.&lt;br /&gt;
  -                     (* P, Q : Prop&lt;br /&gt;
                           HPQ : P -&amp;gt; Q&lt;br /&gt;
                           HQP : Q -&amp;gt; P&lt;br /&gt;
                           ============================&lt;br /&gt;
                           Q -&amp;gt; P *)&lt;br /&gt;
    apply HQP.&lt;br /&gt;
  -                     (* P, Q : Prop&lt;br /&gt;
                           HPQ : P -&amp;gt; Q&lt;br /&gt;
                           HQP : Q -&amp;gt; P&lt;br /&gt;
                           ============================&lt;br /&gt;
                           P -&amp;gt; Q *)&lt;br /&gt;
    apply HPQ.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 2.5.4. Demostrar que&lt;br /&gt;
      forall b : bool,&lt;br /&gt;
        b &amp;lt;&amp;gt; true &amp;lt;-&amp;gt; b = false.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Lemma not_true_iff_false : forall b : bool,&lt;br /&gt;
  b &amp;lt;&amp;gt; true &amp;lt;-&amp;gt; b = false.&lt;br /&gt;
Proof.&lt;br /&gt;
  intros b.                      (* b : bool&lt;br /&gt;
                                    ============================&lt;br /&gt;
                                    b &amp;lt;&amp;gt; true &amp;lt;-&amp;gt; b = false *)&lt;br /&gt;
  split.&lt;br /&gt;
  -                              (* b : bool&lt;br /&gt;
                                    ============================&lt;br /&gt;
                                    b &amp;lt;&amp;gt; true -&amp;gt; b = false *)&lt;br /&gt;
    apply no_verdadero_es_falso. &lt;br /&gt;
  -                              (* b : bool&lt;br /&gt;
                                    ============================&lt;br /&gt;
                                    b = false -&amp;gt; b &amp;lt;&amp;gt; true *)&lt;br /&gt;
    intros H.                    (* b : bool&lt;br /&gt;
                                    H : b = false&lt;br /&gt;
                                    ============================&lt;br /&gt;
                                    b &amp;lt;&amp;gt; true *)&lt;br /&gt;
    rewrite H.                   (* false &amp;lt;&amp;gt; true *)&lt;br /&gt;
    intros H&amp;#039;.                   (* b : bool&lt;br /&gt;
                                    H : b = false&lt;br /&gt;
                                    H&amp;#039; : false = true&lt;br /&gt;
                                    ============================&lt;br /&gt;
                                    False *)&lt;br /&gt;
    inversion H&amp;#039;.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Nota. Se importa la librería Coq.Setoids.Setoid para usar las&lt;br /&gt;
   tácticas reflexivity y rewrite con iff.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Require Import Coq.Setoids.Setoid.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejercicio 2.2.1. Demostrar que&lt;br /&gt;
      forall n m, n * m = 0 -&amp;gt; n = 0 \/ m = 0.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Lemma mult_eq_0 :&lt;br /&gt;
  forall n m, n * m = 0 -&amp;gt; n = 0 \/ m = 0.&lt;br /&gt;
Proof.&lt;br /&gt;
  intros n m H.          (* n, m : nat&lt;br /&gt;
                            H : n * m = 0&lt;br /&gt;
                            ============================&lt;br /&gt;
                            n = 0 \/ m = 0 *)&lt;br /&gt;
  destruct n as [|n&amp;#039;].&lt;br /&gt;
  -                      (* m : nat&lt;br /&gt;
                            H : 0 * m = 0&lt;br /&gt;
                            ============================&lt;br /&gt;
                            0 = 0 \/ m = 0 *)&lt;br /&gt;
    left.                (* 0 = 0 *)&lt;br /&gt;
    reflexivity.&lt;br /&gt;
  -                      (* n&amp;#039;, m : nat&lt;br /&gt;
                            H : S n&amp;#039; * m = 0&lt;br /&gt;
                            ============================&lt;br /&gt;
                            S n&amp;#039; = 0 \/ m = 0 *)&lt;br /&gt;
    destruct m as [|m&amp;#039;]. &lt;br /&gt;
    +                    (* n&amp;#039; : nat&lt;br /&gt;
                            H : S n&amp;#039; * 0 = 0&lt;br /&gt;
                            ============================&lt;br /&gt;
                            S n&amp;#039; = 0 \/ 0 = 0 *)&lt;br /&gt;
      right.             (* 0 = 0 *)&lt;br /&gt;
      reflexivity.&lt;br /&gt;
    +                    (* n&amp;#039;, m&amp;#039; : nat&lt;br /&gt;
                            H : S n&amp;#039; * S m&amp;#039; = 0&lt;br /&gt;
                            ============================&lt;br /&gt;
                            S n&amp;#039; = 0 \/ S m&amp;#039; = 0 *)&lt;br /&gt;
      simpl in H.        (* n&amp;#039;, m&amp;#039; : nat&lt;br /&gt;
                            H : S (m&amp;#039; + n&amp;#039; * S m&amp;#039;) = 0&lt;br /&gt;
                            ============================&lt;br /&gt;
                            S n&amp;#039; = 0 \/ S m&amp;#039; = 0 *)&lt;br /&gt;
      inversion H.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 2.5.5. Demostrar que&lt;br /&gt;
      forall n m : nat, n * m = 0 &amp;lt;-&amp;gt; n = 0 \/ m = 0.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Lemma mult_0 : forall n m : nat, n * m = 0 &amp;lt;-&amp;gt; n = 0 \/ m = 0.&lt;br /&gt;
Proof.&lt;br /&gt;
  split.&lt;br /&gt;
  -                  (* n, m : nat&lt;br /&gt;
                        ============================&lt;br /&gt;
                        n * m = 0 -&amp;gt; n = 0 \/ m = 0 *)&lt;br /&gt;
    apply mult_eq_0. &lt;br /&gt;
  -                  (* n, m : nat&lt;br /&gt;
                        ============================&lt;br /&gt;
                        n = 0 \/ m = 0 -&amp;gt; n * m = 0 *)&lt;br /&gt;
    apply disy_ej.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 2.5.6. Demostrar que&lt;br /&gt;
      forall P Q R : Prop, &lt;br /&gt;
        P \/ (Q \/ R) &amp;lt;-&amp;gt; (P \/ Q) \/ R.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Lemma disy_asociativa :&lt;br /&gt;
  forall P Q R : Prop, P \/ (Q \/ R) &amp;lt;-&amp;gt; (P \/ Q) \/ R.&lt;br /&gt;
Proof.&lt;br /&gt;
  intros P Q R.           (* P, Q, R : Prop&lt;br /&gt;
                             ============================&lt;br /&gt;
                             P \/ (Q \/ R) &amp;lt;-&amp;gt; (P \/ Q) \/ R *)&lt;br /&gt;
  split.&lt;br /&gt;
  -                       (* P, Q, R : Prop&lt;br /&gt;
                             ============================&lt;br /&gt;
                             P \/ (Q \/ R) -&amp;gt; (P \/ Q) \/ R *)&lt;br /&gt;
    intros [H | [H | H]]. &lt;br /&gt;
    +                     (* P, Q, R : Prop&lt;br /&gt;
                             H : P&lt;br /&gt;
                             ============================&lt;br /&gt;
                             (P \/ Q) \/ R *)&lt;br /&gt;
      left.               (* P \/ Q *)&lt;br /&gt;
      left.               (* P *)&lt;br /&gt;
      apply H.&lt;br /&gt;
    +                     (* P, Q, R : Prop&lt;br /&gt;
                             H : Q&lt;br /&gt;
                             ============================&lt;br /&gt;
                             (P \/ Q) \/ R *)&lt;br /&gt;
      left.               (* P \/ Q *)&lt;br /&gt;
      right.              (* Q *)&lt;br /&gt;
      apply H.&lt;br /&gt;
    +                     (* P, Q, R : Prop&lt;br /&gt;
                             H : R&lt;br /&gt;
                             ============================&lt;br /&gt;
                             (P \/ Q) \/ R *)&lt;br /&gt;
      right.              (* R *)&lt;br /&gt;
      apply H.&lt;br /&gt;
  -                       (* P, Q, R : Prop&lt;br /&gt;
                             ============================&lt;br /&gt;
                             (P \/ Q) \/ R -&amp;gt; P \/ (Q \/ R) *)&lt;br /&gt;
    intros [[H | H] | H].&lt;br /&gt;
    +                     (* P, Q, R : Prop&lt;br /&gt;
                             H : P&lt;br /&gt;
                             ============================&lt;br /&gt;
                             (P \/ Q) \/ R *)&lt;br /&gt;
      left.               (* P *)&lt;br /&gt;
      apply H.&lt;br /&gt;
    +                     (* P, Q, R : Prop&lt;br /&gt;
                             H : Q&lt;br /&gt;
                             ============================&lt;br /&gt;
                             P \/ (Q \/ R) *)&lt;br /&gt;
      right.              (* Q \/ R *)&lt;br /&gt;
      left.               (* Q *)&lt;br /&gt;
      apply H.&lt;br /&gt;
    +                     (* P, Q, R : Prop&lt;br /&gt;
                             H : R&lt;br /&gt;
                             ============================&lt;br /&gt;
                             P \/ (Q \/ R) *)&lt;br /&gt;
      right.              (* Q \/ R *)&lt;br /&gt;
      right.              (* R *)&lt;br /&gt;
      apply H.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 2.5.7. Demostrar que&lt;br /&gt;
      forall n m p : nat,&lt;br /&gt;
        n * m * p = 0 &amp;lt;-&amp;gt; n = 0 \/ m = 0 \/ p = 0.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Lemma mult_0_3: forall n m p : nat,&lt;br /&gt;
    n * m * p = 0 &amp;lt;-&amp;gt; n = 0 \/ m = 0 \/ p = 0.&lt;br /&gt;
Proof.&lt;br /&gt;
  intros n m p.            (* n, m, p : nat&lt;br /&gt;
                              ============================&lt;br /&gt;
                              n * (m * p) = 0 &amp;lt;-&amp;gt; n = 0 \/ (m = 0 \/ p = 0) *)&lt;br /&gt;
  rewrite mult_0.          (* n * m = 0 \/ p = 0 &amp;lt;-&amp;gt; &lt;br /&gt;
                              n = 0 \/ (m = 0 \/ p = 0) *)&lt;br /&gt;
  rewrite mult_0.          (* (n = 0 \/ m = 0) \/ p = 0 &amp;lt;-&amp;gt; &lt;br /&gt;
                              n = 0 \/ (m = 0 \/ p = 0) *)&lt;br /&gt;
  rewrite disy_asociativa. (* (n = 0 \/ m = 0) \/ p = 0 &amp;lt;-&amp;gt; &lt;br /&gt;
                              (n = 0 \/ m = 0) \/ p = 0 *)&lt;br /&gt;
  reflexivity.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Nota. Uso de reflexivity y rewrite con iff.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 2.5.8. Demostrar que&lt;br /&gt;
      forall n m : nat,&lt;br /&gt;
        n * m = 0 -&amp;gt; n = 0 \/ m = 0.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Lemma ej_apply_iff: forall n m : nat,&lt;br /&gt;
    n * m = 0 -&amp;gt; n = 0 \/ m = 0.&lt;br /&gt;
Proof.&lt;br /&gt;
  intros n m H. (* n, m : nat&lt;br /&gt;
                   H : n * m = 0&lt;br /&gt;
                   ============================&lt;br /&gt;
                   n = 0 \/ m = 0 *)&lt;br /&gt;
  apply mult_0. (* n * m = 0 *)&lt;br /&gt;
  apply H.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Nota. Uso de apply sobre iff.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
(* =====================================================================&lt;br /&gt;
   §§ 2.6. Cuantificación existencial  &lt;br /&gt;
   ================================================================== *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 2.6.1. Demostrar que&lt;br /&gt;
      exists n : nat, 4 = n + n.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Lemma cuatro_es_par: exists n : nat, 4 = n + n.&lt;br /&gt;
Proof.&lt;br /&gt;
  exists 2.          (* &lt;br /&gt;
                   ============================&lt;br /&gt;
                   4 = 2 + 2 *)&lt;br /&gt;
  reflexivity.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Nota. La táctica &amp;#039;exists a&amp;#039; sustituye el objetivo de la forma &lt;br /&gt;
   (exists x, P(x)) por P(a).&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 2.6.2. Demostrar que&lt;br /&gt;
      forall n : nat,&lt;br /&gt;
        (exists m, n = 4 + m) -&amp;gt; (exists o, n = 2 + o).&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
(* 1ª demostración *)&lt;br /&gt;
Theorem ej_existe_2a: forall n : nat,&lt;br /&gt;
  (exists m, n = 4 + m) -&amp;gt;&lt;br /&gt;
  (exists o, n = 2 + o).&lt;br /&gt;
Proof.&lt;br /&gt;
  intros n H.           (* n : nat&lt;br /&gt;
                           H : exists m : nat, n = 4 + m&lt;br /&gt;
                           ============================&lt;br /&gt;
                           exists o : nat, n = 2 + o *)&lt;br /&gt;
  destruct H as [a Ha]. (* n, a : nat&lt;br /&gt;
                           Ha : n = 4 + a&lt;br /&gt;
                           ============================&lt;br /&gt;
                           exists o : nat, n = 2 + o *)&lt;br /&gt;
  exists (2 + a).            (* n = 2 + (2 + a) *)&lt;br /&gt;
  apply Ha.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* 2ª demostración *)&lt;br /&gt;
Theorem ej_existe_2b: forall n : nat,&lt;br /&gt;
  (exists m, n = 4 + m) -&amp;gt;&lt;br /&gt;
  (exists o, n = 2 + o).&lt;br /&gt;
Proof.&lt;br /&gt;
  intros n [a Ha].      (* n, a : nat&lt;br /&gt;
                           Ha : n = 4 + a&lt;br /&gt;
                           ============================&lt;br /&gt;
                           exists o : nat, n = 2 + o *)&lt;br /&gt;
  exists (2 + a).            (* n = 2 + (2 + a) *)&lt;br /&gt;
  apply Ha.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Notas.&lt;br /&gt;
   1. &amp;#039;destruct H [a Ha]&amp;#039; sustituye la hipótesis (H : exists x, P(x)) &lt;br /&gt;
      por (Ha : P(a)).&lt;br /&gt;
   2. &amp;#039;intros x [a Ha]&amp;#039; sustituye el objetivo &lt;br /&gt;
      (forall x, (exists y P(y)) -&amp;gt; Q(x)) por Q(x) y le añade la&lt;br /&gt;
      hipótesis (Ha : P(a)).&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
(* =====================================================================&lt;br /&gt;
   § 3. Programación con proposiciones &lt;br /&gt;
   ================================================================== *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 3.1.1. Definir la función&lt;br /&gt;
      En {A : Type} (x : A) (xs : list A) : Prop :=&lt;br /&gt;
   tal que (En x xs) se verifica si x pertenece a xs.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Fixpoint En {A : Type} (x : A) (xs : list A) : Prop :=&lt;br /&gt;
  match xs with&lt;br /&gt;
  | []        =&amp;gt; False&lt;br /&gt;
  | x&amp;#039; :: xs&amp;#039; =&amp;gt; x&amp;#039; = x \/ En x xs&amp;#039;&lt;br /&gt;
  end.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 3.1.2. Demostrar que&lt;br /&gt;
      En 4 [1; 2; 3; 4; 5].&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Example En_ejemplo_1 : En 4 [1; 2; 3; 4; 5].&lt;br /&gt;
Proof.&lt;br /&gt;
  simpl.       (* 1 = 4 \/ 2 = 4 \/ 3 = 4 \/ 4 = 4 \/ 5 = 4 \/ False *)&lt;br /&gt;
  right.       (* 2 = 4 \/ 3 = 4 \/ 4 = 4 \/ 5 = 4 \/ False *)&lt;br /&gt;
  right.       (* 3 = 4 \/ 4 = 4 \/ 5 = 4 \/ False *)&lt;br /&gt;
  right.       (* 4 = 4 \/ 5 = 4 \/ False *)&lt;br /&gt;
  left.        (* 4 = 4 *)&lt;br /&gt;
  reflexivity. &lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 3.1.3. Demostrar que&lt;br /&gt;
      forall n : nat, &lt;br /&gt;
        En n [2; 4] -&amp;gt; exists n&amp;#039;, n = 2 * n&amp;#039;.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Example En_ejemplo_2: forall n : nat,&lt;br /&gt;
    En n [2; 4] -&amp;gt; exists n&amp;#039;, n = 2 * n&amp;#039;.&lt;br /&gt;
Proof.&lt;br /&gt;
  simpl.                   (* &lt;br /&gt;
                              ============================&lt;br /&gt;
                              forall n : nat,&lt;br /&gt;
                               2 = n \/ 4 = n \/ False -&amp;gt; &lt;br /&gt;
                               exists n&amp;#039; : nat, n = n&amp;#039; + (n&amp;#039; + 0) *)&lt;br /&gt;
  intros n [H | [H | []]]. &lt;br /&gt;
  -                        (* n : nat&lt;br /&gt;
                              H : 2 = n&lt;br /&gt;
                              ============================&lt;br /&gt;
                              exists n&amp;#039; : nat, n = n&amp;#039; + (n&amp;#039; + 0) *)&lt;br /&gt;
    exists 1.                   (* n = 1 + (1 + 0) *)&lt;br /&gt;
    rewrite &amp;lt;- H.           (* 2 = 1 + (1 + 0) *)&lt;br /&gt;
    reflexivity.&lt;br /&gt;
  -                        (* n : nat&lt;br /&gt;
                              H : 4 = n&lt;br /&gt;
                              ============================&lt;br /&gt;
                              exists n&amp;#039; : nat, n = n&amp;#039; + (n&amp;#039; + 0) *)&lt;br /&gt;
    exists 2.                   (* n = 2 + (2 + 0) *)&lt;br /&gt;
    rewrite &amp;lt;- H.           (* 4 = 2 + (2 + 0) *)&lt;br /&gt;
    reflexivity.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Nota. Uso del patrón vacío para descartar el último caso.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 3.2. Demostrar que&lt;br /&gt;
      forall (A B : Type) (f : A -&amp;gt; B) (xs : list A) (x : A),&lt;br /&gt;
        En x xs -&amp;gt;&lt;br /&gt;
        En (f x) (map f xs).&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Lemma En_map: forall (A B : Type) (f : A -&amp;gt; B) (xs : list A) (x : A),&lt;br /&gt;
    En x xs -&amp;gt;&lt;br /&gt;
    En (f x) (map f xs).&lt;br /&gt;
Proof.&lt;br /&gt;
  intros A B f xs x.            (* A : Type&lt;br /&gt;
                                   B : Type&lt;br /&gt;
                                   f : A -&amp;gt; B&lt;br /&gt;
                                   xs : list A&lt;br /&gt;
                                   x : A&lt;br /&gt;
                                   ============================&lt;br /&gt;
                                   En x xs -&amp;gt; En (f x) (map f xs) *)&lt;br /&gt;
  induction xs as [|x&amp;#039; xs&amp;#039; HI]. &lt;br /&gt;
  -                             (* A : Type&lt;br /&gt;
                                   B : Type&lt;br /&gt;
                                   f : A -&amp;gt; B&lt;br /&gt;
                                   x : A&lt;br /&gt;
                                   ============================&lt;br /&gt;
                                   En x [ ] -&amp;gt; En (f x) (map f [ ]) *)&lt;br /&gt;
    simpl.                      (* False -&amp;gt; False *)&lt;br /&gt;
    intros [].&lt;br /&gt;
  -                             (* A : Type&lt;br /&gt;
                                   B : Type&lt;br /&gt;
                                   f : A -&amp;gt; B&lt;br /&gt;
                                   x&amp;#039; : A&lt;br /&gt;
                                   xs&amp;#039; : list A&lt;br /&gt;
                                   x : A&lt;br /&gt;
                                   HI : En x xs&amp;#039; -&amp;gt; En (f x) (map f xs&amp;#039;)&lt;br /&gt;
                                   ============================&lt;br /&gt;
                                   En x (x&amp;#039;::xs&amp;#039;) -&amp;gt; &lt;br /&gt;
                                   En (f x) (map f (x&amp;#039;::xs&amp;#039;)) *)&lt;br /&gt;
    simpl.                      (* x&amp;#039; = x \/ En x xs&amp;#039; -&amp;gt; &lt;br /&gt;
                                   f x&amp;#039; = f x \/ En (f x) (map f xs&amp;#039;) *)&lt;br /&gt;
    intros [H | H].&lt;br /&gt;
    +                           (* A : Type&lt;br /&gt;
                                   B : Type&lt;br /&gt;
                                   f : A -&amp;gt; B&lt;br /&gt;
                                   x&amp;#039; : A&lt;br /&gt;
                                   xs&amp;#039; : list A&lt;br /&gt;
                                   x : A&lt;br /&gt;
                                   HI : En x xs&amp;#039; -&amp;gt; En (f x) (map f xs&amp;#039;)&lt;br /&gt;
                                   H : x&amp;#039; = x&lt;br /&gt;
                                   ============================&lt;br /&gt;
                                   f x&amp;#039; = f x \/ En (f x) (map f xs&amp;#039;) *)&lt;br /&gt;
      rewrite H.                (* f x = f x \/ En (f x) (map f xs&amp;#039;) *)&lt;br /&gt;
      left.                     (* f x = f x *)&lt;br /&gt;
      reflexivity.&lt;br /&gt;
    +                           (* A : Type&lt;br /&gt;
                                   B : Type&lt;br /&gt;
                                   f : A -&amp;gt; B&lt;br /&gt;
                                   x&amp;#039; : A&lt;br /&gt;
                                   xs&amp;#039; : list A&lt;br /&gt;
                                   x : A&lt;br /&gt;
                                   HI : En x xs&amp;#039; -&amp;gt; En (f x) (map f xs&amp;#039;)&lt;br /&gt;
                                   H : En x xs&amp;#039;&lt;br /&gt;
                                   ============================&lt;br /&gt;
                                   f x&amp;#039; = f x \/ En (f x) (map f xs&amp;#039;) *)&lt;br /&gt;
      right.                    (* En (f x) (map f xs&amp;#039;) *)&lt;br /&gt;
      apply HI.                 (* En x xs&amp;#039; *)&lt;br /&gt;
      apply H.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* =====================================================================&lt;br /&gt;
   § 4. Aplicando teoremas a argumentos &lt;br /&gt;
   ================================================================== *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 4.1. Evaluar la expresión&lt;br /&gt;
      Check suma_conmutativa.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Check suma_conmutativa.&lt;br /&gt;
(* ===&amp;gt; forall n m : nat, n + m = m + n *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Notas.&lt;br /&gt;
   1. En Coq, las demostraciones son objetos de primera clase.&lt;br /&gt;
   2. Coq devuelve el tipo de suma_conmutativa como el de cualquier&lt;br /&gt;
      expresión.&lt;br /&gt;
   3. El identificador suma_conmutativa representa un objeto prueba de&lt;br /&gt;
      (forall n m : nat, n + m = m + n).&lt;br /&gt;
   4. Un término de tipo (nat -&amp;gt; nat -&amp;gt; nat) transforma dos naturales en&lt;br /&gt;
      un natural.&lt;br /&gt;
   5. Análogamente, un término de tipo (n = m -&amp;gt; n + n = m + m)&lt;br /&gt;
      transforma un argumento de tipo (n = m) en otro de tipo &lt;br /&gt;
      (n + n = m + m).&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 4.2. Demostrar que&lt;br /&gt;
      forall x y z : nat, &lt;br /&gt;
        x + (y + z) = (z + y) + x.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
(* 1º intento *)&lt;br /&gt;
Lemma suma_conmutativa3a :&lt;br /&gt;
  forall x y z : nat,&lt;br /&gt;
    x + (y + z) = (z + y) + x.&lt;br /&gt;
Proof.&lt;br /&gt;
  intros x y z.             (* x, y, z : nat&lt;br /&gt;
                               ============================&lt;br /&gt;
                               x + (y + z) = (z + y) + x *)&lt;br /&gt;
  rewrite suma_conmutativa. (* (y + z) + x = (z + y) + x *)&lt;br /&gt;
  rewrite suma_conmutativa. (* x + (y + z) = (z + y) + x *)&lt;br /&gt;
Abort.&lt;br /&gt;
&lt;br /&gt;
(* 2º intento *)&lt;br /&gt;
Lemma suma_conmutativa3b :&lt;br /&gt;
  forall x y z,&lt;br /&gt;
    x + (y + z) = (z + y) + x.&lt;br /&gt;
Proof.&lt;br /&gt;
  intros x y z.               (* x, y, z : nat&lt;br /&gt;
                                 ============================&lt;br /&gt;
                                 x + (y + z) = z + y + x *)&lt;br /&gt;
  rewrite suma_conmutativa.   (* (y + z) + x = (z + y) + x *)&lt;br /&gt;
  assert (H : y + z = z + y). &lt;br /&gt;
  -                           (* x, y, z : nat&lt;br /&gt;
                                 ============================&lt;br /&gt;
                                 y + z = z + y *)&lt;br /&gt;
    rewrite suma_conmutativa. (* z + y = z + y *)&lt;br /&gt;
    reflexivity. &lt;br /&gt;
  -                           (* x, y, z : nat&lt;br /&gt;
                                 H : y + z = z + y&lt;br /&gt;
                                 ============================&lt;br /&gt;
                                 (y + z) + x = (z + y) + x *)&lt;br /&gt;
    rewrite H.                (* (z + y) + x = (z + y) + x *)&lt;br /&gt;
    reflexivity.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* 3º intento *)&lt;br /&gt;
Lemma suma_conmutativa3c:&lt;br /&gt;
  forall x y z,&lt;br /&gt;
    x + (y + z) = (z + y) + x.&lt;br /&gt;
Proof.&lt;br /&gt;
  intros x y z.                   (* x, y, z : nat&lt;br /&gt;
                                     ============================&lt;br /&gt;
                                     x + (y + z) = (z + y) + x *)&lt;br /&gt;
  rewrite suma_conmutativa.       (* (y + z) + x = (z + y) + x *)&lt;br /&gt;
  rewrite (suma_conmutativa y z). (* (z + y) + x = (z + y) + x *)&lt;br /&gt;
  reflexivity.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Nota. Indicación en (rewrite (suma_conmutativa y z)) de los&lt;br /&gt;
   argumentos con los que se aplica, análogamente a las funciones&lt;br /&gt;
   polimórficas. &lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 4.3. Demostrar que&lt;br /&gt;
     forall {n : nat} {ns : list nat},&lt;br /&gt;
       En n (map (fun m =&amp;gt; m * 0) ns) -&amp;gt;&lt;br /&gt;
       n = 0.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
(* Lema auxiliar *)&lt;br /&gt;
Lemma producto_n_0:&lt;br /&gt;
  forall n : nat, n * 0 = 0.&lt;br /&gt;
Proof.&lt;br /&gt;
  induction n as [|n&amp;#039; HI]. &lt;br /&gt;
  -                        (* &lt;br /&gt;
                              ============================&lt;br /&gt;
                              0 * 0 = 0 *)&lt;br /&gt;
    reflexivity. &lt;br /&gt;
  -                        (* n&amp;#039; : nat&lt;br /&gt;
                              HI : n&amp;#039; * 0 = 0&lt;br /&gt;
                              ============================&lt;br /&gt;
                              S n&amp;#039; * 0 = 0 *)&lt;br /&gt;
    simpl.                 (* n&amp;#039; * 0 = 0 *)&lt;br /&gt;
    apply HI.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* Lema auxiliar. *)&lt;br /&gt;
Lemma En_map_iff: forall (A B : Type) (f : A -&amp;gt; B) (xs : list A) (y : B),&lt;br /&gt;
    En y (map f xs) &amp;lt;-&amp;gt;&lt;br /&gt;
    exists x, f x = y /\ En x xs.&lt;br /&gt;
Proof.&lt;br /&gt;
  intros A B f xs y.                  (* A : Type&lt;br /&gt;
                                         B : Type&lt;br /&gt;
                                         f : A -&amp;gt; B&lt;br /&gt;
                                         xs : list A&lt;br /&gt;
                                         y : B&lt;br /&gt;
                                         ============================&lt;br /&gt;
                                         En y (map f xs) &amp;lt;-&amp;gt; &lt;br /&gt;
                                         (exists x : A, f x = y /\ En x xs) *)&lt;br /&gt;
  induction xs as [|x xs&amp;#039; HI]. &lt;br /&gt;
  -                                   (* A : Type&lt;br /&gt;
                                         B : Type&lt;br /&gt;
                                         f : A -&amp;gt; B&lt;br /&gt;
                                         y : B&lt;br /&gt;
                                         ============================&lt;br /&gt;
                                         En y (map f [ ]) &amp;lt;-&amp;gt; &lt;br /&gt;
                                         (exists x : A, f x = y /\ En x [ ]) *)&lt;br /&gt;
    simpl.                            (* En y (map f [ ]) &amp;lt;-&amp;gt; &lt;br /&gt;
                                         (exists x : A, f x = y /\ En x [ ]) *)&lt;br /&gt;
    split.&lt;br /&gt;
    +                                 (* A : Type&lt;br /&gt;
                                         B : Type&lt;br /&gt;
                                         f : A -&amp;gt; B&lt;br /&gt;
                                         y : B&lt;br /&gt;
                                         ============================&lt;br /&gt;
                                         False -&amp;gt; &lt;br /&gt;
                                         exists x : A, f x = y /\ False *)&lt;br /&gt;
      intros [].&lt;br /&gt;
    +                                 (* A : Type&lt;br /&gt;
                                         B : Type&lt;br /&gt;
                                         f : A -&amp;gt; B&lt;br /&gt;
                                         y : B&lt;br /&gt;
                                         ============================&lt;br /&gt;
                                         (exists x : A, f x = y /\ False) -&amp;gt; &lt;br /&gt;
                                         False *)&lt;br /&gt;
      intros [a [H []]].&lt;br /&gt;
  -                                   (* A : Type&lt;br /&gt;
                                         B : Type&lt;br /&gt;
                                         f : A -&amp;gt; B&lt;br /&gt;
                                         x : A&lt;br /&gt;
                                         xs&amp;#039; : list A&lt;br /&gt;
                                         y : B&lt;br /&gt;
                                         HI : En y (map f xs&amp;#039;) &amp;lt;-&amp;gt; &lt;br /&gt;
                                              (exists x:A, f x = y /\ En x xs&amp;#039;)&lt;br /&gt;
                                         ============================&lt;br /&gt;
                                         En y (map f (x :: xs&amp;#039;)) &amp;lt;-&amp;gt; &lt;br /&gt;
                                         (exists x0 : A, &lt;br /&gt;
                                           f x0 = y /\ En x0 (x :: xs&amp;#039;)) *)&lt;br /&gt;
    simpl.                            (* f x = y \/ En y (map f xs&amp;#039;) &amp;lt;-&amp;gt;&lt;br /&gt;
                                         (exists x0 : A, &lt;br /&gt;
                                           f x0 = y /\ (x = x0 \/ En x0 xs&amp;#039;)) *)&lt;br /&gt;
    split.&lt;br /&gt;
    +                                 (* A : Type&lt;br /&gt;
                                         B : Type&lt;br /&gt;
                                         f : A -&amp;gt; B&lt;br /&gt;
                                         x : A&lt;br /&gt;
                                         xs&amp;#039; : list A&lt;br /&gt;
                                         y : B&lt;br /&gt;
                                         HI : En y (map f xs&amp;#039;) &amp;lt;-&amp;gt; &lt;br /&gt;
                                              (exists x:A, f x = y /\ En x xs&amp;#039;)&lt;br /&gt;
                                         ============================&lt;br /&gt;
                                         f x = y \/ En y (map f xs&amp;#039;) -&amp;gt;&lt;br /&gt;
                                         exists x0 : A, &lt;br /&gt;
                                          f x0 = y /\ (x = x0 \/ En x0 xs&amp;#039;) *)&lt;br /&gt;
      intros [H1 | H2].&lt;br /&gt;
      *                               (* A : Type&lt;br /&gt;
                                         B : Type&lt;br /&gt;
                                         f : A -&amp;gt; B&lt;br /&gt;
                                         x : A&lt;br /&gt;
                                         xs&amp;#039; : list A&lt;br /&gt;
                                         y : B&lt;br /&gt;
                                         HI : En y (map f xs&amp;#039;) &amp;lt;-&amp;gt; &lt;br /&gt;
                                              (exists x:A, f x = y /\ En x xs&amp;#039;)&lt;br /&gt;
                                         H1 : f x = y&lt;br /&gt;
                                         ============================&lt;br /&gt;
                                         exists x0 : A, &lt;br /&gt;
                                          f x0 = y /\ (x = x0 \/ En x0 xs&amp;#039;) *)&lt;br /&gt;
        exists x.                        (* f x = y /\ (x = x \/ En x xs&amp;#039;) *)&lt;br /&gt;
        split.&lt;br /&gt;
        --                            (* A : Type&lt;br /&gt;
                                         B : Type&lt;br /&gt;
                                         f : A -&amp;gt; B&lt;br /&gt;
                                         x : A&lt;br /&gt;
                                         xs&amp;#039; : list A&lt;br /&gt;
                                         y : B&lt;br /&gt;
                                         HI : En y (map f xs&amp;#039;) &amp;lt;-&amp;gt; &lt;br /&gt;
                                              (exists x:A, f x = y /\ En x xs&amp;#039;)&lt;br /&gt;
                                         H1 : f x = y&lt;br /&gt;
                                         ============================&lt;br /&gt;
                                         f x = y *)&lt;br /&gt;
          apply H1.&lt;br /&gt;
        --                            (* A : Type&lt;br /&gt;
                                         B : Type&lt;br /&gt;
                                         f : A -&amp;gt; B&lt;br /&gt;
                                         x : A&lt;br /&gt;
                                         xs&amp;#039; : list A&lt;br /&gt;
                                         y : B&lt;br /&gt;
                                         HI : En y (map f xs&amp;#039;) &amp;lt;-&amp;gt; &lt;br /&gt;
                                              (exists x:A, f x = y /\ En x xs&amp;#039;)&lt;br /&gt;
                                         H1 : f x = y&lt;br /&gt;
                                         ============================&lt;br /&gt;
                                         x = x \/ En x xs&amp;#039; *)&lt;br /&gt;
          left.                       (* x = x *)&lt;br /&gt;
          reflexivity.&lt;br /&gt;
      *                               (* A : Type&lt;br /&gt;
                                         B : Type&lt;br /&gt;
                                         f : A -&amp;gt; B&lt;br /&gt;
                                         x : A&lt;br /&gt;
                                         xs&amp;#039; : list A&lt;br /&gt;
                                         y : B&lt;br /&gt;
                                         HI : En y (map f xs&amp;#039;) &amp;lt;-&amp;gt; &lt;br /&gt;
                                              (exists x:A, f x = y /\ En x xs&amp;#039;)&lt;br /&gt;
                                         H2 : En y (map f xs&amp;#039;)&lt;br /&gt;
                                         ============================&lt;br /&gt;
                                         exists x0 : A, &lt;br /&gt;
                                          f x0 = y /\ (x = x0 \/ En x0 xs&amp;#039;) *)&lt;br /&gt;
        apply HI in H2.               (* A : Type&lt;br /&gt;
                                         B : Type&lt;br /&gt;
                                         f : A -&amp;gt; B&lt;br /&gt;
                                         x : A&lt;br /&gt;
                                         xs&amp;#039; : list A&lt;br /&gt;
                                         y : B&lt;br /&gt;
                                         HI : En y (map f xs&amp;#039;) &amp;lt;-&amp;gt; &lt;br /&gt;
                                              (exists x:A, f x = y /\ En x xs&amp;#039;)&lt;br /&gt;
                                         H2 : exists x : A, f x = y /\ En x xs&amp;#039;&lt;br /&gt;
                                         ============================&lt;br /&gt;
                                         exists x0 : A, &lt;br /&gt;
                                          f x0 = y /\ (x = x0 \/ En x0 xs&amp;#039;) *)&lt;br /&gt;
        destruct H2 as [a [Ha1 Ha2]]. (* A : Type&lt;br /&gt;
                                         B : Type&lt;br /&gt;
                                         f : A -&amp;gt; B&lt;br /&gt;
                                         x : A&lt;br /&gt;
                                         xs&amp;#039; : list A&lt;br /&gt;
                                         y : B&lt;br /&gt;
                                         HI : En y (map f xs&amp;#039;) &amp;lt;-&amp;gt; &lt;br /&gt;
                                              (exists x:A, f x = y /\ En x xs&amp;#039;)&lt;br /&gt;
                                         a : A&lt;br /&gt;
                                         Ha1 : f a = y&lt;br /&gt;
                                         Ha2 : En a xs&amp;#039;&lt;br /&gt;
                                         ============================&lt;br /&gt;
                                         exists x0 : A, &lt;br /&gt;
                                          f x0 = y /\ (x = x0 \/ En x0 xs&amp;#039;) *)&lt;br /&gt;
        &lt;br /&gt;
        exists a.                          (* En y (map f xs) &amp;lt;-&amp;gt; &lt;br /&gt;
                                         (exists x : A, f x = y /\ En x xs) *)&lt;br /&gt;
        split.&lt;br /&gt;
        --                            (* A : Type&lt;br /&gt;
                                         B : Type&lt;br /&gt;
                                         f : A -&amp;gt; B&lt;br /&gt;
                                         x : A&lt;br /&gt;
                                         xs&amp;#039; : list A&lt;br /&gt;
                                         y : B&lt;br /&gt;
                                         HI : En y (map f xs&amp;#039;) &amp;lt;-&amp;gt; &lt;br /&gt;
                                              (exists x:A, f x = y /\ En x xs&amp;#039;)&lt;br /&gt;
                                         a : A&lt;br /&gt;
                                         Ha1 : f a = y&lt;br /&gt;
                                         Ha2 : En a xs&amp;#039;&lt;br /&gt;
                                         ============================&lt;br /&gt;
                                         f a = y *)&lt;br /&gt;
          apply Ha1.&lt;br /&gt;
        --                            (* A : Type&lt;br /&gt;
                                         B : Type&lt;br /&gt;
                                         f : A -&amp;gt; B&lt;br /&gt;
                                         x : A&lt;br /&gt;
                                         xs&amp;#039; : list A&lt;br /&gt;
                                         y : B&lt;br /&gt;
                                         HI : En y (map f xs&amp;#039;) &amp;lt;-&amp;gt; &lt;br /&gt;
                                              (exists x:A, f x = y /\ En x xs&amp;#039;)&lt;br /&gt;
                                         a : A&lt;br /&gt;
                                         Ha1 : f a = y&lt;br /&gt;
                                         Ha2 : En a xs&amp;#039;&lt;br /&gt;
                                         ============================&lt;br /&gt;
                                         x = a \/ En a xs&amp;#039; *)&lt;br /&gt;
          right.                      (* En a xs&amp;#039; *)&lt;br /&gt;
          apply Ha2.&lt;br /&gt;
    +                                 (* A : Type&lt;br /&gt;
                                         B : Type&lt;br /&gt;
                                         f : A -&amp;gt; B&lt;br /&gt;
                                         x : A&lt;br /&gt;
                                         xs&amp;#039; : list A&lt;br /&gt;
                                         y : B&lt;br /&gt;
                                         HI : En y (map f xs&amp;#039;) &amp;lt;-&amp;gt; &lt;br /&gt;
                                              (exists x : A, &lt;br /&gt;
                                                f x = y /\ En x xs&amp;#039;)&lt;br /&gt;
                                         ============================&lt;br /&gt;
                                         (exists x0 : A, &lt;br /&gt;
                                          f x0 = y /\ (x = x0 \/ En x0 xs&amp;#039;)) -&amp;gt;&lt;br /&gt;
                                         f x = y \/ En y (map f xs&amp;#039;) *)&lt;br /&gt;
      intros [a [Ha1 [Ha2 | Ha3]]].&lt;br /&gt;
      *                               (* A : Type&lt;br /&gt;
                                         B : Type&lt;br /&gt;
                                         f : A -&amp;gt; B&lt;br /&gt;
                                         x : A&lt;br /&gt;
                                         xs&amp;#039; : list A&lt;br /&gt;
                                         y : B&lt;br /&gt;
                                         HI : En y (map f xs&amp;#039;) &amp;lt;-&amp;gt; &lt;br /&gt;
                                              (exists x:A, f x = y /\ En x xs&amp;#039;)&lt;br /&gt;
                                         a : A&lt;br /&gt;
                                         Ha1 : f a = y&lt;br /&gt;
                                         Ha2 : x = a&lt;br /&gt;
                                         ============================&lt;br /&gt;
                                         f x = y \/ En y (map f xs&amp;#039;) *)&lt;br /&gt;
        left.                         (* f x = y *)&lt;br /&gt;
        rewrite Ha2.                  (* f a = y *)&lt;br /&gt;
        rewrite Ha1.                  (* y = y *)&lt;br /&gt;
        reflexivity.&lt;br /&gt;
      *                               (* A : Type&lt;br /&gt;
                                         B : Type&lt;br /&gt;
                                         f : A -&amp;gt; B&lt;br /&gt;
                                         x : A&lt;br /&gt;
                                         xs&amp;#039; : list A&lt;br /&gt;
                                         y : B&lt;br /&gt;
                                         HI : En y (map f xs&amp;#039;) &amp;lt;-&amp;gt; &lt;br /&gt;
                                              (exists x:A, f x = y /\ En x xs&amp;#039;)&lt;br /&gt;
                                         a : A&lt;br /&gt;
                                         Ha1 : f a = y&lt;br /&gt;
                                         Ha3 : En a xs&amp;#039;&lt;br /&gt;
                                         ============================&lt;br /&gt;
                                         f x = y \/ En y (map f xs&amp;#039;) *)&lt;br /&gt;
        right.                        (* En y (map f xs&amp;#039;) *)&lt;br /&gt;
        apply HI.                     (* exists x0 : A, f x0 = y /\ En x0 xs&amp;#039; *)&lt;br /&gt;
        exists a.                          (* f a = y /\ En a xs&amp;#039; *)&lt;br /&gt;
        split.&lt;br /&gt;
        --                            (* A : Type&lt;br /&gt;
                                         B : Type&lt;br /&gt;
                                         f : A -&amp;gt; B&lt;br /&gt;
                                         x : A&lt;br /&gt;
                                         xs&amp;#039; : list A&lt;br /&gt;
                                         y : B&lt;br /&gt;
                                         HI : En y (map f xs&amp;#039;) &amp;lt;-&amp;gt; &lt;br /&gt;
                                              (exists x:A, f x = y /\ En x xs&amp;#039;)&lt;br /&gt;
                                         a : A&lt;br /&gt;
                                         Ha1 : f a = y&lt;br /&gt;
                                         Ha3 : En a xs&amp;#039;&lt;br /&gt;
                                         ============================&lt;br /&gt;
                                         f a = y *)&lt;br /&gt;
          apply Ha1.&lt;br /&gt;
        --                            (* A : Type&lt;br /&gt;
                                         B : Type&lt;br /&gt;
                                         f : A -&amp;gt; B&lt;br /&gt;
                                         x : A&lt;br /&gt;
                                         xs&amp;#039; : list A&lt;br /&gt;
                                         y : B&lt;br /&gt;
                                         HI : En y (map f xs&amp;#039;) &amp;lt;-&amp;gt; &lt;br /&gt;
                                              (exists x:A, f x = y /\ En x xs&amp;#039;)&lt;br /&gt;
                                         a : A&lt;br /&gt;
                                         Ha1 : f a = y&lt;br /&gt;
                                         Ha3 : En a xs&amp;#039;&lt;br /&gt;
                                         ============================&lt;br /&gt;
                                         En a xs&amp;#039; *)&lt;br /&gt;
          apply Ha3.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(* 1ª demostración *)&lt;br /&gt;
Example ej_aplicacion_de_lema_1:&lt;br /&gt;
  forall {n : nat} {ns : list nat},&lt;br /&gt;
    En n (map (fun m =&amp;gt; m * 0) ns) -&amp;gt;&lt;br /&gt;
    n = 0.&lt;br /&gt;
Proof.&lt;br /&gt;
  intros n ns H.              (* n : nat&lt;br /&gt;
                                 ns : list nat&lt;br /&gt;
                                 H : En n (map (fun m : nat =&amp;gt; m * 0) ns)&lt;br /&gt;
                                 ============================&lt;br /&gt;
                                 n = 0 *)&lt;br /&gt;
  rewrite En_map_iff in H.    (* n : nat&lt;br /&gt;
                                 ns : list nat&lt;br /&gt;
                                 H : exists x : nat, x * 0 = n /\ En x ns&lt;br /&gt;
                                 ============================&lt;br /&gt;
                                 n = 0 *)&lt;br /&gt;
  destruct H as [m [Hm _]].   (* n : nat&lt;br /&gt;
                                 ns : list nat&lt;br /&gt;
                                 m : nat&lt;br /&gt;
                                 Hm : m * 0 = n&lt;br /&gt;
                                 ============================&lt;br /&gt;
                                 n = 0 *)&lt;br /&gt;
  rewrite producto_n_0 in Hm. (* n : nat&lt;br /&gt;
                                 ns : list nat&lt;br /&gt;
                                 m : nat&lt;br /&gt;
                                 Hm : 0 = n&lt;br /&gt;
                                 ============================&lt;br /&gt;
                                 n = 0 *)&lt;br /&gt;
  symmetry.                   (* 0 = n *)&lt;br /&gt;
  apply Hm.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* 2ª demostración *)&lt;br /&gt;
Example ej_aplicacion_de_lema:&lt;br /&gt;
  forall {n : nat} {ns : list nat},&lt;br /&gt;
    En n (map (fun m =&amp;gt; m * 0) ns) -&amp;gt;&lt;br /&gt;
    n = 0.&lt;br /&gt;
Proof.&lt;br /&gt;
  intros n ns H.                    (* n : nat&lt;br /&gt;
                                       ns : list nat&lt;br /&gt;
                                       H : En n (map (fun m : nat =&amp;gt; m * 0) ns)&lt;br /&gt;
                                       ============================&lt;br /&gt;
                                       n = 0 *)&lt;br /&gt;
  destruct (conj_e1 _ _&lt;br /&gt;
             (En_map_iff _ _ _ _ _) &lt;br /&gt;
             H)&lt;br /&gt;
           as [m [Hm _]].           (* n : nat&lt;br /&gt;
                                       ns : list nat&lt;br /&gt;
                                       H : En n (map (fun m : nat =&amp;gt; m * 0) ns)&lt;br /&gt;
                                       m : nat&lt;br /&gt;
                                       Hm : m * 0 = n&lt;br /&gt;
                                       ============================&lt;br /&gt;
                                       n = 0 *)&lt;br /&gt;
  rewrite producto_n_0 in Hm.       (* n : nat&lt;br /&gt;
                                       ns : list nat&lt;br /&gt;
                                       H : En n (map (fun m : nat =&amp;gt; m * 0) ns)&lt;br /&gt;
                                       m : nat&lt;br /&gt;
                                       Hm : 0 = n&lt;br /&gt;
                                       ============================&lt;br /&gt;
                                       n = 0 *)&lt;br /&gt;
  symmetry.                         (* 0 = n *)&lt;br /&gt;
  apply Hm.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Nota. Aplicación de teoremas a argumentos con&lt;br /&gt;
      (conj_e1 _ _  (En_map_iff _ _ _ _ _) H)&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
(* =====================================================================&lt;br /&gt;
   § 5. Coq vs. teoría de conjuntos &lt;br /&gt;
   ================================================================== *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Notas.&lt;br /&gt;
   1. En lugar de decir que un elemento pertenece a un conjunto se puede&lt;br /&gt;
      decir que verifica la propiedad que define al conjunto.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
(* =====================================================================&lt;br /&gt;
   §§ 5.1. Extensionalidad funcional&lt;br /&gt;
   ================================================================== *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 5.1.1. Demostrar que&lt;br /&gt;
      plus 3 = plus (pred 4).&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Example igualdad_de_funciones_ej1:&lt;br /&gt;
  suma 3 = suma (pred 4).&lt;br /&gt;
Proof.&lt;br /&gt;
  reflexivity.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 5.1.2. Definir el axioma de extensionalidad funcional que&lt;br /&gt;
   afirma que dos funciones son giuales cuando tienen los mismos&lt;br /&gt;
   valores. &lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Axiom extensionalidad_funcional : forall {X Y: Type}&lt;br /&gt;
                                    {f g : X -&amp;gt; Y},&lt;br /&gt;
  (forall (x:X), f x = g x) -&amp;gt; f = g.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 5.1.3. Demostrar que&lt;br /&gt;
      (fun x =&amp;gt; suma x 1) = (fun x =&amp;gt; suma 1 x).&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Example igualdad_de_funciones_ej2 :&lt;br /&gt;
  (fun x =&amp;gt; suma x 1) = (fun x =&amp;gt; suma 1 x).&lt;br /&gt;
Proof.&lt;br /&gt;
  apply extensionalidad_funcional. (* &lt;br /&gt;
                                      ============================&lt;br /&gt;
                                      forall x : nat, suma x 1 = suma 1 x *)&lt;br /&gt;
  intros x.                        (* x : nat&lt;br /&gt;
                                      ============================&lt;br /&gt;
                                      suma x 1 = suma 1 x *)&lt;br /&gt;
  apply suma_conmutativa.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Notas.&lt;br /&gt;
   1. No se puede demostrar sin el axioma.&lt;br /&gt;
   2. Hay que ser cuidadoso en la definición de axiomas, porque se&lt;br /&gt;
      pueden introducir inconsistencias. &lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 5.1.4. Calcular los axiomas usados en la prueba de &lt;br /&gt;
      igualdad_de_funciones_ej2&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Print Assumptions igualdad_de_funciones_ej2.&lt;br /&gt;
(* ===&amp;gt;&lt;br /&gt;
     Axioms:&lt;br /&gt;
     extensionalidad_funcional :&lt;br /&gt;
         forall (X Y : Type) (f g : X -&amp;gt; Y),&lt;br /&gt;
                (forall x : X, f x = g x) -&amp;gt; f = g *)&lt;br /&gt;
(* =====================================================================&lt;br /&gt;
   §§ 5.2. Proposiciones y booleanos  &lt;br /&gt;
   ================================================================== *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 5.2.1. Demostrar que&lt;br /&gt;
     forall k : nat,&lt;br /&gt;
       esPar (doble k) = true.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Theorem esPar_doble:&lt;br /&gt;
  forall k : nat, esPar (doble k) = true.&lt;br /&gt;
Proof.&lt;br /&gt;
  intros k.                (* k : nat&lt;br /&gt;
                              ============================&lt;br /&gt;
                              esPar (doble k) = true *)&lt;br /&gt;
  induction k as [|k&amp;#039; HI]. &lt;br /&gt;
  -                        (* &lt;br /&gt;
                              ============================&lt;br /&gt;
                              esPar (doble 0) = true *)&lt;br /&gt;
    reflexivity.&lt;br /&gt;
  -                        (* k&amp;#039; : nat&lt;br /&gt;
                              HI : esPar (doble k&amp;#039;) = true&lt;br /&gt;
                              ============================&lt;br /&gt;
                              esPar (doble (S k&amp;#039;)) = true *)&lt;br /&gt;
    simpl.                 (* esPar (doble k&amp;#039;) = true *)&lt;br /&gt;
    apply HI.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 5.2.2. Demostrar que&lt;br /&gt;
      forall n : nat,&lt;br /&gt;
        esPar n = true &amp;lt;-&amp;gt; exists k, n = doble k.&lt;br /&gt;
&lt;br /&gt;
   Es decir, que la computación booleana (esPar n) refleja la&lt;br /&gt;
   proposición (exists k, n = doble k).&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
(* Lema auxiliar. *)&lt;br /&gt;
Lemma esPar_doble_aux :&lt;br /&gt;
  forall n : nat,&lt;br /&gt;
    exists k : nat, n = if esPar n&lt;br /&gt;
                 then doble k&lt;br /&gt;
                 else S (doble k).&lt;br /&gt;
Proof.&lt;br /&gt;
  induction n as [|n&amp;#039; HI].    &lt;br /&gt;
  -                            (* &lt;br /&gt;
                                  ============================&lt;br /&gt;
                                  exists k : nat, &lt;br /&gt;
                                   0 = (if esPar 0 &lt;br /&gt;
                                        then doble k &lt;br /&gt;
                                        else S (doble k)) *)&lt;br /&gt;
    exists 0.                       (* 0 = (if esPar 0 &lt;br /&gt;
                                       then doble 0 &lt;br /&gt;
                                       else S (doble 0)) *)&lt;br /&gt;
    reflexivity.&lt;br /&gt;
  -                            (* n&amp;#039; : nat&lt;br /&gt;
                                  HI : exists k : nat, &lt;br /&gt;
                                        n&amp;#039; = (if esPar n&amp;#039; &lt;br /&gt;
                                              then doble k &lt;br /&gt;
                                              else S (doble k))&lt;br /&gt;
                                  ============================&lt;br /&gt;
                                  exists k : nat, &lt;br /&gt;
                                   S n&amp;#039; = (if esPar (S n&amp;#039;) &lt;br /&gt;
                                           then doble k &lt;br /&gt;
                                           else S (doble k)) *)&lt;br /&gt;
    destruct (esPar n&amp;#039;) eqn:H. &lt;br /&gt;
    +                          (* n&amp;#039; : nat&lt;br /&gt;
                                  H : esPar n&amp;#039; = true&lt;br /&gt;
                                  HI : exists k : nat, n&amp;#039; = doble k&lt;br /&gt;
                                  ============================&lt;br /&gt;
                                  exists k : nat, &lt;br /&gt;
                                   S n&amp;#039; = (if esPar (S n&amp;#039;) &lt;br /&gt;
                                           then doble k &lt;br /&gt;
                                           else S (doble k)) *)&lt;br /&gt;
      rewrite esPar_S.         (* exists k : nat,&lt;br /&gt;
                                   S n&amp;#039; = (if negacion (esPar n&amp;#039;) &lt;br /&gt;
                                           then doble k &lt;br /&gt;
                                           else S (doble k)) *)&lt;br /&gt;
      rewrite H.               (* exists k : nat, &lt;br /&gt;
                                   S n&amp;#039; = (if negacion true &lt;br /&gt;
                                           then doble k &lt;br /&gt;
                                           else S (doble k)) *)&lt;br /&gt;
      simpl.                   (* exists k : nat, S n&amp;#039; = S (doble k) *)&lt;br /&gt;
      destruct HI as [k&amp;#039; Hk&amp;#039;]. (* n&amp;#039; : nat&lt;br /&gt;
                                  H : esPar n&amp;#039; = true&lt;br /&gt;
                                  k&amp;#039; : nat&lt;br /&gt;
                                  Hk&amp;#039; : n&amp;#039; = doble k&amp;#039;&lt;br /&gt;
                                  ============================&lt;br /&gt;
                                  exists k : nat, S n&amp;#039; = S (doble k) *)&lt;br /&gt;
      exists k&amp;#039;.                    (* S n&amp;#039; = S (doble k&amp;#039;) *)&lt;br /&gt;
      rewrite Hk&amp;#039;.             (* S (doble k&amp;#039;) = S (doble k&amp;#039;) *)&lt;br /&gt;
      reflexivity.&lt;br /&gt;
    +                          (* n&amp;#039; : nat&lt;br /&gt;
                                  H : esPar n&amp;#039; = false&lt;br /&gt;
                                  HI : exists k : nat, n&amp;#039; = S (doble k)&lt;br /&gt;
                                  ============================&lt;br /&gt;
                                  exists k : nat, &lt;br /&gt;
                                   S n&amp;#039; = (if esPar (S n&amp;#039;) &lt;br /&gt;
                                           then doble k &lt;br /&gt;
                                           else S (doble k)) *)&lt;br /&gt;
      rewrite esPar_S.         (* exists k : nat,&lt;br /&gt;
                                   S n&amp;#039; = (if negacion (esPar n&amp;#039;) &lt;br /&gt;
                                           then doble k &lt;br /&gt;
                                           else S (doble k)) *)&lt;br /&gt;
      rewrite H.               (* exists k : nat, &lt;br /&gt;
                                   S n&amp;#039; = (if negacion false &lt;br /&gt;
                                           then doble k &lt;br /&gt;
                                           else S (doble k)) *)&lt;br /&gt;
      simpl.                   (* exists k : nat, S n&amp;#039; = doble k *)&lt;br /&gt;
      destruct HI as [k&amp;#039; Hk&amp;#039;]. (* n&amp;#039; : nat&lt;br /&gt;
                                  H : esPar n&amp;#039; = false&lt;br /&gt;
                                  k&amp;#039; : nat&lt;br /&gt;
                                  Hk&amp;#039; : n&amp;#039; = S (doble k&amp;#039;)&lt;br /&gt;
                                  ============================&lt;br /&gt;
                                  exists k : nat, S n&amp;#039; = doble k *)&lt;br /&gt;
      exists (1 + k&amp;#039;).              (* S n&amp;#039; = doble (1 + k&amp;#039;) *)&lt;br /&gt;
      rewrite Hk&amp;#039;.             (* S (S (doble k&amp;#039;)) = doble (1 + k&amp;#039;) *)&lt;br /&gt;
      reflexivity.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Theorem esPar_bool_prop:&lt;br /&gt;
  forall n : nat,&lt;br /&gt;
    esPar n = true &amp;lt;-&amp;gt; exists k, n = doble k.&lt;br /&gt;
Proof.&lt;br /&gt;
  intros n.               (* n : nat&lt;br /&gt;
                             ============================&lt;br /&gt;
                             esPar n = true &amp;lt;-&amp;gt; (exists k : nat, n = doble k) *)&lt;br /&gt;
  split.&lt;br /&gt;
  -                       (* n : nat&lt;br /&gt;
                             ============================&lt;br /&gt;
                             esPar n = true -&amp;gt; exists k : nat, n = doble k *)&lt;br /&gt;
    intros H.             (* n : nat                           &lt;br /&gt;
                             H : esPar n = true&lt;br /&gt;
                             ============================&lt;br /&gt;
                             exists k : nat, n = doble k *)&lt;br /&gt;
    destruct&lt;br /&gt;
      (esPar_doble_aux n) &lt;br /&gt;
      as [k Hk].          (* n : nat&lt;br /&gt;
                             H : esPar n = true&lt;br /&gt;
                             k : nat&lt;br /&gt;
                             Hk : n = (if esPar n then doble k else S (doble k))&lt;br /&gt;
                             ============================&lt;br /&gt;
                             exists k0 : nat, n = doble k0 *)&lt;br /&gt;
    rewrite Hk.           (* exists k0 : nat, &lt;br /&gt;
                              (if esPar n &lt;br /&gt;
                               then doble k &lt;br /&gt;
                               else S (doble k)) &lt;br /&gt;
                              = doble k0 *)&lt;br /&gt;
    rewrite H.            (* exists k0 : nat, doble k = doble k0 *)&lt;br /&gt;
    exists k.                  (* doble k = doble k *)&lt;br /&gt;
    reflexivity.&lt;br /&gt;
  -                       (* n : nat&lt;br /&gt;
                             ============================&lt;br /&gt;
                             (exists k : nat, n = doble k) -&amp;gt; esPar n = true *)&lt;br /&gt;
    intros [k Hk].        (* n, k : nat&lt;br /&gt;
                             Hk : n = doble k&lt;br /&gt;
                             ============================&lt;br /&gt;
                             esPar n = true *)&lt;br /&gt;
    rewrite Hk.           (* esPar (doble k) = true *)&lt;br /&gt;
    apply esPar_doble.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 5.2.3. Demostrar que&lt;br /&gt;
      forall n m : nat,&lt;br /&gt;
        iguales_nat n m = true &amp;lt;-&amp;gt; n = m.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Theorem iguales_nat_bool_prop:&lt;br /&gt;
  forall n m : nat,&lt;br /&gt;
    iguales_nat n m = true &amp;lt;-&amp;gt; n = m.&lt;br /&gt;
Proof.&lt;br /&gt;
  intros n m.                 (* n, m : nat&lt;br /&gt;
                                 ============================&lt;br /&gt;
                                 iguales_nat n m = true &amp;lt;-&amp;gt; n = m *)&lt;br /&gt;
  split.&lt;br /&gt;
  -                           (* n, m : nat&lt;br /&gt;
                                 ============================&lt;br /&gt;
                                 iguales_nat n m = true -&amp;gt; n = m *)&lt;br /&gt;
    apply iguales_nat_true.&lt;br /&gt;
  -                           (* n, m : nat&lt;br /&gt;
                                 ============================&lt;br /&gt;
                                 n = m -&amp;gt; iguales_nat n m = true *)&lt;br /&gt;
    intros H.                 (* n, m : nat&lt;br /&gt;
                                 H : n = m&lt;br /&gt;
                                 ============================&lt;br /&gt;
                                 iguales_nat n m = true *)&lt;br /&gt;
    rewrite H.                (* iguales_nat m m = true *)&lt;br /&gt;
    rewrite iguales_nat_refl. (* true = true *)&lt;br /&gt;
    reflexivity.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 5.2.4. Definir la función es_primo_par tal que &lt;br /&gt;
   (es_primo_par n) es verifica si n es un primo par.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
(* 1º intento *)&lt;br /&gt;
Fail Definition es_primo_par n :=&lt;br /&gt;
  if n = 2&lt;br /&gt;
  then true&lt;br /&gt;
  else false.&lt;br /&gt;
&lt;br /&gt;
(* 2º intento *)&lt;br /&gt;
Definition es_primo_par n :=&lt;br /&gt;
  if iguales_nat n 2&lt;br /&gt;
  then true&lt;br /&gt;
  else false.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 5.2.5.1. Demostrar que&lt;br /&gt;
      exists k : nat, 1000 = doble k.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Example esPar_1000: exists k : nat, 1000 = doble k.&lt;br /&gt;
Proof.&lt;br /&gt;
  exists 500.&lt;br /&gt;
  reflexivity.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 5.2.5.2. Demostrar que&lt;br /&gt;
      esPar 1000 = true.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Example esPar_1000&amp;#039; : esPar 1000 = true.&lt;br /&gt;
Proof.&lt;br /&gt;
  reflexivity.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 5.2.5.3. Demostrar que&lt;br /&gt;
      exists k : nat, 1000 = doble k.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Example esPar_1000&amp;#039;&amp;#039;: exists k : nat, 1000 = doble k.&lt;br /&gt;
Proof.&lt;br /&gt;
  apply esPar_bool_prop. (* esPar 1000 = true *)&lt;br /&gt;
  reflexivity.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Notas. &lt;br /&gt;
   1. En la proposicional se necesita proporcionar un testipo.&lt;br /&gt;
   2. En la booleano se calcula sin testigo.&lt;br /&gt;
   3. Se puede demostrar la proposicional usando la equivalencia con la&lt;br /&gt;
      booleana sin necesidad de testigo.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
  &lt;br /&gt;
(* =====================================================================&lt;br /&gt;
   §§ 5.3. Lógica clásica vs. constructiva  &lt;br /&gt;
   ================================================================== *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 5.3.1. Definir la proposicion&lt;br /&gt;
      tercio_excluso&lt;br /&gt;
   que afirma que  (forall P : Prop, P \/ ~ P).&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Definition tercio_excluso : Prop := forall P : Prop,&lt;br /&gt;
  P \/ ~ P.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Nota. La proposición tercio_excluso no es demostrable en Coq.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 5.3.2. Demostrar que&lt;br /&gt;
      forall (P : Prop) (b : bool),&lt;br /&gt;
        (P &amp;lt;-&amp;gt; b = true) -&amp;gt; P \/ ~ P.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Theorem tercio_exluso_restringido :&lt;br /&gt;
  forall (P : Prop) (b : bool),&lt;br /&gt;
    (P &amp;lt;-&amp;gt; b = true) -&amp;gt; P \/ ~ P.&lt;br /&gt;
Proof.&lt;br /&gt;
  intros P [] H.  &lt;br /&gt;
  -               (* P : Prop&lt;br /&gt;
                     H : P &amp;lt;-&amp;gt; true = true&lt;br /&gt;
                     ============================&lt;br /&gt;
                     P \/ ~ P *)&lt;br /&gt;
    left.         (* P *)&lt;br /&gt;
    rewrite H.    (* true = true *)&lt;br /&gt;
    reflexivity.&lt;br /&gt;
  -               (* P : Prop&lt;br /&gt;
                     H : P &amp;lt;-&amp;gt; false = true&lt;br /&gt;
                     ============================&lt;br /&gt;
                     P \/ ~ P *)&lt;br /&gt;
    right.        (* ~ P *)&lt;br /&gt;
    rewrite H.    (* false &amp;lt;&amp;gt; true *)&lt;br /&gt;
    intros H1.    (* H1 : false = true&lt;br /&gt;
                     ============================&lt;br /&gt;
                     False *)&lt;br /&gt;
    inversion H1. &lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 5.3.3. Demostrar que&lt;br /&gt;
      forall (n m : nat),&lt;br /&gt;
        n = m \/ n &amp;lt;&amp;gt; m.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Theorem tercio_exluso_restringido_eq:&lt;br /&gt;
  forall (n m : nat),&lt;br /&gt;
    n = m \/ n &amp;lt;&amp;gt; m.&lt;br /&gt;
Proof.&lt;br /&gt;
  intros n m.                      (* n, m : nat&lt;br /&gt;
                                      ============================&lt;br /&gt;
                                      n = m \/ n &amp;lt;&amp;gt; m *)&lt;br /&gt;
  apply (tercio_exluso_restringido &lt;br /&gt;
           (n = m)&lt;br /&gt;
           (iguales_nat n m)).     (* n = m &amp;lt;-&amp;gt; iguales_nat n m = true *)&lt;br /&gt;
  symmetry.                        (* iguales_nat n m = true &amp;lt;-&amp;gt; n = m *)&lt;br /&gt;
  apply iguales_nat_bool_prop.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Notas.&lt;br /&gt;
   1. En Coq no se puede demostrar el principio del tercio exluso.&lt;br /&gt;
   2. Las demostraciones de las fórmulas existenciales tienen que&lt;br /&gt;
      proporcionar un testigo.&lt;br /&gt;
   2. La lógica de Coq es constructiva.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
  &lt;br /&gt;
(* =====================================================================&lt;br /&gt;
   § Bibliografía&lt;br /&gt;
   ================================================================== *)&lt;br /&gt;
&lt;br /&gt;
(*&lt;br /&gt;
 + &amp;quot;Logic in Coq&amp;quot; de Peirce et als. http://bit.ly/2nv1T9Z *)&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/RA2018/index.php?title=Tema_7:_Definiciones_inductivas_en_Coq&amp;diff=380</id>
		<title>Tema 7: Definiciones inductivas en Coq</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2018/index.php?title=Tema_7:_Definiciones_inductivas_en_Coq&amp;diff=380"/>
		<updated>2019-02-14T13:08:12Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: Protegió «Tema 7: Definiciones inductivas en Coq» ([Editar=Solo administradores] (indefinido) [Trasladar=Solo administradores] (indefinido))&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;coq&amp;quot;&amp;gt;&lt;br /&gt;
(* T7: Proposiciones definidas inductivamente *)&lt;br /&gt;
&lt;br /&gt;
Set Warnings &amp;quot;-notation-overridden,-parsing&amp;quot;.&lt;br /&gt;
Require Export T6_Logica.&lt;br /&gt;
Require Coq.omega.Omega.&lt;br /&gt;
&lt;br /&gt;
(* El contenido del tema es&lt;br /&gt;
   1. Proposiciones definidas inductivamente.&lt;br /&gt;
   2. Usando evidencias en demostraciones.&lt;br /&gt;
      1. Inversión sobre evidencias.&lt;br /&gt;
      2. Inducción sobre evidencias.&lt;br /&gt;
   3. Relaciones inductivas.&lt;br /&gt;
*)&lt;br /&gt;
&lt;br /&gt;
(* =====================================================================&lt;br /&gt;
   § 1. Proposiciones definidas inductivamente. &lt;br /&gt;
   ================================================================== *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 1.1. Definir inductivamente la proposición&lt;br /&gt;
      es_par: nat -&amp;gt; Prop&lt;br /&gt;
   tal que (es_par n) expresa que n es un número par.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Inductive es_par: nat -&amp;gt; Prop :=&lt;br /&gt;
| es_par_0  : es_par 0&lt;br /&gt;
| es_par_SS : forall n : nat, es_par n -&amp;gt; es_par (S (S n)).&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 1.2. Demostrar que&lt;br /&gt;
      es_par 4.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
(* 1ª demostración *)&lt;br /&gt;
Theorem es_par_4: es_par 4.&lt;br /&gt;
Proof.&lt;br /&gt;
  apply es_par_SS. (* es_par 2 *)&lt;br /&gt;
  apply es_par_SS. (* es_par 0 *)&lt;br /&gt;
  apply es_par_0.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* 2ª demostración *)&lt;br /&gt;
Theorem es_par_4&amp;#039;: es_par 4.&lt;br /&gt;
Proof.&lt;br /&gt;
  apply (es_par_SS 2 (es_par_SS 0 es_par_0)).&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* Nota *)&lt;br /&gt;
Check es_par_0.                             (* es_par 0 *)&lt;br /&gt;
Check es_par_SS.                            (* forall n : nat, &lt;br /&gt;
                                                es_par n -&amp;gt; es_par (S (S n)) *)&lt;br /&gt;
Check (es_par_SS 0).                        (* es_par 0 -&amp;gt; es_par 2 *)&lt;br /&gt;
Check (es_par_SS 0 es_par_0).               (* es_par 2 *)&lt;br /&gt;
Check (es_par_SS 2).                        (* es_par 2 -&amp;gt; es_par 4 *)&lt;br /&gt;
Check (es_par_SS 2 (es_par_SS 0 es_par_0)). (* es_par 4 *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 1.3. Demostrar que&lt;br /&gt;
      forall n : nat, es_par n -&amp;gt; es_par (4 + n).&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Theorem es_par_suma4:&lt;br /&gt;
  forall n : nat, es_par n -&amp;gt; es_par (4 + n).&lt;br /&gt;
Proof.&lt;br /&gt;
  intros n.        (* n : nat&lt;br /&gt;
                      ============================&lt;br /&gt;
                      es_par n -&amp;gt; es_par (4 + n) *)&lt;br /&gt;
  simpl.           (* es_par n -&amp;gt; es_par (S (S (S (S n)))) *)&lt;br /&gt;
  intros Hn.       (* Hn : es_par n&lt;br /&gt;
                      ============================&lt;br /&gt;
                      es_par (S (S (S (S n)))) *)&lt;br /&gt;
  apply es_par_SS. (* es_par (S (S n)) *)&lt;br /&gt;
  apply es_par_SS. (* es_par n *)&lt;br /&gt;
  apply Hn.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* =====================================================================&lt;br /&gt;
   § 2. Usando evidencias en demostraciones &lt;br /&gt;
   ================================================================== *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Nota. Programación y demostración en Coq son dos lados de la misma&lt;br /&gt;
   moneda. En programación se procesan datos y en demostración se&lt;br /&gt;
   procesan evidencias.  &lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
(* =====================================================================&lt;br /&gt;
   §§ 2.1. Inversión sobre evidencias&lt;br /&gt;
   ================================================================== *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 2.1.1. Demostrar que&lt;br /&gt;
      forall n : nat,&lt;br /&gt;
        es_par n -&amp;gt; es_par (pred (pred n)).&lt;br /&gt;
      ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
(* 1ª demostración *)&lt;br /&gt;
Theorem es_par_menos_2:&lt;br /&gt;
  forall n : nat,&lt;br /&gt;
    es_par n -&amp;gt; es_par (pred (pred n)).&lt;br /&gt;
Proof.&lt;br /&gt;
  intros n E.               (* n : nat&lt;br /&gt;
                               E : es_par n&lt;br /&gt;
                               ============================&lt;br /&gt;
                               es_par (Nat.pred (Nat.pred n)) *)&lt;br /&gt;
  inversion E as [| n&amp;#039; E&amp;#039;]. &lt;br /&gt;
  -                         (* H : 0 = n&lt;br /&gt;
                               ============================&lt;br /&gt;
                               es_par (Nat.pred (Nat.pred 0)) *)&lt;br /&gt;
    simpl.                  (* es_par 0 *)&lt;br /&gt;
    apply es_par_0.&lt;br /&gt;
  -                         (* n&amp;#039; : nat&lt;br /&gt;
                               E&amp;#039; : es_par n&amp;#039;&lt;br /&gt;
                               H : S (S n&amp;#039;) = n&lt;br /&gt;
                               ============================&lt;br /&gt;
                               es_par (Nat.pred (Nat.pred (S (S n&amp;#039;)))) *)&lt;br /&gt;
    simpl.                  (* es_par n&amp;#039; *)&lt;br /&gt;
    apply E&amp;#039;.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Nota. La táctica (inversion E), donde E es la etiqueta de una&lt;br /&gt;
   proposición P definida inductivamente, genera para cada uno de los&lt;br /&gt;
   constructores de P las condiciones bajo las que se puede usar el&lt;br /&gt;
   constructor para demostrar P.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
(* 2ª demostración *)&lt;br /&gt;
Theorem es_par_menos_2&amp;#039;:&lt;br /&gt;
  forall n : nat,&lt;br /&gt;
    es_par n -&amp;gt; es_par (pred (pred n)).&lt;br /&gt;
Proof.&lt;br /&gt;
  intros n E.              (* n : nat&lt;br /&gt;
                              E : es_par n&lt;br /&gt;
                              ============================&lt;br /&gt;
                              es_par (Nat.pred (Nat.pred n)) *)&lt;br /&gt;
  destruct E as [| n&amp;#039; E&amp;#039;]. &lt;br /&gt;
  -                        (* es_par (Nat.pred (Nat.pred 0)) *)&lt;br /&gt;
    simpl.                 (* es_par 0 *)&lt;br /&gt;
    apply es_par_0.&lt;br /&gt;
  -                        (* E&amp;#039; : es_par n&amp;#039;&lt;br /&gt;
                              ============================&lt;br /&gt;
                              es_par (Nat.pred (Nat.pred (S (S n&amp;#039;)))) *)&lt;br /&gt;
    simpl.                 (* es_par n&amp;#039; *)&lt;br /&gt;
    apply E&amp;#039;.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Nota. Uso de destruct sobre evidencia con (destruct E as [| n&amp;#039; E&amp;#039;]).&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 2.1.2. Demostrar que&lt;br /&gt;
      forall n : nat,&lt;br /&gt;
       es_par (S (S n)) -&amp;gt; es_par n.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
(* 1º intento *)&lt;br /&gt;
Theorem es_parSS_es_par:&lt;br /&gt;
  forall n : nat,&lt;br /&gt;
    es_par (S (S n)) -&amp;gt; es_par n.&lt;br /&gt;
Proof.&lt;br /&gt;
  intros n E.              (* n : nat&lt;br /&gt;
                              E : es_par (S (S n))&lt;br /&gt;
                              ============================&lt;br /&gt;
                              es_par n *)&lt;br /&gt;
  destruct E as [| n&amp;#039; E&amp;#039;]. &lt;br /&gt;
  -                        (* n : nat&lt;br /&gt;
                              ============================&lt;br /&gt;
                              es_par n *)&lt;br /&gt;
Abort.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Nota. Mal funcionamiento de destruct sobre evidencias de términos&lt;br /&gt;
   compuestos. &lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
(* 2º intento *)&lt;br /&gt;
Theorem es_parSS_es_par:&lt;br /&gt;
  forall n : nat,&lt;br /&gt;
    es_par (S (S n)) -&amp;gt; es_par n.&lt;br /&gt;
Proof.&lt;br /&gt;
  intros n E.               (* n : nat&lt;br /&gt;
                               E : es_par (S (S n))&lt;br /&gt;
                               ============================&lt;br /&gt;
                               es_par n *)&lt;br /&gt;
  inversion E as [| n&amp;#039; E&amp;#039;]. (* n&amp;#039; : nat&lt;br /&gt;
                               E&amp;#039; : es_par n&lt;br /&gt;
                               H : n&amp;#039; = n&lt;br /&gt;
                               ============================&lt;br /&gt;
                               es_par n *)&lt;br /&gt;
  apply E&amp;#039;.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 2.1.3. Demostrar que&lt;br /&gt;
      ~ es_par 1.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Theorem uno_no_es_par:&lt;br /&gt;
  ~ es_par 1.&lt;br /&gt;
Proof.&lt;br /&gt;
  intros H.    (* H : es_par 1&lt;br /&gt;
                  ============================&lt;br /&gt;
                  False *)&lt;br /&gt;
  inversion H. &lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Nota. Uso de inversión sobre evidencia para contradicción.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
(* =====================================================================&lt;br /&gt;
   §§ 2.2. Inducción sobre evidencias  &lt;br /&gt;
   ================================================================== *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 2.2.1. Demostrar que&lt;br /&gt;
      forall n : nat,&lt;br /&gt;
        es_par n -&amp;gt; exists k, n = doble k.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
(* 1º intento*)&lt;br /&gt;
Lemma es_par_par_1:&lt;br /&gt;
  forall n : nat,&lt;br /&gt;
    es_par n -&amp;gt; exists k, n = doble k.&lt;br /&gt;
Proof.&lt;br /&gt;
  intros n E.               (* n : nat&lt;br /&gt;
                               E : es_par n&lt;br /&gt;
                               ============================&lt;br /&gt;
                               exists k : nat, n = doble k *)&lt;br /&gt;
  inversion E as [| n&amp;#039; E&amp;#039;]. &lt;br /&gt;
  -                         (* H : 0 = n&lt;br /&gt;
                               ============================&lt;br /&gt;
                               exists k : nat, 0 = doble k *)&lt;br /&gt;
    exists 0.                    (* 0 = doble 0 *)&lt;br /&gt;
    reflexivity.&lt;br /&gt;
  -                         (* n&amp;#039; : nat&lt;br /&gt;
                               E&amp;#039; : es_par n&amp;#039;&lt;br /&gt;
                               H : S (S n&amp;#039;) = n&lt;br /&gt;
                               ============================&lt;br /&gt;
                               exists k : nat, S (S n&amp;#039;) = doble k *)&lt;br /&gt;
    simpl.                  (* exists k : nat, S (S n&amp;#039;) = doble k *)&lt;br /&gt;
    assert (I : (exists k&amp;#039;, n&amp;#039; = doble k&amp;#039;) -&amp;gt;&lt;br /&gt;
                (exists k, S (S n&amp;#039;) = doble k)).&lt;br /&gt;
    +                       (* (exists k&amp;#039; : nat, n&amp;#039; = doble k&amp;#039;) -&amp;gt; &lt;br /&gt;
                               exists k : nat, S (S n&amp;#039;) = doble k *)&lt;br /&gt;
      intros [k&amp;#039; Hk&amp;#039;].      (* k&amp;#039; : nat&lt;br /&gt;
                               Hk&amp;#039; : n&amp;#039; = doble k&amp;#039;&lt;br /&gt;
                               ============================&lt;br /&gt;
                               exists k : nat, S (S n&amp;#039;) = doble k *)&lt;br /&gt;
      rewrite Hk&amp;#039;.          (* exists k : nat, S (S (doble k&amp;#039;)) = doble k *)&lt;br /&gt;
      exists (S k&amp;#039;).             (* S (S (doble k&amp;#039;)) = doble (S k&amp;#039;) *)&lt;br /&gt;
      reflexivity.&lt;br /&gt;
    +                       (* I : (exists k&amp;#039; : nat, n&amp;#039; = doble k&amp;#039;) -&amp;gt; &lt;br /&gt;
                                   exists k : nat, S (S n&amp;#039;) = doble k&lt;br /&gt;
                               ============================&lt;br /&gt;
                               exists k : nat, S (S n&amp;#039;) = doble k *)&lt;br /&gt;
      apply I.              (* exists k&amp;#039; : nat, n&amp;#039; = doble k&amp;#039; *)&lt;br /&gt;
Abort.&lt;br /&gt;
&lt;br /&gt;
(* 2º intento *)&lt;br /&gt;
Lemma es_par_par:&lt;br /&gt;
  forall n : nat,&lt;br /&gt;
    es_par n -&amp;gt; exists k, n = doble k.&lt;br /&gt;
Proof.&lt;br /&gt;
  intros n E.                 (* n : nat&lt;br /&gt;
                                 E : es_par n&lt;br /&gt;
                                 ============================&lt;br /&gt;
                                 exists k : nat, n = doble k *)&lt;br /&gt;
  induction E as [|n&amp;#039; E&amp;#039; HI]. &lt;br /&gt;
  -                           (* exists k : nat, 0 = doble k *)&lt;br /&gt;
    exists 0.                      (* 0 = doble 0 *)&lt;br /&gt;
    reflexivity.&lt;br /&gt;
  -                           (* n&amp;#039; : nat&lt;br /&gt;
                                 E&amp;#039; : es_par n&amp;#039;&lt;br /&gt;
                                 HI : exists k : nat, n&amp;#039; = doble k&lt;br /&gt;
                                 ============================&lt;br /&gt;
                                 exists k : nat, S (S n&amp;#039;) = doble k *)&lt;br /&gt;
    destruct HI as [k&amp;#039; Hk&amp;#039;].  (* k&amp;#039; : nat&lt;br /&gt;
                                 Hk&amp;#039; : n&amp;#039; = doble k&amp;#039;&lt;br /&gt;
                                 ============================&lt;br /&gt;
                                 exists k : nat, S (S n&amp;#039;) = doble k *)&lt;br /&gt;
    rewrite Hk&amp;#039;.              (* exists k : nat, S (S (doble k&amp;#039;)) = doble k *)&lt;br /&gt;
    exists (S k&amp;#039;).                 (* S (S (doble k&amp;#039;)) = doble (S k&amp;#039;) *)&lt;br /&gt;
    reflexivity.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 2.2.2. Demostrar que&lt;br /&gt;
      forall n : nat,&lt;br /&gt;
        es_par n &amp;lt;-&amp;gt; exists k, n = doble k.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Lemma es_par_doble:&lt;br /&gt;
  forall n : nat, es_par (doble n).&lt;br /&gt;
Proof.&lt;br /&gt;
  induction n as [|n&amp;#039; HI]. &lt;br /&gt;
  -                        (* es_par (doble 0) *)&lt;br /&gt;
    simpl.                 (* es_par 0 *)&lt;br /&gt;
    apply es_par_0.&lt;br /&gt;
  -                        (* n&amp;#039; : nat&lt;br /&gt;
                              HI : es_par (doble n&amp;#039;)&lt;br /&gt;
                              ============================&lt;br /&gt;
                              es_par (doble (S n&amp;#039;)) *)&lt;br /&gt;
    simpl.                 (* es_par (S (S (doble n&amp;#039;))) *)&lt;br /&gt;
    apply es_par_SS.       (* es_par (doble n&amp;#039;) *)&lt;br /&gt;
    apply HI.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
Theorem es_par_par_syss:&lt;br /&gt;
  forall n : nat,&lt;br /&gt;
    es_par n &amp;lt;-&amp;gt; exists k, n = doble k.&lt;br /&gt;
Proof.&lt;br /&gt;
  intros n.             (* n : nat&lt;br /&gt;
                           ============================&lt;br /&gt;
                           es_par n &amp;lt;-&amp;gt; (exists k : nat, n = doble k) *)&lt;br /&gt;
  split.&lt;br /&gt;
  -                     (* es_par n -&amp;gt; exists k : nat, n = doble k *)&lt;br /&gt;
    apply es_par_par.&lt;br /&gt;
  -                     (* (exists k : nat, n = doble k) -&amp;gt; es_par n *)&lt;br /&gt;
    intros [k Hk].      (* n, k : nat&lt;br /&gt;
                           Hk : n = doble k&lt;br /&gt;
                           ============================&lt;br /&gt;
                           es_par n *)&lt;br /&gt;
    rewrite Hk.         (* es_par (doble k) *)&lt;br /&gt;
    apply es_par_doble. &lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* =====================================================================&lt;br /&gt;
   § 3. Relaciones inductivas&lt;br /&gt;
   ================================================================== *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Notas.&lt;br /&gt;
   1. Las proposiciones con un argumento definen conjuntos; por ejemplo,&lt;br /&gt;
      es_par define el conjunto de los números pares.&lt;br /&gt;
   2. Las proposiciones con dos argumento definen relaciones.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Nota. Creamos el módulo para redefinir la relación menor o igual&lt;br /&gt;
   (definida por le) como menOig. &lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Module RelInd. &lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 3.1. Definir inductivamente la relación&lt;br /&gt;
      menOig: nat -&amp;gt; nat -&amp;gt; Prop&lt;br /&gt;
   tal que (menOig n m) expresa que n es menor o igual que m.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
  &lt;br /&gt;
Inductive menOig: nat -&amp;gt; nat -&amp;gt; Prop :=&lt;br /&gt;
  | menOig_n : forall n, menOig n n&lt;br /&gt;
  | menOig_S : forall n m, (menOig n m) -&amp;gt; (menOig n (S m)).&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 3.2. Definir (m &amp;lt;= n) como abreviatura de (menOig m n).&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Notation &amp;quot;m &amp;lt;= n&amp;quot; := (menOig m n).&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Nota. Sobre la relaciones (p.e. &amp;lt;=) se pueden usar las mismas&lt;br /&gt;
   tácticas que sobre las propiedades (p.e. es_par).&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 3.3. Demostrar que&lt;br /&gt;
      3 &amp;lt;= 3.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Theorem prop_menOig1:&lt;br /&gt;
  3 &amp;lt;= 3.&lt;br /&gt;
Proof.&lt;br /&gt;
  apply menOig_n.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 3.4. Demostrar que&lt;br /&gt;
      3 &amp;lt;= 6.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Theorem prop_menOig2 :&lt;br /&gt;
  3 &amp;lt;= 6.&lt;br /&gt;
Proof.&lt;br /&gt;
  apply menOig_S. (* 3 &amp;lt;= 5 *)&lt;br /&gt;
  apply menOig_S. (* 3 &amp;lt;= 4 *)&lt;br /&gt;
  apply menOig_S. (* 3 &amp;lt;= 3 *)&lt;br /&gt;
  apply menOig_n.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 3.5. Demostrar que&lt;br /&gt;
      (2 &amp;lt;= 1) -&amp;gt; 2 + 2 = 5.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Theorem prop_menOig3 :&lt;br /&gt;
  (2 &amp;lt;= 1) -&amp;gt; 2 + 2 = 5.&lt;br /&gt;
Proof.&lt;br /&gt;
  intros H.       (* H : 2 &amp;lt;= 1&lt;br /&gt;
                     ============================&lt;br /&gt;
                     2 + 2 = 5 *)&lt;br /&gt;
  inversion H.    (* n, m : nat&lt;br /&gt;
                     H2 : 2 &amp;lt;= 0&lt;br /&gt;
                     H1 : n = 2&lt;br /&gt;
                     H0 : m = 0&lt;br /&gt;
                     ============================&lt;br /&gt;
                     2 + 2 = 5 *)&lt;br /&gt;
  inversion H2. &lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
End RelInd.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Nota. En lo que sigue, usaremos la predefiida le en lugar de menOig.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 3.6. Definir la relación&lt;br /&gt;
      mayor : nat -&amp;gt; nat -&amp;gt; Prop&lt;br /&gt;
   tal que (menor m n) expresa que m es menor que n.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Definition menor (n m : nat) := le (S n) m.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 3.7. Definir la abreviatura (m &amp;lt; n) para (menor m n).&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Notation &amp;quot;m &amp;lt; n&amp;quot; := (menor m n).&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 3.8. Definir inductivamente la relación&lt;br /&gt;
      cuadrado_de: nat -&amp;gt; nat -&amp;gt; Prop :=&lt;br /&gt;
   tal que (cuadrado x y) expresa que y es el cuadrado de x.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Inductive cuadrado_de: nat -&amp;gt; nat -&amp;gt; Prop :=&lt;br /&gt;
  | cuad : forall n : nat, cuadrado_de n (n * n).&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 3.9. Definir inductivamente la relación&lt;br /&gt;
      siguiente_nat : nat -&amp;gt; nat -&amp;gt; Prop&lt;br /&gt;
   tal que (siguiente_nat x y) expresa que y es el siguiente de x.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Inductive siguiente_nat : nat -&amp;gt; nat -&amp;gt; Prop :=&lt;br /&gt;
  | sn : forall n : nat, siguiente_nat n (S n).&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 3.9. Definir inductivamente la relación&lt;br /&gt;
      siguiente_par : nat -&amp;gt; nat -&amp;gt; Prop :=&lt;br /&gt;
   tal que (siguiente_par x y) expresa que y es el siguiente  número par&lt;br /&gt;
   de x. &lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Inductive siguiente_par : nat -&amp;gt; nat -&amp;gt; Prop :=&lt;br /&gt;
  | sp_1 : forall n, es_par (S n) -&amp;gt; siguiente_par n (S n)&lt;br /&gt;
  | sp_2 : forall n, es_par (S (S n)) -&amp;gt; siguiente_par n (S (S n)).&lt;br /&gt;
&lt;br /&gt;
(* =====================================================================&lt;br /&gt;
   § Bibliografía&lt;br /&gt;
   =====================================================================&lt;br /&gt;
&lt;br /&gt;
+ &amp;quot;Inductively defined propositions&amp;quot; de Peirce et als. &lt;br /&gt;
  http://bit.ly/2Lejw7s *)&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/RA2018/index.php?title=Tema_7:_Definiciones_inductivas_en_Coq&amp;diff=379</id>
		<title>Tema 7: Definiciones inductivas en Coq</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2018/index.php?title=Tema_7:_Definiciones_inductivas_en_Coq&amp;diff=379"/>
		<updated>2019-02-14T13:08:00Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: Página creada con «&amp;lt;source lang=&amp;quot;coq&amp;quot;&amp;gt; (* T7: Proposiciones definidas inductivamente *)  Set Warnings &amp;quot;-notation-overridden,-parsing&amp;quot;. Require Export T6_Logica. Require Coq.omega.Omega.  (* E…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;coq&amp;quot;&amp;gt;&lt;br /&gt;
(* T7: Proposiciones definidas inductivamente *)&lt;br /&gt;
&lt;br /&gt;
Set Warnings &amp;quot;-notation-overridden,-parsing&amp;quot;.&lt;br /&gt;
Require Export T6_Logica.&lt;br /&gt;
Require Coq.omega.Omega.&lt;br /&gt;
&lt;br /&gt;
(* El contenido del tema es&lt;br /&gt;
   1. Proposiciones definidas inductivamente.&lt;br /&gt;
   2. Usando evidencias en demostraciones.&lt;br /&gt;
      1. Inversión sobre evidencias.&lt;br /&gt;
      2. Inducción sobre evidencias.&lt;br /&gt;
   3. Relaciones inductivas.&lt;br /&gt;
*)&lt;br /&gt;
&lt;br /&gt;
(* =====================================================================&lt;br /&gt;
   § 1. Proposiciones definidas inductivamente. &lt;br /&gt;
   ================================================================== *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 1.1. Definir inductivamente la proposición&lt;br /&gt;
      es_par: nat -&amp;gt; Prop&lt;br /&gt;
   tal que (es_par n) expresa que n es un número par.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Inductive es_par: nat -&amp;gt; Prop :=&lt;br /&gt;
| es_par_0  : es_par 0&lt;br /&gt;
| es_par_SS : forall n : nat, es_par n -&amp;gt; es_par (S (S n)).&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 1.2. Demostrar que&lt;br /&gt;
      es_par 4.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
(* 1ª demostración *)&lt;br /&gt;
Theorem es_par_4: es_par 4.&lt;br /&gt;
Proof.&lt;br /&gt;
  apply es_par_SS. (* es_par 2 *)&lt;br /&gt;
  apply es_par_SS. (* es_par 0 *)&lt;br /&gt;
  apply es_par_0.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* 2ª demostración *)&lt;br /&gt;
Theorem es_par_4&amp;#039;: es_par 4.&lt;br /&gt;
Proof.&lt;br /&gt;
  apply (es_par_SS 2 (es_par_SS 0 es_par_0)).&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* Nota *)&lt;br /&gt;
Check es_par_0.                             (* es_par 0 *)&lt;br /&gt;
Check es_par_SS.                            (* forall n : nat, &lt;br /&gt;
                                                es_par n -&amp;gt; es_par (S (S n)) *)&lt;br /&gt;
Check (es_par_SS 0).                        (* es_par 0 -&amp;gt; es_par 2 *)&lt;br /&gt;
Check (es_par_SS 0 es_par_0).               (* es_par 2 *)&lt;br /&gt;
Check (es_par_SS 2).                        (* es_par 2 -&amp;gt; es_par 4 *)&lt;br /&gt;
Check (es_par_SS 2 (es_par_SS 0 es_par_0)). (* es_par 4 *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 1.3. Demostrar que&lt;br /&gt;
      forall n : nat, es_par n -&amp;gt; es_par (4 + n).&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Theorem es_par_suma4:&lt;br /&gt;
  forall n : nat, es_par n -&amp;gt; es_par (4 + n).&lt;br /&gt;
Proof.&lt;br /&gt;
  intros n.        (* n : nat&lt;br /&gt;
                      ============================&lt;br /&gt;
                      es_par n -&amp;gt; es_par (4 + n) *)&lt;br /&gt;
  simpl.           (* es_par n -&amp;gt; es_par (S (S (S (S n)))) *)&lt;br /&gt;
  intros Hn.       (* Hn : es_par n&lt;br /&gt;
                      ============================&lt;br /&gt;
                      es_par (S (S (S (S n)))) *)&lt;br /&gt;
  apply es_par_SS. (* es_par (S (S n)) *)&lt;br /&gt;
  apply es_par_SS. (* es_par n *)&lt;br /&gt;
  apply Hn.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* =====================================================================&lt;br /&gt;
   § 2. Usando evidencias en demostraciones &lt;br /&gt;
   ================================================================== *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Nota. Programación y demostración en Coq son dos lados de la misma&lt;br /&gt;
   moneda. En programación se procesan datos y en demostración se&lt;br /&gt;
   procesan evidencias.  &lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
(* =====================================================================&lt;br /&gt;
   §§ 2.1. Inversión sobre evidencias&lt;br /&gt;
   ================================================================== *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 2.1.1. Demostrar que&lt;br /&gt;
      forall n : nat,&lt;br /&gt;
        es_par n -&amp;gt; es_par (pred (pred n)).&lt;br /&gt;
      ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
(* 1ª demostración *)&lt;br /&gt;
Theorem es_par_menos_2:&lt;br /&gt;
  forall n : nat,&lt;br /&gt;
    es_par n -&amp;gt; es_par (pred (pred n)).&lt;br /&gt;
Proof.&lt;br /&gt;
  intros n E.               (* n : nat&lt;br /&gt;
                               E : es_par n&lt;br /&gt;
                               ============================&lt;br /&gt;
                               es_par (Nat.pred (Nat.pred n)) *)&lt;br /&gt;
  inversion E as [| n&amp;#039; E&amp;#039;]. &lt;br /&gt;
  -                         (* H : 0 = n&lt;br /&gt;
                               ============================&lt;br /&gt;
                               es_par (Nat.pred (Nat.pred 0)) *)&lt;br /&gt;
    simpl.                  (* es_par 0 *)&lt;br /&gt;
    apply es_par_0.&lt;br /&gt;
  -                         (* n&amp;#039; : nat&lt;br /&gt;
                               E&amp;#039; : es_par n&amp;#039;&lt;br /&gt;
                               H : S (S n&amp;#039;) = n&lt;br /&gt;
                               ============================&lt;br /&gt;
                               es_par (Nat.pred (Nat.pred (S (S n&amp;#039;)))) *)&lt;br /&gt;
    simpl.                  (* es_par n&amp;#039; *)&lt;br /&gt;
    apply E&amp;#039;.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Nota. La táctica (inversion E), donde E es la etiqueta de una&lt;br /&gt;
   proposición P definida inductivamente, genera para cada uno de los&lt;br /&gt;
   constructores de P las condiciones bajo las que se puede usar el&lt;br /&gt;
   constructor para demostrar P.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
(* 2ª demostración *)&lt;br /&gt;
Theorem es_par_menos_2&amp;#039;:&lt;br /&gt;
  forall n : nat,&lt;br /&gt;
    es_par n -&amp;gt; es_par (pred (pred n)).&lt;br /&gt;
Proof.&lt;br /&gt;
  intros n E.              (* n : nat&lt;br /&gt;
                              E : es_par n&lt;br /&gt;
                              ============================&lt;br /&gt;
                              es_par (Nat.pred (Nat.pred n)) *)&lt;br /&gt;
  destruct E as [| n&amp;#039; E&amp;#039;]. &lt;br /&gt;
  -                        (* es_par (Nat.pred (Nat.pred 0)) *)&lt;br /&gt;
    simpl.                 (* es_par 0 *)&lt;br /&gt;
    apply es_par_0.&lt;br /&gt;
  -                        (* E&amp;#039; : es_par n&amp;#039;&lt;br /&gt;
                              ============================&lt;br /&gt;
                              es_par (Nat.pred (Nat.pred (S (S n&amp;#039;)))) *)&lt;br /&gt;
    simpl.                 (* es_par n&amp;#039; *)&lt;br /&gt;
    apply E&amp;#039;.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Nota. Uso de destruct sobre evidencia con (destruct E as [| n&amp;#039; E&amp;#039;]).&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 2.1.2. Demostrar que&lt;br /&gt;
      forall n : nat,&lt;br /&gt;
       es_par (S (S n)) -&amp;gt; es_par n.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
(* 1º intento *)&lt;br /&gt;
Theorem es_parSS_es_par:&lt;br /&gt;
  forall n : nat,&lt;br /&gt;
    es_par (S (S n)) -&amp;gt; es_par n.&lt;br /&gt;
Proof.&lt;br /&gt;
  intros n E.              (* n : nat&lt;br /&gt;
                              E : es_par (S (S n))&lt;br /&gt;
                              ============================&lt;br /&gt;
                              es_par n *)&lt;br /&gt;
  destruct E as [| n&amp;#039; E&amp;#039;]. &lt;br /&gt;
  -                        (* n : nat&lt;br /&gt;
                              ============================&lt;br /&gt;
                              es_par n *)&lt;br /&gt;
Abort.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Nota. Mal funcionamiento de destruct sobre evidencias de términos&lt;br /&gt;
   compuestos. &lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
(* 2º intento *)&lt;br /&gt;
Theorem es_parSS_es_par:&lt;br /&gt;
  forall n : nat,&lt;br /&gt;
    es_par (S (S n)) -&amp;gt; es_par n.&lt;br /&gt;
Proof.&lt;br /&gt;
  intros n E.               (* n : nat&lt;br /&gt;
                               E : es_par (S (S n))&lt;br /&gt;
                               ============================&lt;br /&gt;
                               es_par n *)&lt;br /&gt;
  inversion E as [| n&amp;#039; E&amp;#039;]. (* n&amp;#039; : nat&lt;br /&gt;
                               E&amp;#039; : es_par n&lt;br /&gt;
                               H : n&amp;#039; = n&lt;br /&gt;
                               ============================&lt;br /&gt;
                               es_par n *)&lt;br /&gt;
  apply E&amp;#039;.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 2.1.3. Demostrar que&lt;br /&gt;
      ~ es_par 1.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Theorem uno_no_es_par:&lt;br /&gt;
  ~ es_par 1.&lt;br /&gt;
Proof.&lt;br /&gt;
  intros H.    (* H : es_par 1&lt;br /&gt;
                  ============================&lt;br /&gt;
                  False *)&lt;br /&gt;
  inversion H. &lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Nota. Uso de inversión sobre evidencia para contradicción.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
(* =====================================================================&lt;br /&gt;
   §§ 2.2. Inducción sobre evidencias  &lt;br /&gt;
   ================================================================== *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 2.2.1. Demostrar que&lt;br /&gt;
      forall n : nat,&lt;br /&gt;
        es_par n -&amp;gt; exists k, n = doble k.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
(* 1º intento*)&lt;br /&gt;
Lemma es_par_par_1:&lt;br /&gt;
  forall n : nat,&lt;br /&gt;
    es_par n -&amp;gt; exists k, n = doble k.&lt;br /&gt;
Proof.&lt;br /&gt;
  intros n E.               (* n : nat&lt;br /&gt;
                               E : es_par n&lt;br /&gt;
                               ============================&lt;br /&gt;
                               exists k : nat, n = doble k *)&lt;br /&gt;
  inversion E as [| n&amp;#039; E&amp;#039;]. &lt;br /&gt;
  -                         (* H : 0 = n&lt;br /&gt;
                               ============================&lt;br /&gt;
                               exists k : nat, 0 = doble k *)&lt;br /&gt;
    exists 0.                    (* 0 = doble 0 *)&lt;br /&gt;
    reflexivity.&lt;br /&gt;
  -                         (* n&amp;#039; : nat&lt;br /&gt;
                               E&amp;#039; : es_par n&amp;#039;&lt;br /&gt;
                               H : S (S n&amp;#039;) = n&lt;br /&gt;
                               ============================&lt;br /&gt;
                               exists k : nat, S (S n&amp;#039;) = doble k *)&lt;br /&gt;
    simpl.                  (* exists k : nat, S (S n&amp;#039;) = doble k *)&lt;br /&gt;
    assert (I : (exists k&amp;#039;, n&amp;#039; = doble k&amp;#039;) -&amp;gt;&lt;br /&gt;
                (exists k, S (S n&amp;#039;) = doble k)).&lt;br /&gt;
    +                       (* (exists k&amp;#039; : nat, n&amp;#039; = doble k&amp;#039;) -&amp;gt; &lt;br /&gt;
                               exists k : nat, S (S n&amp;#039;) = doble k *)&lt;br /&gt;
      intros [k&amp;#039; Hk&amp;#039;].      (* k&amp;#039; : nat&lt;br /&gt;
                               Hk&amp;#039; : n&amp;#039; = doble k&amp;#039;&lt;br /&gt;
                               ============================&lt;br /&gt;
                               exists k : nat, S (S n&amp;#039;) = doble k *)&lt;br /&gt;
      rewrite Hk&amp;#039;.          (* exists k : nat, S (S (doble k&amp;#039;)) = doble k *)&lt;br /&gt;
      exists (S k&amp;#039;).             (* S (S (doble k&amp;#039;)) = doble (S k&amp;#039;) *)&lt;br /&gt;
      reflexivity.&lt;br /&gt;
    +                       (* I : (exists k&amp;#039; : nat, n&amp;#039; = doble k&amp;#039;) -&amp;gt; &lt;br /&gt;
                                   exists k : nat, S (S n&amp;#039;) = doble k&lt;br /&gt;
                               ============================&lt;br /&gt;
                               exists k : nat, S (S n&amp;#039;) = doble k *)&lt;br /&gt;
      apply I.              (* exists k&amp;#039; : nat, n&amp;#039; = doble k&amp;#039; *)&lt;br /&gt;
Abort.&lt;br /&gt;
&lt;br /&gt;
(* 2º intento *)&lt;br /&gt;
Lemma es_par_par:&lt;br /&gt;
  forall n : nat,&lt;br /&gt;
    es_par n -&amp;gt; exists k, n = doble k.&lt;br /&gt;
Proof.&lt;br /&gt;
  intros n E.                 (* n : nat&lt;br /&gt;
                                 E : es_par n&lt;br /&gt;
                                 ============================&lt;br /&gt;
                                 exists k : nat, n = doble k *)&lt;br /&gt;
  induction E as [|n&amp;#039; E&amp;#039; HI]. &lt;br /&gt;
  -                           (* exists k : nat, 0 = doble k *)&lt;br /&gt;
    exists 0.                      (* 0 = doble 0 *)&lt;br /&gt;
    reflexivity.&lt;br /&gt;
  -                           (* n&amp;#039; : nat&lt;br /&gt;
                                 E&amp;#039; : es_par n&amp;#039;&lt;br /&gt;
                                 HI : exists k : nat, n&amp;#039; = doble k&lt;br /&gt;
                                 ============================&lt;br /&gt;
                                 exists k : nat, S (S n&amp;#039;) = doble k *)&lt;br /&gt;
    destruct HI as [k&amp;#039; Hk&amp;#039;].  (* k&amp;#039; : nat&lt;br /&gt;
                                 Hk&amp;#039; : n&amp;#039; = doble k&amp;#039;&lt;br /&gt;
                                 ============================&lt;br /&gt;
                                 exists k : nat, S (S n&amp;#039;) = doble k *)&lt;br /&gt;
    rewrite Hk&amp;#039;.              (* exists k : nat, S (S (doble k&amp;#039;)) = doble k *)&lt;br /&gt;
    exists (S k&amp;#039;).                 (* S (S (doble k&amp;#039;)) = doble (S k&amp;#039;) *)&lt;br /&gt;
    reflexivity.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 2.2.2. Demostrar que&lt;br /&gt;
      forall n : nat,&lt;br /&gt;
        es_par n &amp;lt;-&amp;gt; exists k, n = doble k.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Lemma es_par_doble:&lt;br /&gt;
  forall n : nat, es_par (doble n).&lt;br /&gt;
Proof.&lt;br /&gt;
  induction n as [|n&amp;#039; HI]. &lt;br /&gt;
  -                        (* es_par (doble 0) *)&lt;br /&gt;
    simpl.                 (* es_par 0 *)&lt;br /&gt;
    apply es_par_0.&lt;br /&gt;
  -                        (* n&amp;#039; : nat&lt;br /&gt;
                              HI : es_par (doble n&amp;#039;)&lt;br /&gt;
                              ============================&lt;br /&gt;
                              es_par (doble (S n&amp;#039;)) *)&lt;br /&gt;
    simpl.                 (* es_par (S (S (doble n&amp;#039;))) *)&lt;br /&gt;
    apply es_par_SS.       (* es_par (doble n&amp;#039;) *)&lt;br /&gt;
    apply HI.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
Theorem es_par_par_syss:&lt;br /&gt;
  forall n : nat,&lt;br /&gt;
    es_par n &amp;lt;-&amp;gt; exists k, n = doble k.&lt;br /&gt;
Proof.&lt;br /&gt;
  intros n.             (* n : nat&lt;br /&gt;
                           ============================&lt;br /&gt;
                           es_par n &amp;lt;-&amp;gt; (exists k : nat, n = doble k) *)&lt;br /&gt;
  split.&lt;br /&gt;
  -                     (* es_par n -&amp;gt; exists k : nat, n = doble k *)&lt;br /&gt;
    apply es_par_par.&lt;br /&gt;
  -                     (* (exists k : nat, n = doble k) -&amp;gt; es_par n *)&lt;br /&gt;
    intros [k Hk].      (* n, k : nat&lt;br /&gt;
                           Hk : n = doble k&lt;br /&gt;
                           ============================&lt;br /&gt;
                           es_par n *)&lt;br /&gt;
    rewrite Hk.         (* es_par (doble k) *)&lt;br /&gt;
    apply es_par_doble. &lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* =====================================================================&lt;br /&gt;
   § 3. Relaciones inductivas&lt;br /&gt;
   ================================================================== *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Notas.&lt;br /&gt;
   1. Las proposiciones con un argumento definen conjuntos; por ejemplo,&lt;br /&gt;
      es_par define el conjunto de los números pares.&lt;br /&gt;
   2. Las proposiciones con dos argumento definen relaciones.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Nota. Creamos el módulo para redefinir la relación menor o igual&lt;br /&gt;
   (definida por le) como menOig. &lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Module RelInd. &lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 3.1. Definir inductivamente la relación&lt;br /&gt;
      menOig: nat -&amp;gt; nat -&amp;gt; Prop&lt;br /&gt;
   tal que (menOig n m) expresa que n es menor o igual que m.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
  &lt;br /&gt;
Inductive menOig: nat -&amp;gt; nat -&amp;gt; Prop :=&lt;br /&gt;
  | menOig_n : forall n, menOig n n&lt;br /&gt;
  | menOig_S : forall n m, (menOig n m) -&amp;gt; (menOig n (S m)).&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 3.2. Definir (m &amp;lt;= n) como abreviatura de (menOig m n).&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Notation &amp;quot;m &amp;lt;= n&amp;quot; := (menOig m n).&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Nota. Sobre la relaciones (p.e. &amp;lt;=) se pueden usar las mismas&lt;br /&gt;
   tácticas que sobre las propiedades (p.e. es_par).&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 3.3. Demostrar que&lt;br /&gt;
      3 &amp;lt;= 3.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Theorem prop_menOig1:&lt;br /&gt;
  3 &amp;lt;= 3.&lt;br /&gt;
Proof.&lt;br /&gt;
  apply menOig_n.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 3.4. Demostrar que&lt;br /&gt;
      3 &amp;lt;= 6.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Theorem prop_menOig2 :&lt;br /&gt;
  3 &amp;lt;= 6.&lt;br /&gt;
Proof.&lt;br /&gt;
  apply menOig_S. (* 3 &amp;lt;= 5 *)&lt;br /&gt;
  apply menOig_S. (* 3 &amp;lt;= 4 *)&lt;br /&gt;
  apply menOig_S. (* 3 &amp;lt;= 3 *)&lt;br /&gt;
  apply menOig_n.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 3.5. Demostrar que&lt;br /&gt;
      (2 &amp;lt;= 1) -&amp;gt; 2 + 2 = 5.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Theorem prop_menOig3 :&lt;br /&gt;
  (2 &amp;lt;= 1) -&amp;gt; 2 + 2 = 5.&lt;br /&gt;
Proof.&lt;br /&gt;
  intros H.       (* H : 2 &amp;lt;= 1&lt;br /&gt;
                     ============================&lt;br /&gt;
                     2 + 2 = 5 *)&lt;br /&gt;
  inversion H.    (* n, m : nat&lt;br /&gt;
                     H2 : 2 &amp;lt;= 0&lt;br /&gt;
                     H1 : n = 2&lt;br /&gt;
                     H0 : m = 0&lt;br /&gt;
                     ============================&lt;br /&gt;
                     2 + 2 = 5 *)&lt;br /&gt;
  inversion H2. &lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
End RelInd.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Nota. En lo que sigue, usaremos la predefiida le en lugar de menOig.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 3.6. Definir la relación&lt;br /&gt;
      mayor : nat -&amp;gt; nat -&amp;gt; Prop&lt;br /&gt;
   tal que (menor m n) expresa que m es menor que n.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Definition menor (n m : nat) := le (S n) m.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 3.7. Definir la abreviatura (m &amp;lt; n) para (menor m n).&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Notation &amp;quot;m &amp;lt; n&amp;quot; := (menor m n).&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 3.8. Definir inductivamente la relación&lt;br /&gt;
      cuadrado_de: nat -&amp;gt; nat -&amp;gt; Prop :=&lt;br /&gt;
   tal que (cuadrado x y) expresa que y es el cuadrado de x.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Inductive cuadrado_de: nat -&amp;gt; nat -&amp;gt; Prop :=&lt;br /&gt;
  | cuad : forall n : nat, cuadrado_de n (n * n).&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 3.9. Definir inductivamente la relación&lt;br /&gt;
      siguiente_nat : nat -&amp;gt; nat -&amp;gt; Prop&lt;br /&gt;
   tal que (siguiente_nat x y) expresa que y es el siguiente de x.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Inductive siguiente_nat : nat -&amp;gt; nat -&amp;gt; Prop :=&lt;br /&gt;
  | sn : forall n : nat, siguiente_nat n (S n).&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 3.9. Definir inductivamente la relación&lt;br /&gt;
      siguiente_par : nat -&amp;gt; nat -&amp;gt; Prop :=&lt;br /&gt;
   tal que (siguiente_par x y) expresa que y es el siguiente  número par&lt;br /&gt;
   de x. &lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Inductive siguiente_par : nat -&amp;gt; nat -&amp;gt; Prop :=&lt;br /&gt;
  | sp_1 : forall n, es_par (S n) -&amp;gt; siguiente_par n (S n)&lt;br /&gt;
  | sp_2 : forall n, es_par (S (S n)) -&amp;gt; siguiente_par n (S (S n)).&lt;br /&gt;
&lt;br /&gt;
(* =====================================================================&lt;br /&gt;
   § Bibliografía&lt;br /&gt;
   =====================================================================&lt;br /&gt;
&lt;br /&gt;
+ &amp;quot;Inductively defined propositions&amp;quot; de Peirce et als. &lt;br /&gt;
  http://bit.ly/2Lejw7s *)&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/RA2018/index.php?title=Temas&amp;diff=378</id>
		<title>Temas</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2018/index.php?title=Temas&amp;diff=378"/>
		<updated>2019-02-14T13:07:31Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;En esta página se irán publicando los temas conforme se vayan estudiando.&lt;br /&gt;
&lt;br /&gt;
== RA con Isabelle/HOL ==&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: Deducción natural proposicional:&lt;br /&gt;
** [http://www.cs.us.es/~jalonso/cursos/li/temas/tema-1.pdf Tema 7a: Sintaxis y semántica de la lógica proposicional].&lt;br /&gt;
** [http://www.cs.us.es/~jalonso/cursos/li/temas/tema-2.pdf Tema 7b: Deducción natural proposicional].&lt;br /&gt;
** [[Tema 7b: Deducción natural proposicional con Isabelle/HOL | Tema 7c: 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-7.pdf Tema 8a: Sintaxis y semántica de la lógica de primer orden].&lt;br /&gt;
** [http://www.cs.us.es/~jalonso/cursos/li/temas/tema-8.pdf Tema 8b: 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 | Tema 8c: Deducción natural en lógica de primer orden con Isabelle/HOL]]&lt;br /&gt;
* [[Tema 9: Editores lógicos]]. &lt;br /&gt;
* [[Tema 10: Caso de estudio: Compilación de expresiones]].&lt;br /&gt;
* [[Tema 11: Definiciones inductivas]].&lt;br /&gt;
* [[Tema 12: Conjuntos, funciones y relaciones]].&lt;br /&gt;
&lt;br /&gt;
== RA con Coq ==&lt;br /&gt;
* [[Tema 1: Programación funcional y métodos elementales de demostración en Coq]].&lt;br /&gt;
* [[Tema 2: Demostraciones por inducción sobre los números naturales en Coq]].&lt;br /&gt;
* [[Tema 3: Datos estructurados en Coq]].&lt;br /&gt;
* [[Tema 4: Polimorfismo y funciones de orden superior en Coq]].&lt;br /&gt;
* [[Tema 5: Tácticas básicas de Coq]].&lt;br /&gt;
* [[Tema 6: Lógica en Coq]].&lt;br /&gt;
* [[Tema 7: Definiciones inductivas en Coq]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&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;
* [[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/RA2018/index.php?title=Tema_6:_L%C3%B3gica_en_Coq&amp;diff=377</id>
		<title>Tema 6: Lógica en Coq</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2018/index.php?title=Tema_6:_L%C3%B3gica_en_Coq&amp;diff=377"/>
		<updated>2019-02-14T12:46:50Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: Página creada con «&amp;lt;source lang=&amp;quot;coq&amp;quot;&amp;gt; Set Warnings &amp;quot;-notation-overridden,-parsing&amp;quot;. Require Export T5_Tacticas.  (* El contenido del tema es    1. Introducción    2. Conectivas lógicas…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;coq&amp;quot;&amp;gt;&lt;br /&gt;
Set Warnings &amp;quot;-notation-overridden,-parsing&amp;quot;.&lt;br /&gt;
Require Export T5_Tacticas.&lt;br /&gt;
&lt;br /&gt;
(* El contenido del tema es&lt;br /&gt;
   1. Introducción&lt;br /&gt;
   2. Conectivas lógicas &lt;br /&gt;
      1. Conjunción &lt;br /&gt;
      2. Disyunción  &lt;br /&gt;
      3. Falsedad y negación  &lt;br /&gt;
      4. Verdad&lt;br /&gt;
      5. Equivalencia lógica&lt;br /&gt;
      6. Cuantificación existencial  &lt;br /&gt;
   3. Programación con proposiciones &lt;br /&gt;
   4. Aplicando teoremas a argumentos &lt;br /&gt;
   5. Coq vs. teoría de conjuntos &lt;br /&gt;
      1. Extensionalidad funcional&lt;br /&gt;
      2. Proposiciones y booleanos  &lt;br /&gt;
      3. Lógica clásica vs. constructiva  &lt;br /&gt;
   Bibliografía&lt;br /&gt;
 *)&lt;br /&gt;
&lt;br /&gt;
(* =====================================================================&lt;br /&gt;
   § 1. Introducción &lt;br /&gt;
   ================================================================== *)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 1.1. Calcular el tipo de las siguientes expresiones&lt;br /&gt;
      3 = 3.&lt;br /&gt;
      3 = 4.&lt;br /&gt;
      forall n m : nat, n + m = m + n.&lt;br /&gt;
      forall n : nat, n = 2.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Check 3 = 3.&lt;br /&gt;
(* ===&amp;gt; Prop *)&lt;br /&gt;
&lt;br /&gt;
Check 3 = 4.&lt;br /&gt;
(* ===&amp;gt; Prop *)&lt;br /&gt;
&lt;br /&gt;
Check forall n m : nat, n + m = m + n.&lt;br /&gt;
(* ===&amp;gt; Prop *)&lt;br /&gt;
&lt;br /&gt;
Check forall n : nat, n = 2.&lt;br /&gt;
(* ===&amp;gt; Prop *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Nota. El tipo de las fórmulas es Prop.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 1.2.3. Demostrar que 2 más dos es 4.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Theorem suma_2_y_2:&lt;br /&gt;
  2 + 2 = 4.&lt;br /&gt;
Proof. reflexivity.  Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Nota. Usa la proposición &amp;#039;2 + 2 = 4&amp;#039;.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 1.2.2. Definir la proposición &lt;br /&gt;
      prop_suma: Prop&lt;br /&gt;
   que afirma que la suma de 2 y 2 es 4. &lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Definition prop_suma: Prop := 2 + 2 = 4.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 1.2.3. Calcular el tipo de prop_suma&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Check prop_suma.&lt;br /&gt;
(* ===&amp;gt; prop_suma : Prop *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 1.2.4. Usando prop_suma, demostrar que la suma de 2 y 2 es 4.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Theorem prop_suma_es_verdadera:&lt;br /&gt;
  prop_suma.&lt;br /&gt;
Proof. reflexivity.  Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 1.3.1. Definir la proposición &lt;br /&gt;
      es_tres (n : nat) : Prop&lt;br /&gt;
   tal que (es_tres n) se verifica si n es el número 3.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Definition es_tres (n : nat) : Prop :=&lt;br /&gt;
  n = 3.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 1.3.2. Calcular el tipo de las siguientes expresiones&lt;br /&gt;
      es_tres.&lt;br /&gt;
      es_tres 3.&lt;br /&gt;
      es_tres 5.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Check es_tres.&lt;br /&gt;
(* ===&amp;gt; nat -&amp;gt; Prop *)&lt;br /&gt;
&lt;br /&gt;
Check es_tres 3.&lt;br /&gt;
(* ===&amp;gt; Prop *)&lt;br /&gt;
&lt;br /&gt;
Check es_tres 5.&lt;br /&gt;
(* ===&amp;gt; Prop *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Nota. Ejemplo de proposición parametrizada.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 1.4.1. Definir la función&lt;br /&gt;
      inyectiva {A B : Type} (f : A -&amp;gt; B) : Prop :=&lt;br /&gt;
   tal que (inyectiva f) se verifica si f es inyectiva.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Definition inyectiva {A B : Type} (f : A -&amp;gt; B) : Prop :=&lt;br /&gt;
  forall x y : A, f x = f y -&amp;gt; x = y.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 1.4.2. Demostrar que la funcion sucesor es inyectiva; es&lt;br /&gt;
   decir, &lt;br /&gt;
      inyectiva S.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Lemma suc_iny: inyectiva S.&lt;br /&gt;
Proof.&lt;br /&gt;
  intros n m H. (* n, m : nat&lt;br /&gt;
                   H : S n = S m&lt;br /&gt;
                   ============================&lt;br /&gt;
                   n = m *)&lt;br /&gt;
  inversion H.  (* n, m : nat&lt;br /&gt;
                   H : S n = S m&lt;br /&gt;
                   H1 : n = m&lt;br /&gt;
                   ============================&lt;br /&gt;
                   m = m *)&lt;br /&gt;
  reflexivity.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 1.5. Calcular los tipos de las siguientes expresiones&lt;br /&gt;
      3 = 5.&lt;br /&gt;
      eq 3 5.&lt;br /&gt;
      eq 3.&lt;br /&gt;
      @eq.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Check (3 = 5).&lt;br /&gt;
(* ===&amp;gt; Prop *)&lt;br /&gt;
&lt;br /&gt;
Check (eq 3 5).&lt;br /&gt;
(* ===&amp;gt; Prop *)&lt;br /&gt;
&lt;br /&gt;
Check (eq 3).&lt;br /&gt;
(* ===&amp;gt; nat -&amp;gt; Prop *)&lt;br /&gt;
&lt;br /&gt;
Check @eq.&lt;br /&gt;
(* ===&amp;gt; forall A : Type, A -&amp;gt; A -&amp;gt; Prop *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Notas.&lt;br /&gt;
   1. La expresión (x = y) es una abreviatura de (eq x y).&lt;br /&gt;
   2. Se escribe @eq en lugar de eq para ver los argumentos implícitos.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
(* =====================================================================&lt;br /&gt;
   § 2. Conectivas lógicas &lt;br /&gt;
   ================================================================== *)&lt;br /&gt;
&lt;br /&gt;
(* =====================================================================&lt;br /&gt;
   §§ 2.1. Conjunción &lt;br /&gt;
   ================================================================== *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 2.1.1. Demostrar que&lt;br /&gt;
      3 + 4 = 7 /\ 2 * 2 = 4.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Example ej_conjuncion: 3 + 4 = 7 /\ 2 * 2 = 4.&lt;br /&gt;
Proof.&lt;br /&gt;
  split.         &lt;br /&gt;
  -              (* &lt;br /&gt;
                    ============================&lt;br /&gt;
                    3 + 4 = 7 *)&lt;br /&gt;
    reflexivity. &lt;br /&gt;
  -              (* &lt;br /&gt;
                    ============================&lt;br /&gt;
                    2 * 2 = 4 *)&lt;br /&gt;
    reflexivity.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Notas.&lt;br /&gt;
   1. El símbolo de conjunción se escribe con /\&lt;br /&gt;
   2. La táctica &amp;#039;split&amp;#039; sustituye el objetivo (P /\ Q) por los&lt;br /&gt;
   subobjetivos P y Q. &lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 2.1.2. Demostrar que&lt;br /&gt;
      forall A B : Prop, A -&amp;gt; B -&amp;gt; A /\ B.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Lemma conj_intro: forall A B : Prop, A -&amp;gt; B -&amp;gt; A /\ B.&lt;br /&gt;
Proof.&lt;br /&gt;
  intros A B HA HB. (* A, B : Prop&lt;br /&gt;
                       HA : A&lt;br /&gt;
                       HB : B&lt;br /&gt;
                       ============================&lt;br /&gt;
                       A /\ B *)&lt;br /&gt;
  split.&lt;br /&gt;
  -                 (* A, B : Prop&lt;br /&gt;
                       HA : A&lt;br /&gt;
                       HB : B&lt;br /&gt;
                       ============================&lt;br /&gt;
                       A *)&lt;br /&gt;
    apply HA.&lt;br /&gt;
  -                 (* A, B : Prop&lt;br /&gt;
                       HA : A&lt;br /&gt;
                       HB : B&lt;br /&gt;
                       ============================&lt;br /&gt;
                       B *)&lt;br /&gt;
    apply HB.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 2.1.3. Demostrar, con conj_intro, que&lt;br /&gt;
      3 + 4 = 7 /\ 2 * 2 = 4.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Example ej_conjuncion&amp;#039;: 3 + 4 = 7 /\ 2 * 2 = 4.&lt;br /&gt;
Proof.&lt;br /&gt;
  apply conj_intro. &lt;br /&gt;
  -                 (* 3 + 4 = 7 *)&lt;br /&gt;
    reflexivity.&lt;br /&gt;
  -                 (* 2 * 2 = 4 *)&lt;br /&gt;
    reflexivity.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 2.1.4. Demostrar que&lt;br /&gt;
      forall n m : nat, n = 0 /\ m = 0 -&amp;gt; n + m = 0.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Lemma ej_conjuncion2 :&lt;br /&gt;
  forall n m : nat, n = 0 /\ m = 0 -&amp;gt; n + m = 0.&lt;br /&gt;
Proof.&lt;br /&gt;
  intros n m H.          (* n, m : nat&lt;br /&gt;
                            H : n = 0 /\ m = 0&lt;br /&gt;
                            ============================&lt;br /&gt;
                            n + m = 0 *)&lt;br /&gt;
  destruct H as [Hn Hm]. (* n, m : nat&lt;br /&gt;
                            Hn : n = 0&lt;br /&gt;
                            Hm : m = 0&lt;br /&gt;
                            ============================&lt;br /&gt;
                            n + m = 0 *)&lt;br /&gt;
  rewrite Hn.            (* 0 + m = 0 *)&lt;br /&gt;
  rewrite Hm.            (* 0 + 0 = 0 *)&lt;br /&gt;
  reflexivity.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Nota. Uso de la táctica &amp;#039;destruct H as [HA HB]&amp;#039; que  sustituye la&lt;br /&gt;
   hipótesis H de la forma (A /\ B) por las hipótesis HA (que afirma&lt;br /&gt;
   que A es verdad) y HB (que afirma que B es verdad).&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 2.1.5. Demostrar que&lt;br /&gt;
      forall n m : nat, n = 0 /\ m = 0 -&amp;gt; n + m = 0.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Lemma ej_conjuncion2&amp;#039; :&lt;br /&gt;
  forall n m : nat, n = 0 /\ m = 0 -&amp;gt; n + m = 0.&lt;br /&gt;
Proof.&lt;br /&gt;
  intros n m [Hn Hm].    (* n, m : nat&lt;br /&gt;
                            Hn : n = 0&lt;br /&gt;
                            Hm : m = 0&lt;br /&gt;
                            ============================&lt;br /&gt;
                            n + m = 0 *)&lt;br /&gt;
  rewrite Hn.            (* 0 + m = 0 *)&lt;br /&gt;
  rewrite Hm.            (* 0 + 0 = 0 *)&lt;br /&gt;
  reflexivity.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Nota. La táctica &amp;#039;intros x [HA HB]&amp;#039;, cuando el objetivo es de la&lt;br /&gt;
   forma (forall x, A /\ B -&amp;gt; C), introduce la variable x y las&lt;br /&gt;
   hipótesis HA y HB afirmando la certeza de A y de B, respectivamente.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 2.1.6. Demostrar que&lt;br /&gt;
      forall n m : nat, n = 0 -&amp;gt; m = 0 -&amp;gt; n + m = 0.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Lemma ej_conjuncion2&amp;#039;&amp;#039; :&lt;br /&gt;
  forall n m : nat, n = 0 -&amp;gt; m = 0 -&amp;gt; n + m = 0.&lt;br /&gt;
Proof.&lt;br /&gt;
  intros n m Hn Hm. (* n, m : nat&lt;br /&gt;
                       Hn : n = 0&lt;br /&gt;
                       Hm : m = 0&lt;br /&gt;
                       ============================&lt;br /&gt;
                       n + m = 0 *)&lt;br /&gt;
  rewrite Hn.       (* 0 + m = 0 *)&lt;br /&gt;
  rewrite Hm.       (* 0 + 0 = 0 *)&lt;br /&gt;
  reflexivity.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 2.1.8. Demostrar que&lt;br /&gt;
      forall P Q : Prop,&lt;br /&gt;
        P /\ Q -&amp;gt; P.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Lemma conj_e1 : forall P Q : Prop,&lt;br /&gt;
  P /\ Q -&amp;gt; P.&lt;br /&gt;
Proof.&lt;br /&gt;
  intros P Q [HP HQ]. (* P, Q : Prop&lt;br /&gt;
                         HP : P&lt;br /&gt;
                         HQ : Q&lt;br /&gt;
                         ============================&lt;br /&gt;
                         P *)&lt;br /&gt;
  apply HP.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 2.1.9. Demostrar que&lt;br /&gt;
      forall P Q : Prop,&lt;br /&gt;
        P /\ Q -&amp;gt; Q /\ P.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Theorem conj_conmutativa: forall P Q : Prop,&lt;br /&gt;
  P /\ Q -&amp;gt; Q /\ P.&lt;br /&gt;
Proof.&lt;br /&gt;
  intros P Q [HP HQ]. (* P, Q : Prop&lt;br /&gt;
                         HP : P&lt;br /&gt;
                         HQ : Q&lt;br /&gt;
                         ============================&lt;br /&gt;
                         Q /\ P *)&lt;br /&gt;
  split.&lt;br /&gt;
  -                   (* P, Q : Prop&lt;br /&gt;
                         HP : P&lt;br /&gt;
                         HQ : Q&lt;br /&gt;
                         ============================&lt;br /&gt;
                         Q *)&lt;br /&gt;
    apply HQ.&lt;br /&gt;
  -                   (* P, Q : Prop&lt;br /&gt;
                         HP : P&lt;br /&gt;
                         HQ : Q&lt;br /&gt;
                         ============================&lt;br /&gt;
                         P *)&lt;br /&gt;
    apply HP.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 2.1.10. Calcular el tipo de la expresión&lt;br /&gt;
      and&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Check and.&lt;br /&gt;
(* ===&amp;gt; and : Prop -&amp;gt; Prop -&amp;gt; Prop *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Nota. (x /\ y) es una abreviatura de (and x y).&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
(* =====================================================================&lt;br /&gt;
   §§ 2.2. Disyunción  &lt;br /&gt;
   ================================================================== *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 2.2.1. Demostrar que&lt;br /&gt;
      forall n m : nat, n = 0 \/ m = 0 -&amp;gt; n * m = 0.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
(* 1ª demostración *)&lt;br /&gt;
Lemma disy_ej1:&lt;br /&gt;
  forall n m : nat, n = 0 \/ m = 0 -&amp;gt; n * m = 0.&lt;br /&gt;
Proof.&lt;br /&gt;
  intros n m H.&lt;br /&gt;
  destruct H as [Hn | Hm]. &lt;br /&gt;
  -                        (* n, m : nat&lt;br /&gt;
                              Hn : n = 0&lt;br /&gt;
                              ============================&lt;br /&gt;
                              n * m = 0 *)&lt;br /&gt;
    rewrite Hn.            (* 0 * m = 0 *)&lt;br /&gt;
    reflexivity.           &lt;br /&gt;
  -                        (* n, m : nat&lt;br /&gt;
                              Hm : m = 0&lt;br /&gt;
                              ============================&lt;br /&gt;
                              n * m = 0 *)&lt;br /&gt;
    rewrite Hm.            (* n * 0 = 0 *)&lt;br /&gt;
    rewrite &amp;lt;- mult_n_O.    (* 0 = 0 *)&lt;br /&gt;
    reflexivity.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* 2ª demostración *)&lt;br /&gt;
Lemma disy_ej:&lt;br /&gt;
  forall n m : nat, n = 0 \/ m = 0 -&amp;gt; n * m = 0.&lt;br /&gt;
Proof.&lt;br /&gt;
  intros n m [Hn | Hm]. &lt;br /&gt;
  -                     (* n, m : nat&lt;br /&gt;
                           Hn : n = 0&lt;br /&gt;
                           ============================&lt;br /&gt;
                           n * m = 0 *)&lt;br /&gt;
    rewrite Hn.         (* 0 * m = 0 *)&lt;br /&gt;
    reflexivity.&lt;br /&gt;
  -                     (* n, m : nat&lt;br /&gt;
                           Hm : m = 0&lt;br /&gt;
                           ============================&lt;br /&gt;
                           n * m = 0 *)&lt;br /&gt;
    rewrite Hm.         (* n * 0 = 0 *)&lt;br /&gt;
    rewrite &amp;lt;- mult_n_O. (* 0 = 0 *)&lt;br /&gt;
    reflexivity.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Notas.&lt;br /&gt;
   1. La táctica &amp;#039;destruct H as [Hn | Hm]&amp;#039;, cuando la hipótesis H es de&lt;br /&gt;
      la forma (A \/ B), la divide en dos casos: uno con hipótesis HA&lt;br /&gt;
      (afirmando la certeza de A) y otro con la hipótesis HB (afirmando&lt;br /&gt;
      la certeza de B).   &lt;br /&gt;
   2. La táctica &amp;#039;intros x [HA | HB]&amp;#039;, cuando el objetivo es de la&lt;br /&gt;
      forma (forall x, A \/ B -&amp;gt; C), intoduce la variable x y dos casos:&lt;br /&gt;
      uno con hipótesis HA (afirmando la certeza de A) y otro con la&lt;br /&gt;
      hipótesis HB (afirmando la certeza de B).&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 2.2.2. Demostrar que&lt;br /&gt;
      forall A B : Prop, A -&amp;gt; A \/ B.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Lemma disy_intro: forall A B : Prop, A -&amp;gt; A \/ B.&lt;br /&gt;
Proof.&lt;br /&gt;
  intros A B HA. (* A, B : Prop&lt;br /&gt;
                    HA : A&lt;br /&gt;
                    ============================&lt;br /&gt;
                    A \/ B *)&lt;br /&gt;
  left.          (* A *)&lt;br /&gt;
  apply HA.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Nota. La táctica &amp;#039;left&amp;#039; sustituye el objetivo de la forma (A \/ B)&lt;br /&gt;
   por A.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 2.2.3. Demostrar que&lt;br /&gt;
      forall n : nat, n = 0 \/ n = S (pred n).&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Lemma cero_o_sucesor:&lt;br /&gt;
  forall n : nat, n = 0 \/ n = S (pred n).&lt;br /&gt;
Proof.&lt;br /&gt;
  intros [|n].&lt;br /&gt;
  -              (* &lt;br /&gt;
                    ============================&lt;br /&gt;
                    0 = 0 \/ 0 = S (Nat.pred 0) *)&lt;br /&gt;
    left.        (* 0 = 0 *)&lt;br /&gt;
    reflexivity. &lt;br /&gt;
  -              (* n : nat&lt;br /&gt;
                    ============================&lt;br /&gt;
                    S n = 0 \/ S n = S (Nat.pred (S n)) *)&lt;br /&gt;
    right.       (* S n = S (Nat.pred (S n)) *)&lt;br /&gt;
    reflexivity.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Nota. La táctica &amp;#039;right&amp;#039; sustituye el objetivo de la forma (A \/ B)&lt;br /&gt;
   por B.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
  &lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 2.2.4. Calcular el tipo de la expresión&lt;br /&gt;
      or&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Check or.&lt;br /&gt;
(* ===&amp;gt; or : Prop -&amp;gt; Prop -&amp;gt; Prop *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Nota. (x \/ y) es una abreviatura de (or x y).&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
(* =====================================================================&lt;br /&gt;
   §§ 2.3. Falsedad y negación  &lt;br /&gt;
   ================================================================== *)&lt;br /&gt;
&lt;br /&gt;
Module DefNot.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 2.3.1. Definir la función&lt;br /&gt;
      not (P : Prop) : Prop&lt;br /&gt;
   tal que (not P) es la negación de P&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Definition not (P:Prop) : Prop :=&lt;br /&gt;
    P -&amp;gt; False.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 2.3.2. Definir (~ x) como abreviatura de (not x).&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Notation &amp;quot;~ x&amp;quot; := (not x) : type_scope.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Nota. Esta es la forma como está definida la negación en Coq.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
End DefNot.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 2.3.3. Demostrar que&lt;br /&gt;
      forall (P:Prop),&lt;br /&gt;
        False -&amp;gt; P.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Theorem ex_falso_quodlibet: forall (P:Prop),&lt;br /&gt;
  False -&amp;gt; P.&lt;br /&gt;
Proof.&lt;br /&gt;
  intros P H. (* P : Prop&lt;br /&gt;
                 H : False&lt;br /&gt;
                 ============================&lt;br /&gt;
                 P *)&lt;br /&gt;
  destruct H.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Nota. En latín, &amp;quot;ex falso quodlibet&amp;quot; significa &amp;quot;de lo falso (se&lt;br /&gt;
   sigue) cualquier cosa&amp;quot;. &lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 2.3.4. Demostrar que&lt;br /&gt;
      ~(0 = 1).&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Theorem cero_no_es_uno: ~(0 = 1).&lt;br /&gt;
Proof.&lt;br /&gt;
  intros H.       (* H : 0 = 1&lt;br /&gt;
                     ============================&lt;br /&gt;
                     False *)&lt;br /&gt;
  inversion H.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Nota. La expresión (x &amp;lt;&amp;gt; y) es una abreviatura de ~(x = y).&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Theorem cero_no_es_uno&amp;#039;: 0 &amp;lt;&amp;gt; 1.&lt;br /&gt;
Proof.&lt;br /&gt;
  intros H.       (* H : 0 = 1&lt;br /&gt;
                     ============================&lt;br /&gt;
                     False *)&lt;br /&gt;
  inversion H. &lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 2.3.5. Demostrar que&lt;br /&gt;
      ~ False&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Theorem not_False :&lt;br /&gt;
  ~ False.&lt;br /&gt;
Proof.&lt;br /&gt;
  unfold not. (* &lt;br /&gt;
                 ============================&lt;br /&gt;
                 False -&amp;gt; False *)&lt;br /&gt;
  intros H.   (* H : False&lt;br /&gt;
                 ============================&lt;br /&gt;
                 False *)&lt;br /&gt;
  destruct H. &lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 2.3.6. Demostrar que&lt;br /&gt;
      forall P Q : Prop,&lt;br /&gt;
        (P /\ ~P) -&amp;gt; Q.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Theorem contradiccion_implica_cualquiera: forall P Q : Prop,&lt;br /&gt;
  (P /\ ~P) -&amp;gt; Q.&lt;br /&gt;
Proof.&lt;br /&gt;
  intros P Q [HP HNP]. (* P, Q : Prop&lt;br /&gt;
                          HP : P&lt;br /&gt;
                          HNP : ~ P&lt;br /&gt;
                          ============================&lt;br /&gt;
                          Q *)&lt;br /&gt;
  unfold not in HNP. (* P, Q : Prop&lt;br /&gt;
                          HP : P&lt;br /&gt;
                          HNP : P -&amp;gt; False&lt;br /&gt;
                          ============================&lt;br /&gt;
                          Q *)&lt;br /&gt;
  apply HNP in HP. (* P, Q : Prop&lt;br /&gt;
                          HP : False&lt;br /&gt;
                          HNP : P -&amp;gt; False&lt;br /&gt;
                          ============================&lt;br /&gt;
                          Q *)&lt;br /&gt;
  destruct HP.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 2.3.7. Demostrar que&lt;br /&gt;
      forall P : Prop,&lt;br /&gt;
        P -&amp;gt; ~~P.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Theorem doble_neg: forall P : Prop,&lt;br /&gt;
  P -&amp;gt; ~~P.&lt;br /&gt;
Proof.&lt;br /&gt;
  intros P H. (* P : Prop&lt;br /&gt;
                 H : P&lt;br /&gt;
                 ============================&lt;br /&gt;
                 ~ ~ P *)&lt;br /&gt;
  unfold not. (* (P -&amp;gt; False) -&amp;gt; False *)&lt;br /&gt;
  intros G.   (* P : Prop&lt;br /&gt;
                 H : P&lt;br /&gt;
                 G : P -&amp;gt; False&lt;br /&gt;
                 ============================&lt;br /&gt;
                 False *)&lt;br /&gt;
  apply G.    (* P *)&lt;br /&gt;
  apply H.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 2.3.8. Demostrar que&lt;br /&gt;
      forall b : bool,&lt;br /&gt;
        b &amp;lt;&amp;gt; true -&amp;gt; b = false.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
(* 1ª demostración *)&lt;br /&gt;
Theorem no_verdadero_es_falso: forall b : bool,&lt;br /&gt;
  b &amp;lt;&amp;gt; true -&amp;gt; b = false.&lt;br /&gt;
Proof.&lt;br /&gt;
  intros [] H.&lt;br /&gt;
  -                           (* H : true &amp;lt;&amp;gt; true&lt;br /&gt;
                                 ============================&lt;br /&gt;
                                 true = false *)&lt;br /&gt;
    unfold not in H.          (* H : true = true -&amp;gt; False&lt;br /&gt;
                                 ============================&lt;br /&gt;
                                 true = false *)&lt;br /&gt;
    apply ex_falso_quodlibet. (* H : true = true -&amp;gt; False&lt;br /&gt;
                                 ============================&lt;br /&gt;
                                 False *)&lt;br /&gt;
    apply H.                  (* true = true *)&lt;br /&gt;
    reflexivity.&lt;br /&gt;
  -                           (* H : false &amp;lt;&amp;gt; true&lt;br /&gt;
                                 ============================&lt;br /&gt;
                                 false = false *)&lt;br /&gt;
    reflexivity.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* 2ª demostración *)&lt;br /&gt;
Theorem no_verdadero_es_falso&amp;#039;: forall b : bool,&lt;br /&gt;
  b &amp;lt;&amp;gt; true -&amp;gt; b = false.&lt;br /&gt;
Proof.&lt;br /&gt;
  intros [] H.&lt;br /&gt;
  -                  (* H : true &amp;lt;&amp;gt; true&lt;br /&gt;
                        ============================&lt;br /&gt;
                        true = false *)&lt;br /&gt;
    unfold not in H. (* H : true = true -&amp;gt; False&lt;br /&gt;
                        ============================&lt;br /&gt;
                        true = false *)&lt;br /&gt;
    exfalso.         (* H : true = true -&amp;gt; False&lt;br /&gt;
                        ============================&lt;br /&gt;
                        False *)&lt;br /&gt;
    apply H.         (* true = true *)&lt;br /&gt;
    reflexivity.&lt;br /&gt;
  -                  (* H : false &amp;lt;&amp;gt; true&lt;br /&gt;
                        ============================&lt;br /&gt;
                        false = false *)&lt;br /&gt;
    reflexivity.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Notas. &lt;br /&gt;
   1. Uso de &amp;#039;apply ex_falso_quodlibet&amp;#039; en la primera demostración.&lt;br /&gt;
   2. Uso de &amp;#039;exfalso&amp;#039; en la segunda demostración.&lt;br /&gt;
   3. La táctica &amp;#039;exfalso&amp;#039; sustituye el objetivo por falso. &lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
(* =====================================================================&lt;br /&gt;
   §§ 2.4. Verdad&lt;br /&gt;
   ================================================================== *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 2.4.1. Demostrar que la proposición True es verdadera.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Lemma True_es_verdadera : True.&lt;br /&gt;
Proof.&lt;br /&gt;
  apply I.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Nota. Uso del constructor I.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
(* =====================================================================&lt;br /&gt;
   §§ 2.5. Equivalencia lógica  &lt;br /&gt;
   ================================================================== *)&lt;br /&gt;
&lt;br /&gt;
Module DefIff.&lt;br /&gt;
&lt;br /&gt;
  (* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 2.5.1. Definir la función&lt;br /&gt;
      iff (P Q : Prop) : Prop&lt;br /&gt;
   tal que  (iff P Q) es la equivalencia de P y Q.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Definition iff (P Q : Prop) : Prop := (P -&amp;gt; Q) /\ (Q -&amp;gt; P).&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 2.5.2. Definir (P &amp;lt;-&amp;gt; Q) como una abreviatura de (iff P Q). &lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Notation &amp;quot;P &amp;lt;-&amp;gt; Q&amp;quot; := (iff P Q)&lt;br /&gt;
                      (at level 95, no associativity)&lt;br /&gt;
                      : type_scope.&lt;br /&gt;
&lt;br /&gt;
End DefIff.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 2.5.3. Demostrar que&lt;br /&gt;
      forall P Q : Prop,&lt;br /&gt;
        (P &amp;lt;-&amp;gt; Q) -&amp;gt; (Q &amp;lt;-&amp;gt; P).&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Theorem iff_sim : forall P Q : Prop,&lt;br /&gt;
  (P &amp;lt;-&amp;gt; Q) -&amp;gt; (Q &amp;lt;-&amp;gt; P).&lt;br /&gt;
Proof.&lt;br /&gt;
  intros P Q [HPQ HQP]. (* P, Q : Prop&lt;br /&gt;
                           HPQ : P -&amp;gt; Q&lt;br /&gt;
                           HQP : Q -&amp;gt; P&lt;br /&gt;
                           ============================&lt;br /&gt;
                           Q &amp;lt;-&amp;gt; P *)&lt;br /&gt;
  split.&lt;br /&gt;
  -                     (* P, Q : Prop&lt;br /&gt;
                           HPQ : P -&amp;gt; Q&lt;br /&gt;
                           HQP : Q -&amp;gt; P&lt;br /&gt;
                           ============================&lt;br /&gt;
                           Q -&amp;gt; P *)&lt;br /&gt;
    apply HQP.&lt;br /&gt;
  -                     (* P, Q : Prop&lt;br /&gt;
                           HPQ : P -&amp;gt; Q&lt;br /&gt;
                           HQP : Q -&amp;gt; P&lt;br /&gt;
                           ============================&lt;br /&gt;
                           P -&amp;gt; Q *)&lt;br /&gt;
    apply HPQ.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 2.5.4. Demostrar que&lt;br /&gt;
      forall b : bool,&lt;br /&gt;
        b &amp;lt;&amp;gt; true &amp;lt;-&amp;gt; b = false.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Lemma not_true_iff_false : forall b : bool,&lt;br /&gt;
  b &amp;lt;&amp;gt; true &amp;lt;-&amp;gt; b = false.&lt;br /&gt;
Proof.&lt;br /&gt;
  intros b.                      (* b : bool&lt;br /&gt;
                                    ============================&lt;br /&gt;
                                    b &amp;lt;&amp;gt; true &amp;lt;-&amp;gt; b = false *)&lt;br /&gt;
  split.&lt;br /&gt;
  -                              (* b : bool&lt;br /&gt;
                                    ============================&lt;br /&gt;
                                    b &amp;lt;&amp;gt; true -&amp;gt; b = false *)&lt;br /&gt;
    apply no_verdadero_es_falso. &lt;br /&gt;
  -                              (* b : bool&lt;br /&gt;
                                    ============================&lt;br /&gt;
                                    b = false -&amp;gt; b &amp;lt;&amp;gt; true *)&lt;br /&gt;
    intros H.                    (* b : bool&lt;br /&gt;
                                    H : b = false&lt;br /&gt;
                                    ============================&lt;br /&gt;
                                    b &amp;lt;&amp;gt; true *)&lt;br /&gt;
    rewrite H.                   (* false &amp;lt;&amp;gt; true *)&lt;br /&gt;
    intros H&amp;#039;.                   (* b : bool&lt;br /&gt;
                                    H : b = false&lt;br /&gt;
                                    H&amp;#039; : false = true&lt;br /&gt;
                                    ============================&lt;br /&gt;
                                    False *)&lt;br /&gt;
    inversion H&amp;#039;.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Nota. Se importa la librería Coq.Setoids.Setoid para usar las&lt;br /&gt;
   tácticas reflexivity y rewrite con iff.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Require Import Coq.Setoids.Setoid.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejercicio 2.2.1. Demostrar que&lt;br /&gt;
      forall n m, n * m = 0 -&amp;gt; n = 0 \/ m = 0.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Lemma mult_eq_0 :&lt;br /&gt;
  forall n m, n * m = 0 -&amp;gt; n = 0 \/ m = 0.&lt;br /&gt;
Proof.&lt;br /&gt;
  intros n m H.          (* n, m : nat&lt;br /&gt;
                            H : n * m = 0&lt;br /&gt;
                            ============================&lt;br /&gt;
                            n = 0 \/ m = 0 *)&lt;br /&gt;
  destruct n as [|n&amp;#039;].&lt;br /&gt;
  -                      (* m : nat&lt;br /&gt;
                            H : 0 * m = 0&lt;br /&gt;
                            ============================&lt;br /&gt;
                            0 = 0 \/ m = 0 *)&lt;br /&gt;
    left.                (* 0 = 0 *)&lt;br /&gt;
    reflexivity.&lt;br /&gt;
  -                      (* n&amp;#039;, m : nat&lt;br /&gt;
                            H : S n&amp;#039; * m = 0&lt;br /&gt;
                            ============================&lt;br /&gt;
                            S n&amp;#039; = 0 \/ m = 0 *)&lt;br /&gt;
    destruct m as [|m&amp;#039;]. &lt;br /&gt;
    +                    (* n&amp;#039; : nat&lt;br /&gt;
                            H : S n&amp;#039; * 0 = 0&lt;br /&gt;
                            ============================&lt;br /&gt;
                            S n&amp;#039; = 0 \/ 0 = 0 *)&lt;br /&gt;
      right.             (* 0 = 0 *)&lt;br /&gt;
      reflexivity.&lt;br /&gt;
    +                    (* n&amp;#039;, m&amp;#039; : nat&lt;br /&gt;
                            H : S n&amp;#039; * S m&amp;#039; = 0&lt;br /&gt;
                            ============================&lt;br /&gt;
                            S n&amp;#039; = 0 \/ S m&amp;#039; = 0 *)&lt;br /&gt;
      simpl in H.        (* n&amp;#039;, m&amp;#039; : nat&lt;br /&gt;
                            H : S (m&amp;#039; + n&amp;#039; * S m&amp;#039;) = 0&lt;br /&gt;
                            ============================&lt;br /&gt;
                            S n&amp;#039; = 0 \/ S m&amp;#039; = 0 *)&lt;br /&gt;
      inversion H.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 2.5.5. Demostrar que&lt;br /&gt;
      forall n m : nat, n * m = 0 &amp;lt;-&amp;gt; n = 0 \/ m = 0.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Lemma mult_0 : forall n m : nat, n * m = 0 &amp;lt;-&amp;gt; n = 0 \/ m = 0.&lt;br /&gt;
Proof.&lt;br /&gt;
  split.&lt;br /&gt;
  -                  (* n, m : nat&lt;br /&gt;
                        ============================&lt;br /&gt;
                        n * m = 0 -&amp;gt; n = 0 \/ m = 0 *)&lt;br /&gt;
    apply mult_eq_0. &lt;br /&gt;
  -                  (* n, m : nat&lt;br /&gt;
                        ============================&lt;br /&gt;
                        n = 0 \/ m = 0 -&amp;gt; n * m = 0 *)&lt;br /&gt;
    apply disy_ej.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 2.5.6. Demostrar que&lt;br /&gt;
      forall P Q R : Prop, &lt;br /&gt;
        P \/ (Q \/ R) &amp;lt;-&amp;gt; (P \/ Q) \/ R.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Lemma disy_asociativa :&lt;br /&gt;
  forall P Q R : Prop, P \/ (Q \/ R) &amp;lt;-&amp;gt; (P \/ Q) \/ R.&lt;br /&gt;
Proof.&lt;br /&gt;
  intros P Q R.           (* P, Q, R : Prop&lt;br /&gt;
                             ============================&lt;br /&gt;
                             P \/ (Q \/ R) &amp;lt;-&amp;gt; (P \/ Q) \/ R *)&lt;br /&gt;
  split.&lt;br /&gt;
  -                       (* P, Q, R : Prop&lt;br /&gt;
                             ============================&lt;br /&gt;
                             P \/ (Q \/ R) -&amp;gt; (P \/ Q) \/ R *)&lt;br /&gt;
    intros [H | [H | H]]. &lt;br /&gt;
    +                     (* P, Q, R : Prop&lt;br /&gt;
                             H : P&lt;br /&gt;
                             ============================&lt;br /&gt;
                             (P \/ Q) \/ R *)&lt;br /&gt;
      left.               (* P \/ Q *)&lt;br /&gt;
      left.               (* P *)&lt;br /&gt;
      apply H.&lt;br /&gt;
    +                     (* P, Q, R : Prop&lt;br /&gt;
                             H : Q&lt;br /&gt;
                             ============================&lt;br /&gt;
                             (P \/ Q) \/ R *)&lt;br /&gt;
      left.               (* P \/ Q *)&lt;br /&gt;
      right.              (* Q *)&lt;br /&gt;
      apply H.&lt;br /&gt;
    +                     (* P, Q, R : Prop&lt;br /&gt;
                             H : R&lt;br /&gt;
                             ============================&lt;br /&gt;
                             (P \/ Q) \/ R *)&lt;br /&gt;
      right.              (* R *)&lt;br /&gt;
      apply H.&lt;br /&gt;
  -                       (* P, Q, R : Prop&lt;br /&gt;
                             ============================&lt;br /&gt;
                             (P \/ Q) \/ R -&amp;gt; P \/ (Q \/ R) *)&lt;br /&gt;
    intros [[H | H] | H].&lt;br /&gt;
    +                     (* P, Q, R : Prop&lt;br /&gt;
                             H : P&lt;br /&gt;
                             ============================&lt;br /&gt;
                             (P \/ Q) \/ R *)&lt;br /&gt;
      left.               (* P *)&lt;br /&gt;
      apply H.&lt;br /&gt;
    +                     (* P, Q, R : Prop&lt;br /&gt;
                             H : Q&lt;br /&gt;
                             ============================&lt;br /&gt;
                             P \/ (Q \/ R) *)&lt;br /&gt;
      right.              (* Q \/ R *)&lt;br /&gt;
      left.               (* Q *)&lt;br /&gt;
      apply H.&lt;br /&gt;
    +                     (* P, Q, R : Prop&lt;br /&gt;
                             H : R&lt;br /&gt;
                             ============================&lt;br /&gt;
                             P \/ (Q \/ R) *)&lt;br /&gt;
      right.              (* Q \/ R *)&lt;br /&gt;
      right.              (* R *)&lt;br /&gt;
      apply H.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 2.5.7. Demostrar que&lt;br /&gt;
      forall n m p : nat,&lt;br /&gt;
        n * m * p = 0 &amp;lt;-&amp;gt; n = 0 \/ m = 0 \/ p = 0.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Lemma mult_0_3: forall n m p : nat,&lt;br /&gt;
    n * m * p = 0 &amp;lt;-&amp;gt; n = 0 \/ m = 0 \/ p = 0.&lt;br /&gt;
Proof.&lt;br /&gt;
  intros n m p.            (* n, m, p : nat&lt;br /&gt;
                              ============================&lt;br /&gt;
                              n * (m * p) = 0 &amp;lt;-&amp;gt; n = 0 \/ (m = 0 \/ p = 0) *)&lt;br /&gt;
  rewrite mult_0.          (* n * m = 0 \/ p = 0 &amp;lt;-&amp;gt; &lt;br /&gt;
                              n = 0 \/ (m = 0 \/ p = 0) *)&lt;br /&gt;
  rewrite mult_0.          (* (n = 0 \/ m = 0) \/ p = 0 &amp;lt;-&amp;gt; &lt;br /&gt;
                              n = 0 \/ (m = 0 \/ p = 0) *)&lt;br /&gt;
  rewrite disy_asociativa. (* (n = 0 \/ m = 0) \/ p = 0 &amp;lt;-&amp;gt; &lt;br /&gt;
                              (n = 0 \/ m = 0) \/ p = 0 *)&lt;br /&gt;
  reflexivity.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Nota. Uso de reflexivity y rewrite con iff.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 2.5.8. Demostrar que&lt;br /&gt;
      forall n m : nat,&lt;br /&gt;
        n * m = 0 -&amp;gt; n = 0 \/ m = 0.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Lemma ej_apply_iff: forall n m : nat,&lt;br /&gt;
    n * m = 0 -&amp;gt; n = 0 \/ m = 0.&lt;br /&gt;
Proof.&lt;br /&gt;
  intros n m H. (* n, m : nat&lt;br /&gt;
                   H : n * m = 0&lt;br /&gt;
                   ============================&lt;br /&gt;
                   n = 0 \/ m = 0 *)&lt;br /&gt;
  apply mult_0. (* n * m = 0 *)&lt;br /&gt;
  apply H.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Nota. Uso de apply sobre iff.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
(* =====================================================================&lt;br /&gt;
   §§ 2.6. Cuantificación existencial  &lt;br /&gt;
   ================================================================== *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 2.6.1. Demostrar que&lt;br /&gt;
      exists n : nat, 4 = n + n.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Lemma cuatro_es_par: exists n : nat, 4 = n + n.&lt;br /&gt;
Proof.&lt;br /&gt;
  exists 2.          (* &lt;br /&gt;
                   ============================&lt;br /&gt;
                   4 = 2 + 2 *)&lt;br /&gt;
  reflexivity.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Nota. La táctica &amp;#039;exists a&amp;#039; sustituye el objetivo de la forma &lt;br /&gt;
   (exists x, P(x)) por P(a).&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 2.6.2. Demostrar que&lt;br /&gt;
      forall n : nat,&lt;br /&gt;
        (exists m, n = 4 + m) -&amp;gt; (exists o, n = 2 + o).&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
(* 1ª demostración *)&lt;br /&gt;
Theorem ej_existe_2a: forall n : nat,&lt;br /&gt;
  (exists m, n = 4 + m) -&amp;gt;&lt;br /&gt;
  (exists o, n = 2 + o).&lt;br /&gt;
Proof.&lt;br /&gt;
  intros n H.           (* n : nat&lt;br /&gt;
                           H : exists m : nat, n = 4 + m&lt;br /&gt;
                           ============================&lt;br /&gt;
                           exists o : nat, n = 2 + o *)&lt;br /&gt;
  destruct H as [a Ha]. (* n, a : nat&lt;br /&gt;
                           Ha : n = 4 + a&lt;br /&gt;
                           ============================&lt;br /&gt;
                           exists o : nat, n = 2 + o *)&lt;br /&gt;
  exists (2 + a).            (* n = 2 + (2 + a) *)&lt;br /&gt;
  apply Ha.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* 2ª demostración *)&lt;br /&gt;
Theorem ej_existe_2b: forall n : nat,&lt;br /&gt;
  (exists m, n = 4 + m) -&amp;gt;&lt;br /&gt;
  (exists o, n = 2 + o).&lt;br /&gt;
Proof.&lt;br /&gt;
  intros n [a Ha].      (* n, a : nat&lt;br /&gt;
                           Ha : n = 4 + a&lt;br /&gt;
                           ============================&lt;br /&gt;
                           exists o : nat, n = 2 + o *)&lt;br /&gt;
  exists (2 + a).            (* n = 2 + (2 + a) *)&lt;br /&gt;
  apply Ha.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Notas.&lt;br /&gt;
   1. &amp;#039;destruct H [a Ha]&amp;#039; sustituye la hipótesis (H : exists x, P(x)) &lt;br /&gt;
      por (Ha : P(a)).&lt;br /&gt;
   2. &amp;#039;intros x [a Ha]&amp;#039; sustituye el objetivo &lt;br /&gt;
      (forall x, (exists y P(y)) -&amp;gt; Q(x)) por Q(x) y le añade la&lt;br /&gt;
      hipótesis (Ha : P(a)).&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
(* =====================================================================&lt;br /&gt;
   § 3. Programación con proposiciones &lt;br /&gt;
   ================================================================== *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 3.1.1. Definir la función&lt;br /&gt;
      En {A : Type} (x : A) (xs : list A) : Prop :=&lt;br /&gt;
   tal que (En x xs) se verifica si x pertenece a xs.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Fixpoint En {A : Type} (x : A) (xs : list A) : Prop :=&lt;br /&gt;
  match xs with&lt;br /&gt;
  | []        =&amp;gt; False&lt;br /&gt;
  | x&amp;#039; :: xs&amp;#039; =&amp;gt; x&amp;#039; = x \/ En x xs&amp;#039;&lt;br /&gt;
  end.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 3.1.2. Demostrar que&lt;br /&gt;
      En 4 [1; 2; 3; 4; 5].&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Example En_ejemplo_1 : En 4 [1; 2; 3; 4; 5].&lt;br /&gt;
Proof.&lt;br /&gt;
  simpl.       (* 1 = 4 \/ 2 = 4 \/ 3 = 4 \/ 4 = 4 \/ 5 = 4 \/ False *)&lt;br /&gt;
  right.       (* 2 = 4 \/ 3 = 4 \/ 4 = 4 \/ 5 = 4 \/ False *)&lt;br /&gt;
  right.       (* 3 = 4 \/ 4 = 4 \/ 5 = 4 \/ False *)&lt;br /&gt;
  right.       (* 4 = 4 \/ 5 = 4 \/ False *)&lt;br /&gt;
  left.        (* 4 = 4 *)&lt;br /&gt;
  reflexivity. &lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 3.1.3. Demostrar que&lt;br /&gt;
      forall n : nat, &lt;br /&gt;
        En n [2; 4] -&amp;gt; exists n&amp;#039;, n = 2 * n&amp;#039;.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Example En_ejemplo_2: forall n : nat,&lt;br /&gt;
    En n [2; 4] -&amp;gt; exists n&amp;#039;, n = 2 * n&amp;#039;.&lt;br /&gt;
Proof.&lt;br /&gt;
  simpl.                   (* &lt;br /&gt;
                              ============================&lt;br /&gt;
                              forall n : nat,&lt;br /&gt;
                               2 = n \/ 4 = n \/ False -&amp;gt; &lt;br /&gt;
                               exists n&amp;#039; : nat, n = n&amp;#039; + (n&amp;#039; + 0) *)&lt;br /&gt;
  intros n [H | [H | []]]. &lt;br /&gt;
  -                        (* n : nat&lt;br /&gt;
                              H : 2 = n&lt;br /&gt;
                              ============================&lt;br /&gt;
                              exists n&amp;#039; : nat, n = n&amp;#039; + (n&amp;#039; + 0) *)&lt;br /&gt;
    exists 1.                   (* n = 1 + (1 + 0) *)&lt;br /&gt;
    rewrite &amp;lt;- H.           (* 2 = 1 + (1 + 0) *)&lt;br /&gt;
    reflexivity.&lt;br /&gt;
  -                        (* n : nat&lt;br /&gt;
                              H : 4 = n&lt;br /&gt;
                              ============================&lt;br /&gt;
                              exists n&amp;#039; : nat, n = n&amp;#039; + (n&amp;#039; + 0) *)&lt;br /&gt;
    exists 2.                   (* n = 2 + (2 + 0) *)&lt;br /&gt;
    rewrite &amp;lt;- H.           (* 4 = 2 + (2 + 0) *)&lt;br /&gt;
    reflexivity.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Nota. Uso del patrón vacío para descartar el último caso.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 3.2. Demostrar que&lt;br /&gt;
      forall (A B : Type) (f : A -&amp;gt; B) (xs : list A) (x : A),&lt;br /&gt;
        En x xs -&amp;gt;&lt;br /&gt;
        En (f x) (map f xs).&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Lemma En_map: forall (A B : Type) (f : A -&amp;gt; B) (xs : list A) (x : A),&lt;br /&gt;
    En x xs -&amp;gt;&lt;br /&gt;
    En (f x) (map f xs).&lt;br /&gt;
Proof.&lt;br /&gt;
  intros A B f xs x.            (* A : Type&lt;br /&gt;
                                   B : Type&lt;br /&gt;
                                   f : A -&amp;gt; B&lt;br /&gt;
                                   xs : list A&lt;br /&gt;
                                   x : A&lt;br /&gt;
                                   ============================&lt;br /&gt;
                                   En x xs -&amp;gt; En (f x) (map f xs) *)&lt;br /&gt;
  induction xs as [|x&amp;#039; xs&amp;#039; HI]. &lt;br /&gt;
  -                             (* A : Type&lt;br /&gt;
                                   B : Type&lt;br /&gt;
                                   f : A -&amp;gt; B&lt;br /&gt;
                                   x : A&lt;br /&gt;
                                   ============================&lt;br /&gt;
                                   En x [ ] -&amp;gt; En (f x) (map f [ ]) *)&lt;br /&gt;
    simpl.                      (* False -&amp;gt; False *)&lt;br /&gt;
    intros [].&lt;br /&gt;
  -                             (* A : Type&lt;br /&gt;
                                   B : Type&lt;br /&gt;
                                   f : A -&amp;gt; B&lt;br /&gt;
                                   x&amp;#039; : A&lt;br /&gt;
                                   xs&amp;#039; : list A&lt;br /&gt;
                                   x : A&lt;br /&gt;
                                   HI : En x xs&amp;#039; -&amp;gt; En (f x) (map f xs&amp;#039;)&lt;br /&gt;
                                   ============================&lt;br /&gt;
                                   En x (x&amp;#039;::xs&amp;#039;) -&amp;gt; &lt;br /&gt;
                                   En (f x) (map f (x&amp;#039;::xs&amp;#039;)) *)&lt;br /&gt;
    simpl.                      (* x&amp;#039; = x \/ En x xs&amp;#039; -&amp;gt; &lt;br /&gt;
                                   f x&amp;#039; = f x \/ En (f x) (map f xs&amp;#039;) *)&lt;br /&gt;
    intros [H | H].&lt;br /&gt;
    +                           (* A : Type&lt;br /&gt;
                                   B : Type&lt;br /&gt;
                                   f : A -&amp;gt; B&lt;br /&gt;
                                   x&amp;#039; : A&lt;br /&gt;
                                   xs&amp;#039; : list A&lt;br /&gt;
                                   x : A&lt;br /&gt;
                                   HI : En x xs&amp;#039; -&amp;gt; En (f x) (map f xs&amp;#039;)&lt;br /&gt;
                                   H : x&amp;#039; = x&lt;br /&gt;
                                   ============================&lt;br /&gt;
                                   f x&amp;#039; = f x \/ En (f x) (map f xs&amp;#039;) *)&lt;br /&gt;
      rewrite H.                (* f x = f x \/ En (f x) (map f xs&amp;#039;) *)&lt;br /&gt;
      left.                     (* f x = f x *)&lt;br /&gt;
      reflexivity.&lt;br /&gt;
    +                           (* A : Type&lt;br /&gt;
                                   B : Type&lt;br /&gt;
                                   f : A -&amp;gt; B&lt;br /&gt;
                                   x&amp;#039; : A&lt;br /&gt;
                                   xs&amp;#039; : list A&lt;br /&gt;
                                   x : A&lt;br /&gt;
                                   HI : En x xs&amp;#039; -&amp;gt; En (f x) (map f xs&amp;#039;)&lt;br /&gt;
                                   H : En x xs&amp;#039;&lt;br /&gt;
                                   ============================&lt;br /&gt;
                                   f x&amp;#039; = f x \/ En (f x) (map f xs&amp;#039;) *)&lt;br /&gt;
      right.                    (* En (f x) (map f xs&amp;#039;) *)&lt;br /&gt;
      apply HI.                 (* En x xs&amp;#039; *)&lt;br /&gt;
      apply H.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* =====================================================================&lt;br /&gt;
   § 4. Aplicando teoremas a argumentos &lt;br /&gt;
   ================================================================== *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 4.1. Evaluar la expresión&lt;br /&gt;
      Check suma_conmutativa.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Check suma_conmutativa.&lt;br /&gt;
(* ===&amp;gt; forall n m : nat, n + m = m + n *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Notas.&lt;br /&gt;
   1. En Coq, las demostraciones son objetos de primera clase.&lt;br /&gt;
   2. Coq devuelve el tipo de suma_conmutativa como el de cualquier&lt;br /&gt;
      expresión.&lt;br /&gt;
   3. El identificador suma_conmutativa representa un objeto prueba de&lt;br /&gt;
      (forall n m : nat, n + m = m + n).&lt;br /&gt;
   4. Un término de tipo (nat -&amp;gt; nat -&amp;gt; nat) transforma dos naturales en&lt;br /&gt;
      un natural.&lt;br /&gt;
   5. Análogamente, un término de tipo (n = m -&amp;gt; n + n = m + m)&lt;br /&gt;
      transforma un argumento de tipo (n = m) en otro de tipo &lt;br /&gt;
      (n + n = m + m).&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 4.2. Demostrar que&lt;br /&gt;
      forall x y z : nat, &lt;br /&gt;
        x + (y + z) = (z + y) + x.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
(* 1º intento *)&lt;br /&gt;
Lemma suma_conmutativa3a :&lt;br /&gt;
  forall x y z : nat,&lt;br /&gt;
    x + (y + z) = (z + y) + x.&lt;br /&gt;
Proof.&lt;br /&gt;
  intros x y z.             (* x, y, z : nat&lt;br /&gt;
                               ============================&lt;br /&gt;
                               x + (y + z) = (z + y) + x *)&lt;br /&gt;
  rewrite suma_conmutativa. (* (y + z) + x = (z + y) + x *)&lt;br /&gt;
  rewrite suma_conmutativa. (* x + (y + z) = (z + y) + x *)&lt;br /&gt;
Abort.&lt;br /&gt;
&lt;br /&gt;
(* 2º intento *)&lt;br /&gt;
Lemma suma_conmutativa3b :&lt;br /&gt;
  forall x y z,&lt;br /&gt;
    x + (y + z) = (z + y) + x.&lt;br /&gt;
Proof.&lt;br /&gt;
  intros x y z.               (* x, y, z : nat&lt;br /&gt;
                                 ============================&lt;br /&gt;
                                 x + (y + z) = z + y + x *)&lt;br /&gt;
  rewrite suma_conmutativa.   (* (y + z) + x = (z + y) + x *)&lt;br /&gt;
  assert (H : y + z = z + y). &lt;br /&gt;
  -                           (* x, y, z : nat&lt;br /&gt;
                                 ============================&lt;br /&gt;
                                 y + z = z + y *)&lt;br /&gt;
    rewrite suma_conmutativa. (* z + y = z + y *)&lt;br /&gt;
    reflexivity. &lt;br /&gt;
  -                           (* x, y, z : nat&lt;br /&gt;
                                 H : y + z = z + y&lt;br /&gt;
                                 ============================&lt;br /&gt;
                                 (y + z) + x = (z + y) + x *)&lt;br /&gt;
    rewrite H.                (* (z + y) + x = (z + y) + x *)&lt;br /&gt;
    reflexivity.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* 3º intento *)&lt;br /&gt;
Lemma suma_conmutativa3c:&lt;br /&gt;
  forall x y z,&lt;br /&gt;
    x + (y + z) = (z + y) + x.&lt;br /&gt;
Proof.&lt;br /&gt;
  intros x y z.                   (* x, y, z : nat&lt;br /&gt;
                                     ============================&lt;br /&gt;
                                     x + (y + z) = (z + y) + x *)&lt;br /&gt;
  rewrite suma_conmutativa.       (* (y + z) + x = (z + y) + x *)&lt;br /&gt;
  rewrite (suma_conmutativa y z). (* (z + y) + x = (z + y) + x *)&lt;br /&gt;
  reflexivity.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Nota. Indicación en (rewrite (suma_conmutativa y z)) de los&lt;br /&gt;
   argumentos con los que se aplica, análogamente a las funciones&lt;br /&gt;
   polimórficas. &lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 4.3. Demostrar que&lt;br /&gt;
     forall {n : nat} {ns : list nat},&lt;br /&gt;
       En n (map (fun m =&amp;gt; m * 0) ns) -&amp;gt;&lt;br /&gt;
       n = 0.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
(* Lema auxiliar *)&lt;br /&gt;
Lemma producto_n_0:&lt;br /&gt;
  forall n : nat, n * 0 = 0.&lt;br /&gt;
Proof.&lt;br /&gt;
  induction n as [|n&amp;#039; HI]. &lt;br /&gt;
  -                        (* &lt;br /&gt;
                              ============================&lt;br /&gt;
                              0 * 0 = 0 *)&lt;br /&gt;
    reflexivity. &lt;br /&gt;
  -                        (* n&amp;#039; : nat&lt;br /&gt;
                              HI : n&amp;#039; * 0 = 0&lt;br /&gt;
                              ============================&lt;br /&gt;
                              S n&amp;#039; * 0 = 0 *)&lt;br /&gt;
    simpl.                 (* n&amp;#039; * 0 = 0 *)&lt;br /&gt;
    apply HI.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* Lema auxiliar. *)&lt;br /&gt;
Lemma En_map_iff: forall (A B : Type) (f : A -&amp;gt; B) (xs : list A) (y : B),&lt;br /&gt;
    En y (map f xs) &amp;lt;-&amp;gt;&lt;br /&gt;
    exists x, f x = y /\ En x xs.&lt;br /&gt;
Proof.&lt;br /&gt;
  intros A B f xs y.                  (* A : Type&lt;br /&gt;
                                         B : Type&lt;br /&gt;
                                         f : A -&amp;gt; B&lt;br /&gt;
                                         xs : list A&lt;br /&gt;
                                         y : B&lt;br /&gt;
                                         ============================&lt;br /&gt;
                                         En y (map f xs) &amp;lt;-&amp;gt; &lt;br /&gt;
                                         (exists x : A, f x = y /\ En x xs) *)&lt;br /&gt;
  induction xs as [|x xs&amp;#039; HI]. &lt;br /&gt;
  -                                   (* A : Type&lt;br /&gt;
                                         B : Type&lt;br /&gt;
                                         f : A -&amp;gt; B&lt;br /&gt;
                                         y : B&lt;br /&gt;
                                         ============================&lt;br /&gt;
                                         En y (map f [ ]) &amp;lt;-&amp;gt; &lt;br /&gt;
                                         (exists x : A, f x = y /\ En x [ ]) *)&lt;br /&gt;
    simpl.                            (* En y (map f [ ]) &amp;lt;-&amp;gt; &lt;br /&gt;
                                         (exists x : A, f x = y /\ En x [ ]) *)&lt;br /&gt;
    split.&lt;br /&gt;
    +                                 (* A : Type&lt;br /&gt;
                                         B : Type&lt;br /&gt;
                                         f : A -&amp;gt; B&lt;br /&gt;
                                         y : B&lt;br /&gt;
                                         ============================&lt;br /&gt;
                                         False -&amp;gt; &lt;br /&gt;
                                         exists x : A, f x = y /\ False *)&lt;br /&gt;
      intros [].&lt;br /&gt;
    +                                 (* A : Type&lt;br /&gt;
                                         B : Type&lt;br /&gt;
                                         f : A -&amp;gt; B&lt;br /&gt;
                                         y : B&lt;br /&gt;
                                         ============================&lt;br /&gt;
                                         (exists x : A, f x = y /\ False) -&amp;gt; &lt;br /&gt;
                                         False *)&lt;br /&gt;
      intros [a [H []]].&lt;br /&gt;
  -                                   (* A : Type&lt;br /&gt;
                                         B : Type&lt;br /&gt;
                                         f : A -&amp;gt; B&lt;br /&gt;
                                         x : A&lt;br /&gt;
                                         xs&amp;#039; : list A&lt;br /&gt;
                                         y : B&lt;br /&gt;
                                         HI : En y (map f xs&amp;#039;) &amp;lt;-&amp;gt; &lt;br /&gt;
                                              (exists x:A, f x = y /\ En x xs&amp;#039;)&lt;br /&gt;
                                         ============================&lt;br /&gt;
                                         En y (map f (x :: xs&amp;#039;)) &amp;lt;-&amp;gt; &lt;br /&gt;
                                         (exists x0 : A, &lt;br /&gt;
                                           f x0 = y /\ En x0 (x :: xs&amp;#039;)) *)&lt;br /&gt;
    simpl.                            (* f x = y \/ En y (map f xs&amp;#039;) &amp;lt;-&amp;gt;&lt;br /&gt;
                                         (exists x0 : A, &lt;br /&gt;
                                           f x0 = y /\ (x = x0 \/ En x0 xs&amp;#039;)) *)&lt;br /&gt;
    split.&lt;br /&gt;
    +                                 (* A : Type&lt;br /&gt;
                                         B : Type&lt;br /&gt;
                                         f : A -&amp;gt; B&lt;br /&gt;
                                         x : A&lt;br /&gt;
                                         xs&amp;#039; : list A&lt;br /&gt;
                                         y : B&lt;br /&gt;
                                         HI : En y (map f xs&amp;#039;) &amp;lt;-&amp;gt; &lt;br /&gt;
                                              (exists x:A, f x = y /\ En x xs&amp;#039;)&lt;br /&gt;
                                         ============================&lt;br /&gt;
                                         f x = y \/ En y (map f xs&amp;#039;) -&amp;gt;&lt;br /&gt;
                                         exists x0 : A, &lt;br /&gt;
                                          f x0 = y /\ (x = x0 \/ En x0 xs&amp;#039;) *)&lt;br /&gt;
      intros [H1 | H2].&lt;br /&gt;
      *                               (* A : Type&lt;br /&gt;
                                         B : Type&lt;br /&gt;
                                         f : A -&amp;gt; B&lt;br /&gt;
                                         x : A&lt;br /&gt;
                                         xs&amp;#039; : list A&lt;br /&gt;
                                         y : B&lt;br /&gt;
                                         HI : En y (map f xs&amp;#039;) &amp;lt;-&amp;gt; &lt;br /&gt;
                                              (exists x:A, f x = y /\ En x xs&amp;#039;)&lt;br /&gt;
                                         H1 : f x = y&lt;br /&gt;
                                         ============================&lt;br /&gt;
                                         exists x0 : A, &lt;br /&gt;
                                          f x0 = y /\ (x = x0 \/ En x0 xs&amp;#039;) *)&lt;br /&gt;
        exists x.                        (* f x = y /\ (x = x \/ En x xs&amp;#039;) *)&lt;br /&gt;
        split.&lt;br /&gt;
        --                            (* A : Type&lt;br /&gt;
                                         B : Type&lt;br /&gt;
                                         f : A -&amp;gt; B&lt;br /&gt;
                                         x : A&lt;br /&gt;
                                         xs&amp;#039; : list A&lt;br /&gt;
                                         y : B&lt;br /&gt;
                                         HI : En y (map f xs&amp;#039;) &amp;lt;-&amp;gt; &lt;br /&gt;
                                              (exists x:A, f x = y /\ En x xs&amp;#039;)&lt;br /&gt;
                                         H1 : f x = y&lt;br /&gt;
                                         ============================&lt;br /&gt;
                                         f x = y *)&lt;br /&gt;
          apply H1.&lt;br /&gt;
        --                            (* A : Type&lt;br /&gt;
                                         B : Type&lt;br /&gt;
                                         f : A -&amp;gt; B&lt;br /&gt;
                                         x : A&lt;br /&gt;
                                         xs&amp;#039; : list A&lt;br /&gt;
                                         y : B&lt;br /&gt;
                                         HI : En y (map f xs&amp;#039;) &amp;lt;-&amp;gt; &lt;br /&gt;
                                              (exists x:A, f x = y /\ En x xs&amp;#039;)&lt;br /&gt;
                                         H1 : f x = y&lt;br /&gt;
                                         ============================&lt;br /&gt;
                                         x = x \/ En x xs&amp;#039; *)&lt;br /&gt;
          left.                       (* x = x *)&lt;br /&gt;
          reflexivity.&lt;br /&gt;
      *                               (* A : Type&lt;br /&gt;
                                         B : Type&lt;br /&gt;
                                         f : A -&amp;gt; B&lt;br /&gt;
                                         x : A&lt;br /&gt;
                                         xs&amp;#039; : list A&lt;br /&gt;
                                         y : B&lt;br /&gt;
                                         HI : En y (map f xs&amp;#039;) &amp;lt;-&amp;gt; &lt;br /&gt;
                                              (exists x:A, f x = y /\ En x xs&amp;#039;)&lt;br /&gt;
                                         H2 : En y (map f xs&amp;#039;)&lt;br /&gt;
                                         ============================&lt;br /&gt;
                                         exists x0 : A, &lt;br /&gt;
                                          f x0 = y /\ (x = x0 \/ En x0 xs&amp;#039;) *)&lt;br /&gt;
        apply HI in H2.               (* A : Type&lt;br /&gt;
                                         B : Type&lt;br /&gt;
                                         f : A -&amp;gt; B&lt;br /&gt;
                                         x : A&lt;br /&gt;
                                         xs&amp;#039; : list A&lt;br /&gt;
                                         y : B&lt;br /&gt;
                                         HI : En y (map f xs&amp;#039;) &amp;lt;-&amp;gt; &lt;br /&gt;
                                              (exists x:A, f x = y /\ En x xs&amp;#039;)&lt;br /&gt;
                                         H2 : exists x : A, f x = y /\ En x xs&amp;#039;&lt;br /&gt;
                                         ============================&lt;br /&gt;
                                         exists x0 : A, &lt;br /&gt;
                                          f x0 = y /\ (x = x0 \/ En x0 xs&amp;#039;) *)&lt;br /&gt;
        destruct H2 as [a [Ha1 Ha2]]. (* A : Type&lt;br /&gt;
                                         B : Type&lt;br /&gt;
                                         f : A -&amp;gt; B&lt;br /&gt;
                                         x : A&lt;br /&gt;
                                         xs&amp;#039; : list A&lt;br /&gt;
                                         y : B&lt;br /&gt;
                                         HI : En y (map f xs&amp;#039;) &amp;lt;-&amp;gt; &lt;br /&gt;
                                              (exists x:A, f x = y /\ En x xs&amp;#039;)&lt;br /&gt;
                                         a : A&lt;br /&gt;
                                         Ha1 : f a = y&lt;br /&gt;
                                         Ha2 : En a xs&amp;#039;&lt;br /&gt;
                                         ============================&lt;br /&gt;
                                         exists x0 : A, &lt;br /&gt;
                                          f x0 = y /\ (x = x0 \/ En x0 xs&amp;#039;) *)&lt;br /&gt;
        &lt;br /&gt;
        exists a.                          (* En y (map f xs) &amp;lt;-&amp;gt; &lt;br /&gt;
                                         (exists x : A, f x = y /\ En x xs) *)&lt;br /&gt;
        split.&lt;br /&gt;
        --                            (* A : Type&lt;br /&gt;
                                         B : Type&lt;br /&gt;
                                         f : A -&amp;gt; B&lt;br /&gt;
                                         x : A&lt;br /&gt;
                                         xs&amp;#039; : list A&lt;br /&gt;
                                         y : B&lt;br /&gt;
                                         HI : En y (map f xs&amp;#039;) &amp;lt;-&amp;gt; &lt;br /&gt;
                                              (exists x:A, f x = y /\ En x xs&amp;#039;)&lt;br /&gt;
                                         a : A&lt;br /&gt;
                                         Ha1 : f a = y&lt;br /&gt;
                                         Ha2 : En a xs&amp;#039;&lt;br /&gt;
                                         ============================&lt;br /&gt;
                                         f a = y *)&lt;br /&gt;
          apply Ha1.&lt;br /&gt;
        --                            (* A : Type&lt;br /&gt;
                                         B : Type&lt;br /&gt;
                                         f : A -&amp;gt; B&lt;br /&gt;
                                         x : A&lt;br /&gt;
                                         xs&amp;#039; : list A&lt;br /&gt;
                                         y : B&lt;br /&gt;
                                         HI : En y (map f xs&amp;#039;) &amp;lt;-&amp;gt; &lt;br /&gt;
                                              (exists x:A, f x = y /\ En x xs&amp;#039;)&lt;br /&gt;
                                         a : A&lt;br /&gt;
                                         Ha1 : f a = y&lt;br /&gt;
                                         Ha2 : En a xs&amp;#039;&lt;br /&gt;
                                         ============================&lt;br /&gt;
                                         x = a \/ En a xs&amp;#039; *)&lt;br /&gt;
          right.                      (* En a xs&amp;#039; *)&lt;br /&gt;
          apply Ha2.&lt;br /&gt;
    +                                 (* A : Type&lt;br /&gt;
                                         B : Type&lt;br /&gt;
                                         f : A -&amp;gt; B&lt;br /&gt;
                                         x : A&lt;br /&gt;
                                         xs&amp;#039; : list A&lt;br /&gt;
                                         y : B&lt;br /&gt;
                                         HI : En y (map f xs&amp;#039;) &amp;lt;-&amp;gt; &lt;br /&gt;
                                              (exists x : A, &lt;br /&gt;
                                                f x = y /\ En x xs&amp;#039;)&lt;br /&gt;
                                         ============================&lt;br /&gt;
                                         (exists x0 : A, &lt;br /&gt;
                                          f x0 = y /\ (x = x0 \/ En x0 xs&amp;#039;)) -&amp;gt;&lt;br /&gt;
                                         f x = y \/ En y (map f xs&amp;#039;) *)&lt;br /&gt;
      intros [a [Ha1 [Ha2 | Ha3]]].&lt;br /&gt;
      *                               (* A : Type&lt;br /&gt;
                                         B : Type&lt;br /&gt;
                                         f : A -&amp;gt; B&lt;br /&gt;
                                         x : A&lt;br /&gt;
                                         xs&amp;#039; : list A&lt;br /&gt;
                                         y : B&lt;br /&gt;
                                         HI : En y (map f xs&amp;#039;) &amp;lt;-&amp;gt; &lt;br /&gt;
                                              (exists x:A, f x = y /\ En x xs&amp;#039;)&lt;br /&gt;
                                         a : A&lt;br /&gt;
                                         Ha1 : f a = y&lt;br /&gt;
                                         Ha2 : x = a&lt;br /&gt;
                                         ============================&lt;br /&gt;
                                         f x = y \/ En y (map f xs&amp;#039;) *)&lt;br /&gt;
        left.                         (* f x = y *)&lt;br /&gt;
        rewrite Ha2.                  (* f a = y *)&lt;br /&gt;
        rewrite Ha1.                  (* y = y *)&lt;br /&gt;
        reflexivity.&lt;br /&gt;
      *                               (* A : Type&lt;br /&gt;
                                         B : Type&lt;br /&gt;
                                         f : A -&amp;gt; B&lt;br /&gt;
                                         x : A&lt;br /&gt;
                                         xs&amp;#039; : list A&lt;br /&gt;
                                         y : B&lt;br /&gt;
                                         HI : En y (map f xs&amp;#039;) &amp;lt;-&amp;gt; &lt;br /&gt;
                                              (exists x:A, f x = y /\ En x xs&amp;#039;)&lt;br /&gt;
                                         a : A&lt;br /&gt;
                                         Ha1 : f a = y&lt;br /&gt;
                                         Ha3 : En a xs&amp;#039;&lt;br /&gt;
                                         ============================&lt;br /&gt;
                                         f x = y \/ En y (map f xs&amp;#039;) *)&lt;br /&gt;
        right.                        (* En y (map f xs&amp;#039;) *)&lt;br /&gt;
        apply HI.                     (* exists x0 : A, f x0 = y /\ En x0 xs&amp;#039; *)&lt;br /&gt;
        exists a.                          (* f a = y /\ En a xs&amp;#039; *)&lt;br /&gt;
        split.&lt;br /&gt;
        --                            (* A : Type&lt;br /&gt;
                                         B : Type&lt;br /&gt;
                                         f : A -&amp;gt; B&lt;br /&gt;
                                         x : A&lt;br /&gt;
                                         xs&amp;#039; : list A&lt;br /&gt;
                                         y : B&lt;br /&gt;
                                         HI : En y (map f xs&amp;#039;) &amp;lt;-&amp;gt; &lt;br /&gt;
                                              (exists x:A, f x = y /\ En x xs&amp;#039;)&lt;br /&gt;
                                         a : A&lt;br /&gt;
                                         Ha1 : f a = y&lt;br /&gt;
                                         Ha3 : En a xs&amp;#039;&lt;br /&gt;
                                         ============================&lt;br /&gt;
                                         f a = y *)&lt;br /&gt;
          apply Ha1.&lt;br /&gt;
        --                            (* A : Type&lt;br /&gt;
                                         B : Type&lt;br /&gt;
                                         f : A -&amp;gt; B&lt;br /&gt;
                                         x : A&lt;br /&gt;
                                         xs&amp;#039; : list A&lt;br /&gt;
                                         y : B&lt;br /&gt;
                                         HI : En y (map f xs&amp;#039;) &amp;lt;-&amp;gt; &lt;br /&gt;
                                              (exists x:A, f x = y /\ En x xs&amp;#039;)&lt;br /&gt;
                                         a : A&lt;br /&gt;
                                         Ha1 : f a = y&lt;br /&gt;
                                         Ha3 : En a xs&amp;#039;&lt;br /&gt;
                                         ============================&lt;br /&gt;
                                         En a xs&amp;#039; *)&lt;br /&gt;
          apply Ha3.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(* 1ª demostración *)&lt;br /&gt;
Example ej_aplicacion_de_lema_1:&lt;br /&gt;
  forall {n : nat} {ns : list nat},&lt;br /&gt;
    En n (map (fun m =&amp;gt; m * 0) ns) -&amp;gt;&lt;br /&gt;
    n = 0.&lt;br /&gt;
Proof.&lt;br /&gt;
  intros n ns H.              (* n : nat&lt;br /&gt;
                                 ns : list nat&lt;br /&gt;
                                 H : En n (map (fun m : nat =&amp;gt; m * 0) ns)&lt;br /&gt;
                                 ============================&lt;br /&gt;
                                 n = 0 *)&lt;br /&gt;
  rewrite En_map_iff in H.    (* n : nat&lt;br /&gt;
                                 ns : list nat&lt;br /&gt;
                                 H : exists x : nat, x * 0 = n /\ En x ns&lt;br /&gt;
                                 ============================&lt;br /&gt;
                                 n = 0 *)&lt;br /&gt;
  destruct H as [m [Hm _]].   (* n : nat&lt;br /&gt;
                                 ns : list nat&lt;br /&gt;
                                 m : nat&lt;br /&gt;
                                 Hm : m * 0 = n&lt;br /&gt;
                                 ============================&lt;br /&gt;
                                 n = 0 *)&lt;br /&gt;
  rewrite producto_n_0 in Hm. (* n : nat&lt;br /&gt;
                                 ns : list nat&lt;br /&gt;
                                 m : nat&lt;br /&gt;
                                 Hm : 0 = n&lt;br /&gt;
                                 ============================&lt;br /&gt;
                                 n = 0 *)&lt;br /&gt;
  symmetry.                   (* 0 = n *)&lt;br /&gt;
  apply Hm.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* 2ª demostración *)&lt;br /&gt;
Example ej_aplicacion_de_lema:&lt;br /&gt;
  forall {n : nat} {ns : list nat},&lt;br /&gt;
    En n (map (fun m =&amp;gt; m * 0) ns) -&amp;gt;&lt;br /&gt;
    n = 0.&lt;br /&gt;
Proof.&lt;br /&gt;
  intros n ns H.                    (* n : nat&lt;br /&gt;
                                       ns : list nat&lt;br /&gt;
                                       H : En n (map (fun m : nat =&amp;gt; m * 0) ns)&lt;br /&gt;
                                       ============================&lt;br /&gt;
                                       n = 0 *)&lt;br /&gt;
  destruct (conj_e1 _ _&lt;br /&gt;
             (En_map_iff _ _ _ _ _) &lt;br /&gt;
             H)&lt;br /&gt;
           as [m [Hm _]].           (* n : nat&lt;br /&gt;
                                       ns : list nat&lt;br /&gt;
                                       H : En n (map (fun m : nat =&amp;gt; m * 0) ns)&lt;br /&gt;
                                       m : nat&lt;br /&gt;
                                       Hm : m * 0 = n&lt;br /&gt;
                                       ============================&lt;br /&gt;
                                       n = 0 *)&lt;br /&gt;
  rewrite producto_n_0 in Hm.       (* n : nat&lt;br /&gt;
                                       ns : list nat&lt;br /&gt;
                                       H : En n (map (fun m : nat =&amp;gt; m * 0) ns)&lt;br /&gt;
                                       m : nat&lt;br /&gt;
                                       Hm : 0 = n&lt;br /&gt;
                                       ============================&lt;br /&gt;
                                       n = 0 *)&lt;br /&gt;
  symmetry.                         (* 0 = n *)&lt;br /&gt;
  apply Hm.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Nota. Aplicación de teoremas a argumentos con&lt;br /&gt;
      (conj_e1 _ _  (En_map_iff _ _ _ _ _) H)&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
(* =====================================================================&lt;br /&gt;
   § 5. Coq vs. teoría de conjuntos &lt;br /&gt;
   ================================================================== *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Notas.&lt;br /&gt;
   1. En lugar de decir que un elemento pertenece a un conjunto se puede&lt;br /&gt;
      decir que verifica la propiedad que define al conjunto.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
(* =====================================================================&lt;br /&gt;
   §§ 5.1. Extensionalidad funcional&lt;br /&gt;
   ================================================================== *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 5.1.1. Demostrar que&lt;br /&gt;
      plus 3 = plus (pred 4).&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Example igualdad_de_funciones_ej1:&lt;br /&gt;
  suma 3 = suma (pred 4).&lt;br /&gt;
Proof.&lt;br /&gt;
  reflexivity.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 5.1.2. Definir el axioma de extensionalidad funcional que&lt;br /&gt;
   afirma que dos funciones son giuales cuando tienen los mismos&lt;br /&gt;
   valores. &lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Axiom extensionalidad_funcional : forall {X Y: Type}&lt;br /&gt;
                                    {f g : X -&amp;gt; Y},&lt;br /&gt;
  (forall (x:X), f x = g x) -&amp;gt; f = g.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 5.1.3. Demostrar que&lt;br /&gt;
      (fun x =&amp;gt; suma x 1) = (fun x =&amp;gt; suma 1 x).&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Example igualdad_de_funciones_ej2 :&lt;br /&gt;
  (fun x =&amp;gt; suma x 1) = (fun x =&amp;gt; suma 1 x).&lt;br /&gt;
Proof.&lt;br /&gt;
  apply extensionalidad_funcional. (* &lt;br /&gt;
                                      ============================&lt;br /&gt;
                                      forall x : nat, suma x 1 = suma 1 x *)&lt;br /&gt;
  intros x.                        (* x : nat&lt;br /&gt;
                                      ============================&lt;br /&gt;
                                      suma x 1 = suma 1 x *)&lt;br /&gt;
  apply suma_conmutativa.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Notas.&lt;br /&gt;
   1. No se puede demostrar sin el axioma.&lt;br /&gt;
   2. Hay que ser cuidadoso en la definición de axiomas, porque se&lt;br /&gt;
      pueden introducir inconsistencias. &lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 5.1.4. Calcular los axiomas usados en la prueba de &lt;br /&gt;
      igualdad_de_funciones_ej2&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Print Assumptions igualdad_de_funciones_ej2.&lt;br /&gt;
(* ===&amp;gt;&lt;br /&gt;
     Axioms:&lt;br /&gt;
     extensionalidad_funcional :&lt;br /&gt;
         forall (X Y : Type) (f g : X -&amp;gt; Y),&lt;br /&gt;
                (forall x : X, f x = g x) -&amp;gt; f = g *)&lt;br /&gt;
(* =====================================================================&lt;br /&gt;
   §§ 5.2. Proposiciones y booleanos  &lt;br /&gt;
   ================================================================== *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 5.2.1. Demostrar que&lt;br /&gt;
     forall k : nat,&lt;br /&gt;
       esPar (doble k) = true.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Theorem esPar_doble:&lt;br /&gt;
  forall k : nat, esPar (doble k) = true.&lt;br /&gt;
Proof.&lt;br /&gt;
  intros k.                (* k : nat&lt;br /&gt;
                              ============================&lt;br /&gt;
                              esPar (doble k) = true *)&lt;br /&gt;
  induction k as [|k&amp;#039; HI]. &lt;br /&gt;
  -                        (* &lt;br /&gt;
                              ============================&lt;br /&gt;
                              esPar (doble 0) = true *)&lt;br /&gt;
    reflexivity.&lt;br /&gt;
  -                        (* k&amp;#039; : nat&lt;br /&gt;
                              HI : esPar (doble k&amp;#039;) = true&lt;br /&gt;
                              ============================&lt;br /&gt;
                              esPar (doble (S k&amp;#039;)) = true *)&lt;br /&gt;
    simpl.                 (* esPar (doble k&amp;#039;) = true *)&lt;br /&gt;
    apply HI.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 5.2.2. Demostrar que&lt;br /&gt;
      forall n : nat,&lt;br /&gt;
        esPar n = true &amp;lt;-&amp;gt; exists k, n = doble k.&lt;br /&gt;
&lt;br /&gt;
   Es decir, que la computación booleana (esPar n) refleja la&lt;br /&gt;
   proposición (exists k, n = doble k).&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
(* Lema auxiliar. *)&lt;br /&gt;
Lemma esPar_doble_aux :&lt;br /&gt;
  forall n : nat,&lt;br /&gt;
    exists k : nat, n = if esPar n&lt;br /&gt;
                 then doble k&lt;br /&gt;
                 else S (doble k).&lt;br /&gt;
Proof.&lt;br /&gt;
  induction n as [|n&amp;#039; HI].    &lt;br /&gt;
  -                            (* &lt;br /&gt;
                                  ============================&lt;br /&gt;
                                  exists k : nat, &lt;br /&gt;
                                   0 = (if esPar 0 &lt;br /&gt;
                                        then doble k &lt;br /&gt;
                                        else S (doble k)) *)&lt;br /&gt;
    exists 0.                       (* 0 = (if esPar 0 &lt;br /&gt;
                                       then doble 0 &lt;br /&gt;
                                       else S (doble 0)) *)&lt;br /&gt;
    reflexivity.&lt;br /&gt;
  -                            (* n&amp;#039; : nat&lt;br /&gt;
                                  HI : exists k : nat, &lt;br /&gt;
                                        n&amp;#039; = (if esPar n&amp;#039; &lt;br /&gt;
                                              then doble k &lt;br /&gt;
                                              else S (doble k))&lt;br /&gt;
                                  ============================&lt;br /&gt;
                                  exists k : nat, &lt;br /&gt;
                                   S n&amp;#039; = (if esPar (S n&amp;#039;) &lt;br /&gt;
                                           then doble k &lt;br /&gt;
                                           else S (doble k)) *)&lt;br /&gt;
    destruct (esPar n&amp;#039;) eqn:H. &lt;br /&gt;
    +                          (* n&amp;#039; : nat&lt;br /&gt;
                                  H : esPar n&amp;#039; = true&lt;br /&gt;
                                  HI : exists k : nat, n&amp;#039; = doble k&lt;br /&gt;
                                  ============================&lt;br /&gt;
                                  exists k : nat, &lt;br /&gt;
                                   S n&amp;#039; = (if esPar (S n&amp;#039;) &lt;br /&gt;
                                           then doble k &lt;br /&gt;
                                           else S (doble k)) *)&lt;br /&gt;
      rewrite esPar_S.         (* exists k : nat,&lt;br /&gt;
                                   S n&amp;#039; = (if negacion (esPar n&amp;#039;) &lt;br /&gt;
                                           then doble k &lt;br /&gt;
                                           else S (doble k)) *)&lt;br /&gt;
      rewrite H.               (* exists k : nat, &lt;br /&gt;
                                   S n&amp;#039; = (if negacion true &lt;br /&gt;
                                           then doble k &lt;br /&gt;
                                           else S (doble k)) *)&lt;br /&gt;
      simpl.                   (* exists k : nat, S n&amp;#039; = S (doble k) *)&lt;br /&gt;
      destruct HI as [k&amp;#039; Hk&amp;#039;]. (* n&amp;#039; : nat&lt;br /&gt;
                                  H : esPar n&amp;#039; = true&lt;br /&gt;
                                  k&amp;#039; : nat&lt;br /&gt;
                                  Hk&amp;#039; : n&amp;#039; = doble k&amp;#039;&lt;br /&gt;
                                  ============================&lt;br /&gt;
                                  exists k : nat, S n&amp;#039; = S (doble k) *)&lt;br /&gt;
      exists k&amp;#039;.                    (* S n&amp;#039; = S (doble k&amp;#039;) *)&lt;br /&gt;
      rewrite Hk&amp;#039;.             (* S (doble k&amp;#039;) = S (doble k&amp;#039;) *)&lt;br /&gt;
      reflexivity.&lt;br /&gt;
    +                          (* n&amp;#039; : nat&lt;br /&gt;
                                  H : esPar n&amp;#039; = false&lt;br /&gt;
                                  HI : exists k : nat, n&amp;#039; = S (doble k)&lt;br /&gt;
                                  ============================&lt;br /&gt;
                                  exists k : nat, &lt;br /&gt;
                                   S n&amp;#039; = (if esPar (S n&amp;#039;) &lt;br /&gt;
                                           then doble k &lt;br /&gt;
                                           else S (doble k)) *)&lt;br /&gt;
      rewrite esPar_S.         (* exists k : nat,&lt;br /&gt;
                                   S n&amp;#039; = (if negacion (esPar n&amp;#039;) &lt;br /&gt;
                                           then doble k &lt;br /&gt;
                                           else S (doble k)) *)&lt;br /&gt;
      rewrite H.               (* exists k : nat, &lt;br /&gt;
                                   S n&amp;#039; = (if negacion false &lt;br /&gt;
                                           then doble k &lt;br /&gt;
                                           else S (doble k)) *)&lt;br /&gt;
      simpl.                   (* exists k : nat, S n&amp;#039; = doble k *)&lt;br /&gt;
      destruct HI as [k&amp;#039; Hk&amp;#039;]. (* n&amp;#039; : nat&lt;br /&gt;
                                  H : esPar n&amp;#039; = false&lt;br /&gt;
                                  k&amp;#039; : nat&lt;br /&gt;
                                  Hk&amp;#039; : n&amp;#039; = S (doble k&amp;#039;)&lt;br /&gt;
                                  ============================&lt;br /&gt;
                                  exists k : nat, S n&amp;#039; = doble k *)&lt;br /&gt;
      exists (1 + k&amp;#039;).              (* S n&amp;#039; = doble (1 + k&amp;#039;) *)&lt;br /&gt;
      rewrite Hk&amp;#039;.             (* S (S (doble k&amp;#039;)) = doble (1 + k&amp;#039;) *)&lt;br /&gt;
      reflexivity.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Theorem esPar_bool_prop:&lt;br /&gt;
  forall n : nat,&lt;br /&gt;
    esPar n = true &amp;lt;-&amp;gt; exists k, n = doble k.&lt;br /&gt;
Proof.&lt;br /&gt;
  intros n.               (* n : nat&lt;br /&gt;
                             ============================&lt;br /&gt;
                             esPar n = true &amp;lt;-&amp;gt; (exists k : nat, n = doble k) *)&lt;br /&gt;
  split.&lt;br /&gt;
  -                       (* n : nat&lt;br /&gt;
                             ============================&lt;br /&gt;
                             esPar n = true -&amp;gt; exists k : nat, n = doble k *)&lt;br /&gt;
    intros H.             (* n : nat                           &lt;br /&gt;
                             H : esPar n = true&lt;br /&gt;
                             ============================&lt;br /&gt;
                             exists k : nat, n = doble k *)&lt;br /&gt;
    destruct&lt;br /&gt;
      (esPar_doble_aux n) &lt;br /&gt;
      as [k Hk].          (* n : nat&lt;br /&gt;
                             H : esPar n = true&lt;br /&gt;
                             k : nat&lt;br /&gt;
                             Hk : n = (if esPar n then doble k else S (doble k))&lt;br /&gt;
                             ============================&lt;br /&gt;
                             exists k0 : nat, n = doble k0 *)&lt;br /&gt;
    rewrite Hk.           (* exists k0 : nat, &lt;br /&gt;
                              (if esPar n &lt;br /&gt;
                               then doble k &lt;br /&gt;
                               else S (doble k)) &lt;br /&gt;
                              = doble k0 *)&lt;br /&gt;
    rewrite H.            (* exists k0 : nat, doble k = doble k0 *)&lt;br /&gt;
    exists k.                  (* doble k = doble k *)&lt;br /&gt;
    reflexivity.&lt;br /&gt;
  -                       (* n : nat&lt;br /&gt;
                             ============================&lt;br /&gt;
                             (exists k : nat, n = doble k) -&amp;gt; esPar n = true *)&lt;br /&gt;
    intros [k Hk].        (* n, k : nat&lt;br /&gt;
                             Hk : n = doble k&lt;br /&gt;
                             ============================&lt;br /&gt;
                             esPar n = true *)&lt;br /&gt;
    rewrite Hk.           (* esPar (doble k) = true *)&lt;br /&gt;
    apply esPar_doble.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 5.2.3. Demostrar que&lt;br /&gt;
      forall n m : nat,&lt;br /&gt;
        iguales_nat n m = true &amp;lt;-&amp;gt; n = m.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Theorem iguales_nat_bool_prop:&lt;br /&gt;
  forall n m : nat,&lt;br /&gt;
    iguales_nat n m = true &amp;lt;-&amp;gt; n = m.&lt;br /&gt;
Proof.&lt;br /&gt;
  intros n m.                 (* n, m : nat&lt;br /&gt;
                                 ============================&lt;br /&gt;
                                 iguales_nat n m = true &amp;lt;-&amp;gt; n = m *)&lt;br /&gt;
  split.&lt;br /&gt;
  -                           (* n, m : nat&lt;br /&gt;
                                 ============================&lt;br /&gt;
                                 iguales_nat n m = true -&amp;gt; n = m *)&lt;br /&gt;
    apply iguales_nat_true.&lt;br /&gt;
  -                           (* n, m : nat&lt;br /&gt;
                                 ============================&lt;br /&gt;
                                 n = m -&amp;gt; iguales_nat n m = true *)&lt;br /&gt;
    intros H.                 (* n, m : nat&lt;br /&gt;
                                 H : n = m&lt;br /&gt;
                                 ============================&lt;br /&gt;
                                 iguales_nat n m = true *)&lt;br /&gt;
    rewrite H.                (* iguales_nat m m = true *)&lt;br /&gt;
    rewrite iguales_nat_refl. (* true = true *)&lt;br /&gt;
    reflexivity.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 5.2.4. Definir la función es_primo_par tal que &lt;br /&gt;
   (es_primo_par n) es verifica si n es un primo par.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
(* 1º intento *)&lt;br /&gt;
Fail Definition es_primo_par n :=&lt;br /&gt;
  if n = 2&lt;br /&gt;
  then true&lt;br /&gt;
  else false.&lt;br /&gt;
&lt;br /&gt;
(* 2º intento *)&lt;br /&gt;
Definition es_primo_par n :=&lt;br /&gt;
  if iguales_nat n 2&lt;br /&gt;
  then true&lt;br /&gt;
  else false.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 5.2.5.1. Demostrar que&lt;br /&gt;
      exists k : nat, 1000 = doble k.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Example esPar_1000: exists k : nat, 1000 = doble k.&lt;br /&gt;
Proof.&lt;br /&gt;
  exists 500.&lt;br /&gt;
  reflexivity.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 5.2.5.2. Demostrar que&lt;br /&gt;
      esPar 1000 = true.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Example esPar_1000&amp;#039; : esPar 1000 = true.&lt;br /&gt;
Proof.&lt;br /&gt;
  reflexivity.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 5.2.5.3. Demostrar que&lt;br /&gt;
      exists k : nat, 1000 = doble k.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Example esPar_1000&amp;#039;&amp;#039;: exists k : nat, 1000 = doble k.&lt;br /&gt;
Proof.&lt;br /&gt;
  apply esPar_bool_prop. (* esPar 1000 = true *)&lt;br /&gt;
  reflexivity.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Notas. &lt;br /&gt;
   1. En la proposicional se necesita proporcionar un testipo.&lt;br /&gt;
   2. En la booleano se calcula sin testigo.&lt;br /&gt;
   3. Se puede demostrar la proposicional usando la equivalencia con la&lt;br /&gt;
      booleana sin necesidad de testigo.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
  &lt;br /&gt;
(* =====================================================================&lt;br /&gt;
   §§ 5.3. Lógica clásica vs. constructiva  &lt;br /&gt;
   ================================================================== *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 5.3.1. Definir la proposicion&lt;br /&gt;
      tercio_excluso&lt;br /&gt;
   que afirma que  (forall P : Prop, P \/ ~ P).&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Definition tercio_excluso : Prop := forall P : Prop,&lt;br /&gt;
  P \/ ~ P.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Nota. La proposición tercio_excluso no es demostrable en Coq.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 5.3.2. Demostrar que&lt;br /&gt;
      forall (P : Prop) (b : bool),&lt;br /&gt;
        (P &amp;lt;-&amp;gt; b = true) -&amp;gt; P \/ ~ P.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Theorem tercio_exluso_restringido :&lt;br /&gt;
  forall (P : Prop) (b : bool),&lt;br /&gt;
    (P &amp;lt;-&amp;gt; b = true) -&amp;gt; P \/ ~ P.&lt;br /&gt;
Proof.&lt;br /&gt;
  intros P [] H.  &lt;br /&gt;
  -               (* P : Prop&lt;br /&gt;
                     H : P &amp;lt;-&amp;gt; true = true&lt;br /&gt;
                     ============================&lt;br /&gt;
                     P \/ ~ P *)&lt;br /&gt;
    left.         (* P *)&lt;br /&gt;
    rewrite H.    (* true = true *)&lt;br /&gt;
    reflexivity.&lt;br /&gt;
  -               (* P : Prop&lt;br /&gt;
                     H : P &amp;lt;-&amp;gt; false = true&lt;br /&gt;
                     ============================&lt;br /&gt;
                     P \/ ~ P *)&lt;br /&gt;
    right.        (* ~ P *)&lt;br /&gt;
    rewrite H.    (* false &amp;lt;&amp;gt; true *)&lt;br /&gt;
    intros H1.    (* H1 : false = true&lt;br /&gt;
                     ============================&lt;br /&gt;
                     False *)&lt;br /&gt;
    inversion H1. &lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 5.3.3. Demostrar que&lt;br /&gt;
      forall (n m : nat),&lt;br /&gt;
        n = m \/ n &amp;lt;&amp;gt; m.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Theorem tercio_exluso_restringido_eq:&lt;br /&gt;
  forall (n m : nat),&lt;br /&gt;
    n = m \/ n &amp;lt;&amp;gt; m.&lt;br /&gt;
Proof.&lt;br /&gt;
  intros n m.                      (* n, m : nat&lt;br /&gt;
                                      ============================&lt;br /&gt;
                                      n = m \/ n &amp;lt;&amp;gt; m *)&lt;br /&gt;
  apply (tercio_exluso_restringido &lt;br /&gt;
           (n = m)&lt;br /&gt;
           (iguales_nat n m)).     (* n = m &amp;lt;-&amp;gt; iguales_nat n m = true *)&lt;br /&gt;
  symmetry.                        (* iguales_nat n m = true &amp;lt;-&amp;gt; n = m *)&lt;br /&gt;
  apply iguales_nat_bool_prop.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Notas.&lt;br /&gt;
   1. En Coq no se puede demostrar el principio del tercio exluso.&lt;br /&gt;
   2. Las demostraciones de las fórmulas existenciales tienen que&lt;br /&gt;
      proporcionar un testigo.&lt;br /&gt;
   2. La lógica de Coq es constructiva.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
  &lt;br /&gt;
(* =====================================================================&lt;br /&gt;
   § Bibliografía&lt;br /&gt;
   ================================================================== *)&lt;br /&gt;
&lt;br /&gt;
(*&lt;br /&gt;
 + &amp;quot;Logic in Coq&amp;quot; de Peirce et als. http://bit.ly/2nv1T9Z *)&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/RA2018/index.php?title=Temas&amp;diff=376</id>
		<title>Temas</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2018/index.php?title=Temas&amp;diff=376"/>
		<updated>2019-02-14T12:46:19Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;En esta página se irán publicando los temas conforme se vayan estudiando.&lt;br /&gt;
&lt;br /&gt;
== RA con Isabelle/HOL ==&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: Deducción natural proposicional:&lt;br /&gt;
** [http://www.cs.us.es/~jalonso/cursos/li/temas/tema-1.pdf Tema 7a: Sintaxis y semántica de la lógica proposicional].&lt;br /&gt;
** [http://www.cs.us.es/~jalonso/cursos/li/temas/tema-2.pdf Tema 7b: Deducción natural proposicional].&lt;br /&gt;
** [[Tema 7b: Deducción natural proposicional con Isabelle/HOL | Tema 7c: 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-7.pdf Tema 8a: Sintaxis y semántica de la lógica de primer orden].&lt;br /&gt;
** [http://www.cs.us.es/~jalonso/cursos/li/temas/tema-8.pdf Tema 8b: 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 | Tema 8c: Deducción natural en lógica de primer orden con Isabelle/HOL]]&lt;br /&gt;
* [[Tema 9: Editores lógicos]]. &lt;br /&gt;
* [[Tema 10: Caso de estudio: Compilación de expresiones]].&lt;br /&gt;
* [[Tema 11: Definiciones inductivas]].&lt;br /&gt;
* [[Tema 12: Conjuntos, funciones y relaciones]].&lt;br /&gt;
&lt;br /&gt;
== RA con Coq ==&lt;br /&gt;
* [[Tema 1: Programación funcional y métodos elementales de demostración en Coq]].&lt;br /&gt;
* [[Tema 2: Demostraciones por inducción sobre los números naturales en Coq]].&lt;br /&gt;
* [[Tema 3: Datos estructurados en Coq]].&lt;br /&gt;
* [[Tema 4: Polimorfismo y funciones de orden superior en Coq]].&lt;br /&gt;
* [[Tema 5: Tácticas básicas de Coq]].&lt;br /&gt;
* [[Tema 6: Lógica en Coq]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&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;
* [[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/RA2018/index.php?title=Tema_11:_Definiciones_inductivas&amp;diff=374</id>
		<title>Tema 11: Definiciones inductivas</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2018/index.php?title=Tema_11:_Definiciones_inductivas&amp;diff=374"/>
		<updated>2019-02-14T07:37:45Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: Protegió «Tema 11: Definiciones inductivas» ([Editar=Solo administradores] (indefinido) [Trasladar=Solo administradores] (indefinido))&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isabelle&amp;quot;&amp;gt;&lt;br /&gt;
chapter {* Tema 11: Definiciones inductivas *}&lt;br /&gt;
&lt;br /&gt;
theory T11_Definiciones_inductivas&lt;br /&gt;
imports Main&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
section {* El conjunto de los números pares *}&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  · El conjunto de los números pares se define inductivamente como el&lt;br /&gt;
    menor conjunto que contiene al 0 y es cerrado por la operación (+2).&lt;br /&gt;
&lt;br /&gt;
  · El conjunto de los números pares también puede definirse como los &lt;br /&gt;
    naturales divisible por 2.&lt;br /&gt;
&lt;br /&gt;
  · Veremos cómo se escriben las dos definiciones en Isabelle/HOL y cómo&lt;br /&gt;
    se demuestra su equivalencia.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
subsection {* Definición inductiva del conjunto de los pares *}&lt;br /&gt;
&lt;br /&gt;
inductive_set par :: &amp;quot;nat set&amp;quot; where&lt;br /&gt;
  cero [intro!]: &amp;quot;0 ∈ par&amp;quot; &lt;br /&gt;
| paso [intro!]: &amp;quot;n ∈ par ⟹ (Suc (Suc n)) ∈ par&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  · Una definición inductiva está formada con reglas de introducción.&lt;br /&gt;
&lt;br /&gt;
  · La definición inductiva genera varios teoremas:&lt;br /&gt;
    · par.cero:   0 ∈ par&lt;br /&gt;
    · par.paso:   n ∈ par ⟹ Suc (Suc n) ∈ par&lt;br /&gt;
    · par.simps:  (a ∈ par) = (a = 0 ∨ (∃n. a = Suc (Suc n) ∧ n ∈ par))&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
subsection {* Uso de las reglas de introducción *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Lema: Los números de la forma 2*k son pares.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
― ‹La demostración automática es›&lt;br /&gt;
lemma dobles_son_pares [intro!]: &lt;br /&gt;
  &amp;quot;2*k ∈ par&amp;quot;&lt;br /&gt;
by (induct k) auto&lt;br /&gt;
&lt;br /&gt;
― ‹La demostración estructurada es›&lt;br /&gt;
lemma dobles_son_pares_2:&lt;br /&gt;
  &amp;quot;2*k ∈ par&amp;quot;&lt;br /&gt;
proof (induct k)&lt;br /&gt;
  show &amp;quot;2 * 0 ∈ par&amp;quot; by auto&lt;br /&gt;
next&lt;br /&gt;
  show &amp;quot;⋀k. 2 * k ∈ par ⟹ 2 * Suc k ∈ par&amp;quot; by auto&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  · Nota: Nuestro objetivo es demostrar la equivalencia de la definición&lt;br /&gt;
    anterior y la definición mediante divisibilidad (even).&lt;br /&gt;
  &lt;br /&gt;
  · Lema: Si n es divisible por 2, entonces es par.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma even_imp_par: &amp;quot;even n ⟹ n ∈ par&amp;quot;&lt;br /&gt;
by auto&lt;br /&gt;
&lt;br /&gt;
subsection {* Regla de inducción *} &lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Entre las reglas generadas por la definión de par está la de&lt;br /&gt;
  inducción:&lt;br /&gt;
  · par.induct: ⟦ x ∈ par; &lt;br /&gt;
                 P 0; &lt;br /&gt;
                 ⋀n. ⟦n ∈ par; P n⟧ ⟹ P (Suc (Suc n))⟧ &lt;br /&gt;
                ⟹ P x&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Lema: Los números pares son divisibles por 2.&lt;br /&gt;
*} &lt;br /&gt;
&lt;br /&gt;
― ‹1ª demostración (detallada)›&lt;br /&gt;
lemma par_imp_even: &lt;br /&gt;
  &amp;quot;n ∈ par ⟹ even n&amp;quot;&lt;br /&gt;
proof (induction rule: par.induct)&lt;br /&gt;
  show &amp;quot;2 dvd (0::nat)&amp;quot; by (simp_all add: dvd_def)&lt;br /&gt;
next&lt;br /&gt;
  fix n::nat&lt;br /&gt;
  assume H1: &amp;quot;n ∈ par&amp;quot; and&lt;br /&gt;
         H2: &amp;quot;even n&amp;quot;&lt;br /&gt;
  have &amp;quot;∃k. n = 2*k&amp;quot; using H2 by (simp add: dvd_def)&lt;br /&gt;
  then obtain k where &amp;quot;n = 2*k&amp;quot; ..&lt;br /&gt;
  then have &amp;quot;Suc (Suc n) = 2*(k+1)&amp;quot; by auto&lt;br /&gt;
  then have &amp;quot;∃k. Suc (Suc n) = 2*k&amp;quot; ..&lt;br /&gt;
  then show &amp;quot;even (Suc (Suc n))&amp;quot; by (simp add: dvd_def)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
― ‹2ª demostración (con arith)›&lt;br /&gt;
lemma par_imp_even_2: &lt;br /&gt;
  &amp;quot;n ∈ par ⟹ even n&amp;quot;&lt;br /&gt;
proof (induction rule: par.induct)&lt;br /&gt;
  show &amp;quot;even (0::nat)&amp;quot; by (simp_all add: dvd_def)&lt;br /&gt;
next&lt;br /&gt;
  fix n::nat&lt;br /&gt;
  assume H1: &amp;quot;n ∈ par&amp;quot; and&lt;br /&gt;
         H2: &amp;quot;even n&amp;quot;&lt;br /&gt;
  then show &amp;quot;even (Suc (Suc n))&amp;quot; by (auto simp add: dvd_def, arith)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
― ‹3ª demostración (automática)›&lt;br /&gt;
lemma par_imp_even_3: &lt;br /&gt;
  &amp;quot;n ∈ par ⟹ even n&amp;quot;&lt;br /&gt;
by (induction rule:par.induct) (auto simp add: dvd_def, arith)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Lema: Un número n es par syss es divisible por 2. &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
theorem par_iff_even: &amp;quot;(n ∈ par) = (even n)&amp;quot;&lt;br /&gt;
by (blast intro: even_imp_par par_imp_even)&lt;br /&gt;
&lt;br /&gt;
subsection{* Generalización y regla de inducción *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  · Antes de aplicar inducción se debe de generalizar la fórmula a&lt;br /&gt;
    probar.&lt;br /&gt;
 &lt;br /&gt;
  · Vamos a ilustrar el principio anterior en el caso de los conjuntos&lt;br /&gt;
    inductivamente definidos, con el siguiente ejemplo: si n+2 es par,&lt;br /&gt;
    entonces n también lo es.&lt;br /&gt;
&lt;br /&gt;
  · El siguiente intento falla:&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;Suc (Suc n) ∈ par ⟹ n ∈ par&amp;quot;&lt;br /&gt;
  apply (erule par.induct) &lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  En el intento anterior, los subobjetivos generados son&lt;br /&gt;
     1. n ∈ par&lt;br /&gt;
     2. ⋀na. ⟦na ∈ par; n ∈ par⟧ ⟹ n ∈ par&lt;br /&gt;
  que no se pueden demostrar.&lt;br /&gt;
&lt;br /&gt;
  Se ha perdido la información sobre Suc (Suc n).&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Reformulación del lema: Si n es par, entonces n-2 también lo es.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
― ‹La demostración automática es›&lt;br /&gt;
lemma par_imp_par_menos_2: &lt;br /&gt;
  &amp;quot;n ∈ par ⟹ n - 2 ∈ par&amp;quot;&lt;br /&gt;
by (induction rule:par.induct) auto&lt;br /&gt;
&lt;br /&gt;
― ‹La demostración estructurada es›&lt;br /&gt;
lemma &amp;quot;n ∈  par ⟹ n - 2 ∈ par&amp;quot;&lt;br /&gt;
proof (induction rule:par.induct)&lt;br /&gt;
  show &amp;quot;0 - 2 ∈ par&amp;quot; by auto&lt;br /&gt;
next&lt;br /&gt;
  show &amp;quot;⋀n. ⟦n ∈ par; n - 2 ∈ par⟧ ⟹ Suc (Suc n) - 2 ∈ par&amp;quot; by auto&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
text {* &lt;br /&gt;
  Con el lema anterior se puede demostrar el original.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
― ‹La demostración estructurada es›&lt;br /&gt;
lemma&lt;br /&gt;
  assumes &amp;quot;Suc (Suc n) ∈ par&amp;quot; &lt;br /&gt;
  shows   &amp;quot;n ∈ par&amp;quot;&lt;br /&gt;
proof -&lt;br /&gt;
  have &amp;quot;Suc (Suc n) - 2 ∈ par&amp;quot; using assms by (rule par_imp_par_menos_2)&lt;br /&gt;
  then show &amp;quot;n ∈ par&amp;quot; by simp &lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
― ‹La demostración aplicativa es›&lt;br /&gt;
lemma &lt;br /&gt;
  &amp;quot;Suc (Suc n) ∈ par ⟹ n ∈ par&amp;quot;&lt;br /&gt;
apply (drule par_imp_par_menos_2) &lt;br /&gt;
apply simp&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
(* Comentar el uso de drule *)&lt;br /&gt;
&lt;br /&gt;
― ‹La demostración automática es›&lt;br /&gt;
lemma Suc_Suc_par_imp_par: &lt;br /&gt;
  &amp;quot;Suc (Suc n) ∈ par ⟹ n ∈ par&amp;quot;&lt;br /&gt;
by (drule par_imp_par_menos_2, simp)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Lemma. Un número natural n es par syss n+2 es par.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma [iff]: &amp;quot;((Suc (Suc n)) ∈ par) = (n ∈ par)&amp;quot;&lt;br /&gt;
by (blast dest: Suc_Suc_par_imp_par)&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Se usa el atributo &amp;quot;iff&amp;quot; porque sirve como regla de simplificación.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
subsection {* Definiciones mutuamente inductivas *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Definición cruzada de los conjuntos inductivos de los pares y de los &lt;br /&gt;
  impares:&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
inductive_set&lt;br /&gt;
  Pares    :: &amp;quot;nat set&amp;quot; and&lt;br /&gt;
  Impares  :: &amp;quot;nat set&amp;quot;&lt;br /&gt;
where&lt;br /&gt;
  ceroP:    &amp;quot;0 ∈ Pares&amp;quot;&lt;br /&gt;
| ParesI:   &amp;quot;n ∈ Impares ⟹ Suc n ∈ Pares&amp;quot;&lt;br /&gt;
| ImparesI: &amp;quot;n ∈ Pares   ⟹ Suc n ∈ Impares&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  El esquema de inducción generado por la definición anterior es&lt;br /&gt;
  · Pares_Impares.induct:&lt;br /&gt;
    ⟦P1 0; &lt;br /&gt;
     ⋀n. ⟦n ∈ Impares; P2 n⟧ ⟹ P1 (Suc n);&lt;br /&gt;
     ⋀n. ⟦n ∈ Pares;   P1 n⟧ ⟹ P2 (Suc n)⟧&lt;br /&gt;
    ⟹ (x1 ∈ Pares ⟶ P1 x1) ∧ (x2 ∈ Impares ⟶ P2 x2)&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Ejemplo de demostración usando el esquema anterior.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma &amp;quot;(m ∈ Pares ⟶ even m) ∧ (n ∈ Impares ⟶ even (Suc n))&amp;quot;&lt;br /&gt;
proof (induction rule:Pares_Impares.induct)&lt;br /&gt;
  show &amp;quot;even (0::nat)&amp;quot; by simp&lt;br /&gt;
next&lt;br /&gt;
  fix n :: &amp;quot;nat&amp;quot;&lt;br /&gt;
  assume H1: &amp;quot;n ∈ Impares&amp;quot; and&lt;br /&gt;
         H2: &amp;quot;even (Suc n)&amp;quot;&lt;br /&gt;
  show &amp;quot;even (Suc n)&amp;quot; using H2 by simp&lt;br /&gt;
next&lt;br /&gt;
  fix n :: &amp;quot;nat&amp;quot;&lt;br /&gt;
  assume H1: &amp;quot;n ∈ Pares&amp;quot; and&lt;br /&gt;
         H2: &amp;quot;even n&amp;quot;&lt;br /&gt;
  have &amp;quot;∃k. n = 2*k&amp;quot; using H2 by (simp add: dvd_def)&lt;br /&gt;
  then obtain k where &amp;quot;n = 2*k&amp;quot; ..&lt;br /&gt;
  then have &amp;quot;Suc (Suc n) = 2*(k+1)&amp;quot; by auto&lt;br /&gt;
  then have &amp;quot;∃k. Suc (Suc n) = 2*k&amp;quot; ..&lt;br /&gt;
  then show &amp;quot;even (Suc (Suc n))&amp;quot; by (simp add: dvd_def)&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
subsection {* Definición inductiva de predicados *}&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Definición inductiva del predicado es_par tal que (es_par n) se&lt;br /&gt;
  verifica si n es par.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
inductive es_par :: &amp;quot;nat ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;es_par 0&amp;quot; &lt;br /&gt;
| &amp;quot;es_par n ⟹ es_par (Suc(Suc n))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Heurística para elegir entre definir conjuntos o predicados:&lt;br /&gt;
  · si se va a combinar con operaciones conjuntistas, definir conjunto;&lt;br /&gt;
  · en caso contrario, definir predicado.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
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/RA2018/index.php?title=Tema_12:_Conjuntos,_funciones_y_relaciones&amp;diff=373</id>
		<title>Tema 12: Conjuntos, funciones y relaciones</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2018/index.php?title=Tema_12:_Conjuntos,_funciones_y_relaciones&amp;diff=373"/>
		<updated>2019-02-14T07:37:27Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: Protegió «Tema 12: Conjuntos, funciones y relaciones» ([Editar=Solo administradores] (indefinido) [Trasladar=Solo administradores] (indefinido))&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;isabelle&amp;quot;&amp;gt;&lt;br /&gt;
chapter {* Tema 12: Conjuntos, funciones y relaciones *}&lt;br /&gt;
&lt;br /&gt;
theory T12_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}&amp;quot; ― ‹= 10›&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;∑{2::nat,5,3}&amp;quot; ― ‹= 10›&lt;br /&gt;
&lt;br /&gt;
definition sumaCuadradosConj :: &amp;quot;nat set ⇒ nat&amp;quot; where&lt;br /&gt;
  &amp;quot;sumaCuadradosConj S ≡ ∑x∈S. x*x&amp;quot;&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;sumaCuadradosConj {2,5,3}&amp;quot; ― ‹= 38›&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;
― ‹La demostración automática es›&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;
― ‹La demostración estructurada es›&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;
      then have &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;
      then have &amp;quot;y ∈ F&amp;quot; using `y ∈ insert x F` by simp&lt;br /&gt;
      then have &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;
― ‹La demostración detallada es›&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;
  then have &amp;quot;x ∈ Pares&amp;quot; by (rule IntD1)&lt;br /&gt;
  then have &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;
  then have &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;
― ‹La demostración estructurada es›&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;
  then have &amp;quot;x ∈ Pares&amp;quot; ..&lt;br /&gt;
  then have &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;
  then have &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;
― ‹La demostración automática es›&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;
― ‹La demostración detallada es›&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;
    then have &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;
― ‹La demostración estructurada es›&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;
  then show &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;
  then show &amp;quot;f ∘ g = f ∘ h&amp;quot; by auto&lt;br /&gt;
qed&lt;br /&gt;
&lt;br /&gt;
― ‹La demostración automática es›&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/RA2018/index.php?title=Tema_5:_T%C3%A1cticas_b%C3%A1sicas_de_Coq&amp;diff=372</id>
		<title>Tema 5: Tácticas básicas de Coq</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2018/index.php?title=Tema_5:_T%C3%A1cticas_b%C3%A1sicas_de_Coq&amp;diff=372"/>
		<updated>2019-02-14T07:37:09Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: Protegió «Tema 5: Tácticas básicas de Coq» ([Editar=Solo administradores] (indefinido) [Trasladar=Solo administradores] (indefinido))&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;coq&amp;quot;&amp;gt;&lt;br /&gt;
Set Warnings &amp;quot;-notation-overridden,-parsing&amp;quot;.&lt;br /&gt;
Require Export T4_PolimorfismoyOS.&lt;br /&gt;
Require Export R2_Induccion_sol.&lt;br /&gt;
&lt;br /&gt;
(* El contenido del tema es&lt;br /&gt;
   1. La táctica &amp;#039;apply&amp;#039;&lt;br /&gt;
   2. La táctica &amp;#039;apply ... with ...&amp;#039;&lt;br /&gt;
   3. La táctica &amp;#039;inversion&amp;#039;&lt;br /&gt;
   4. Uso de tácticas sobre las hipótesis&lt;br /&gt;
   5. Control de la hipótesis de inducción  &lt;br /&gt;
   6. Expansión de definiciones &lt;br /&gt;
   7. Uso de &amp;#039;destruct&amp;#039; sobre expresiones compuestas&lt;br /&gt;
   8. Resumen de tácticas básicas &lt;br /&gt;
*)&lt;br /&gt;
&lt;br /&gt;
(* =====================================================================&lt;br /&gt;
   § 1. La táctica &amp;#039;apply&amp;#039;&lt;br /&gt;
   ================================================================== *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 1.1. Demostrar que &lt;br /&gt;
          n = m  -&amp;gt;&lt;br /&gt;
          [n;o] = [n;p] -&amp;gt;&lt;br /&gt;
          [n;o] = [m;p].&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
(* Demostración sin apply *)&lt;br /&gt;
Theorem artificial_1a : forall (n m o p : nat),&lt;br /&gt;
    n = m  -&amp;gt;&lt;br /&gt;
    [n;o] = [n;p] -&amp;gt;&lt;br /&gt;
    [n;o] = [m;p].&lt;br /&gt;
Proof.&lt;br /&gt;
  intros n m o p H1 H2. (* n, m, o, p : nat&lt;br /&gt;
                           H1 : n = m&lt;br /&gt;
                           H2 : [n; o] = [n; p]&lt;br /&gt;
                           ============================&lt;br /&gt;
                           [n; o] = [m; p] *)&lt;br /&gt;
  rewrite &amp;lt;- H1.         (* [n; o] = [n; p] *)&lt;br /&gt;
  rewrite H2.           (* [n; p] = [n; p] *)&lt;br /&gt;
  reflexivity.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* Demostración con apply *)&lt;br /&gt;
Theorem artificial_1b : forall (n m o p : nat),&lt;br /&gt;
    n = m  -&amp;gt;&lt;br /&gt;
    [n;o] = [n;p] -&amp;gt;&lt;br /&gt;
    [n;o] = [m;p].&lt;br /&gt;
Proof.&lt;br /&gt;
  intros n m o p H1 H2. (* n, m, o, p : nat&lt;br /&gt;
                           H1 : n = m&lt;br /&gt;
                           H2 : [n; o] = [n; p]&lt;br /&gt;
                           ============================&lt;br /&gt;
                           [n; o] = [m; p] *)&lt;br /&gt;
  rewrite &amp;lt;- H1.         (* [n; o] = [n; p] *)&lt;br /&gt;
  apply H2.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Nota. Uso de la táctica &amp;#039;apply&amp;#039;.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 1.2. Demostrar que &lt;br /&gt;
      n = m  -&amp;gt;&lt;br /&gt;
      (forall (q r : nat), q = r -&amp;gt; [q;o] = [r;p]) -&amp;gt;&lt;br /&gt;
      [n;o] = [m;p].&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Theorem artificial2 : forall (n m o p : nat),&lt;br /&gt;
    n = m  -&amp;gt;&lt;br /&gt;
    (forall (q r : nat), q = r -&amp;gt; [q;o] = [r;p]) -&amp;gt;&lt;br /&gt;
    [n;o] = [m;p].&lt;br /&gt;
Proof.&lt;br /&gt;
  intros n m o p H1 H2. (* n, m, o, p : nat&lt;br /&gt;
                           H1 : n = m&lt;br /&gt;
                           H2 : forall q r : nat, q = r -&amp;gt; [q; o] = [r; p]&lt;br /&gt;
                           ============================&lt;br /&gt;
                           [n; o] = [m; p] *)&lt;br /&gt;
  apply H2.             (* n = m *)&lt;br /&gt;
  apply H1.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Nota. Uso de la táctica &amp;#039;apply&amp;#039; en hipótesis condicionales y&lt;br /&gt;
   razonamiento hacia atrás&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 1.3. Demostrar que &lt;br /&gt;
      (n,n) = (m,m)  -&amp;gt;&lt;br /&gt;
      (forall (q r : nat), (q,q) = (r,r) -&amp;gt; [q] = [r]) -&amp;gt;&lt;br /&gt;
      [n] = [m].&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Theorem artificial2a : forall (n m : nat),&lt;br /&gt;
    (n,n) = (m,m)  -&amp;gt;&lt;br /&gt;
    (forall (q r : nat), (q,q) = (r,r) -&amp;gt; [q] = [r]) -&amp;gt;&lt;br /&gt;
    [n] = [m].&lt;br /&gt;
Proof.&lt;br /&gt;
  intros n m H1 H2. (* n, m : nat&lt;br /&gt;
                       H1 : (n, n) = (m, m)&lt;br /&gt;
                       H2 : forall q r : nat, (q, q) = (r, r) -&amp;gt; [q] = [r]&lt;br /&gt;
                       ============================&lt;br /&gt;
                       [n] = [m] *)&lt;br /&gt;
  apply H2.         (* (n, n) = (m, m) *)&lt;br /&gt;
  apply H1.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 1.4. Demostrar que &lt;br /&gt;
      true = iguales_nat n 5  -&amp;gt;&lt;br /&gt;
      iguales_nat (S (S n)) 7 = true.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Theorem artificial3a: forall (n : nat),&lt;br /&gt;
    true = iguales_nat n 5  -&amp;gt;&lt;br /&gt;
    iguales_nat (S (S n)) 7 = true.&lt;br /&gt;
Proof.&lt;br /&gt;
  intros n H. (* n : nat&lt;br /&gt;
                 H : true = iguales_nat n 5&lt;br /&gt;
                 ============================&lt;br /&gt;
                 iguales_nat (S (S n)) 7 = true *)&lt;br /&gt;
  symmetry.   (* true = iguales_nat (S (S n)) 7 *)&lt;br /&gt;
  simpl.      (* true = iguales_nat n 5 *)&lt;br /&gt;
  apply H.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Nota. Necesidad de usar symmetry antes de apply.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
(* =====================================================================&lt;br /&gt;
   § 2. La táctica &amp;#039;apply ... with ...&amp;#039;&lt;br /&gt;
   ================================================================== *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 2.1. Demostrar que&lt;br /&gt;
      forall (a b c d e f : nat),&lt;br /&gt;
       [a;b] = [c;d] -&amp;gt;&lt;br /&gt;
       [c;d] = [e;f] -&amp;gt;&lt;br /&gt;
       [a;b] = [e;f].&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Example ejemplo_con_transitiva: forall (a b c d e f : nat),&lt;br /&gt;
    [a;b] = [c;d] -&amp;gt;&lt;br /&gt;
    [c;d] = [e;f] -&amp;gt;&lt;br /&gt;
    [a;b] = [e;f].&lt;br /&gt;
Proof.&lt;br /&gt;
  intros a b c d e f H1 H2. (* a, b, c, d, e, f : nat&lt;br /&gt;
                               H1 : [a; b] = [c; d]&lt;br /&gt;
                               H2 : [c; d] = [e; f]&lt;br /&gt;
                               ============================&lt;br /&gt;
                               [a; b] = [e; f] *)&lt;br /&gt;
  rewrite -&amp;gt; H1.             (* [c; d] = [e; f] *)&lt;br /&gt;
  rewrite -&amp;gt; H2.             (* [e; f] = [e; f] *)&lt;br /&gt;
  reflexivity.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 2.2. Demostrar que&lt;br /&gt;
      forall (X : Type) (n m o : X),&lt;br /&gt;
       n = m -&amp;gt; m = o -&amp;gt; n = o.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Theorem igualdad_transitiva: forall (X:Type) (n m o : X),&lt;br /&gt;
    n = m -&amp;gt; m = o -&amp;gt; n = o.&lt;br /&gt;
Proof.&lt;br /&gt;
  intros X n m o H1 H2. (* X : Type&lt;br /&gt;
                           n, m, o : X&lt;br /&gt;
                           H1 : n = m&lt;br /&gt;
                           H2 : m = o&lt;br /&gt;
                           ============================&lt;br /&gt;
                           n = o *)&lt;br /&gt;
  rewrite -&amp;gt; H1.         (* m = o *)&lt;br /&gt;
  rewrite -&amp;gt; H2.         (* o = o *)&lt;br /&gt;
  reflexivity.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Nota. El ejercicio 2.2 es una generalización del 2.1, sus&lt;br /&gt;
   demostraciones son isomorfas y se puede usar el 2.2 en la&lt;br /&gt;
   demostración del 2.1.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 2.3. Demostrar que&lt;br /&gt;
      forall (X : Type) (n m o : X),&lt;br /&gt;
       n = m -&amp;gt; m = o -&amp;gt; n = o.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
(* 1ª demostración *)&lt;br /&gt;
Example ejemplo_con_transitiva&amp;#039; : forall (a b c d e f : nat),&lt;br /&gt;
    [a;b] = [c;d] -&amp;gt;&lt;br /&gt;
    [c;d] = [e;f] -&amp;gt;&lt;br /&gt;
    [a;b] = [e;f].&lt;br /&gt;
Proof.&lt;br /&gt;
  intros a b c d e f H1 H2.                  (* a, b, c, d, e, f : nat&lt;br /&gt;
                                                H1 : [a; b] = [c; d]&lt;br /&gt;
                                                H2 : [c; d] = [e; f]&lt;br /&gt;
                                                ============================&lt;br /&gt;
                                                [a; b] = [e; f] *)&lt;br /&gt;
  apply igualdad_transitiva with (m:=[c;d]).&lt;br /&gt;
  -                                          (* [a; b] = [c; d] *)&lt;br /&gt;
    apply H1.&lt;br /&gt;
  -                                          (* [c; d] = [e; f] *)&lt;br /&gt;
    apply H2.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* 2ª demostración *)&lt;br /&gt;
Example ejemplo_con_transitiva&amp;#039;&amp;#039; : forall (a b c d e f : nat),&lt;br /&gt;
    [a;b] = [c;d] -&amp;gt;&lt;br /&gt;
    [c;d] = [e;f] -&amp;gt;&lt;br /&gt;
    [a;b] = [e;f].&lt;br /&gt;
Proof.&lt;br /&gt;
  intros a b c d e f H1 H2.             (* a, b, c, d, e, f : nat&lt;br /&gt;
                                           H1 : [a; b] = [c; d]&lt;br /&gt;
                                           H2 : [c; d] = [e; f]&lt;br /&gt;
                                           ============================&lt;br /&gt;
                                           [a; b] = [e; f] *)&lt;br /&gt;
  apply igualdad_transitiva with [c;d].&lt;br /&gt;
  -                                     (* [a; b] = [c; d] *)&lt;br /&gt;
    apply H1.&lt;br /&gt;
  -                                     (* [c; d] = [e; f] *)&lt;br /&gt;
    apply H2.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Nota. Uso de la táctica &amp;#039;apply ... whith ...&amp;#039;&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
(* =====================================================================&lt;br /&gt;
   § 3. La táctica &amp;#039;inversion&amp;#039;&lt;br /&gt;
   ================================================================== *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 3.1. Demostrar que&lt;br /&gt;
      forall (n m : nat),&lt;br /&gt;
       S n = S m -&amp;gt; n = m.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Theorem S_inyectiva: forall (n m : nat),&lt;br /&gt;
  S n = S m -&amp;gt;&lt;br /&gt;
  n = m.&lt;br /&gt;
Proof.&lt;br /&gt;
  intros n m H. (* n, m : nat&lt;br /&gt;
                   H : S n = S m&lt;br /&gt;
                   ============================&lt;br /&gt;
                   n = m *)&lt;br /&gt;
  inversion H.  (* n, m : nat&lt;br /&gt;
                   H : S n = S m&lt;br /&gt;
                   H1 : n = m&lt;br /&gt;
                   ============================&lt;br /&gt;
                   m = m *)&lt;br /&gt;
  reflexivity.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Nota. Uso de la táctica &amp;#039;inversion&amp;#039;&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 3.2. Demostrar que&lt;br /&gt;
      forall (n m o : nat),&lt;br /&gt;
       [n; m] = [o; o] -&amp;gt; [n] = [m].&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Theorem inversion_ej1: forall (n m o : nat),&lt;br /&gt;
    [n; m] = [o; o] -&amp;gt;&lt;br /&gt;
    [n] = [m].&lt;br /&gt;
Proof.&lt;br /&gt;
  intros n m o H. (* n, m, o : nat&lt;br /&gt;
                     H : [n; m] = [o; o]&lt;br /&gt;
                     ============================&lt;br /&gt;
                     [n] = [m] *)&lt;br /&gt;
  inversion H.    (* n, m, o : nat&lt;br /&gt;
                     H : [n; m] = [o; o]&lt;br /&gt;
                     H1 : n = o&lt;br /&gt;
                     H2 : m = o&lt;br /&gt;
                     ============================&lt;br /&gt;
                     [o] = [o] *)&lt;br /&gt;
  reflexivity.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 3.3. Demostrar que&lt;br /&gt;
      forall (n m : nat),&lt;br /&gt;
       [n] = [m] -&amp;gt;&lt;br /&gt;
       n = m.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Theorem inversion_ej2: forall (n m : nat),&lt;br /&gt;
    [n] = [m] -&amp;gt;&lt;br /&gt;
    n = m.&lt;br /&gt;
Proof.&lt;br /&gt;
  intros n m H.         (* n, m : nat&lt;br /&gt;
                           H : [n] = [m]&lt;br /&gt;
                           ============================&lt;br /&gt;
                           n = m *)&lt;br /&gt;
  inversion H as [Hnm]. (* n, m : nat&lt;br /&gt;
                           H : [n] = [m]&lt;br /&gt;
                           Hnm : n = m&lt;br /&gt;
                           ============================&lt;br /&gt;
                           m = m *)&lt;br /&gt;
  reflexivity.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Nota. Nombramiento de las hipótesis generadas por inversión.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 3.4. Demostrar que&lt;br /&gt;
      forall n:nat,&lt;br /&gt;
       iguales_nat 0 n = true -&amp;gt; n = 0.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Theorem iguales_nat_0_n: forall n:nat,&lt;br /&gt;
    iguales_nat 0 n = true -&amp;gt; n = 0.&lt;br /&gt;
Proof.&lt;br /&gt;
  intros n.             (* n : nat&lt;br /&gt;
                           ============================&lt;br /&gt;
                           iguales_nat 0 n = true -&amp;gt; n = 0 *)&lt;br /&gt;
  destruct n as [| n&amp;#039;]. &lt;br /&gt;
  -                     (* &lt;br /&gt;
                           ============================&lt;br /&gt;
                           iguales_nat 0 0 = true -&amp;gt; 0 = 0 *)&lt;br /&gt;
    intros H.           (* H : iguales_nat 0 0 = true&lt;br /&gt;
                           ============================&lt;br /&gt;
                           0 = 0 *)&lt;br /&gt;
    reflexivity.&lt;br /&gt;
  -                     (* n&amp;#039; : nat&lt;br /&gt;
                           ============================&lt;br /&gt;
                           iguales_nat 0 (S n&amp;#039;) = true -&amp;gt; S n&amp;#039; = 0 *)&lt;br /&gt;
    simpl.              (* n&amp;#039; : nat&lt;br /&gt;
                           ============================&lt;br /&gt;
                           false = true -&amp;gt; S n&amp;#039; = 0 *)&lt;br /&gt;
    intros H.           (* n&amp;#039; : nat&lt;br /&gt;
                           H : false = true&lt;br /&gt;
                           ============================&lt;br /&gt;
                           S n&amp;#039; = 0 *)&lt;br /&gt;
    inversion H.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 3.5. Demostrar que&lt;br /&gt;
      forall (n : nat),&lt;br /&gt;
       S n = O -&amp;gt; 2 + 2 = 5.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Theorem inversion_ej4: forall (n : nat),&lt;br /&gt;
    S n = O -&amp;gt;&lt;br /&gt;
    2 + 2 = 5.&lt;br /&gt;
Proof.&lt;br /&gt;
  intros n H.  (* n : nat&lt;br /&gt;
                  H : S n = 0&lt;br /&gt;
                  ============================&lt;br /&gt;
                  2 + 2 = 5 *)&lt;br /&gt;
  inversion H.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 3.6. Demostrar que&lt;br /&gt;
      forall (n m : nat),&lt;br /&gt;
       false = true -&amp;gt; [n] = [m].&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Theorem inversion_ej5: forall (n m : nat),&lt;br /&gt;
    false = true -&amp;gt; [n] = [m].&lt;br /&gt;
Proof.&lt;br /&gt;
  intros n m H. (* n, m : nat&lt;br /&gt;
                   H : false = true&lt;br /&gt;
                   ============================&lt;br /&gt;
                   [n] = [m] *)&lt;br /&gt;
  inversion H.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 3.7. Demostrar que&lt;br /&gt;
      forall (A B : Type) (f: A -&amp;gt; B) (x y: A),&lt;br /&gt;
       x = y -&amp;gt; f x = f y.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Theorem funcional: forall (A B : Type) (f: A -&amp;gt; B) (x y: A),&lt;br /&gt;
    x = y -&amp;gt; f x = f y.&lt;br /&gt;
Proof.&lt;br /&gt;
  intros A B f x y H. (* A : Type&lt;br /&gt;
                         B : Type&lt;br /&gt;
                         f : A -&amp;gt; B&lt;br /&gt;
                         x, y : A&lt;br /&gt;
                         H : x = y&lt;br /&gt;
                         ============================&lt;br /&gt;
                         f x = f y *)&lt;br /&gt;
  rewrite H.          (* f y = f y *)&lt;br /&gt;
  reflexivity.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* =====================================================================&lt;br /&gt;
   § 4. Uso de tácticas sobre las hipótesis&lt;br /&gt;
   ================================================================== *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 4.1. Demostrar que&lt;br /&gt;
      forall (n m : nat) (b : bool),&lt;br /&gt;
       iguales_nat (S n) (S m) = b  -&amp;gt;&lt;br /&gt;
       iguales_nat n m = b.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Theorem S_inj: forall (n m : nat) (b : bool),&lt;br /&gt;
    iguales_nat (S n) (S m) = b  -&amp;gt;&lt;br /&gt;
    iguales_nat n m = b.&lt;br /&gt;
Proof.&lt;br /&gt;
  intros n m b H. (* n, m : nat&lt;br /&gt;
                     b : bool&lt;br /&gt;
                     H : iguales_nat (S n) (S m) = b&lt;br /&gt;
                     ============================&lt;br /&gt;
                     iguales_nat n m = b *)&lt;br /&gt;
  simpl in H.     (* n, m : nat&lt;br /&gt;
                     b : bool&lt;br /&gt;
                     H : iguales_nat n m = b&lt;br /&gt;
                     ============================&lt;br /&gt;
                     iguales_nat n m = b *)&lt;br /&gt;
  apply H.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Nota. Uso de táctica &amp;#039;simpl in ...&amp;#039;&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 4.1. Demostrar que&lt;br /&gt;
      forall (n : nat),&lt;br /&gt;
       (iguales_nat n 5 = true -&amp;gt; iguales_nat (S (S n)) 7 = true) -&amp;gt;&lt;br /&gt;
       true = iguales_nat n 5  -&amp;gt;&lt;br /&gt;
       true = iguales_nat (S (S n)) 7.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Theorem artificial3&amp;#039;: forall (n : nat),&lt;br /&gt;
  (iguales_nat n 5 = true -&amp;gt; iguales_nat (S (S n)) 7 = true) -&amp;gt;&lt;br /&gt;
  true = iguales_nat n 5  -&amp;gt;&lt;br /&gt;
  true = iguales_nat (S (S n)) 7.&lt;br /&gt;
Proof.&lt;br /&gt;
  intros n H1 H2. (* n : nat&lt;br /&gt;
                     H1 : iguales_nat n 5 = true -&amp;gt; &lt;br /&gt;
                          iguales_nat (S (S n)) 7 = true&lt;br /&gt;
                     H2 : true = iguales_nat n 5&lt;br /&gt;
                     ============================&lt;br /&gt;
                     true = iguales_nat (S (S n)) 7 *)&lt;br /&gt;
  symmetry in H2. (* n : nat&lt;br /&gt;
                     H1 : iguales_nat n 5 = true -&amp;gt; &lt;br /&gt;
                          iguales_nat (S (S n)) 7 = true&lt;br /&gt;
                     H2 : iguales_nat n 5 = true&lt;br /&gt;
                     ============================&lt;br /&gt;
                     true = iguales_nat (S (S n)) 7 *)&lt;br /&gt;
  apply H1 in H2. (* n : nat&lt;br /&gt;
                     H1 : iguales_nat n 5 = true -&amp;gt; &lt;br /&gt;
                          iguales_nat (S (S n)) 7 = true&lt;br /&gt;
                     H2 : iguales_nat (S (S n)) 7 = true&lt;br /&gt;
                     ============================&lt;br /&gt;
                     true = iguales_nat (S (S n)) 7 *)&lt;br /&gt;
  symmetry in H2. (* n : nat&lt;br /&gt;
                     H1 : iguales_nat n 5 = true -&amp;gt; &lt;br /&gt;
                          iguales_nat (S (S n)) 7 = true&lt;br /&gt;
                     H2 : true = iguales_nat (S (S n)) 7&lt;br /&gt;
                     ============================&lt;br /&gt;
                     true = iguales_nat (S (S n)) 7 *)&lt;br /&gt;
  apply H2.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Nota. Uso de las tácticas &amp;#039;apply H1 in H2&amp;#039; y &amp;#039;symmetry in H&amp;#039;.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
(* =====================================================================&lt;br /&gt;
   § 5. Control de la hipótesis de inducción  &lt;br /&gt;
   ================================================================== *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 5.1. Demostrar que&lt;br /&gt;
      forall n m : nat,&lt;br /&gt;
       doble n = doble m -&amp;gt; n = m.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
(* 1ª intento *)&lt;br /&gt;
Theorem doble_inyectiva_fallado : forall n m : nat,&lt;br /&gt;
    doble n = doble m -&amp;gt;&lt;br /&gt;
    n = m.&lt;br /&gt;
Proof.&lt;br /&gt;
  intros n m.             (* n, m : nat&lt;br /&gt;
                             ============================&lt;br /&gt;
                             doble n = doble m -&amp;gt; n = m *)&lt;br /&gt;
  induction n as [| n&amp;#039; HI].&lt;br /&gt;
  -                       (* m : nat&lt;br /&gt;
                             ============================&lt;br /&gt;
                             doble 0 = doble m -&amp;gt; 0 = m *)&lt;br /&gt;
    simpl.                (* m : nat&lt;br /&gt;
                             ============================&lt;br /&gt;
                             0 = doble m -&amp;gt; 0 = m *)&lt;br /&gt;
    intros H.             (* m : nat&lt;br /&gt;
                             H : 0 = doble m&lt;br /&gt;
                             ============================&lt;br /&gt;
                             0 = m *)&lt;br /&gt;
    destruct m as [| m&amp;#039;]. &lt;br /&gt;
    +                     (* H : 0 = doble 0&lt;br /&gt;
                             ============================&lt;br /&gt;
                             0 = 0 *)&lt;br /&gt;
      reflexivity.&lt;br /&gt;
    +                     (* m&amp;#039; : nat&lt;br /&gt;
                             H : 0 = doble (S m&amp;#039;)&lt;br /&gt;
                             ============================&lt;br /&gt;
                             0 = S m&amp;#039; *)&lt;br /&gt;
      inversion H.&lt;br /&gt;
  -                       (* n&amp;#039;, m : nat&lt;br /&gt;
                             HI : doble n&amp;#039; = doble m -&amp;gt; n&amp;#039; = m&lt;br /&gt;
                             ============================&lt;br /&gt;
                             doble (S n&amp;#039;) = doble m -&amp;gt; S n&amp;#039; = m *)&lt;br /&gt;
    intros H.             (* n&amp;#039;, m : nat&lt;br /&gt;
                             HI : doble n&amp;#039; = doble m -&amp;gt; n&amp;#039; = m&lt;br /&gt;
                             H : doble (S n&amp;#039;) = doble m&lt;br /&gt;
                             ============================&lt;br /&gt;
                             S n&amp;#039; = m *)&lt;br /&gt;
    destruct m as [| m&amp;#039;].&lt;br /&gt;
    +                     (* n&amp;#039; : nat&lt;br /&gt;
                             HI : doble n&amp;#039; = doble 0 -&amp;gt; n&amp;#039; = 0&lt;br /&gt;
                             H : doble (S n&amp;#039;) = doble 0&lt;br /&gt;
                             ============================&lt;br /&gt;
                             S n&amp;#039; = 0 *)&lt;br /&gt;
      simpl in H.         (* n&amp;#039; : nat&lt;br /&gt;
                             HI : doble n&amp;#039; = doble 0 -&amp;gt; n&amp;#039; = 0&lt;br /&gt;
                             H : S (S (doble n&amp;#039;)) = 0&lt;br /&gt;
                             ============================&lt;br /&gt;
                             S n&amp;#039; = 0 *)&lt;br /&gt;
      inversion H.&lt;br /&gt;
    +                     (* n&amp;#039;, m&amp;#039; : nat&lt;br /&gt;
                             HI : doble n&amp;#039; = doble (S m&amp;#039;) -&amp;gt; n&amp;#039; = S m&amp;#039;&lt;br /&gt;
                             H : doble (S n&amp;#039;) = doble (S m&amp;#039;)&lt;br /&gt;
                             ============================&lt;br /&gt;
                             S n&amp;#039; = S m&amp;#039; *)&lt;br /&gt;
      apply funcional.    (* n&amp;#039;, m&amp;#039; : nat&lt;br /&gt;
                             HI : doble n&amp;#039; = doble (S m&amp;#039;) -&amp;gt; n&amp;#039; = S m&amp;#039;&lt;br /&gt;
                             H : doble (S n&amp;#039;) = doble (S m&amp;#039;)&lt;br /&gt;
                             ============================&lt;br /&gt;
                             n&amp;#039; = m&amp;#039; *)&lt;br /&gt;
      Abort.&lt;br /&gt;
&lt;br /&gt;
(* 2º intento *)&lt;br /&gt;
Theorem doble_inyectiva: forall n m,&lt;br /&gt;
    doble n = doble m -&amp;gt;&lt;br /&gt;
    n = m.&lt;br /&gt;
Proof.&lt;br /&gt;
  intros n.               (* n : nat&lt;br /&gt;
                             ============================&lt;br /&gt;
                             forall m : nat, doble n = doble m -&amp;gt; n = m *)&lt;br /&gt;
  induction n as [| n&amp;#039; HI].&lt;br /&gt;
  -                       (* &lt;br /&gt;
                             ============================&lt;br /&gt;
                             forall m : nat, doble 0 = doble m -&amp;gt; 0 = m *)&lt;br /&gt;
    simpl.                (* forall m : nat, 0 = doble m -&amp;gt; 0 = m *)&lt;br /&gt;
    intros m H.           (* m : nat&lt;br /&gt;
                             H : 0 = doble m&lt;br /&gt;
                             ============================&lt;br /&gt;
                             0 = m *)&lt;br /&gt;
    destruct m as [| m&amp;#039;].&lt;br /&gt;
    +                     (* H : 0 = doble 0&lt;br /&gt;
                             ============================&lt;br /&gt;
                             0 = 0 *)&lt;br /&gt;
      reflexivity.&lt;br /&gt;
    +                     (* m&amp;#039; : nat&lt;br /&gt;
                             H : 0 = doble (S m&amp;#039;)&lt;br /&gt;
                             ============================&lt;br /&gt;
                             0 = S m&amp;#039; *)&lt;br /&gt;
      inversion H.&lt;br /&gt;
  -                       (* n&amp;#039; : nat&lt;br /&gt;
                             HI : forall m : nat, doble n&amp;#039; = doble m -&amp;gt; n&amp;#039; = m&lt;br /&gt;
                             ============================&lt;br /&gt;
                             forall m : nat, doble (S n&amp;#039;) = doble m &lt;br /&gt;
                                             -&amp;gt; S n&amp;#039; = m *)&lt;br /&gt;
    simpl.                (* forall m : nat, S (S (doble n&amp;#039;)) = doble m &lt;br /&gt;
                                             -&amp;gt; S n&amp;#039; = m *)&lt;br /&gt;
    intros m H.           (* n&amp;#039; : nat&lt;br /&gt;
                             HI : forall m : nat, doble n&amp;#039; = doble m -&amp;gt; n&amp;#039; = m&lt;br /&gt;
                             m : nat&lt;br /&gt;
                             H : S (S (doble n&amp;#039;)) = doble m&lt;br /&gt;
                             ============================&lt;br /&gt;
                             S n&amp;#039; = m *)&lt;br /&gt;
    destruct m as [| m&amp;#039;]. &lt;br /&gt;
    +                     (* n&amp;#039; : nat&lt;br /&gt;
                             HI : forall m : nat, doble n&amp;#039; = doble m -&amp;gt; n&amp;#039; = m&lt;br /&gt;
                             H : S (S (doble n&amp;#039;)) = doble 0&lt;br /&gt;
                             ============================&lt;br /&gt;
                             S n&amp;#039; = 0 *)&lt;br /&gt;
      simpl in H.         (* n&amp;#039; : nat&lt;br /&gt;
                             HI : forall m : nat, doble n&amp;#039; = doble m -&amp;gt; n&amp;#039; = m&lt;br /&gt;
                             H : S (S (doble n&amp;#039;)) = 0&lt;br /&gt;
                             ============================&lt;br /&gt;
                             S n&amp;#039; = 0 *)&lt;br /&gt;
      inversion H.&lt;br /&gt;
    +                     (* n&amp;#039; : nat&lt;br /&gt;
                             HI : forall m : nat, doble n&amp;#039; = doble m -&amp;gt; n&amp;#039; = m&lt;br /&gt;
                             m&amp;#039; : nat&lt;br /&gt;
                             H : S (S (doble n&amp;#039;)) = doble (S m&amp;#039;)&lt;br /&gt;
                             ============================&lt;br /&gt;
                             S n&amp;#039; = S m&amp;#039; *)&lt;br /&gt;
      apply funcional.    (* n&amp;#039; = m&amp;#039; *)&lt;br /&gt;
      apply HI.           (* doble n&amp;#039; = doble m&amp;#039; *)&lt;br /&gt;
      inversion H.        (* n&amp;#039; : nat&lt;br /&gt;
                             HI : forall m : nat, doble n&amp;#039; = doble m -&amp;gt; n&amp;#039; = m&lt;br /&gt;
                             m&amp;#039; : nat&lt;br /&gt;
                             H : S (S (doble n&amp;#039;)) = doble (S m&amp;#039;)&lt;br /&gt;
                             H1 : doble n&amp;#039; = doble m&amp;#039;&lt;br /&gt;
                             ============================&lt;br /&gt;
                             doble n&amp;#039; = doble n&amp;#039; *)&lt;br /&gt;
      reflexivity.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Nota. Uso de la estrategia de generalización.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 5.2. Demostrar que&lt;br /&gt;
      forall n m : nat,&lt;br /&gt;
       doble n = doble m -&amp;gt;&lt;br /&gt;
       n = m.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
(* 1º intento *)&lt;br /&gt;
Theorem doble_inyectiva_2a: forall n m : nat,&lt;br /&gt;
    doble n = doble m -&amp;gt;&lt;br /&gt;
    n = m.&lt;br /&gt;
Proof.&lt;br /&gt;
  intros n m.                   (* n, m : nat&lt;br /&gt;
                                   ============================&lt;br /&gt;
                                   doble n = doble m -&amp;gt; n = m *)&lt;br /&gt;
  induction m as [| m&amp;#039; HI].&lt;br /&gt;
  -                             (* n : nat&lt;br /&gt;
                                   ============================&lt;br /&gt;
                                   doble n = doble 0 -&amp;gt; n = 0 *)&lt;br /&gt;
    simpl.                      (* doble n = 0 -&amp;gt; n = 0 *)&lt;br /&gt;
    intros H.                   (* n : nat&lt;br /&gt;
                                   H : doble n = 0&lt;br /&gt;
                                   ============================&lt;br /&gt;
                                   n = 0 *)&lt;br /&gt;
    destruct n as [| n&amp;#039;].&lt;br /&gt;
    +                           (* H : doble 0 = 0&lt;br /&gt;
                                   ============================&lt;br /&gt;
                                   0 = 0 *)&lt;br /&gt;
      reflexivity.&lt;br /&gt;
    +                           (* n&amp;#039; : nat&lt;br /&gt;
                                   H : doble (S n&amp;#039;) = 0&lt;br /&gt;
                                   ============================&lt;br /&gt;
                                   S n&amp;#039; = 0 *)&lt;br /&gt;
      simpl in H.               (* n&amp;#039; : nat&lt;br /&gt;
                                   H : S (S (doble n&amp;#039;)) = 0&lt;br /&gt;
                                   ============================&lt;br /&gt;
                                   S n&amp;#039; = 0 *)&lt;br /&gt;
      inversion H.&lt;br /&gt;
  -                             (* n, m&amp;#039; : nat&lt;br /&gt;
                                   HI : doble n = doble m&amp;#039; -&amp;gt; n = m&amp;#039;&lt;br /&gt;
                                   ============================&lt;br /&gt;
                                   doble n = doble (S m&amp;#039;) -&amp;gt; n = S m&amp;#039; *)&lt;br /&gt;
&lt;br /&gt;
    intros H.                   (* n, m&amp;#039; : nat&lt;br /&gt;
                                   HI : doble n = doble m&amp;#039; -&amp;gt; n = m&amp;#039;&lt;br /&gt;
                                   H : doble n = doble (S m&amp;#039;)&lt;br /&gt;
                                   ============================&lt;br /&gt;
                                   n = S m&amp;#039; *)&lt;br /&gt;
    destruct n as [| n&amp;#039;]. &lt;br /&gt;
    +                           (* m&amp;#039; : nat&lt;br /&gt;
                                   HI : doble 0 = doble m&amp;#039; -&amp;gt; 0 = m&amp;#039;&lt;br /&gt;
                                   H : doble 0 = doble (S m&amp;#039;)&lt;br /&gt;
                                   ============================&lt;br /&gt;
                                   0 = S m&amp;#039; *)&lt;br /&gt;
      simpl in H.               (* m&amp;#039; : nat&lt;br /&gt;
                                   HI : doble 0 = doble m&amp;#039; -&amp;gt; 0 = m&amp;#039;&lt;br /&gt;
                                   H : 0 = S (S (doble m&amp;#039;))&lt;br /&gt;
                                   ============================&lt;br /&gt;
                                   0 = S m&amp;#039; *)&lt;br /&gt;
      inversion H.&lt;br /&gt;
    +                           (* n&amp;#039;, m&amp;#039; : nat&lt;br /&gt;
                                   HI : doble (S n&amp;#039;) = doble m&amp;#039; -&amp;gt; S n&amp;#039; = m&amp;#039;&lt;br /&gt;
                                   H : doble (S n&amp;#039;) = doble (S m&amp;#039;)&lt;br /&gt;
                                   ============================&lt;br /&gt;
                                   S n&amp;#039; = S m&amp;#039; *)&lt;br /&gt;
      apply funcional.          (* n&amp;#039; = m&amp;#039; *)&lt;br /&gt;
Abort.&lt;br /&gt;
&lt;br /&gt;
(* 2º intento *)&lt;br /&gt;
Theorem doble_inyectiva_2 : forall n m,&lt;br /&gt;
    doble n = doble m -&amp;gt;&lt;br /&gt;
    n = m.&lt;br /&gt;
Proof.&lt;br /&gt;
  intros n m.               (* n, m : nat&lt;br /&gt;
                               ============================&lt;br /&gt;
                               doble n = doble m -&amp;gt; n = m *)&lt;br /&gt;
  generalize dependent n.   (* m : nat&lt;br /&gt;
                               ============================&lt;br /&gt;
                               forall n : nat, doble n = doble m -&amp;gt; n = m *)&lt;br /&gt;
  induction m as [| m&amp;#039; HI]. &lt;br /&gt;
  -                         (*  &lt;br /&gt;
                               ============================&lt;br /&gt;
                               forall n : nat, doble n = doble 0 -&amp;gt; n = 0 *)&lt;br /&gt;
    simpl.                  (* forall n : nat, doble n = 0 -&amp;gt; n = 0 *)&lt;br /&gt;
    intros n H.             (* n : nat&lt;br /&gt;
                               H : doble n = 0&lt;br /&gt;
                               ============================&lt;br /&gt;
                               n = 0 *)&lt;br /&gt;
    destruct n as [| n&amp;#039;].&lt;br /&gt;
    +                       (* H : doble 0 = 0&lt;br /&gt;
                               ============================&lt;br /&gt;
                               0 = 0 *)&lt;br /&gt;
      reflexivity.&lt;br /&gt;
    +                       (* n&amp;#039; : nat&lt;br /&gt;
                               H : doble (S n&amp;#039;) = 0&lt;br /&gt;
                               ============================&lt;br /&gt;
                               S n&amp;#039; = 0 *)&lt;br /&gt;
      simpl in H.           (* n&amp;#039; : nat&lt;br /&gt;
                               H : S (S (doble n&amp;#039;)) = 0&lt;br /&gt;
                               ============================&lt;br /&gt;
                               S n&amp;#039; = 0 *)&lt;br /&gt;
      inversion H.&lt;br /&gt;
  -                         (* m&amp;#039; : nat&lt;br /&gt;
                               HI : forall n : nat, doble n = doble m&amp;#039; -&amp;gt; n = m&amp;#039;&lt;br /&gt;
                               ============================&lt;br /&gt;
                               forall n : nat, doble n = doble (S m&amp;#039;) &lt;br /&gt;
                                               -&amp;gt; n = S m&amp;#039; *)&lt;br /&gt;
    intros n H.             (* m&amp;#039; : nat&lt;br /&gt;
                               HI : forall n : nat, doble n = doble m&amp;#039; -&amp;gt; n = m&amp;#039;&lt;br /&gt;
                               n : nat&lt;br /&gt;
                               H : doble n = doble (S m&amp;#039;)&lt;br /&gt;
                               ============================&lt;br /&gt;
                               n = S m&amp;#039; *)&lt;br /&gt;
    destruct n as [| n&amp;#039;]. &lt;br /&gt;
    +                       (* m&amp;#039; : nat&lt;br /&gt;
                               HI : forall n : nat, doble n = doble m&amp;#039; -&amp;gt; n = m&amp;#039;&lt;br /&gt;
                               H : doble 0 = doble (S m&amp;#039;)&lt;br /&gt;
                               ============================&lt;br /&gt;
                               0 = S m&amp;#039; *)&lt;br /&gt;
      simpl in H.           (* m&amp;#039; : nat&lt;br /&gt;
                               HI : forall n : nat, doble n = doble m&amp;#039; -&amp;gt; n = m&amp;#039;&lt;br /&gt;
                               H : 0 = S (S (doble m&amp;#039;))&lt;br /&gt;
                               ============================&lt;br /&gt;
                               0 = S m&amp;#039; *)&lt;br /&gt;
      inversion H.&lt;br /&gt;
    +                       (* m&amp;#039; : nat&lt;br /&gt;
                               HI : forall n : nat, doble n = doble m&amp;#039; -&amp;gt; n = m&amp;#039;&lt;br /&gt;
                               n&amp;#039; : nat&lt;br /&gt;
                               H : doble (S n&amp;#039;) = doble (S m&amp;#039;)&lt;br /&gt;
                               ============================&lt;br /&gt;
                               S n&amp;#039; = S m&amp;#039; *)&lt;br /&gt;
      apply funcional.      (* n&amp;#039; = m&amp;#039; *)&lt;br /&gt;
      apply HI.             (* doble n&amp;#039; = doble m&amp;#039; *)&lt;br /&gt;
      simpl in H.           (* m&amp;#039; : nat&lt;br /&gt;
                               HI : forall n : nat, doble n = doble m&amp;#039; -&amp;gt; n = m&amp;#039;&lt;br /&gt;
                               n&amp;#039; : nat&lt;br /&gt;
                               H : S (S (doble n&amp;#039;)) = S (S (doble m&amp;#039;))&lt;br /&gt;
                               ============================&lt;br /&gt;
                               doble n&amp;#039; = doble m&amp;#039; *)&lt;br /&gt;
      inversion H.          (* m&amp;#039; : nat&lt;br /&gt;
                               HI : forall n : nat, doble n = doble m&amp;#039; -&amp;gt; n = m&amp;#039;&lt;br /&gt;
                               n&amp;#039; : nat&lt;br /&gt;
                               H : S (S (doble n&amp;#039;)) = S (S (doble m&amp;#039;))&lt;br /&gt;
                               H1 : doble n&amp;#039; = doble m&amp;#039;&lt;br /&gt;
                               ============================&lt;br /&gt;
                               doble n&amp;#039; = doble n&amp;#039; *)&lt;br /&gt;
      reflexivity.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Nota. Uso de la táctica &amp;#039;generalize dependent n&amp;#039;.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 5.3. Demostrar que&lt;br /&gt;
      forall n m : nat,&lt;br /&gt;
        iguales_nat n m = true -&amp;gt; n = m.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Theorem iguales_nat_true : forall n m : nat,&lt;br /&gt;
    iguales_nat n m = true -&amp;gt; n = m.&lt;br /&gt;
Proof.&lt;br /&gt;
  induction n as [|n&amp;#039; HIn&amp;#039;].&lt;br /&gt;
  -                             (* &lt;br /&gt;
                                   ============================&lt;br /&gt;
                                   forall m : nat, iguales_nat 0 m = true &lt;br /&gt;
                                              -&amp;gt; 0 = m *)&lt;br /&gt;
    induction m as [|m&amp;#039; HIm&amp;#039;].&lt;br /&gt;
    +                           (* &lt;br /&gt;
                                   ============================&lt;br /&gt;
                                   iguales_nat 0 0 = true -&amp;gt; 0 = 0 *)&lt;br /&gt;
      reflexivity.&lt;br /&gt;
    +                           (* m&amp;#039; : nat&lt;br /&gt;
                                   HIm&amp;#039; : iguales_nat 0 m&amp;#039; = true -&amp;gt; 0 = m&amp;#039;&lt;br /&gt;
                                   ============================&lt;br /&gt;
                                   iguales_nat 0 (S m&amp;#039;) = true -&amp;gt; 0 = S m&amp;#039; *)&lt;br /&gt;
      simpl.                    (* false = true -&amp;gt; 0 = S m&amp;#039; *)&lt;br /&gt;
      intros H.                 (* m&amp;#039; : nat&lt;br /&gt;
                                   HIm&amp;#039; : iguales_nat 0 m&amp;#039; = true -&amp;gt; 0 = m&amp;#039;&lt;br /&gt;
                                   H : false = true&lt;br /&gt;
                                   ============================&lt;br /&gt;
                                   0 = S m&amp;#039; *)&lt;br /&gt;
      inversion H.&lt;br /&gt;
  -                             (* n&amp;#039; : nat&lt;br /&gt;
                                   HIn&amp;#039; : forall m:nat, iguales_nat n&amp;#039; m = true&lt;br /&gt;
                                                         -&amp;gt; n&amp;#039; = m&lt;br /&gt;
                                   ============================&lt;br /&gt;
                                   forall m : nat, iguales_nat (S n&amp;#039;) m = true&lt;br /&gt;
                                                   -&amp;gt; S n&amp;#039; = m *)&lt;br /&gt;
    induction m as [|m&amp;#039; HIm&amp;#039;].&lt;br /&gt;
    +                           (* n&amp;#039; : nat&lt;br /&gt;
                                   HIn&amp;#039; : forall m:nat, iguales_nat n&amp;#039; m = true&lt;br /&gt;
                                                         -&amp;gt; n&amp;#039; = m&lt;br /&gt;
                                   ============================&lt;br /&gt;
                                   iguales_nat (S n&amp;#039;) 0 = true -&amp;gt; S n&amp;#039; = 0 *)&lt;br /&gt;
      simpl.                    (* false = true -&amp;gt; S n&amp;#039; = 0 *)&lt;br /&gt;
      intros H.                 (* n&amp;#039; : nat&lt;br /&gt;
                                   HIn&amp;#039; : forall m:nat, iguales_nat n&amp;#039; m = true&lt;br /&gt;
                                                        -&amp;gt; n&amp;#039; = m&lt;br /&gt;
                                   H : false = true&lt;br /&gt;
                                   ============================&lt;br /&gt;
                                   S n&amp;#039; = 0 *)&lt;br /&gt;
      inversion H.&lt;br /&gt;
    +                           (* n&amp;#039; : nat&lt;br /&gt;
                                   HIn&amp;#039; : forall m:nat, iguales_nat n&amp;#039; m = true&lt;br /&gt;
                                                         -&amp;gt; n&amp;#039; = m&lt;br /&gt;
                                   m&amp;#039; : nat&lt;br /&gt;
                                   HIm&amp;#039; : iguales_nat (S n&amp;#039;) m&amp;#039; = true &lt;br /&gt;
                                          -&amp;gt; S n&amp;#039; = m&amp;#039;&lt;br /&gt;
                                   ============================&lt;br /&gt;
                                   iguales_nat (S n&amp;#039;) (S m&amp;#039;) = true &lt;br /&gt;
                                   -&amp;gt; S n&amp;#039; = S m&amp;#039; *)&lt;br /&gt;
      simpl.                    (* iguales_nat n&amp;#039; m&amp;#039; = true -&amp;gt; S n&amp;#039; = S m&amp;#039; *)&lt;br /&gt;
      intros H.                 (* n&amp;#039; : nat&lt;br /&gt;
                                   HIn&amp;#039; : forall m:nat, iguales_nat n&amp;#039; m = true&lt;br /&gt;
                                                         -&amp;gt; n&amp;#039; = m&lt;br /&gt;
                                   m&amp;#039; : nat&lt;br /&gt;
                                   HIm&amp;#039; : iguales_nat (S n&amp;#039;) m&amp;#039; = true &lt;br /&gt;
                                          -&amp;gt; S n&amp;#039; = m&amp;#039;&lt;br /&gt;
                                   H : iguales_nat n&amp;#039; m&amp;#039; = true&lt;br /&gt;
                                   ============================&lt;br /&gt;
                                   S n&amp;#039; = S m&amp;#039; *)&lt;br /&gt;
      apply HIn&amp;#039; in H.          (* n&amp;#039; : nat&lt;br /&gt;
                                   HIn&amp;#039; : forall m:nat, iguales_nat n&amp;#039; m = true&lt;br /&gt;
                                                         -&amp;gt; n&amp;#039; = m&lt;br /&gt;
                                   m&amp;#039; : nat&lt;br /&gt;
                                   HIm&amp;#039; : iguales_nat (S n&amp;#039;) m&amp;#039; = true &lt;br /&gt;
                                          -&amp;gt; S n&amp;#039; = m&amp;#039;&lt;br /&gt;
                                   H : n&amp;#039; = m&amp;#039;&lt;br /&gt;
                                   ============================&lt;br /&gt;
                                   S n&amp;#039; = S m&amp;#039; *)&lt;br /&gt;
      rewrite H.                (* S m&amp;#039; = S m&amp;#039; *)&lt;br /&gt;
      reflexivity.&lt;br /&gt;
Qed.&lt;br /&gt;
    &lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 5.3. Demostrar que&lt;br /&gt;
      forall x y : id,&lt;br /&gt;
       iguales_id x y = true -&amp;gt; x = y.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Theorem iguales_id_true: forall x y : id,&lt;br /&gt;
  iguales_id x y = true -&amp;gt; x = y.&lt;br /&gt;
Proof.&lt;br /&gt;
  intros [m] [n].           (* m, n : nat&lt;br /&gt;
                               ============================&lt;br /&gt;
                               iguales_id (Id m) (Id n) = true -&amp;gt; Id m = Id n *)&lt;br /&gt;
  simpl.                    (* iguales_nat m n = true -&amp;gt; Id m = Id n *)&lt;br /&gt;
  intros H.                 (* m, n : nat&lt;br /&gt;
                               H : iguales_nat m n = true&lt;br /&gt;
                               ============================&lt;br /&gt;
                               Id m = Id n *)&lt;br /&gt;
  assert (H&amp;#039; : m = n).&lt;br /&gt;
  -                         (* m, n : nat&lt;br /&gt;
                               H : iguales_nat m n = true&lt;br /&gt;
                               ============================&lt;br /&gt;
                               m = n *)&lt;br /&gt;
    apply iguales_nat_true. (* iguales_nat m n = true *)&lt;br /&gt;
    apply H. &lt;br /&gt;
  -                         (* m, n : nat&lt;br /&gt;
                               H : iguales_nat m n = true&lt;br /&gt;
                               H&amp;#039; : m = n&lt;br /&gt;
                               ============================&lt;br /&gt;
                               Id m = Id n *)&lt;br /&gt;
    rewrite H&amp;#039;.             (* Id n = Id n *)&lt;br /&gt;
    reflexivity.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* =====================================================================&lt;br /&gt;
   § 6. Expansión de definiciones &lt;br /&gt;
   ================================================================== *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 6.1. Definir la función&lt;br /&gt;
      cuadrado : nata -&amp;gt; nat&lt;br /&gt;
   tal que (cuadrado n) es el cuadrado de n.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Definition cuadrado (n:nat) : nat := n * n.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 6.2. Demostrar que&lt;br /&gt;
      forall n m : nat,&lt;br /&gt;
       cuadrado (n * m) = cuadrado n * cuadrado m.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Lemma cuadrado_mult : forall n m : nat,&lt;br /&gt;
    cuadrado (n * m) = cuadrado n * cuadrado m.&lt;br /&gt;
Proof.&lt;br /&gt;
  intros n m.                            (* n, m : nat&lt;br /&gt;
                                            ============================&lt;br /&gt;
                                            cuadrado (n * m) = &lt;br /&gt;
                                            cuadrado n * cuadrado m *)&lt;br /&gt;
  unfold cuadrado.                       (* (n * m) * (n * m) = &lt;br /&gt;
                                            (n * n) * (m * m) *)&lt;br /&gt;
  rewrite producto_asociativa.           (* ((n * m) * n) * m = &lt;br /&gt;
                                            (n * n) * (m * m) *)&lt;br /&gt;
  assert (H : (n * m) * n = (n * n) * m). &lt;br /&gt;
  -                                      (* (n * m) * n = (n * n) * m) *)&lt;br /&gt;
    rewrite producto_conmutativa.        (* n * (n * m) = (n * n) * m *)&lt;br /&gt;
    apply producto_asociativa.           &lt;br /&gt;
  -                                      (* n, m : nat&lt;br /&gt;
                                            H : (n * m) * n = (n * n) * m&lt;br /&gt;
                                            ============================&lt;br /&gt;
                                            ((n * m) * n) * m = &lt;br /&gt;
                                            (n * n) * (m * m) *)&lt;br /&gt;
    rewrite H.                           (* ((n * n) * m) * m = &lt;br /&gt;
                                            (n * n) * (m * m) *)&lt;br /&gt;
    rewrite producto_asociativa.         (* ((n * n) * m) * m = &lt;br /&gt;
                                            ((n * n) * m) * m *)&lt;br /&gt;
    reflexivity.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Nota. Uso de la táctica &amp;#039;unfold&amp;#039;&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 6.4. Definir la función&lt;br /&gt;
      const5 : nat -&amp;gt; nat&lt;br /&gt;
   tal que (const5 x) es el número 5.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Definition const5 (x: nat) : nat := 5.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 6.5. Demostrar que&lt;br /&gt;
      forall m : nat,&lt;br /&gt;
       const5 m + 1 = const5 (m + 1) + 1.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Fact prop_const5 : forall m : nat,&lt;br /&gt;
    const5 m + 1 = const5 (m + 1) + 1.&lt;br /&gt;
Proof.&lt;br /&gt;
  intros m.    (* m : nat&lt;br /&gt;
                  ============================&lt;br /&gt;
                  const5 m + 1 = const5 (m + 1) + 1 *)&lt;br /&gt;
  simpl.       (* 6 = 6 *)&lt;br /&gt;
  reflexivity. &lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Nota. Expansión automática de la definición de const5.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 6.6. Se coonsidera la siguiente definición&lt;br /&gt;
      Definition const5b (x:nat) : nat :=&lt;br /&gt;
        match x with&lt;br /&gt;
        | O   =&amp;gt; 5&lt;br /&gt;
        | S _ =&amp;gt; 5&lt;br /&gt;
        end.&lt;br /&gt;
&lt;br /&gt;
   Demostrar que&lt;br /&gt;
      forall m : nat,&lt;br /&gt;
       const5b m + 1 = const5b (m + 1) + 1.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Definition const5b (x:nat) : nat :=&lt;br /&gt;
  match x with&lt;br /&gt;
  | O   =&amp;gt; 5&lt;br /&gt;
  | S _ =&amp;gt; 5&lt;br /&gt;
  end.&lt;br /&gt;
&lt;br /&gt;
(* 1º intento *)&lt;br /&gt;
Fact prop_const5b_1: forall m : nat,&lt;br /&gt;
    const5b m + 1 = const5b (m + 1) + 1.&lt;br /&gt;
Proof.&lt;br /&gt;
  intros m. (* m : nat&lt;br /&gt;
               ============================&lt;br /&gt;
               const5b m + 1 = const5b (m + 1) + 1 *)&lt;br /&gt;
  simpl.    (* const5b m + 1 = const5b (m + 1) + 1 *)&lt;br /&gt;
Abort.&lt;br /&gt;
&lt;br /&gt;
(* 1ª demostración *)&lt;br /&gt;
Fact prop_const5b_2: forall m : nat,&lt;br /&gt;
    const5b m + 1 = const5b (m + 1) + 1.&lt;br /&gt;
Proof.&lt;br /&gt;
  intros m.      (* m : nat&lt;br /&gt;
                    ============================&lt;br /&gt;
                    const5b m + 1 = const5b (m + 1) + 1 *)&lt;br /&gt;
  destruct m.&lt;br /&gt;
  -              (* &lt;br /&gt;
                    ============================&lt;br /&gt;
                    const5b 0 + 1 = const5b (0 + 1) + 1 *)&lt;br /&gt;
    simpl.       (* 6 = 6 *)&lt;br /&gt;
    reflexivity. &lt;br /&gt;
  -              (* m : nat&lt;br /&gt;
                    ============================&lt;br /&gt;
                    const5b (S m) + 1 = const5b (S m + 1) + 1 *)&lt;br /&gt;
    simpl.       (* 6 = 6 *)&lt;br /&gt;
    reflexivity.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* 2ª demostración *)&lt;br /&gt;
Fact prop_const5b_3: forall m : nat,&lt;br /&gt;
    const5b m + 1 = const5b (m + 1) + 1.&lt;br /&gt;
Proof.&lt;br /&gt;
  intros m.       (* m : nat&lt;br /&gt;
                     ============================&lt;br /&gt;
                     const5b m + 1 = const5b (m + 1) + 1 *)&lt;br /&gt;
  unfold const5b. (* m : nat&lt;br /&gt;
                     ============================&lt;br /&gt;
                     match m with&lt;br /&gt;
                     | 0 | _ =&amp;gt; 5&lt;br /&gt;
                     end + 1 = match m + 1 with&lt;br /&gt;
                               | 0 | _ =&amp;gt; 5&lt;br /&gt;
                               end + 1 *)&lt;br /&gt;
  destruct m.&lt;br /&gt;
  -               (* &lt;br /&gt;
                     ============================&lt;br /&gt;
                     5 + 1 = match 0 + 1 with&lt;br /&gt;
                             | 0 | _ =&amp;gt; 5&lt;br /&gt;
                             end + 1 *)&lt;br /&gt;
    reflexivity.&lt;br /&gt;
  -               (* m : nat&lt;br /&gt;
                     ============================&lt;br /&gt;
                     5 + 1 = match S m + 1 with&lt;br /&gt;
                             | 0 | _ =&amp;gt; 5&lt;br /&gt;
                             end + 1 *)&lt;br /&gt;
    reflexivity.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* =====================================================================&lt;br /&gt;
   § 7. Uso de &amp;#039;destruct&amp;#039; sobre expresiones compuestas&lt;br /&gt;
   ================================================================== *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 7.1. Se considera la siguiente definición &lt;br /&gt;
      Definition const_false (n : nat) : bool :=&lt;br /&gt;
        if      iguales_nat n 3 then false&lt;br /&gt;
        else if iguales_nat n 5 then false&lt;br /&gt;
        else                         false.&lt;br /&gt;
&lt;br /&gt;
   Demostrar que&lt;br /&gt;
      forall n : nat,&lt;br /&gt;
       const_false n = false.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Definition const_false (n : nat) : bool :=&lt;br /&gt;
  if      iguales_nat n 3 then false&lt;br /&gt;
  else if iguales_nat n 5 then false&lt;br /&gt;
  else                         false.&lt;br /&gt;
&lt;br /&gt;
Theorem const_false_false : forall n : nat,&lt;br /&gt;
    const_false n = false.&lt;br /&gt;
Proof.&lt;br /&gt;
  intros n.                     (* n : nat&lt;br /&gt;
                                   ============================&lt;br /&gt;
                                   const_false n = false *)&lt;br /&gt;
  unfold const_false.           (* (if iguales_nat n 3 then false &lt;br /&gt;
                                   else if iguales_nat n 5 then false &lt;br /&gt;
                                   else false) =&lt;br /&gt;
                                   false *)&lt;br /&gt;
  destruct (iguales_nat n 3).&lt;br /&gt;
  -                             (* n : nat&lt;br /&gt;
                                   ============================&lt;br /&gt;
                                   false = false *)&lt;br /&gt;
    reflexivity.&lt;br /&gt;
  -                             (* n : nat&lt;br /&gt;
                                   ============================&lt;br /&gt;
                                   (if iguales_nat n 5 then false &lt;br /&gt;
                                   else false) = false *)&lt;br /&gt;
    destruct (iguales_nat n 5). &lt;br /&gt;
    +                           (* n : nat&lt;br /&gt;
                                   ============================&lt;br /&gt;
                                   false = false *)&lt;br /&gt;
      reflexivity.&lt;br /&gt;
    +                           (* n : nat&lt;br /&gt;
                                   ============================&lt;br /&gt;
                                   false = false *)&lt;br /&gt;
      reflexivity.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 7.2. Se considera la siguiente definición &lt;br /&gt;
      Definition ej (n : nat) : bool :=&lt;br /&gt;
        if      iguales_nat n 3 then true&lt;br /&gt;
        else if iguales_nat n 5 then true&lt;br /&gt;
        else                     false.&lt;br /&gt;
&lt;br /&gt;
   Demostrar que&lt;br /&gt;
      forall n : nat,&lt;br /&gt;
       ej n = true -&amp;gt; esImpar n = true.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Definition ej (n : nat) : bool :=&lt;br /&gt;
  if      iguales_nat n 3 then true&lt;br /&gt;
  else if iguales_nat n 5 then true&lt;br /&gt;
  else                     false.&lt;br /&gt;
&lt;br /&gt;
(* 1º intento *)&lt;br /&gt;
Theorem ej_impar_a: forall n : nat,&lt;br /&gt;
    ej n = true -&amp;gt;&lt;br /&gt;
    esImpar n = true.&lt;br /&gt;
Proof.&lt;br /&gt;
  intros n H.                       (* n : nat&lt;br /&gt;
                                       H : ej n = true&lt;br /&gt;
                                       ============================&lt;br /&gt;
                                       esImpar n = true *)&lt;br /&gt;
  unfold ej in H. (* n : nat&lt;br /&gt;
                                      H : (if iguales_nat n 3&lt;br /&gt;
                                           then true&lt;br /&gt;
                                           else if iguales_nat n 5 &lt;br /&gt;
                                                then true &lt;br /&gt;
                                                else false) &lt;br /&gt;
                                          = true&lt;br /&gt;
                                      ============================&lt;br /&gt;
                                      esImpar n = true *)&lt;br /&gt;
  destruct (iguales_nat n 3).&lt;br /&gt;
  -                                (* n : nat&lt;br /&gt;
                                      H : true = true&lt;br /&gt;
                                      ============================&lt;br /&gt;
                                      esImpar n = true *)&lt;br /&gt;
Abort.&lt;br /&gt;
&lt;br /&gt;
(* 2º intento *)&lt;br /&gt;
Theorem ej_impar : forall n : nat,&lt;br /&gt;
    ej n = true -&amp;gt;&lt;br /&gt;
    esImpar n = true.&lt;br /&gt;
Proof.&lt;br /&gt;
  intros n H.                             (* n : nat&lt;br /&gt;
                                             H : ej n = true&lt;br /&gt;
                                             ============================&lt;br /&gt;
                                             esImpar n = true *)&lt;br /&gt;
  unfold ej in H.                         (* n : nat&lt;br /&gt;
                                             H : (if iguales_nat n 3&lt;br /&gt;
                                                  then true&lt;br /&gt;
                                                  else if iguales_nat n 5 &lt;br /&gt;
                                                       then true else false) &lt;br /&gt;
                                                 = true&lt;br /&gt;
                                             ============================&lt;br /&gt;
                                             esImpar n = true *)&lt;br /&gt;
  destruct (iguales_nat n 3) eqn: H3.&lt;br /&gt;
  -                                       (* n : nat&lt;br /&gt;
                                             H3 : iguales_nat n 3 = true&lt;br /&gt;
                                             H : true = true&lt;br /&gt;
                                             ============================&lt;br /&gt;
                                             esImpar n = true *)&lt;br /&gt;
    apply iguales_nat_true in H3.         (* n : nat&lt;br /&gt;
                                             H3 : n = 3&lt;br /&gt;
                                             H : true = true&lt;br /&gt;
                                             ============================&lt;br /&gt;
                                             esImpar n = true *)&lt;br /&gt;
    rewrite H3.                           (* esImpar 3 = true *)&lt;br /&gt;
    reflexivity.&lt;br /&gt;
  -                                       (* n : nat&lt;br /&gt;
                                             H3 : iguales_nat n 3 = false&lt;br /&gt;
                                             H : (if iguales_nat n 5 &lt;br /&gt;
                                                  then true else false) &lt;br /&gt;
                                                 = true&lt;br /&gt;
                                             ============================&lt;br /&gt;
                                             esImpar n = true *)&lt;br /&gt;
    destruct (iguales_nat n 5) eqn:H5. &lt;br /&gt;
    +                                     (* n : nat&lt;br /&gt;
                                             H3 : iguales_nat n 3 = false&lt;br /&gt;
                                             H5 : iguales_nat n 5 = true&lt;br /&gt;
                                             H : true = true&lt;br /&gt;
                                             ============================&lt;br /&gt;
                                             esImpar n = true *)&lt;br /&gt;
      apply iguales_nat_true in H5.       (* n : nat&lt;br /&gt;
                                             H3 : iguales_nat n 3 = false&lt;br /&gt;
                                             H5 : n = 5&lt;br /&gt;
                                             H : true = true&lt;br /&gt;
                                             ============================&lt;br /&gt;
                                             esImpar n = true *)&lt;br /&gt;
      rewrite H5.                         (* esImpar 5 = true *)&lt;br /&gt;
      reflexivity.&lt;br /&gt;
    +                                     (* n : nat&lt;br /&gt;
                                             H3 : iguales_nat n 3 = false&lt;br /&gt;
                                             H5 : iguales_nat n 5 = false&lt;br /&gt;
                                             H : false = true&lt;br /&gt;
                                             ============================&lt;br /&gt;
                                             esImpar n = true *)&lt;br /&gt;
      inversion H.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Nota. Uso de la táctica &amp;#039;destruct e eqn: H&amp;#039;.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
(* =====================================================================&lt;br /&gt;
   § 8. Resumen de tácticas básicas &lt;br /&gt;
   ================================================================== *)&lt;br /&gt;
&lt;br /&gt;
(* Las tácticas básicas utilizadas hasta ahora son&lt;br /&gt;
  + apply H: &lt;br /&gt;
    + si el objetivo coincide con la hipótesis H, lo demuestra;&lt;br /&gt;
    + si H es una implicación,&lt;br /&gt;
      + si el objetivo coincide con la conclusión de H, lo sustituye por&lt;br /&gt;
        su premisa y&lt;br /&gt;
      + si el objetivo coincide con la premisa de H, lo sustituye por&lt;br /&gt;
        su conclusión.&lt;br /&gt;
&lt;br /&gt;
  + apply ... with ...: Especifica los valores de las variables que no&lt;br /&gt;
    se pueden deducir por emparejamiento.&lt;br /&gt;
&lt;br /&gt;
  + apply H1 in H2: Aplica la igualdad de la hipótesis H1 a la&lt;br /&gt;
    hipótesis H2.&lt;br /&gt;
&lt;br /&gt;
  + assert (H: P): Incluye la demostración de la propiedad P y continúa&lt;br /&gt;
    la demostración añadiendo como premisa la propiedad P con nombre H. &lt;br /&gt;
&lt;br /&gt;
  + destruct b: Distingue dos casos según que b sea True o False.&lt;br /&gt;
&lt;br /&gt;
  + destruct n as [| n1]: Distingue dos casos según que n sea 0 o sea S n1. &lt;br /&gt;
&lt;br /&gt;
  + destruct p as [n m]: Sustituye el par p por (n,m).&lt;br /&gt;
&lt;br /&gt;
  + destruct e eqn: H: Distingue casos según el valor de la expresión&lt;br /&gt;
    e y lo añade al contexto la hipótesis H.&lt;br /&gt;
&lt;br /&gt;
  + generalize dependent x: Mueve la variable x (y las que dependan de&lt;br /&gt;
    ella) del contexto a una hipótesis explícita en el objetivo.&lt;br /&gt;
&lt;br /&gt;
  + induction n as [|n1 IHn1]: Inicia una demostración por inducción&lt;br /&gt;
    sobre n. El caso base en ~n  0~. El paso de la inducción consiste en&lt;br /&gt;
    suponer la propiedad para ~n1~ y demostrarla para ~S n1~. El nombre de la&lt;br /&gt;
    hipótesis de inducción es ~IHn1~.&lt;br /&gt;
&lt;br /&gt;
  + intros vars: Introduce las variables del cuantificador universal y,&lt;br /&gt;
    como premisas, los antecedentes de las implicaciones.&lt;br /&gt;
&lt;br /&gt;
  + inversion: Aplica que los constructores son disjuntos e inyectivos. &lt;br /&gt;
&lt;br /&gt;
  + reflexivity: Demuestra el objetivo si es una igualdad trivial.&lt;br /&gt;
&lt;br /&gt;
  + rewrite H: Sustituye el término izquierdo de H por el derecho.&lt;br /&gt;
&lt;br /&gt;
  + rewrite &amp;lt;-H: Sustituye el término derecho de H por el izquierdo.&lt;br /&gt;
&lt;br /&gt;
  + simpl: Simplifica el objetivo.&lt;br /&gt;
&lt;br /&gt;
  + simpl in H: Simplifica la hipótesis H.&lt;br /&gt;
&lt;br /&gt;
  + symmetry: Cambia un objetivo de la forma s = t en t = s.&lt;br /&gt;
&lt;br /&gt;
  + symmetry in H: Cambia la hipótesis H de la forma ~st~ en ~ts~.&lt;br /&gt;
&lt;br /&gt;
  + unfold f: Expande la definición de la función f.&lt;br /&gt;
 *)&lt;br /&gt;
&lt;br /&gt;
(* =====================================================================&lt;br /&gt;
   § Bibliografía&lt;br /&gt;
   ================================================================== *)&lt;br /&gt;
&lt;br /&gt;
(*&lt;br /&gt;
 + &amp;quot;More Basic Tactics&amp;quot; de Peirce et als. http://bit.ly/2LYFTlZ *)&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/RA2018/index.php?title=Tema_4:_Polimorfismo_y_funciones_de_orden_superior_en_Coq&amp;diff=371</id>
		<title>Tema 4: Polimorfismo y funciones de orden superior en Coq</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2018/index.php?title=Tema_4:_Polimorfismo_y_funciones_de_orden_superior_en_Coq&amp;diff=371"/>
		<updated>2019-02-14T07:36:47Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: Protegió «Tema 4: Polimorfismo y funciones de orden superior en Coq» ([Editar=Solo administradores] (indefinido) [Trasladar=Solo administradores] (indefinido))&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;coq&amp;quot;&amp;gt;&lt;br /&gt;
Require Export T3_EstructurasNat.&lt;br /&gt;
&lt;br /&gt;
(* El contenido del tema es&lt;br /&gt;
   1. Polimorfismo&lt;br /&gt;
      1. Listas polimórficas  &lt;br /&gt;
         1. Inferencia de tipos&lt;br /&gt;
         2. Síntesis de los tipos de los argumentos  &lt;br /&gt;
         3. Argumentos implícitos  &lt;br /&gt;
         4. Explicitación de argumentos  &lt;br /&gt;
         5. Ejercicios  &lt;br /&gt;
      2. Polimorfismo de pares  &lt;br /&gt;
      3. Resultados opcionales polimórficos  &lt;br /&gt;
   2. Funciones como datos&lt;br /&gt;
      1. Funciones de orden superior &lt;br /&gt;
      2. Filtrado  &lt;br /&gt;
      3. Funciones anónimas  &lt;br /&gt;
      4. Aplicación a todos los elementos (map)&lt;br /&gt;
      5. Plegados (fold)  &lt;br /&gt;
      6. Funciones que construyen funciones  &lt;br /&gt;
   3. Bibliografía&lt;br /&gt;
*)&lt;br /&gt;
&lt;br /&gt;
(* =====================================================================&lt;br /&gt;
   § 1. Polimorfismo&lt;br /&gt;
   ================================================================== *)&lt;br /&gt;
&lt;br /&gt;
(* =====================================================================&lt;br /&gt;
   §§ 1.1. Listas polimórficas  &lt;br /&gt;
   ================================================================== *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Nota. Se suprimen algunos avisos.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Set Warnings &amp;quot;-notation-overridden,-parsing&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 1.1.1. Definir el tipo (list X) para representar las listas&lt;br /&gt;
   de elementos de tipo X con los constructores nil y cons tales que &lt;br /&gt;
   + nil es la lista vacía y&lt;br /&gt;
   + (cons x ys) es la lista obtenida añadiendo el elemento x a la&lt;br /&gt;
     lista ys.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Inductive list (X : Type) : Type :=&lt;br /&gt;
  | nil  : list X&lt;br /&gt;
  | cons : X -&amp;gt; list X -&amp;gt; list X.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 1.1.2. Calcular el tipo de list.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Check list.&lt;br /&gt;
(* ===&amp;gt; list : Type -&amp;gt; Type *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 1.1.3. Calcular el tipo de (nil nat).&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Check (nil nat).&lt;br /&gt;
(* ===&amp;gt; nil nat : list nat *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 1.1.4. Calcular el tipo de (cons nat 3 (nil nat)).&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Check (cons nat 3 (nil nat)).&lt;br /&gt;
(* ===&amp;gt; cons nat 3 (nil nat) : list nat *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 1.1.5. Calcular el tipo de nil.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Check nil.&lt;br /&gt;
(* ===&amp;gt; nil : forall X : Type, list X *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 1.1.6. Calcular el tipo de cons.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Check cons.&lt;br /&gt;
(* ===&amp;gt; cons : forall X : Type, X -&amp;gt; list X -&amp;gt; list X *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 1.1.7. Calcular el tipo de &lt;br /&gt;
      (cons nat 2 (cons nat 1 (nil nat))).&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Check (cons nat 2 (cons nat 1 (nil nat))).&lt;br /&gt;
(* ==&amp;gt; cons nat 2 (cons nat 1 (nil nat)) : list nat *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 1.1.8. Definir la función&lt;br /&gt;
      repite (X : Type) (x : X) (n : nat) : list X&lt;br /&gt;
   tal que (repite X x n) es la lista, de elementos de tipo X, obtenida&lt;br /&gt;
   repitiendo n veces el elemento x. Por ejemplo,&lt;br /&gt;
      repite nat 4 2 = cons nat 4 (cons nat 4 (nil nat)).&lt;br /&gt;
      repite bool false 1 = cons bool false (nil bool).&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Fixpoint repite (X : Type) (x : X) (n : nat) : list X :=&lt;br /&gt;
  match n with&lt;br /&gt;
  | 0    =&amp;gt; nil X&lt;br /&gt;
  | S n&amp;#039; =&amp;gt; cons X x (repite X x n&amp;#039;)&lt;br /&gt;
  end.&lt;br /&gt;
&lt;br /&gt;
Example prop_repite1 :&lt;br /&gt;
  repite nat 4 2 = cons nat 4 (cons nat 4 (nil nat)).&lt;br /&gt;
Proof. reflexivity.  Qed.&lt;br /&gt;
&lt;br /&gt;
Example prop_repite2 :&lt;br /&gt;
  repite bool false 1 = cons bool false (nil bool).&lt;br /&gt;
Proof. reflexivity.  Qed.&lt;br /&gt;
&lt;br /&gt;
(* =====================================================================&lt;br /&gt;
   §§§ 1.1.1. Inferencia de tipos&lt;br /&gt;
   ================================================================== *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 1.1.9. Definir la función&lt;br /&gt;
      repite&amp;#039; X x n : list X&lt;br /&gt;
   tal que (repite&amp;#039; X x n) es la lista obtenida repitiendo n veces el&lt;br /&gt;
   elemento x. Por ejemplo,&lt;br /&gt;
      repite&amp;#039; nat 4 2 = cons nat 4 (cons nat 4 (nil nat)).&lt;br /&gt;
      repite&amp;#039; bool false 1 = cons bool false (nil bool).&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Fixpoint repite&amp;#039; X x n : list X :=&lt;br /&gt;
  match n with&lt;br /&gt;
  | 0    =&amp;gt; nil X&lt;br /&gt;
  | S n&amp;#039; =&amp;gt; cons X x (repite&amp;#039; X x n&amp;#039;)&lt;br /&gt;
  end.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 1.1.10. Calcular los tipos de repite&amp;#039; y repite.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Check repite&amp;#039;.&lt;br /&gt;
(* ===&amp;gt; forall X : Type, X -&amp;gt; nat -&amp;gt; list X *)&lt;br /&gt;
Check repite.&lt;br /&gt;
(* ===&amp;gt; forall X : Type, X -&amp;gt; nat -&amp;gt; list X *)&lt;br /&gt;
&lt;br /&gt;
(* =====================================================================&lt;br /&gt;
   §§§ 1.1.2. Síntesis de los tipos de los argumentos  &lt;br /&gt;
   ================================================================== *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 1.1.11. Definir la función&lt;br /&gt;
      repite&amp;#039;&amp;#039; X x n : list X&lt;br /&gt;
   tal que (repite&amp;#039;&amp;#039; X x n) es la lista obtenida repitiendo n veces el&lt;br /&gt;
   elemento x, usando argumentos implícitos. Por ejemplo,&lt;br /&gt;
      repite&amp;#039;&amp;#039; nat 4 2 = cons nat 4 (cons nat 4 (nil nat)).&lt;br /&gt;
      repite&amp;#039;&amp;#039; bool false 1 = cons bool false (nil bool).&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Fixpoint repite&amp;#039;&amp;#039; X x n : list X :=&lt;br /&gt;
  match n with&lt;br /&gt;
  | 0    =&amp;gt; nil _&lt;br /&gt;
  | S n&amp;#039; =&amp;gt; cons _ x (repite&amp;#039;&amp;#039; _ x n&amp;#039;)&lt;br /&gt;
  end.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 1.1.12. Definir la lista formada por los números naturales 1,&lt;br /&gt;
   2 y 3. &lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Definition list123 :=&lt;br /&gt;
  cons nat 1 (cons nat 2 (cons nat 3 (nil nat))).&lt;br /&gt;
&lt;br /&gt;
Definition list123&amp;#039; :=&lt;br /&gt;
  cons _ 1 (cons _ 2 (cons _ 3 (nil _))).&lt;br /&gt;
&lt;br /&gt;
(* =====================================================================&lt;br /&gt;
   §§§ 1.1.3. Argumentos implícitos  &lt;br /&gt;
   ================================================================== *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 1.1.13. Especificar las siguientes funciones y sus argumentos&lt;br /&gt;
   explícitos e implícitos:&lt;br /&gt;
   + nil&lt;br /&gt;
   + constructor&lt;br /&gt;
   + repite&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Arguments nil {X}.&lt;br /&gt;
Arguments cons {X} _ _.&lt;br /&gt;
Arguments repite {X} x n.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 1.1.14. Definir la lista formada por los números naturales 1,&lt;br /&gt;
   2 y 3. &lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Definition list123&amp;#039;&amp;#039; := cons 1 (cons 2 (cons 3 nil)).&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 1.1.15. Definir la función&lt;br /&gt;
      repite&amp;#039;&amp;#039;&amp;#039; {X : Type} (x : X) (n : nat) : list X&lt;br /&gt;
   tal que (repite&amp;#039;&amp;#039; X x n) es la lista obtenida repitiendo n veces el&lt;br /&gt;
   elemento x, usando argumentos implícitos. Por ejemplo,&lt;br /&gt;
      repite&amp;#039;&amp;#039; nat 4 2 = cons nat 4 (cons nat 4 (nil nat)).&lt;br /&gt;
      repite&amp;#039;&amp;#039; bool false 1 = cons bool false (nil bool).&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Fixpoint repite&amp;#039;&amp;#039;&amp;#039; {X : Type} (x : X) (n : nat) : list X :=&lt;br /&gt;
  match n with&lt;br /&gt;
  | 0    =&amp;gt; nil&lt;br /&gt;
  | S n&amp;#039; =&amp;gt; cons x (repite&amp;#039;&amp;#039;&amp;#039; x n&amp;#039;)&lt;br /&gt;
  end.&lt;br /&gt;
&lt;br /&gt;
Example prop_repite&amp;#039;&amp;#039;&amp;#039;1 :&lt;br /&gt;
  repite&amp;#039;&amp;#039;&amp;#039; 4 2 = cons 4 (cons 4 nil).&lt;br /&gt;
Proof. reflexivity.  Qed.&lt;br /&gt;
&lt;br /&gt;
Example prop_repite&amp;#039;&amp;#039;&amp;#039;2 :&lt;br /&gt;
  repite false 1 = cons false nil.&lt;br /&gt;
Proof. reflexivity.  Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 1.1.16. Definir el tipo (list&amp;#039; {X}) para representar las&lt;br /&gt;
   listas de elementos de tipo X con los constructores nil&amp;#039; y cons&amp;#039;&lt;br /&gt;
   tales que  &lt;br /&gt;
   + nil&amp;#039; es la lista vacía y&lt;br /&gt;
   + (cons&amp;#039; x ys) es la lista obtenida añadiendo el elemento x a la&lt;br /&gt;
     lista ys.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Inductive list&amp;#039; {X : Type} : Type :=&lt;br /&gt;
  | nil&amp;#039;  : list&amp;#039;&lt;br /&gt;
  | cons&amp;#039; : X -&amp;gt; list&amp;#039; -&amp;gt; list&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 1.1.17. Definir la función&lt;br /&gt;
      conc {X : Type} (xs ys : list X) : (list X)&lt;br /&gt;
   tal que (conc xs ys) es la concatenación de xs e ys.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Fixpoint conc {X : Type} (xs ys : list X) : (list X) :=&lt;br /&gt;
  match xs with&lt;br /&gt;
  | nil        =&amp;gt; ys&lt;br /&gt;
  | cons x xs&amp;#039; =&amp;gt; cons x (conc xs&amp;#039; ys)&lt;br /&gt;
  end.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 1.1.18. Definir la función&lt;br /&gt;
      inversa {X : Type} (xs : list X) : list X&lt;br /&gt;
   tal que (inversa xs) es la inversa de xs. Por ejemplo,&lt;br /&gt;
      inversa (cons 1 (cons 2 nil)) = (cons 2 (cons 1 nil)).&lt;br /&gt;
      inversa (cons true nil)       = cons true nil.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Fixpoint inversa {X : Type} (xs : list X) : list X :=&lt;br /&gt;
  match xs with&lt;br /&gt;
  | nil        =&amp;gt; nil&lt;br /&gt;
  | cons x xs&amp;#039; =&amp;gt; conc (inversa xs&amp;#039;) (cons x nil)&lt;br /&gt;
  end.&lt;br /&gt;
&lt;br /&gt;
Example prop_inversa1 :&lt;br /&gt;
  inversa (cons 1 (cons 2 nil)) = (cons 2 (cons 1 nil)).&lt;br /&gt;
Proof. reflexivity.  Qed.&lt;br /&gt;
&lt;br /&gt;
Example prop_inversa2:&lt;br /&gt;
  inversa (cons true nil) = cons true nil.&lt;br /&gt;
Proof. reflexivity.  Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 1.1.19. Definir la función&lt;br /&gt;
      longitud {X : Type} (xs : list X) : nat &lt;br /&gt;
   tal que (longitud xs) es el número de elementos de xs. Por ejemplo,&lt;br /&gt;
      longitud (cons 1 (cons 2 (cons 3 nil))) = 3.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Fixpoint longitud {X : Type} (xs : list X) : nat :=&lt;br /&gt;
  match xs with&lt;br /&gt;
  | nil        =&amp;gt; 0&lt;br /&gt;
  | cons _ xs&amp;#039; =&amp;gt; S (longitud xs&amp;#039;)&lt;br /&gt;
  end.&lt;br /&gt;
&lt;br /&gt;
Example prop_longitud1:&lt;br /&gt;
  longitud (cons 1 (cons 2 (cons 3 nil))) = 3.&lt;br /&gt;
Proof. reflexivity.  Qed.&lt;br /&gt;
&lt;br /&gt;
(* =====================================================================&lt;br /&gt;
   §§§ 1.1.4. Explicitación de argumentos  &lt;br /&gt;
   ================================================================== *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 1.1.20. Evaluar la siguiente expresión&lt;br /&gt;
      Fail Definition n_nil := nil.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Fail Definition n_nil := nil.&lt;br /&gt;
(* ==&amp;gt; Error: Cannot infer the implicit parameter X of nil. *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 1.1.21. Completar la definición anterior para obtener la&lt;br /&gt;
   lista vacía de números naturales.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
(* 1ª solución *)&lt;br /&gt;
Definition n_nil : list nat := nil.&lt;br /&gt;
&lt;br /&gt;
(* 2ª solución *)&lt;br /&gt;
Definition n_nil&amp;#039; := @nil nat.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 1.1.22. Definir las siguientes abreviaturas&lt;br /&gt;
   + &amp;quot;x :: y&amp;quot;         para (cons x y)&lt;br /&gt;
   + &amp;quot;[ ]&amp;quot;            para nil&lt;br /&gt;
   + &amp;quot;[ x ; .. ; y ]&amp;quot; para (cons x .. (cons y []) ..).&lt;br /&gt;
   + &amp;quot;x ++ y&amp;quot;         para (conc x y)&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Notation &amp;quot;x :: y&amp;quot;         := (cons x y)&lt;br /&gt;
                             (at level 60, right associativity).&lt;br /&gt;
Notation &amp;quot;[ ]&amp;quot;            := nil.&lt;br /&gt;
Notation &amp;quot;[ x ; .. ; y ]&amp;quot; := (cons x .. (cons y []) ..).&lt;br /&gt;
Notation &amp;quot;x ++ y&amp;quot;         := (conc x y)&lt;br /&gt;
                              (at level 60, right associativity).&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 1.1.23. Definir la lista cuyos elementos son 1, 2 y 3.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Definition list123&amp;#039;&amp;#039;&amp;#039; := [1; 2; 3].&lt;br /&gt;
&lt;br /&gt;
(* =====================================================================&lt;br /&gt;
   §§ 1.2. Polimorfismo de pares  &lt;br /&gt;
   ================================================================== *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 1.2.1. Definir el tipo prod (X Y) con el constructor par tal&lt;br /&gt;
   que (par x y) es el par cuyas componentes son x e y.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Inductive prod (X Y : Type) : Type :=&lt;br /&gt;
  | par : X -&amp;gt; Y -&amp;gt; prod X Y.&lt;br /&gt;
&lt;br /&gt;
Arguments par {X} {Y} _ _.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 1.2.2. Definir la abreviaturas&lt;br /&gt;
      &amp;quot;( x , y )&amp;quot; para (par x y).&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Notation &amp;quot;( x , y )&amp;quot; := (par x y).&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 1.2.3. Definir la abreviatura&lt;br /&gt;
      &amp;quot;X * Y&amp;quot; para (prod X Y) &lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Notation &amp;quot;X * Y&amp;quot; := (prod X Y) : type_scope.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 1.2.4. Definir la función&lt;br /&gt;
      fst {X Y : Type} (p : X * Y) : X&lt;br /&gt;
   tal que (fst p) es la primera componente del par p. Por ejemplo,&lt;br /&gt;
      fst (par 3 5) = 3&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Definition fst {X Y : Type} (p : X * Y) : X :=&lt;br /&gt;
  match p with&lt;br /&gt;
  | (x, y) =&amp;gt; x&lt;br /&gt;
  end.&lt;br /&gt;
&lt;br /&gt;
Example prop_fst: fst (par 3 5) = 3.&lt;br /&gt;
Proof. reflexivity. Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 2.2.5. Definir la función&lt;br /&gt;
      snd {X Y : Type} (p : X * Y) &lt;br /&gt;
   tal que (snd p) es la segunda componente del par p. Por ejemplo,&lt;br /&gt;
      snd (par 3 5) = 5 &lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Definition snd {X Y : Type} (p : X * Y) : Y :=&lt;br /&gt;
  match p with&lt;br /&gt;
  | (x, y) =&amp;gt; y&lt;br /&gt;
  end.&lt;br /&gt;
&lt;br /&gt;
Example prop_snd: snd (par 3 5) = 5.&lt;br /&gt;
Proof. reflexivity. Qed.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(* =====================================================================&lt;br /&gt;
   §§ 1.3. Resultados opcionales polimórficos  &lt;br /&gt;
   ================================================================== *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 1.3.1. Definir el tipo (Opcional X) con los constructores Some&lt;br /&gt;
   y None tales que &lt;br /&gt;
   + (Some x) es un valor de tipo X.&lt;br /&gt;
   + None es el valor nulo.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Inductive Opcional (X:Type) : Type :=&lt;br /&gt;
  | Some : X -&amp;gt; Opcional X&lt;br /&gt;
  | None : Opcional X.&lt;br /&gt;
&lt;br /&gt;
Arguments Some {X} _.&lt;br /&gt;
Arguments None {X}.&lt;br /&gt;
&lt;br /&gt;
(* =====================================================================&lt;br /&gt;
   § 2. Funciones como datos&lt;br /&gt;
   ================================================================== *)&lt;br /&gt;
&lt;br /&gt;
(* =====================================================================&lt;br /&gt;
   §§ 2.1. Funciones de orden superior &lt;br /&gt;
   ================================================================== *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 2.1.1. Definir la función &lt;br /&gt;
      aplica3veces {X : Type} (f : X -&amp;gt; X) (n : X) : X &lt;br /&gt;
   tal que (aplica3veces f) aplica 3 veces la función f. Por ejemplo,&lt;br /&gt;
      aplica3veces menosDos 9     = 3.&lt;br /&gt;
      aplica3veces negacion true  = false.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Definition aplica3veces {X : Type} (f : X -&amp;gt; X) (n : X) : X :=&lt;br /&gt;
  f (f (f n)).&lt;br /&gt;
&lt;br /&gt;
Check @aplica3veces.&lt;br /&gt;
(* ===&amp;gt; aplica3veces : forall X : Type, (X -&amp;gt; X) -&amp;gt; X -&amp;gt; X *)&lt;br /&gt;
&lt;br /&gt;
Example prop_aplica3veces:&lt;br /&gt;
  aplica3veces menosDos 9 = 3.&lt;br /&gt;
Proof. reflexivity.  Qed.&lt;br /&gt;
&lt;br /&gt;
Example prop_aplica3veces&amp;#039;:&lt;br /&gt;
  aplica3veces negacion true = false.&lt;br /&gt;
Proof. reflexivity.  Qed.&lt;br /&gt;
&lt;br /&gt;
(* =====================================================================&lt;br /&gt;
   §§ 2.2. Filtrado  &lt;br /&gt;
   ================================================================== *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 2.2.1. Definir la función&lt;br /&gt;
      filtra {X : Type} (p : X -&amp;gt; bool) (xs : list X) : (list X)&lt;br /&gt;
   tal que (filtra p xs) es la lista de los elementos de xs que&lt;br /&gt;
   verifican p. Por ejemplo,&lt;br /&gt;
      filtra esPar [1;2;3;4] = [2;4].&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Fixpoint filtra {X : Type} (p : X -&amp;gt; bool) (xs : list X) : (list X) :=&lt;br /&gt;
  match xs with&lt;br /&gt;
  | []       =&amp;gt; []&lt;br /&gt;
  | x :: xs&amp;#039; =&amp;gt; if p x&lt;br /&gt;
               then x :: (filtra p xs&amp;#039;)&lt;br /&gt;
               else filtra p xs&amp;#039;&lt;br /&gt;
  end.&lt;br /&gt;
&lt;br /&gt;
Example prop_filtra1:&lt;br /&gt;
  filtra esPar [1;2;3;4] = [2;4].&lt;br /&gt;
Proof. reflexivity.  Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 2.2.2. Definir la función&lt;br /&gt;
      unitarias {X : Type} (xss : list (list X)) : list (list X) :=&lt;br /&gt;
   tal que (unitarias xss) es la lista de listas unitarias de xss. Por&lt;br /&gt;
   ejemplo, &lt;br /&gt;
      unitarias [[1;2];[3];[4];[5;6;7];[];[8]] = [[3];[4];[8]]&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Definition esUnitaria {X : Type} (xs : list X) : bool :=&lt;br /&gt;
  iguales_nat (longitud xs) 1.&lt;br /&gt;
&lt;br /&gt;
Definition unitarias {X : Type} (xss : list (list X)) : list (list X) :=&lt;br /&gt;
  filtra esUnitaria xss.&lt;br /&gt;
  &lt;br /&gt;
Compute (unitarias [[1; 2]; [3]; [4]; [5;6;7]; []; [8]]).&lt;br /&gt;
(* = [[3]; [4]; [8]] : list (list nat)*)&lt;br /&gt;
&lt;br /&gt;
Example prop_unitarias:&lt;br /&gt;
  unitarias [[1; 2]; [3]; [4]; [5;6;7]; []; [8]]&lt;br /&gt;
  = [[3]; [4]; [8]].&lt;br /&gt;
Proof. reflexivity.  Qed.&lt;br /&gt;
&lt;br /&gt;
(* =====================================================================&lt;br /&gt;
   §§ 2.3. Funciones anónimas  &lt;br /&gt;
   ================================================================== *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 2.3.1. Demostrar que&lt;br /&gt;
      aplica3veces (fun n =&amp;gt; n * n) 2 = 256.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Example prop_anon_fun&amp;#039;:&lt;br /&gt;
  aplica3veces (fun n =&amp;gt; n * n) 2 = 256.&lt;br /&gt;
Proof. reflexivity.  Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 2.3.2. Calcular&lt;br /&gt;
      filtra (fun xs =&amp;gt; iguales_nat (longitud xs) 1)&lt;br /&gt;
             [ [1; 2]; [3]; [4]; [5;6;7]; []; [8] ]&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Compute (filtra (fun xs =&amp;gt; iguales_nat (longitud xs) 1)&lt;br /&gt;
                [ [1; 2]; [3]; [4]; [5;6;7]; []; [8] ]).&lt;br /&gt;
(* = [[3]; [4]; [8]] : list (list nat)*)&lt;br /&gt;
&lt;br /&gt;
(* =====================================================================&lt;br /&gt;
   §§ 2.4. Aplicación a todos los elementos (map)&lt;br /&gt;
   ================================================================== *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 2.4.1. Definir la función&lt;br /&gt;
      map {X Y:Type} (f : X -&amp;gt; Y) (xs:list X) : list Y &lt;br /&gt;
   tal que (map f xs) es la lista obtenida aplicando f a todos los&lt;br /&gt;
   elementos de xs. Por ejemplo,&lt;br /&gt;
      map (fun x =&amp;gt; plus 3 x) [2;0;2] = [5;3;5].&lt;br /&gt;
      map esImpar [2;1;2;5] = [false;true;false;true].&lt;br /&gt;
      map (fun n =&amp;gt; [evenb n;esImpar n]) [2;1;2;5]&lt;br /&gt;
        = [[true;false];[false;true];[true;false];[false;true]].&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Fixpoint map {X Y:Type} (f : X -&amp;gt; Y) (xs : list X) : list Y :=&lt;br /&gt;
  match xs with&lt;br /&gt;
  | []       =&amp;gt; []&lt;br /&gt;
  | x :: xs&amp;#039; =&amp;gt; f x :: map f xs&amp;#039;&lt;br /&gt;
  end.&lt;br /&gt;
&lt;br /&gt;
Example prop_map1:&lt;br /&gt;
  map (fun x =&amp;gt; plus 3 x) [2;0;2] = [5;3;5].&lt;br /&gt;
Proof. reflexivity.  Qed.&lt;br /&gt;
&lt;br /&gt;
Example prop_map2:&lt;br /&gt;
  map esImpar [2;1;2;5] = [false;true;false;true].&lt;br /&gt;
Proof. reflexivity.  Qed.&lt;br /&gt;
&lt;br /&gt;
Example prop_map3:&lt;br /&gt;
  map (fun n =&amp;gt; [esPar n ; esImpar n]) [2;1;2;5]&lt;br /&gt;
  = [[true;false];[false;true];[true;false];[false;true]].&lt;br /&gt;
Proof. reflexivity.  Qed.&lt;br /&gt;
&lt;br /&gt;
(* =====================================================================&lt;br /&gt;
   §§ 2.5. Plegados (fold)  &lt;br /&gt;
   ================================================================== *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 2.5.1. Definir la función&lt;br /&gt;
      fold {X Y:Type} (f: X -&amp;gt; Y- &amp;gt; Y) (xs : list X) (b : Y) : Y&lt;br /&gt;
   tal que (fold f xs b) es el plegado de xs con la operación f a partir&lt;br /&gt;
   del elemento b. Por ejemplo,&lt;br /&gt;
      fold mult [1;2;3;4] 1                       = 24.&lt;br /&gt;
      fold conjuncion [true;true;false;true] true = false.&lt;br /&gt;
      fold conc  [[1];[];[2;3];[4]] []            = [1;2;3;4].&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Fixpoint fold {X Y:Type} (f: X -&amp;gt; Y -&amp;gt; Y) (xs : list X) (b : Y) : Y :=&lt;br /&gt;
  match xs with&lt;br /&gt;
  | nil      =&amp;gt; b&lt;br /&gt;
  | x :: xs&amp;#039; =&amp;gt; f x (fold f xs&amp;#039; b)&lt;br /&gt;
  end.&lt;br /&gt;
&lt;br /&gt;
Check (fold conjuncion).&lt;br /&gt;
(* ===&amp;gt; fold conjuncion : list bool -&amp;gt; bool -&amp;gt; bool *)&lt;br /&gt;
&lt;br /&gt;
Example fold_example1:&lt;br /&gt;
  fold mult [1;2;3;4] 1 = 24.&lt;br /&gt;
Proof. reflexivity. Qed.&lt;br /&gt;
&lt;br /&gt;
Example fold_example2 :&lt;br /&gt;
  fold conjuncion [true;true;false;true] true = false.&lt;br /&gt;
Proof. reflexivity. Qed.&lt;br /&gt;
&lt;br /&gt;
Example fold_example3 :&lt;br /&gt;
  fold conc  [[1];[];[2;3];[4]] [] = [1;2;3;4].&lt;br /&gt;
Proof. reflexivity. Qed.&lt;br /&gt;
&lt;br /&gt;
(* =====================================================================&lt;br /&gt;
   §§ 2.6. Funciones que construyen funciones  &lt;br /&gt;
   ================================================================== *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 2.6.1. Definir la función&lt;br /&gt;
      constante {X : Type} (x : X) : nat -&amp;gt; X&lt;br /&gt;
   tal que (constante x) es la función que a todos los naturales le&lt;br /&gt;
   asigna el x. Por ejemplo, &lt;br /&gt;
      (constante 5) 99 = 5.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Definition constante {X : Type} (x : X) : nat -&amp;gt; X :=&lt;br /&gt;
  fun (k : nat) =&amp;gt; x.&lt;br /&gt;
&lt;br /&gt;
Example prop_constante:&lt;br /&gt;
  (constante 5) 99 = 5.&lt;br /&gt;
Proof. reflexivity. Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 2.6.2. Calcular el tipo de plus.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Check plus.&lt;br /&gt;
(* ==&amp;gt; nat -&amp;gt; nat -&amp;gt; nat *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 2.6.3. Definir la función&lt;br /&gt;
      plus3 : nat -&amp;gt; nat&lt;br /&gt;
   tal que (plus3 x) es tres más x. Por ejemplo,&lt;br /&gt;
      plus3 4                 = 7.&lt;br /&gt;
      aplica3veces plus3 0    = 9.&lt;br /&gt;
      aplica3veces (plus 3) 0 = 9.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Definition plus3 := plus 3.&lt;br /&gt;
&lt;br /&gt;
Example prop_plus3a:&lt;br /&gt;
  plus3 4 = 7.&lt;br /&gt;
Proof. reflexivity.  Qed.&lt;br /&gt;
&lt;br /&gt;
Example prop_plus3b:&lt;br /&gt;
  aplica3veces plus3 0 = 9.&lt;br /&gt;
Proof. reflexivity.  Qed.&lt;br /&gt;
&lt;br /&gt;
Example prop_plus3c:&lt;br /&gt;
  aplica3veces (plus 3) 0 = 9.&lt;br /&gt;
Proof. reflexivity.  Qed.&lt;br /&gt;
&lt;br /&gt;
(* =====================================================================&lt;br /&gt;
   § Bibliografía&lt;br /&gt;
   ================================================================== *)&lt;br /&gt;
&lt;br /&gt;
(*&lt;br /&gt;
 + &amp;quot;Polymorphism and higher-order functions&amp;quot; de Peirce et als. &lt;br /&gt;
   http://bit.ly/2Mj5gMf *)&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/RA2018/index.php?title=Tema_3:_Datos_estructurados_en_Coq&amp;diff=370</id>
		<title>Tema 3: Datos estructurados en Coq</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2018/index.php?title=Tema_3:_Datos_estructurados_en_Coq&amp;diff=370"/>
		<updated>2019-02-14T07:36:22Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: Protegió «Tema 3: Datos estructurados en Coq» ([Editar=Solo administradores] (indefinido) [Trasladar=Solo administradores] (indefinido))&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;coq&amp;quot;&amp;gt;&lt;br /&gt;
Require Export T2_Induccion.&lt;br /&gt;
&lt;br /&gt;
(* En este capítulos se estudian datos estructurados con números &lt;br /&gt;
   naturales. Su contenido es&lt;br /&gt;
   1. Pares de números &lt;br /&gt;
   2. Listas de números &lt;br /&gt;
      1. El tipo de la lista de números. &lt;br /&gt;
      2. La función repite (repeat)  &lt;br /&gt;
      3. La función longitud (length)  &lt;br /&gt;
      4. La función conc (app)  &lt;br /&gt;
      5. Las funciones primero (hd) y resto (tl)&lt;br /&gt;
      6. Ejercicios sobre listas de números &lt;br /&gt;
      7. Multiconjuntos como listas &lt;br /&gt;
   3. Razonamiento sobre listas&lt;br /&gt;
      1. Demostraciones por simplificación &lt;br /&gt;
      2. Demostraciones por casos &lt;br /&gt;
      3. Demostraciones por inducción&lt;br /&gt;
      4. Ejercicios &lt;br /&gt;
   4. Opcionales&lt;br /&gt;
   5. Diccionarios (o funciones parciales)&lt;br /&gt;
   6. Bibliografía&lt;br /&gt;
*)&lt;br /&gt;
&lt;br /&gt;
(* =====================================================================&lt;br /&gt;
   § 1. Pares de números &lt;br /&gt;
   ================================================================== *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Nota. Se inicia el módulo ListaNat.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Module ListaNat. &lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 1.1. Definir el tipo ProdNat para los pares de números&lt;br /&gt;
   naturales con el constructor&lt;br /&gt;
      par : nat -&amp;gt; nat -&amp;gt; ProdNat.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Inductive ProdNat : Type :=&lt;br /&gt;
  par : nat -&amp;gt; nat -&amp;gt; ProdNat.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 1.2. Calcular el tipo de la expresión (par 3 5)&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Check (par 3 5).&lt;br /&gt;
(* ===&amp;gt; par 3 5 : ProdNat *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 1.3. Definir la función&lt;br /&gt;
      fst : ProdNat -&amp;gt; nat&lt;br /&gt;
   tal que (fst p) es la primera componente de p.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Definition fst (p : ProdNat) : nat := &lt;br /&gt;
  match p with&lt;br /&gt;
  | par x y =&amp;gt; x&lt;br /&gt;
  end.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 1.4. Evaluar la expresión &lt;br /&gt;
      fst (par 3 5)&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Compute (fst (par 3 5)).&lt;br /&gt;
(* ===&amp;gt; 3 : nat *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 1.5. Definir la función&lt;br /&gt;
      snd : ProdNat -&amp;gt; nat&lt;br /&gt;
   tal que (snd p) es la segunda componente de p.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Definition snd (p : ProdNat) : nat := &lt;br /&gt;
  match p with&lt;br /&gt;
  | par x y =&amp;gt; y&lt;br /&gt;
  end.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 1.6. Definir la notación (x,y) como una abreviaura de &lt;br /&gt;
   (par x y).&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Notation &amp;quot;( x , y )&amp;quot; := (par x y).&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 1.7. Evaluar la expresión &lt;br /&gt;
      fst (3,5)&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Compute (fst (3,5)).&lt;br /&gt;
(* ===&amp;gt; 3 : nat *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 1.8. Redefinir la función fst usando la abreviatura de pares.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Definition fst&amp;#039; (p : ProdNat) : nat := &lt;br /&gt;
  match p with&lt;br /&gt;
  | (x,y) =&amp;gt; x&lt;br /&gt;
  end.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 1.9. Redefinir la función snd usando la abreviatura de pares.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Definition snd&amp;#039; (p : ProdNat) : nat := &lt;br /&gt;
  match p with&lt;br /&gt;
  | (x,y) =&amp;gt; y&lt;br /&gt;
  end.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 1.10. Definir la función&lt;br /&gt;
      intercambia : ProdNat -&amp;gt; ProdNat&lt;br /&gt;
   tal que (intercambia p) es el par obtenido intercambiando las&lt;br /&gt;
   componentes de p.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Definition intercambia (p : ProdNat) : ProdNat := &lt;br /&gt;
  match p with&lt;br /&gt;
  | (x,y) =&amp;gt; (y,x)&lt;br /&gt;
  end.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 1.11. Demostrar que para todos los naturales&lt;br /&gt;
      (n,m) = (fst (n,m), snd (n,m)).&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Theorem par_componentes1 : forall n m : nat,&lt;br /&gt;
  (n,m) = (fst (n,m), snd (n,m)).&lt;br /&gt;
Proof.&lt;br /&gt;
  reflexivity.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 1.12. Demostrar que para todo par de naturales&lt;br /&gt;
      p = (fst p, snd p).&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
(* 1º intento *)&lt;br /&gt;
Theorem par_componentes2 : forall p : ProdNat,&lt;br /&gt;
  p = (fst p, snd p).&lt;br /&gt;
Proof.&lt;br /&gt;
  simpl. (* &lt;br /&gt;
            ============================&lt;br /&gt;
            forall p : ProdNat, p = (fst p, snd p) *)&lt;br /&gt;
Abort.&lt;br /&gt;
&lt;br /&gt;
(* 2º intento *)&lt;br /&gt;
Theorem par_componentes : forall p : ProdNat,&lt;br /&gt;
  p = (fst p, snd p).&lt;br /&gt;
Proof.&lt;br /&gt;
  intros p.            (* p : ProdNat&lt;br /&gt;
                          ============================&lt;br /&gt;
                          p = (fst p, snd p) *)&lt;br /&gt;
  destruct p as [n m]. (* n, m : nat&lt;br /&gt;
                          ============================&lt;br /&gt;
                          (n, m) = (fst (n, m), snd (n, m)) *)&lt;br /&gt;
  simpl.               (* (n, m) = (n, m) *)&lt;br /&gt;
  reflexivity.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* =====================================================================&lt;br /&gt;
   § 2. Listas de números &lt;br /&gt;
   ================================================================== *)&lt;br /&gt;
&lt;br /&gt;
(* =====================================================================&lt;br /&gt;
   §§ 2.1. El tipo de la lista de números. &lt;br /&gt;
   ================================================================== *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 2.1.1. Definir el tipo ListaNat de la lista de los números&lt;br /&gt;
   naturales y cuyo constructores son &lt;br /&gt;
   + nil (la lista vacía) y &lt;br /&gt;
   + cons (tal que (cons x ys) es la lista obtenida añadiéndole x a ys). &lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Inductive ListaNat : Type :=&lt;br /&gt;
  | nil  : ListaNat&lt;br /&gt;
  | cons : nat -&amp;gt; ListaNat -&amp;gt; ListaNat.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 2.1.2. Definir la constante &lt;br /&gt;
      ejLista : ListaNat&lt;br /&gt;
   que es la lista cuyos elementos son 1, 2 y 3.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Definition ejLista := cons 1 (cons 2 (cons 3 nil)).&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 2.1.3. Definir la notación (x :: ys) como una abreviatura de &lt;br /&gt;
   (cons x ys).&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Notation &amp;quot;x :: l&amp;quot; := (cons x l)&lt;br /&gt;
                     (at level 60, right associativity).&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 2.1.4. Definir la notación de las listas finitas escribiendo&lt;br /&gt;
   sus elementos entre corchetes y separados por puntos y comas.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Notation &amp;quot;[ ]&amp;quot; := nil.&lt;br /&gt;
Notation &amp;quot;[ x ; .. ; y ]&amp;quot; := (cons x .. (cons y nil) ..).&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 2.1.5. Definir la lista cuyos elementos son 1, 2 y 3 mediante&lt;br /&gt;
   sistintas representaciones.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Definition ejLista1 := 1 :: (2 :: (3 :: nil)).&lt;br /&gt;
Definition ejLista2 := 1 :: 2 :: 3 :: nil.&lt;br /&gt;
Definition ejLista3 := [1;2;3].&lt;br /&gt;
&lt;br /&gt;
(* =====================================================================&lt;br /&gt;
   §§ 2.2. La función repite (repeat)  &lt;br /&gt;
   ================================================================== *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 2.2.1. Definir la función&lt;br /&gt;
      repite : nat -&amp;gt; nat -&amp;gt; ListaNat&lt;br /&gt;
   tal que (repite n k) es la lista formada por k veces el número n. Por&lt;br /&gt;
   ejemplo, &lt;br /&gt;
      repite 5 3 = [5; 5; 5]&lt;br /&gt;
&lt;br /&gt;
   Nota: La función repite es quivalente a la predefinida repeat.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Fixpoint repite (n k : nat) : ListaNat :=&lt;br /&gt;
  match k with&lt;br /&gt;
  | O    =&amp;gt; nil&lt;br /&gt;
  | S k&amp;#039; =&amp;gt; n :: repite n k&amp;#039;&lt;br /&gt;
  end.&lt;br /&gt;
&lt;br /&gt;
Compute (repite 5 3).&lt;br /&gt;
(* ===&amp;gt; [5; 5; 5] : ListaNat*)&lt;br /&gt;
&lt;br /&gt;
(* =====================================================================&lt;br /&gt;
   §§ 2.3. La función longitud (length)  &lt;br /&gt;
   ================================================================== *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 2.3.1. Definir la función&lt;br /&gt;
      longitud : ListaNat -&amp;gt; nat&lt;br /&gt;
   tal que (longitud xs) es el número de elementos de xs. Por ejemplo, &lt;br /&gt;
      longitud [4;2;6] = 3&lt;br /&gt;
&lt;br /&gt;
   Nota: La función longitud es equivalente a la predefinida length&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Fixpoint longitud (xs : ListaNat) : nat :=&lt;br /&gt;
  match xs with&lt;br /&gt;
  | nil    =&amp;gt; O&lt;br /&gt;
  | _ :: xs =&amp;gt; S (longitud xs)&lt;br /&gt;
  end.&lt;br /&gt;
&lt;br /&gt;
Compute (longitud [4;2;6]).&lt;br /&gt;
(* ===&amp;gt; 3 : nat *)&lt;br /&gt;
&lt;br /&gt;
(* =====================================================================&lt;br /&gt;
   §§ 2.4. La función conc (app)  &lt;br /&gt;
   ================================================================== *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 2.4.1. Definir la función&lt;br /&gt;
      conc : ListaNat -&amp;gt; ListaNat -&amp;gt; ListaNat&lt;br /&gt;
   tal que (conc xs ys) es la concatenación de xs e ys. Por ejemplo, &lt;br /&gt;
      conc [1;3] [4;2;3;5] =  [1; 3; 4; 2; 3; 5]&lt;br /&gt;
&lt;br /&gt;
   Nota: La función conc es equivalente a la predefinida app.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Fixpoint conc (xs ys : ListaNat) : ListaNat :=&lt;br /&gt;
  match xs with&lt;br /&gt;
  | nil     =&amp;gt; ys&lt;br /&gt;
  | x :: zs =&amp;gt; x :: conc zs ys&lt;br /&gt;
  end.&lt;br /&gt;
&lt;br /&gt;
Compute (conc [1;3] [4;2;3;5]).&lt;br /&gt;
(* ===&amp;gt; [1; 3; 4; 2; 3; 5] : ListaNat *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 2.4.2. Definir la notación (xs ++ ys) como una abreviaura de &lt;br /&gt;
   (conc xs ys).&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Notation &amp;quot;x ++ y&amp;quot; := (conc x y)&lt;br /&gt;
                     (right associativity, at level 60).&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 2.4.3. Demostrar que&lt;br /&gt;
      [1;2;3] ++ [4;5] = [1;2;3;4;5].&lt;br /&gt;
      nil     ++ [4;5] = [4;5].&lt;br /&gt;
      [1;2;3] ++ nil   = [1;2;3].&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Example test_conc1: [1;2;3] ++ [4;5] = [1;2;3;4;5].&lt;br /&gt;
Proof. reflexivity.  Qed.&lt;br /&gt;
&lt;br /&gt;
Example test_conc2: nil ++ [4;5] = [4;5].&lt;br /&gt;
Proof. reflexivity.  Qed.&lt;br /&gt;
&lt;br /&gt;
Example test_conc3: [1;2;3] ++ nil = [1;2;3].&lt;br /&gt;
Proof. reflexivity.  Qed.&lt;br /&gt;
&lt;br /&gt;
(* =====================================================================&lt;br /&gt;
   §§ 2.5. Las funciones primero (hd) y resto (tl)&lt;br /&gt;
   ================================================================== *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 2.5.1. Definir la función&lt;br /&gt;
      primero : nat -&amp;gt; ListaNat -&amp;gt; ListaNat&lt;br /&gt;
   tal que (primero d xs) es el primer elemento de xs o d, si xs es la lista&lt;br /&gt;
   vacía. Por ejemplo,&lt;br /&gt;
      primero 7 [3;2;5] = 3 &lt;br /&gt;
      primero 7 []      = 7 &lt;br /&gt;
&lt;br /&gt;
   Nota. La función primero es equivalente a la predefinida hd&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Definition primero (d : nat) (xs : ListaNat) : nat :=&lt;br /&gt;
  match xs with&lt;br /&gt;
  | nil     =&amp;gt; d&lt;br /&gt;
  | y :: ys =&amp;gt; y&lt;br /&gt;
  end.&lt;br /&gt;
&lt;br /&gt;
Compute (primero 7 [3;2;5]).&lt;br /&gt;
(* ===&amp;gt; 3 : nat *)&lt;br /&gt;
Compute (primero 7 []).&lt;br /&gt;
(* ===&amp;gt; 7 : nat *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 2.5.2. Demostrar que &lt;br /&gt;
       primero 0 [1;2;3] = 1.&lt;br /&gt;
       resto [1;2;3]     = [2;3].&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Example prop_primero1: primero 0 [1;2;3] = 1.&lt;br /&gt;
Proof. reflexivity.  Qed.&lt;br /&gt;
&lt;br /&gt;
Example prop_primero2: primero 0 [] = 0.&lt;br /&gt;
Proof. reflexivity.  Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 2.5.3. Definir la función&lt;br /&gt;
      resto : ListaNat -&amp;gt; ListaNat&lt;br /&gt;
   tal que (resto xs) es el resto de xs. Por ejemplo.&lt;br /&gt;
      resto [3;2;5] = [2; 5]&lt;br /&gt;
      resto []      = [ ]&lt;br /&gt;
&lt;br /&gt;
   Nota. La función resto es equivalente la predefinida tl.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Definition resto (xs:ListaNat) : ListaNat :=&lt;br /&gt;
  match xs with&lt;br /&gt;
  | nil     =&amp;gt; nil&lt;br /&gt;
  | y :: ys =&amp;gt; ys&lt;br /&gt;
  end.&lt;br /&gt;
&lt;br /&gt;
Compute (resto [3;2;5]).&lt;br /&gt;
(* ===&amp;gt; [2; 5] : ListaNat *)&lt;br /&gt;
Compute (resto []).&lt;br /&gt;
(* ===&amp;gt; [ ] : ListaNat *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 2.5.4. Demostrar que &lt;br /&gt;
       resto [1;2;3] = [2;3].&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Example prop_resto: resto [1;2;3] = [2;3].&lt;br /&gt;
Proof. reflexivity.  Qed.&lt;br /&gt;
&lt;br /&gt;
(* =====================================================================&lt;br /&gt;
   § 3. Razonamiento sobre listas&lt;br /&gt;
   ================================================================== *)&lt;br /&gt;
&lt;br /&gt;
(* =====================================================================&lt;br /&gt;
   §§ 3.1. Demostraciones por simplificación &lt;br /&gt;
   ================================================================== *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 3.1.1. Demostrar que, para toda lista de naturales xs,&lt;br /&gt;
      [] ++ xs = xs&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Theorem nil_conc : forall xs:ListaNat,&lt;br /&gt;
  [] ++ xs = xs.&lt;br /&gt;
Proof.&lt;br /&gt;
  reflexivity.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* =====================================================================&lt;br /&gt;
   §§ 3.2. Demostraciones por casos &lt;br /&gt;
   ================================================================== *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 3.2.1. Demostrar que, para toda lista de naturales xs,&lt;br /&gt;
      pred (longitud xs) = longitud (resto xs)&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Theorem resto_longitud_pred : forall xs : ListaNat,&lt;br /&gt;
  pred (longitud xs) = longitud (resto xs).&lt;br /&gt;
Proof.&lt;br /&gt;
  intros xs.                (* xs : ListaNat&lt;br /&gt;
                               ============================&lt;br /&gt;
                               Nat.pred (longitud xs) = longitud (resto xs) *)&lt;br /&gt;
  destruct xs as [|x xs&amp;#039;]. &lt;br /&gt;
  -                         (* &lt;br /&gt;
                               ============================&lt;br /&gt;
                               Nat.pred (longitud []) = longitud (resto []) *)&lt;br /&gt;
    reflexivity.&lt;br /&gt;
  -                         (* x : nat&lt;br /&gt;
                               xs&amp;#039; : ListaNat&lt;br /&gt;
                               ============================&lt;br /&gt;
                               Nat.pred (longitud (x :: xs&amp;#039;)) = &lt;br /&gt;
                                longitud (resto (x :: xs&amp;#039;)) *)&lt;br /&gt;
    reflexivity.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* =====================================================================&lt;br /&gt;
   §§ 3.3. Demostraciones por inducción&lt;br /&gt;
   ================================================================== *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 3.3.1. Demostrar que la concatenación de listas de naturales&lt;br /&gt;
   es asociativa; es decir,&lt;br /&gt;
      (xs ++ ys) ++ zs = xs ++ (ys ++ zs).&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Theorem conc_asociativa: forall xs ys zs : ListaNat,&lt;br /&gt;
  (xs ++ ys) ++ zs = xs ++ (ys ++ zs).&lt;br /&gt;
Proof.&lt;br /&gt;
  intros xs ys zs.             (* xs, ys, zs : ListaNat&lt;br /&gt;
                                  ============================&lt;br /&gt;
                                  (xs ++ ys) ++ zs = xs ++ (ys ++ zs) *)&lt;br /&gt;
  induction xs as [|x xs&amp;#039; HI]. &lt;br /&gt;
  -                            (* ys, zs : ListaNat&lt;br /&gt;
                                  ============================&lt;br /&gt;
                                  ([ ] ++ ys) ++ zs = [ ] ++ (ys ++ zs) *)&lt;br /&gt;
    reflexivity.&lt;br /&gt;
  -                            (* x : nat&lt;br /&gt;
                                  xs&amp;#039;, ys, zs : ListaNat&lt;br /&gt;
                                  HI : (xs&amp;#039; ++ ys) ++ zs = xs&amp;#039; ++ (ys ++ zs)&lt;br /&gt;
                                  ============================&lt;br /&gt;
                                  ((x :: xs&amp;#039;) ++ ys) ++ zs = &lt;br /&gt;
                                   (x :: xs&amp;#039;) ++ (ys ++ zs) *)&lt;br /&gt;
    simpl.                     (* (x :: (xs&amp;#039; ++ ys)) ++ zs = &lt;br /&gt;
                                  x :: (xs&amp;#039; ++ (ys ++ zs)) *)&lt;br /&gt;
    rewrite -&amp;gt; HI.             (* x :: (xs&amp;#039; ++ (ys ++ zs)) = &lt;br /&gt;
                                  x :: (xs&amp;#039; ++ (ys ++ zs)) *)&lt;br /&gt;
    reflexivity.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 3.3.2. Definir la función&lt;br /&gt;
      inversa : ListaNat -&amp;gt; ListaNat&lt;br /&gt;
   tal que (inversa xs) es la inversa de xs. Por ejemplo,&lt;br /&gt;
      inversa [1;2;3] = [3;2;1].&lt;br /&gt;
      inversa nil     = nil.&lt;br /&gt;
&lt;br /&gt;
   Nota. La función inversa es equivalente a la predefinida rev.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Fixpoint inversa (xs:ListaNat) : ListaNat :=&lt;br /&gt;
  match xs with&lt;br /&gt;
  | nil    =&amp;gt; nil&lt;br /&gt;
  | x::xs&amp;#039; =&amp;gt; inversa xs&amp;#039; ++ [x]&lt;br /&gt;
  end.&lt;br /&gt;
&lt;br /&gt;
Example prop_inversa1:&lt;br /&gt;
  inversa [1;2;3] = [3;2;1].&lt;br /&gt;
Proof. reflexivity.  Qed.&lt;br /&gt;
&lt;br /&gt;
Example prop_inversa2:&lt;br /&gt;
  inversa nil = nil.&lt;br /&gt;
Proof. reflexivity.  Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 3.3.3. Demostrar que&lt;br /&gt;
      longitud (inversa xs) = longitud xs&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
(* 1º intento *)&lt;br /&gt;
Theorem longitud_inversa1: forall xs : ListaNat,&lt;br /&gt;
  longitud (inversa xs) = longitud xs.&lt;br /&gt;
Proof.&lt;br /&gt;
  intros xs.&lt;br /&gt;
  induction xs as [|x xs&amp;#039; HI]. &lt;br /&gt;
  -                            (* &lt;br /&gt;
                                  ============================&lt;br /&gt;
                                  longitud (inversa [ ]) = longitud [ ] *)&lt;br /&gt;
    reflexivity.&lt;br /&gt;
  -                            (* x : nat&lt;br /&gt;
                                  xs&amp;#039; : ListaNat&lt;br /&gt;
                                  HI : longitud (inversa xs&amp;#039;) = longitud xs&amp;#039;&lt;br /&gt;
                                  ============================&lt;br /&gt;
                                  longitud (inversa (x :: xs&amp;#039;)) = &lt;br /&gt;
                                   longitud (x :: xs&amp;#039;) *)&lt;br /&gt;
    simpl.                     (* longitud (inversa xs&amp;#039; ++ [x]) = &lt;br /&gt;
                                   S (longitud xs&amp;#039;)*)&lt;br /&gt;
    rewrite &amp;lt;- HI.             (* longitud (inversa xs&amp;#039; ++ [x]) = &lt;br /&gt;
                                   S (longitud (inversa xs&amp;#039;)) *)&lt;br /&gt;
Abort.&lt;br /&gt;
&lt;br /&gt;
(* Nota: Para simplificar la última expresión se necesita los siguientes &lt;br /&gt;
  lemas. *) &lt;br /&gt;
&lt;br /&gt;
Lemma longitud_conc : forall xs ys : ListaNat,&lt;br /&gt;
  longitud (xs ++ ys) = longitud xs + longitud ys.&lt;br /&gt;
Proof.&lt;br /&gt;
  intros xs ys.                 (* xs, ys : ListaNat&lt;br /&gt;
                                   ============================&lt;br /&gt;
                                   longitud (xs ++ ys) = &lt;br /&gt;
                                    longitud xs + longitud ys *)&lt;br /&gt;
  induction xs as [| x xs&amp;#039; HI]. &lt;br /&gt;
  -                             (* ys : ListaNat&lt;br /&gt;
                                   ============================&lt;br /&gt;
                                   longitud ([ ] ++ ys) = &lt;br /&gt;
                                    longitud [ ] + longitud ys *)&lt;br /&gt;
    reflexivity.&lt;br /&gt;
  -                             (* x : nat&lt;br /&gt;
                                   xs&amp;#039;, ys : ListaNat&lt;br /&gt;
                                   HI : longitud (xs&amp;#039; ++ ys) = &lt;br /&gt;
                                         longitud xs&amp;#039; + longitud ys&lt;br /&gt;
                                   ============================&lt;br /&gt;
                                   longitud ((x :: xs&amp;#039;) ++ ys) = &lt;br /&gt;
                                   longitud (x :: xs&amp;#039;) + longitud ys *)&lt;br /&gt;
    simpl.                      (* S (longitud (xs&amp;#039; ++ ys)) = &lt;br /&gt;
                                   S (longitud xs&amp;#039; + longitud ys) *)&lt;br /&gt;
    rewrite HI.                 (* S (longitud xs&amp;#039; + longitud ys) = &lt;br /&gt;
                                   S (longitud xs&amp;#039; + longitud ys) *)&lt;br /&gt;
    reflexivity.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
Theorem suma_n_1 : forall n : nat,&lt;br /&gt;
    n + 1 = S n.&lt;br /&gt;
Proof.&lt;br /&gt;
  intro n.                   (* n : nat&lt;br /&gt;
                                ============================&lt;br /&gt;
                                n + 1 = S n *)&lt;br /&gt;
  induction n as [|n&amp;#039; HIn&amp;#039;]. &lt;br /&gt;
  -                          (* &lt;br /&gt;
                                ============================&lt;br /&gt;
                                0 + 1 = 1 *)&lt;br /&gt;
    reflexivity.&lt;br /&gt;
  -                          (* n&amp;#039; : nat&lt;br /&gt;
                                HIn&amp;#039; : n&amp;#039; + 1 = S n&amp;#039;&lt;br /&gt;
                                ============================&lt;br /&gt;
                                S n&amp;#039; + 1 = S (S n&amp;#039;) *)&lt;br /&gt;
    simpl.                   (* S (n&amp;#039; + 1) = S (S n&amp;#039;) *)&lt;br /&gt;
    rewrite HIn&amp;#039;.            (* S (S n&amp;#039;) = S (S n&amp;#039;) *)&lt;br /&gt;
    reflexivity.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* 2º intento *)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Theorem longitud_inversa : forall xs:ListaNat,&lt;br /&gt;
  longitud (inversa xs) = longitud xs.&lt;br /&gt;
Proof.&lt;br /&gt;
  intros xs.                    (* xs : ListaNat&lt;br /&gt;
                                   ============================&lt;br /&gt;
                                   longitud (inversa xs) = longitud xs *)&lt;br /&gt;
  induction xs as [| x xs&amp;#039; HI].&lt;br /&gt;
  -                             (* &lt;br /&gt;
                                   ============================&lt;br /&gt;
                                   longitud (inversa [ ]) = longitud [ ] *)&lt;br /&gt;
    reflexivity.&lt;br /&gt;
  -                             (* x : nat&lt;br /&gt;
                                   xs&amp;#039; : ListaNat&lt;br /&gt;
                                   HI : longitud (inversa xs&amp;#039;) = longitud xs&amp;#039;&lt;br /&gt;
                                   ============================&lt;br /&gt;
                                   longitud (inversa (x :: xs&amp;#039;)) = &lt;br /&gt;
                                    longitud (x :: xs&amp;#039;) *)&lt;br /&gt;
    simpl.                      (* longitud (inversa xs&amp;#039; ++ [x]) = &lt;br /&gt;
                                   S (longitud xs&amp;#039;) *)&lt;br /&gt;
    rewrite longitud_conc.      (* longitud (inversa xs&amp;#039;) + longitud [x] = &lt;br /&gt;
                                   S (longitud xs&amp;#039;) *)&lt;br /&gt;
    rewrite HI.                 (* longitud xs&amp;#039; + longitud [x] = &lt;br /&gt;
                                   S (longitud xs&amp;#039;) *)&lt;br /&gt;
    simpl.                      (* longitud xs&amp;#039; + 1 = S (longitud xs&amp;#039;) *)&lt;br /&gt;
    rewrite suma_n_1.           (* 1 + longitud xs&amp;#039; = S (longitud xs&amp;#039;) *)&lt;br /&gt;
    reflexivity.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* =====================================================================&lt;br /&gt;
   § 4. Opcionales&lt;br /&gt;
   ================================================================== *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 4.1. Definir el tipo OpcionalNat con los contructores&lt;br /&gt;
      Some : nat -&amp;gt; OpcionalNat&lt;br /&gt;
      None : OpcionalNat.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Inductive OpcionalNat : Type :=&lt;br /&gt;
  | Some : nat -&amp;gt; OpcionalNat&lt;br /&gt;
  | None : OpcionalNat.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 4.2. Definir la función&lt;br /&gt;
      nthOpcional : ListaNat -&amp;gt; nat -&amp;gt; OpcionalNat&lt;br /&gt;
   tal que (nthOpcional xs n) es el n-ésimo elemento de la lista xs o None&lt;br /&gt;
   si la lista tiene menos de n elementos. Por ejemplo,&lt;br /&gt;
      nthOpcional [4;5;6;7] 0 = Some 4.&lt;br /&gt;
      nthOpcional [4;5;6;7] 3 = Some 7.&lt;br /&gt;
      nthOpcional [4;5;6;7] 9 = None.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Fixpoint nthOpcional (xs : ListaNat) (n : nat) : OpcionalNat :=&lt;br /&gt;
  match xs with&lt;br /&gt;
  | nil      =&amp;gt; None&lt;br /&gt;
  | x :: xs&amp;#039; =&amp;gt; match iguales_nat n O with&lt;br /&gt;
                | true  =&amp;gt; Some x&lt;br /&gt;
                | false =&amp;gt; nthOpcional xs&amp;#039; (pred n)&lt;br /&gt;
                end&lt;br /&gt;
  end.&lt;br /&gt;
&lt;br /&gt;
Example prop_nthOpcional1 :&lt;br /&gt;
  nthOpcional [4;5;6;7] 0 = Some 4.&lt;br /&gt;
Proof. reflexivity. Qed.&lt;br /&gt;
&lt;br /&gt;
Example prop_nthOpcional2 :&lt;br /&gt;
  nthOpcional [4;5;6;7] 3 = Some 7.&lt;br /&gt;
Proof. reflexivity. Qed.&lt;br /&gt;
&lt;br /&gt;
Example prop_nthOpcional3 :&lt;br /&gt;
  nthOpcional [4;5;6;7] 9 = None.&lt;br /&gt;
Proof. reflexivity. Qed.&lt;br /&gt;
&lt;br /&gt;
(* La definición con condicionales es: *)&lt;br /&gt;
Fixpoint nthOpcional&amp;#039; (xs : ListaNat) (n : nat) : OpcionalNat :=&lt;br /&gt;
  match xs with&lt;br /&gt;
  | nil      =&amp;gt; None&lt;br /&gt;
  | x :: xs&amp;#039; =&amp;gt; if iguales_nat x O&lt;br /&gt;
               then Some x&lt;br /&gt;
               else nthOpcional&amp;#039; xs&amp;#039; (pred n)&lt;br /&gt;
  end.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 4.3. Definir la función&lt;br /&gt;
      extraeOpcionalNat -&amp;gt; OpcionalNat -&amp;gt; nat&lt;br /&gt;
   tal que (extraeOpcionalNat d o) es el valor de o, si o tiene valor o es d&lt;br /&gt;
   en caso contrario. Por ejemplo,&lt;br /&gt;
      extraeOpcionalNat 3 (Some 7) = 7&lt;br /&gt;
      extraeOpcionalNat 3 None     = 3&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Definition extraeOpcionalNat (d : nat) (o : OpcionalNat) : nat :=&lt;br /&gt;
  match o with&lt;br /&gt;
  | Some n&amp;#039; =&amp;gt; n&amp;#039;&lt;br /&gt;
  | None    =&amp;gt; d&lt;br /&gt;
  end.&lt;br /&gt;
&lt;br /&gt;
Compute (extraeOpcionalNat 3 (Some 7)).&lt;br /&gt;
(* ===&amp;gt; 7 : nat *)&lt;br /&gt;
Compute (extraeOpcionalNat 3 None).&lt;br /&gt;
(* ===&amp;gt; 3 : nat *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Nota. Finalizar el módulo ListaNat.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
End ListaNat.&lt;br /&gt;
&lt;br /&gt;
(* =====================================================================&lt;br /&gt;
   § 5. Diccionarios (o funciones parciales)&lt;br /&gt;
   ================================================================== *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 5.1. Definir el tipo id (por identificador) con el&lt;br /&gt;
   constructor &lt;br /&gt;
      Id : nat -&amp;gt; id.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Inductive id : Type :=&lt;br /&gt;
  | Id : nat -&amp;gt; id.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 5.2. Definir la función&lt;br /&gt;
      iguales_id : id -&amp;gt; id -&amp;gt; bool&lt;br /&gt;
   tal que (iguales_id x1 x2) se verifica si tienen la misma clave. Por&lt;br /&gt;
   ejemplo, &lt;br /&gt;
      iguales_id (Id 3) (Id 3) = true : bool&lt;br /&gt;
      iguales_id (Id 3) (Id 4) = false : bool&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Definition iguales_id (x1 x2 : id) :=&lt;br /&gt;
  match x1, x2 with&lt;br /&gt;
  | Id n1, Id n2 =&amp;gt; iguales_nat n1 n2&lt;br /&gt;
  end.&lt;br /&gt;
&lt;br /&gt;
Compute (iguales_id (Id 3) (Id 3)).&lt;br /&gt;
(* ===&amp;gt; true : bool *)&lt;br /&gt;
Compute (iguales_id (Id 3) (Id 4)).&lt;br /&gt;
(* ===&amp;gt; false : bool *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 5.3. Iniciar el módulo Diccionario que importa a ListaNat.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Module Diccionario.&lt;br /&gt;
Export ListaNat.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 5.4. Definir el tipo diccionario con los contructores&lt;br /&gt;
      vacio    : diccionario&lt;br /&gt;
      registro : id -&amp;gt; nat -&amp;gt; diccionario -&amp;gt; diccionario.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Inductive diccionario : Type :=&lt;br /&gt;
  | vacio    : diccionario&lt;br /&gt;
  | registro : id -&amp;gt; nat -&amp;gt; diccionario -&amp;gt; diccionario.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 5.5. Definir los diccionarios cuyos elementos son&lt;br /&gt;
      + []&lt;br /&gt;
      + [(3,6)]&lt;br /&gt;
      + [(2,4), (3,6)]&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Definition diccionario1 := vacio.&lt;br /&gt;
Definition diccionario2 := registro (Id 3) 6 diccionario1.&lt;br /&gt;
Definition diccionario3 := registro (Id 2) 4 diccionario2.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 5.6. Definir la función&lt;br /&gt;
      valor : id -&amp;gt; diccionario -&amp;gt; OpcionalNat &lt;br /&gt;
   tal que (valor i d) es el valor de la entrada de d con clave i, o&lt;br /&gt;
   None si d no tiene ninguna entrada con clave i. Por ejemplo,&lt;br /&gt;
      valor (Id 2) diccionario3 = Some 4&lt;br /&gt;
      valor (Id 2) diccionario2 = None&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Fixpoint valor (x : id) (d : diccionario) : OpcionalNat :=&lt;br /&gt;
  match d with&lt;br /&gt;
  | vacio           =&amp;gt; None&lt;br /&gt;
  | registro y v d&amp;#039; =&amp;gt; if iguales_id x y&lt;br /&gt;
                      then Some v&lt;br /&gt;
                      else valor x d&amp;#039;&lt;br /&gt;
  end.&lt;br /&gt;
&lt;br /&gt;
Compute (valor (Id 2) diccionario3).&lt;br /&gt;
(* = Some 4 : OpcionalNat *)&lt;br /&gt;
Compute (valor (Id 2) diccionario2).&lt;br /&gt;
(* = None : OpcionalNat*)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 5.7. Definir la función&lt;br /&gt;
      actualiza : diccionario -&amp;gt; id -&amp;gt; nat -&amp;gt; diccionario&lt;br /&gt;
   tal que (actualiza d x v) es el diccionario obtenido a partir del d&lt;br /&gt;
   + si d tiene un elemento con clave x, le cambia su valor a v&lt;br /&gt;
   + en caso contrario, le añade el elemento v con clave x &lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Definition actualiza (d : diccionario)&lt;br /&gt;
                     (x : id) (v : nat)&lt;br /&gt;
                     : diccionario :=&lt;br /&gt;
  registro x v d.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 5.8. Finalizar el módulo Diccionario&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
End Diccionario.&lt;br /&gt;
&lt;br /&gt;
(* =====================================================================&lt;br /&gt;
   § Bibliografía&lt;br /&gt;
   ================================================================== *)&lt;br /&gt;
&lt;br /&gt;
(*&lt;br /&gt;
 + &amp;quot;Working with structured data&amp;quot; de Peirce et als. &lt;br /&gt;
   http://bit.ly/2LQABsv&lt;br /&gt;
 *)&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/RA2018/index.php?title=Tema_2:_Demostraciones_por_inducci%C3%B3n_sobre_los_n%C3%BAmeros_naturales_en_Coq&amp;diff=369</id>
		<title>Tema 2: Demostraciones por inducción sobre los números naturales en Coq</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2018/index.php?title=Tema_2:_Demostraciones_por_inducci%C3%B3n_sobre_los_n%C3%BAmeros_naturales_en_Coq&amp;diff=369"/>
		<updated>2019-02-14T07:36:02Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: Protegió «Tema 2: Demostraciones por inducción sobre los números naturales en Coq» ([Editar=Solo administradores] (indefinido) [Trasladar=Solo administradores] (indefinido))&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;coq&amp;quot;&amp;gt;&lt;br /&gt;
Require Export T1_PF_en_Coq.&lt;br /&gt;
&lt;br /&gt;
(* El contenido de la teoría es&lt;br /&gt;
   1. Demostraciones por inducción. &lt;br /&gt;
   2. Demostraciones anidadas.&lt;br /&gt;
   3. Demostraciones formales vs demostraciones informales.&lt;br /&gt;
   4. Ejercicios complementarios *)&lt;br /&gt;
&lt;br /&gt;
(* =====================================================================&lt;br /&gt;
   § 1. Demostraciones por inducción &lt;br /&gt;
   ================================================================== *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 1.1. Demostrar que&lt;br /&gt;
      forall n:nat, n = n + 0.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
(* 1º intento: con métodos elementales *)&lt;br /&gt;
Theorem suma_n_0_a: forall n : nat, n = n + 0.&lt;br /&gt;
Proof.&lt;br /&gt;
  intros n. (* n : nat&lt;br /&gt;
               ============================&lt;br /&gt;
                n = n + 0 *)&lt;br /&gt;
  simpl.    (* n : nat&lt;br /&gt;
               ============================&lt;br /&gt;
                n = n + 0 *)&lt;br /&gt;
Abort.&lt;br /&gt;
&lt;br /&gt;
(* 2º intento: con casos *)&lt;br /&gt;
Theorem suma_n_0_b : forall n : nat,&lt;br /&gt;
  n = n + 0.&lt;br /&gt;
Proof.&lt;br /&gt;
  intros n.             (* n : nat&lt;br /&gt;
                           ============================&lt;br /&gt;
                            n = n + 0 *)&lt;br /&gt;
  destruct n as [| n&amp;#039;]. &lt;br /&gt;
  -                     (* &lt;br /&gt;
                           ============================&lt;br /&gt;
                            0 = 0 + 0 *)&lt;br /&gt;
    reflexivity. &lt;br /&gt;
  -                     (* n&amp;#039; : nat&lt;br /&gt;
                           ============================&lt;br /&gt;
                            S n&amp;#039; = S n&amp;#039; + 0  *)&lt;br /&gt;
    simpl.              (* n&amp;#039; : nat&lt;br /&gt;
                           ============================&lt;br /&gt;
                            S n&amp;#039; = S (n&amp;#039; + 0) *)&lt;br /&gt;
Abort.&lt;br /&gt;
&lt;br /&gt;
(* 3ª intento: con inducción *)&lt;br /&gt;
Theorem suma_n_0 : forall n : nat,&lt;br /&gt;
    n = n + 0.&lt;br /&gt;
Proof.&lt;br /&gt;
  intros n.                   (* n : nat&lt;br /&gt;
                                 ============================&lt;br /&gt;
                                 n = n + 0 *) &lt;br /&gt;
  induction n as [| n&amp;#039; IHn&amp;#039;]. &lt;br /&gt;
  +                           (*   &lt;br /&gt;
                                 ============================&lt;br /&gt;
                                 0 = 0 + 0 *)&lt;br /&gt;
    reflexivity.&lt;br /&gt;
  +                           (* n&amp;#039; : nat&lt;br /&gt;
                                 IHn&amp;#039; : n&amp;#039; = n&amp;#039; + 0&lt;br /&gt;
                                 ============================&lt;br /&gt;
                                 S n&amp;#039; = S n&amp;#039; + 0 *)&lt;br /&gt;
    simpl.                    (* S n&amp;#039; = S (n&amp;#039; + 0) *)&lt;br /&gt;
    rewrite &amp;lt;- IHn&amp;#039;.          (* S n&amp;#039; = S n&amp;#039; *)&lt;br /&gt;
    reflexivity.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 1.2. Demostrar que&lt;br /&gt;
      forall n, n - n = 0.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Theorem resta_n_n: forall n : nat, n - n = 0.&lt;br /&gt;
Proof.&lt;br /&gt;
  intros n.                   (* n : nat&lt;br /&gt;
                                 ============================&lt;br /&gt;
                                 n - n = 0 *)&lt;br /&gt;
  induction n as [| n&amp;#039; IHn&amp;#039;]. &lt;br /&gt;
  +                           (*  &lt;br /&gt;
                                 ============================&lt;br /&gt;
                                 0 - 0 = 0 *)&lt;br /&gt;
    reflexivity.&lt;br /&gt;
  +                           (* n&amp;#039; : nat&lt;br /&gt;
                                 IHn&amp;#039; : n&amp;#039; - n&amp;#039; = 0&lt;br /&gt;
                                 ============================&lt;br /&gt;
                                 S n&amp;#039; - S n&amp;#039; = 0 *)&lt;br /&gt;
    simpl.                    (* n&amp;#039; - n&amp;#039; = 0 *)&lt;br /&gt;
    rewrite IHn&amp;#039;.             (* 0 = 0 *)&lt;br /&gt;
    reflexivity.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* =====================================================================&lt;br /&gt;
   § 2. Demostraciones anidadas&lt;br /&gt;
   ================================================================== *)&lt;br /&gt;
&lt;br /&gt;
(* ---------------------------------------------------------------------&lt;br /&gt;
   Ejemplo 2.1. Demostrar que&lt;br /&gt;
      forall n m : nat, (0 + n) * m = n * m.&lt;br /&gt;
   ------------------------------------------------------------------ *)&lt;br /&gt;
&lt;br /&gt;
Theorem producto_0_suma&amp;#039;: forall n m : nat, (0 + n) * m = n * m.&lt;br /&gt;
Proof.&lt;br /&gt;
  intros n m.            (* n, m : nat&lt;br /&gt;
                            ============================&lt;br /&gt;
                            (0 + n) * m = n * m *)&lt;br /&gt;
  assert (H: 0 + n = n). &lt;br /&gt;
  -                      (* n, m : nat&lt;br /&gt;
                            ============================&lt;br /&gt;
                            0 + n = n *)&lt;br /&gt;
    reflexivity.&lt;br /&gt;
  -                      (* n, m : nat&lt;br /&gt;
                            H : 0 + n = n&lt;br /&gt;
                            ============================&lt;br /&gt;
                            (0 + n) * m = n * m *)&lt;br /&gt;
    rewrite -&amp;gt; H.        (* n * m = n * m *)&lt;br /&gt;
    reflexivity.&lt;br /&gt;
Qed.&lt;br /&gt;
&lt;br /&gt;
(* =====================================================================&lt;br /&gt;
   § Bibliografía&lt;br /&gt;
   ================================================================== *)&lt;br /&gt;
&lt;br /&gt;
(*&lt;br /&gt;
 + &amp;quot;Demostraciones por inducción&amp;quot; de Peirce et als. http://bit.ly/2NRSWTF&lt;br /&gt;
 *)&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/RA2018/index.php?title=Temas&amp;diff=368</id>
		<title>Temas</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2018/index.php?title=Temas&amp;diff=368"/>
		<updated>2019-02-14T07:35:46Z</updated>

		<summary type="html">&lt;p&gt;Jalonso: Protegió «Temas» ([Editar=Solo administradores] (indefinido) [Trasladar=Solo administradores] (indefinido))&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;En esta página se irán publicando los temas conforme se vayan estudiando.&lt;br /&gt;
&lt;br /&gt;
== RA con Isabelle/HOL ==&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: Deducción natural proposicional:&lt;br /&gt;
** [http://www.cs.us.es/~jalonso/cursos/li/temas/tema-1.pdf Tema 7a: Sintaxis y semántica de la lógica proposicional].&lt;br /&gt;
** [http://www.cs.us.es/~jalonso/cursos/li/temas/tema-2.pdf Tema 7b: Deducción natural proposicional].&lt;br /&gt;
** [[Tema 7b: Deducción natural proposicional con Isabelle/HOL | Tema 7c: 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-7.pdf Tema 8a: Sintaxis y semántica de la lógica de primer orden].&lt;br /&gt;
** [http://www.cs.us.es/~jalonso/cursos/li/temas/tema-8.pdf Tema 8b: 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 | Tema 8c: Deducción natural en lógica de primer orden con Isabelle/HOL]]&lt;br /&gt;
* [[Tema 9: Editores lógicos]]. &lt;br /&gt;
* [[Tema 10: Caso de estudio: Compilación de expresiones]].&lt;br /&gt;
* [[Tema 11: Definiciones inductivas]].&lt;br /&gt;
* [[Tema 12: Conjuntos, funciones y relaciones]].&lt;br /&gt;
&lt;br /&gt;
== RA con Coq ==&lt;br /&gt;
* [[Tema 1: Programación funcional y métodos elementales de demostración en Coq]].&lt;br /&gt;
* [[Tema 2: Demostraciones por inducción sobre los números naturales en Coq]].&lt;br /&gt;
* [[Tema 3: Datos estructurados en Coq]].&lt;br /&gt;
* [[Tema 4: Polimorfismo y funciones de orden superior en Coq]].&lt;br /&gt;
* [[Tema 5: Tácticas básicas de Coq]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&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;
* [[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>
</feed>