<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="es">
	<id>https://www.glc.us.es/~jalonso/DAO/index.php?action=history&amp;feed=atom&amp;title=RA12_Relaci%C3%B3n_22</id>
	<title>RA12 Relación 22 - Historial de revisiones</title>
	<link rel="self" type="application/atom+xml" href="https://www.glc.us.es/~jalonso/DAO/index.php?action=history&amp;feed=atom&amp;title=RA12_Relaci%C3%B3n_22"/>
	<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/DAO/index.php?title=RA12_Relaci%C3%B3n_22&amp;action=history"/>
	<updated>2026-09-20T12:44:30Z</updated>
	<subtitle>Historial de revisiones para esta página en el wiki</subtitle>
	<generator>MediaWiki 1.31.14</generator>
	<entry>
		<id>https://www.glc.us.es/~jalonso/DAO/index.php?title=RA12_Relaci%C3%B3n_22&amp;diff=195&amp;oldid=prev</id>
		<title>Jalonso: Texto reemplazado: «&quot;isar&quot;» por «&quot;isabelle&quot;»</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/DAO/index.php?title=RA12_Relaci%C3%B3n_22&amp;diff=195&amp;oldid=prev"/>
		<updated>2018-07-15T12:04:10Z</updated>

		<summary type="html">&lt;p&gt;Texto reemplazado: «&amp;quot;isar&amp;quot;» por «&amp;quot;isabelle&amp;quot;»&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;es&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;← Revisión anterior&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;Revisión del 12:04 15 jul 2018&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l1&quot; &gt;Línea 1:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Línea 1:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&#039;diff-marker&#039;&gt;−&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;source lang=&amp;quot;&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;isar&lt;/del&gt;&amp;quot;&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&#039;diff-marker&#039;&gt;+&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;source lang=&amp;quot;&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;isabelle&lt;/ins&gt;&amp;quot;&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&#039;diff-marker&#039;&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;header {* R22: Diagramas de decisión binarios *}&lt;/div&gt;&lt;/td&gt;&lt;td class=&#039;diff-marker&#039;&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;header {* R22: Diagramas de decisión binarios *}&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&#039;diff-marker&#039;&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class=&#039;diff-marker&#039;&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Jalonso</name></author>
		
	</entry>
	<entry>
		<id>https://www.glc.us.es/~jalonso/DAO/index.php?title=RA12_Relaci%C3%B3n_22&amp;diff=136&amp;oldid=prev</id>
		<title>Jalonso: Página creada con &#039;&lt;source lang=&quot;isar&quot;&gt; header {* R22: Diagramas de decisión binarios *}  theory R22 imports Main  begin   text {*   Las funciones booleanas se pueden representar mediante diagram...&#039;</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/DAO/index.php?title=RA12_Relaci%C3%B3n_22&amp;diff=136&amp;oldid=prev"/>
		<updated>2013-06-06T06:17:45Z</updated>

		<summary type="html">&lt;p&gt;Página creada con &amp;#039;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt; header {* R22: Diagramas de decisión binarios *}  theory R22 imports Main  begin   text {*   Las funciones booleanas se pueden representar mediante diagram...&amp;#039;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Página nueva&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;lt;source lang=&amp;quot;isar&amp;quot;&amp;gt;&lt;br /&gt;
header {* R22: Diagramas de decisión binarios *}&lt;br /&gt;
&lt;br /&gt;
theory R22&lt;br /&gt;
imports Main &lt;br /&gt;
begin &lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Las funciones booleanas se pueden representar mediante diagramas de&lt;br /&gt;
  decisión binarios (DDB). Por ejemplo, la función f definida por la&lt;br /&gt;
  tabla de la izquierda se representa por el DDB de la derecha&lt;br /&gt;
     +---+---+---+----------+            p       &lt;br /&gt;
     | p | q | r | f(p,q,r) |           / \      &lt;br /&gt;
     +---+---+---+----------+          /   \     &lt;br /&gt;
     | F | F | * | V        |         q     q    &lt;br /&gt;
     | F | V | * | F        |        / \   / \   &lt;br /&gt;
     | V | F | * | F        |       V   F F   r  &lt;br /&gt;
     | V | V | F | F        |                / \ &lt;br /&gt;
     | V | V | V | V        |               F   V&lt;br /&gt;
     +---+---+---+----------+&lt;br /&gt;
  Para cada variable, si su valor es falso se evalúa su hijo izquierdo y&lt;br /&gt;
  si es verdadero se evalúa su hijo derecho.&lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 1. Definir el tipo de datos ddb para representar los&lt;br /&gt;
  diagramas de decisión binarios. Por ejemplo, el DDB anterior se&lt;br /&gt;
  representa por&lt;br /&gt;
     N (N (H True) (H False)) (N (H False) (N (H False) (H True)))&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
datatype ddb = H bool | N ddb ddb&lt;br /&gt;
&lt;br /&gt;
value &amp;quot;N (N (H True) (H False)) (N (H False) (N (H False) (H True)))&amp;quot; &lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 2. Definir ddb1 para representar el DDB del ejercicio 1.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
abbreviation ddb1 :: ddb where&lt;br /&gt;
  &amp;quot;ddb1 ≡ N (N (H True) (H False)) (N (H False) (N (H False) (H True)))&amp;quot; &lt;br /&gt;
&lt;br /&gt;
text {*  &lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 3. Definir int1,..., int8 para representar las&lt;br /&gt;
  interpretaciones del ejercicio 1.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
abbreviation int1 :: &amp;quot;nat ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;int1 x ≡ False&amp;quot;&lt;br /&gt;
abbreviation int2 :: &amp;quot;nat ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;int2 ≡ int1 (2 := True)&amp;quot;&lt;br /&gt;
abbreviation int3 :: &amp;quot;nat ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;int3 ≡ int1 (1 := True)&amp;quot;&lt;br /&gt;
abbreviation int4 :: &amp;quot;nat ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;int4 ≡ int1 (1 := True, 2 := True)&amp;quot;&lt;br /&gt;
abbreviation int5 :: &amp;quot;nat ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;int5 ≡ int1 (0 := True)&amp;quot;&lt;br /&gt;
abbreviation int6 :: &amp;quot;nat ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;int6 ≡ int1 (0 := True, 2 := True)&amp;quot;&lt;br /&gt;
abbreviation int7 :: &amp;quot;nat ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;int7 ≡ int1 (0 := True, 1 := True)&amp;quot;&lt;br /&gt;
abbreviation int8 :: &amp;quot;nat ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;int8 ≡ int1 (0 := True, 1 := True, 2 := True)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 4. Definir la función&lt;br /&gt;
     valor :: &amp;quot;(nat ⇒ bool) ⇒ nat ⇒ ddb ⇒ bool&amp;quot;&lt;br /&gt;
  tal que (valor i n d) es el valor del DDB d en la interpretación i a&lt;br /&gt;
  partir de la variable de índice n. Por ejemplo,&lt;br /&gt;
     valor int1 0 ddb1 = True&lt;br /&gt;
     valor int2 0 ddb1 = True&lt;br /&gt;
     valor int3 0 ddb1 = False&lt;br /&gt;
     valor int4 0 ddb1 = False&lt;br /&gt;
     valor int5 0 ddb1 = False&lt;br /&gt;
     valor int6 0 ddb1 = False&lt;br /&gt;
     valor int7 0 ddb1 = False&lt;br /&gt;
     valor int8 0 ddb1 = True&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
fun valor :: &amp;quot;(nat ⇒ bool) ⇒ nat ⇒ ddb ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;valor i n a = undefined&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 5. Definir la función&lt;br /&gt;
     ddb_op_un :: &amp;quot;(bool ⇒ bool) ⇒ ddb ⇒ ddb&lt;br /&gt;
  tal que (ddb_op_un f d) es el diagrama obtenido aplicando el operador&lt;br /&gt;
  unitario f a cada hoja de DDB d de forma que se conserve el valor; es&lt;br /&gt;
  decir, &lt;br /&gt;
     valor i n (ddb_op_un f d) = f (valor i n d)&amp;quot;&lt;br /&gt;
  Por ejemplo,&lt;br /&gt;
     value &amp;quot;ddb_op_un (λx. ¬x) ddb1&amp;quot;&lt;br /&gt;
     = N (N (H False) (H True)) (N (H True) (N (H True) (H False)))&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
fun ddb_op_un :: &amp;quot;(bool ⇒ bool) ⇒ ddb ⇒ ddb&amp;quot; where&lt;br /&gt;
  &amp;quot;ddb_op_un f a = undefined&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 6. Demostrar que la definición de ddb_op_un es correcta; es&lt;br /&gt;
  decir, &lt;br /&gt;
     valor i n (ddb_op_un f d) = f (valor i n d)&amp;quot;&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
theorem ddb_op_un_correcto:&lt;br /&gt;
  &amp;quot;valor i n (ddb_op_un f d) = f (valor i n d)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 7. Definir la función&lt;br /&gt;
     ddb_op_bin :: &amp;quot;(bool ⇒ bool ⇒ bool) ⇒ ddb ⇒ ddb ⇒ ddb&amp;quot; &lt;br /&gt;
  tal que (ddb_op_bin f d1 d2) es el diagrama obtenido aplicando el&lt;br /&gt;
  operador binario f a los DDB d1 y d2 de forma que se conserve el&lt;br /&gt;
  valor; es decir, &lt;br /&gt;
     valor i n (ddb_op_bin f d1 d2) = f (valor i n d1) (valor i n d2)&lt;br /&gt;
  Por ejemplo,&lt;br /&gt;
     ddb_op_bin (op ∧) ddb1 (N (H True) (H False))&lt;br /&gt;
     = N (N (H True) (H False)) (N (H False) (N (H False) (H False)))&lt;br /&gt;
     ddb_op_bin (op ∧) ddb1 (N (H False) (H True))&lt;br /&gt;
     = N (N (H False) (H False)) (N (H False) (N (H False) (H True)))&lt;br /&gt;
     ddb_op_bin (op ∨) ddb1 (N (H True) (H False))&lt;br /&gt;
     = N (N (H True) (H True)) (N (H False) (N (H False) (H True)))&lt;br /&gt;
     ddb_op_bin (op ∨) ddb1 (N (H False) (H True))&lt;br /&gt;
     = N (N (H True) (H False)) (N (H True) (N (H True) (H True)))&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
fun ddb_op_bin :: &amp;quot;(bool ⇒ bool ⇒ bool) ⇒ ddb ⇒ ddb ⇒ ddb&amp;quot; where&lt;br /&gt;
  &amp;quot;ddb_op_bin f d1 d2 = undefined&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 8. Demostrar que la definición de ddb_op_bin es correcta; &lt;br /&gt;
  es decir, &lt;br /&gt;
     valor i n (ddb_op_bin f d1 d2) = f (valor i n d1) (valor i n d2)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
theorem ddb_op_bin_correcto:&lt;br /&gt;
  &amp;quot;valor i n (ddb_op_bin f d1 d2) = f (valor i n d1) (valor i n d2)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 9. Definir la función&lt;br /&gt;
     ddb_and :: &amp;quot;ddb ⇒ ddb ⇒ ddb&amp;quot;&lt;br /&gt;
  tal que (ddb_and d1 d2) es el diagrama correspondiente a la conjunción&lt;br /&gt;
  de los DDB d1 y d2 de forma que se conserva el valor; es decir, &lt;br /&gt;
     valor i n (ddb_and d1 d2) = (valor i n d1 ∧ valor i n d2)&lt;br /&gt;
  Por ejemplo,&lt;br /&gt;
     ddb_and ddb1 (N (H True) (H False))&lt;br /&gt;
     = N (N (H True) (H False)) (N (H False) (N (H False) (H False)))&lt;br /&gt;
     ddb_and ddb1 (N (H False) (H True))&lt;br /&gt;
     = N (N (H False) (H False)) (N (H False) (N (H False) (H True)))&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
definition ddb_and :: &amp;quot;ddb ⇒ ddb ⇒ ddb&amp;quot; where&lt;br /&gt;
  &amp;quot;ddb_and ≡ undefined&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 10. Demostrar que la definición de ddb_and es correcta; &lt;br /&gt;
  es decir, &lt;br /&gt;
     valor i n (ddb_and d1 d2) = (valor i n d1 ∧ valor i n d2)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
theorem ddb_and_correcta:&lt;br /&gt;
  &amp;quot;valor i n (ddb_and d1 d2) = (valor i n d1 ∧ valor i n d2)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 11. Definir la función&lt;br /&gt;
     ddb_or :: &amp;quot;ddb ⇒ ddb ⇒ ddb&amp;quot;&lt;br /&gt;
  tal que (ddb_or d1 d2) es el diagrama correspondiente a la disyunción&lt;br /&gt;
  de los DDB d1 y d2 de forma que se conserva el valor; es decir, &lt;br /&gt;
     valor i n (ddb_or d1 d2) = (valor i n d1 ∨ valor i n d2)&lt;br /&gt;
  Por ejemplo,&lt;br /&gt;
     ddb_or ddb1 (N (H True) (H False))&lt;br /&gt;
     = N (N (H True) (H True)) (N (H False) (N (H False) (H True)))&lt;br /&gt;
     ddb_or ddb1 (N (H False) (H True))&lt;br /&gt;
     = N (N (H True) (H False)) (N (H True) (N (H True) (H True)))&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
definition ddb_or :: &amp;quot;ddb ⇒ ddb ⇒ ddb&amp;quot; where&lt;br /&gt;
  &amp;quot;ddb_or ≡ undefined&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 12. Demostrar que la definición de ddb_or es correcta; &lt;br /&gt;
  es decir, &lt;br /&gt;
     valor i n (ddb_or d1 d2) = (valor i n d1 ∨ valor i n d2)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
theorem ddb_or_correcta:&lt;br /&gt;
  &amp;quot;valor i n (ddb_or d1 d2) = (valor i n d1 ∨ valor i n d2)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 13. Definir la función&lt;br /&gt;
     ddb_not :: &amp;quot;ddb ⇒ ddb&amp;quot;&lt;br /&gt;
  tal que (ddb_not d) es el diagrama correspondiente a la negación&lt;br /&gt;
  del DDB d de forma que se conserva el valor; es decir, &lt;br /&gt;
     valor i n (ddb_or d1 d2) = (valor i n d1 ∨ valor i n d2)&lt;br /&gt;
  Por ejemplo,&lt;br /&gt;
     ddb_not ddb1&lt;br /&gt;
     = N (N (H False) (H True)) (N (H True) (N (H True) (H False)))&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
definition ddb_not :: &amp;quot;ddb ⇒ ddb&amp;quot; where&lt;br /&gt;
  &amp;quot;ddb_not ≡ undefined&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 14. Demostrar que la definición de ddb_not es correcta; &lt;br /&gt;
  es decir, &lt;br /&gt;
     valor i n (ddb_not d) = (¬ valor i n d)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
theorem ddb_not_correcta: &lt;br /&gt;
  &amp;quot;valor i n (ddb_not d) = (¬ valor i n d)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 15. Definir la función&lt;br /&gt;
     xor :: &amp;quot;bool ⇒ bool ⇒ bool&amp;quot; &lt;br /&gt;
  tal que (xor x y) es la disyunción excluyente de x e y. Por ejemplo,&lt;br /&gt;
     xor True False = True&lt;br /&gt;
     xor True True  = False&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
definition xor :: &amp;quot;bool ⇒ bool ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;xor x y ≡ undefined&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 16. Definir la función&lt;br /&gt;
     ddb_xor :: &amp;quot;ddb ⇒ ddb ⇒ ddb&amp;quot;&lt;br /&gt;
  tal que (ddb_xor d1 d2) es el diagrama correspondiente a la disyunción&lt;br /&gt;
  excluyente de los DDB d1 y d2. Por ejemplo,&lt;br /&gt;
     ddb_xor ddb1 (N (H True) (H False))&lt;br /&gt;
     = N (N (H True) (H True)) (N (H False) (N (H False) (H True)))&lt;br /&gt;
     ddb_xor ddb1 (N (H False) (H True))&lt;br /&gt;
     = N (N (H True) (H False)) (N (H True) (N (H True) (H True)))&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
definition ddb_xor :: &amp;quot;ddb ⇒ ddb ⇒ ddb&amp;quot; where&lt;br /&gt;
  &amp;quot;ddb_xor ≡ undefined&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 17. Demostrar que la definición de ddb_xor es correcta; &lt;br /&gt;
  es decir, &lt;br /&gt;
     valor i n (ddb_xor d1 d2) = xor (valor i n d1) (valor i n d2)&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
theorem ddb_xor_correcta: &lt;br /&gt;
  &amp;quot;valor i n (ddb_xor d1 d2) = xor (valor i n d1) (valor i n d2)&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 18. Definir la función&lt;br /&gt;
     ddb_var :: &amp;quot;nat ⇒ ddb&amp;quot; where&lt;br /&gt;
  tal que (ddb_var n) es el diagrama equivalente a la variable p(n). Por&lt;br /&gt;
  ejemplo, &lt;br /&gt;
     ddb_var 0&lt;br /&gt;
     = N (H False) (H True)&lt;br /&gt;
     ddb_var 1&lt;br /&gt;
     = N (N (H False) (H True)) (N (H False) (H True))&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
fun ddb_var :: &amp;quot;nat ⇒ ddb&amp;quot; where&lt;br /&gt;
  &amp;quot;ddb_var n = undefined&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 19. Demostrar que la definición de ddb_var es correcta; &lt;br /&gt;
  es decir, &lt;br /&gt;
     &amp;quot;valor i 0 (ddb_var n) = i n&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
lemma ddb_var_correcta: &lt;br /&gt;
  &amp;quot;valor i 0 (ddb_var n) = i n&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 20. Definir el tipo de las fórmulas proposicionales&lt;br /&gt;
  contruidas con la constante T, las variables (Var n) y las conectivas&lt;br /&gt;
  Not, And, Or y Xor.&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
datatype form = T &lt;br /&gt;
              | Var nat&lt;br /&gt;
              | Not form&lt;br /&gt;
              | And form form &lt;br /&gt;
              | Or  form form &lt;br /&gt;
              | Xor form form&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 21. Definir la función&lt;br /&gt;
     valor_fla :: &amp;quot;(nat ⇒ bool) ⇒ form ⇒ bool&amp;quot;&lt;br /&gt;
  tal que (valor_fla i f) es el valor de la fórmula f en la&lt;br /&gt;
  interpretación i. Por ejemplo,&lt;br /&gt;
     valor_fla (λn. True) (Xor T T)        = False&lt;br /&gt;
     valor_fla (λn. False) (Xor T (Var 1)) = True&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
fun valor_fla :: &amp;quot;(nat ⇒ bool) ⇒ form ⇒ bool&amp;quot; where&lt;br /&gt;
  &amp;quot;valor_fla i f = undefined&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 22. Definir la función&lt;br /&gt;
     ddb_fla :: &amp;quot;form ⇒ ddb&amp;quot;&lt;br /&gt;
  tal que (ddb_fla f) es el DDB equivalente a la fórmula f; es decir,&lt;br /&gt;
     valor i 0 (ddb_fla f) = valor_fla i f&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
fun ddb_fla :: &amp;quot;form ⇒ ddb&amp;quot; where&lt;br /&gt;
  &amp;quot;ddb_fla f = undefined&amp;quot;&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
  Ejercicio 23. Demostrar que la definición de ddb_fla es correcta; es&lt;br /&gt;
  decir, &lt;br /&gt;
     valor i 0 (ddb_fla f) = valor_fla i f&lt;br /&gt;
  --------------------------------------------------------------------- &lt;br /&gt;
*}&lt;br /&gt;
&lt;br /&gt;
theorem ddb_fla_correcta: &lt;br /&gt;
  &amp;quot;valor e 0 (ddb_fla f) = valor_fla e f&amp;quot;&lt;br /&gt;
oops&lt;br /&gt;
&lt;br /&gt;
text {*&lt;br /&gt;
  Referencias:&lt;br /&gt;
  · J.A. Alonso, F.J. Martín y J.L. Ruiz &amp;quot;Diagramas de decisión&lt;br /&gt;
    binarios&amp;quot;. En &lt;br /&gt;
       http://www.cs.us.es/cursos/lp-2005/temas/tema-07.pdf &lt;br /&gt;
  · Wikipedia &amp;quot;Binary decision diagram&amp;quot;. En&lt;br /&gt;
       http://en.wikipedia.org/wiki/Binary_decision_diagram&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>
</feed>