Diferencia entre revisiones de «Práctica 1 (LyC Verano)»

De Cuba-Wiki
(No se muestran 3 ediciones intermedias del mismo usuario)
Línea 1: Línea 1:
__NOTOC__
{{Back|Lógica y Computabilidad}}
{{Back|Lógica y Computabilidad}}


= Ejercicio 1 =
= Ejercicio 1 =
Sin usar macros, mostrar en <math>\mathcal{S}</math> un programa que compute la función vacía <math>\emptyset : I\!\!N^k \to I\!\!N</math>; es decir, la función que no está definida para ninguna k-tupla de naturales.
Sin usar macros, mostrar en <math>\mathcal{S}</math> un programa que compute la función vacía <math>\emptyset : I\!\!N^k \to I\!\!N</math>; es decir, la función que no está definida para ninguna k-tupla de naturales.


== Solución ==
==== Solución ====
 
       Y ← Y + 1
       Y ← Y + 1
  [A1] IF Y ≠ 0 GOTO A1
  [A1] IF Y ≠ 0 GOTO A1
 
<br>


= Ejercicio 2 =
= Ejercicio 2 =
Escribir en <math>\mathcal{S}</math> programas que computen los siguientes predicados.
Escribir en <math>\mathcal{S}</math> programas que computen los siguientes predicados.


Pueden utilizarse las macros <pre style="display: inline">GOTO A</pre> (salto incondicional), <pre style="display: inline">V ← k</pre> (asignación de constantes) y <pre style="display: inline">V1 ← V2</pre> (asignación de variables).
Pueden utilizarse las macros <pre style="display: inline">GOTO A</pre> (salto incondicional), <pre style="display: inline">V ← k</pre> (asignación de constantes) y <pre style="display: inline">V1 ← V2</pre> (asignación de variables).


== Ítem a ==
=== Ítem a ===
 
<math>
<math>
igual(x_1, x_2) = \begin{cases}
igual(x_1, x_2) = \begin{cases}
Línea 26: Línea 23:
</math>
</math>


=== Solución ===
==== Solución ====
 
  [A1] IF X1 ≠ 0 GOTO A2
  [A1] IF X1 ≠ 0 GOTO A2
       IF X2 ≠ 0 GOTO E
       IF X2 ≠ 0 GOTO E
       Y ← Y + 1
       Y ← Y + 1
       GOTO E
       GOTO E
  [A2] IF X1 ≠ 0 GOTO A3
  [A2] IF X2 ≠ 0 GOTO A3
       GOTO E
       GOTO E
  [A3] X1 ← X1 - 1
  [A3] X1 ← X1 - 1
Línea 38: Línea 34:
       GOTO A1
       GOTO A1


== Ítem b ==
=== Ítem b ===
 
<math>
<math>
distinto(x_1, x_2) = \begin{cases}
distinto(x_1, x_2) = \begin{cases}
Línea 47: Línea 42:
</math>
</math>


=== Solución ===
==== Solución ====
 
       Y ← Y + 1
       Y ← Y + 1
  [A1] IF X1 ≠ 0 GOTO A2
  [A1] IF X1 ≠ 0 GOTO A2
Línea 60: Línea 54:
       GOTO A1
       GOTO A1


== Ítem c ==
=== Ítem c ===
 
<math>
<math>
mayor(x_1, x_2) = \begin{cases}
mayor(x_1, x_2) = \begin{cases}
Línea 69: Línea 62:
</math>
</math>


=== Solución ===
==== Solución ====
 
  [A1] IF X1 ≠ 0 GOTO A2
  [A1] IF X1 ≠ 0 GOTO A2
       GOTO E
       GOTO E
Línea 80: Línea 72:
       GOTO A1
       GOTO A1


== Ítem d ==
=== Ítem d ===
 
<math>
<math>
menor(x_1, x_2) = \begin{cases}
menor(x_1, x_2) = \begin{cases}
Línea 89: Línea 80:
</math>
</math>


=== Solución ===
==== Solución ====
 
  [A1] IF X2 ≠ 0 GOTO A2
  [A1] IF X2 ≠ 0 GOTO A2
       GOTO E
       GOTO E
Línea 99: Línea 89:
       X2 ← X2 - 1
       X2 ← X2 - 1
       GOTO A1
       GOTO A1
 
<br>


= Ejercicio 3 =
= Ejercicio 3 =
Mostrar que el lenguaje <math>\mathcal{S}</math> es minimal, en el sentido que ninguna de las instrucciones <pre style="display: inline">V ← V + 1</pre>, <pre style="display: inline">V ← V - 1</pre> y <pre style="display: inline">IF V ≠ 0 GOTO A</pre>  pueden eliminarse del lenguaje sin perder expresividad.
== Solución ==
= Ejercicio 4 =
Escribir en <math>\mathcal{S}</math> programas que calculen las siguientes funciones.
Escribir en <math>\mathcal{S}</math> programas que calculen las siguientes funciones.


Además, pueden utilizarse las macros <pre style="display: inline">GOTO A</pre>, <pre style="display: inline">V ← k</pre> y <pre style="display: inline">V1 ← V2</pre>.
Además, pueden utilizarse las macros <pre style="display: inline">GOTO A</pre>, <pre style="display: inline">V ← k</pre> y <pre style="display: inline">V1 ← V2</pre>.


== Ítem a ==
=== Ítem a ===
 
<math>producto(x_1, x_2) = x_1 \cdot x_2</math> (usando suma como macro)
<math>producto(x_1, x_2) = x_1 \cdot x_2</math> (usando suma como macro)


=== Solución ===
==== Solución ====
 
       Z1 ← X1
       Z1 ← X1
  [A1] IF Z1 ≠ 0 GOTO A2
  [A1] IF Z1 ≠ 0 GOTO A2
Línea 127: Línea 107:
       GOTO A1
       GOTO A1


== Ítem b ==
=== Ítem b ===
 
<math>potencia(x_1, x_2) = x_1^{x_2}</math> (usando producto como macro)
<math>potencia(x_1, x_2) = x_1^{x_2}</math> (usando producto como macro)


=== Solución ===
==== Solución ====
 
       Z1 ← X2
       Z1 ← X2
       Y ← 1
       Y ← 1
Línea 140: Línea 118:
       Z1 ← Z1 - 1
       Z1 ← Z1 - 1
       GOTO A1
       GOTO A1
<br>


 
= Ejercicio 4 =
= Ejercicio 5 =
Demostrar que las siguientes funciones son computables:
 
Demostrar que el lenguaje <math>\mathcal{S}</math> cumple las siguientes propiedades:
 
== Ítem a ==
 
Las siguientes funciones son computables:
 
* la función sucesor <math>suc: I\!\!N \to I\!\!N, suc(x) = x + 1</math>
* la función sucesor <math>suc: I\!\!N \to I\!\!N, suc(x) = x + 1</math>
* las proyecciones <math>u^n_i: I\!\!N^n \to I\!\!N, u^n_i(x_1, \dots, x_n) = x_i</math> (para <math>i</math> tal que <math>i \le i \le n)</math>.
* las proyecciones <math>u^n_i: I\!\!N^n \to I\!\!N, u^n_i(x_1, \dots, x_n) = x_i</math> (para <math>i</math> tal que <math>i \le i \le n)</math>.
Línea 163: Línea 135:
<math>c_k(x)\,\!</math>
<math>c_k(x)\,\!</math>
       Y ← k
       Y ← k
<br>


== Ítem b ==
= Ejercicio 5 =
 
Si <math>f, g_1, \dots, g_k\,\!</math> son computables con <math>Dom(f) \subseteq I\!\!N^k</math> y <math>Dom(g_i) \subseteq I\!\!N^r</math> para todo <math>i \in \{1, \dots, k\}</math>, entonces la composición <math>h\,\!</math> es computable:
 
<center><math>h(x_1, \dots, x_r) = f(g_1(x_1, \dots, x_r), \dots, g_k(x_1, \dots, x_r))\,\!</math>.</center>
 
¿Cuál es el dominio de <math>h\,\!</math>?
 
Nota: hay un pequeño error en el enunciado, <math>h\,\!</math> es computable sólo si
 
<math>Dom(f) \supseteq Img(g_1) \times \dots \times Img(g_k)</math>
 
=== Solución ===
 
<math>Dom(h) = \bigcap_{0 < i \le k} Dom(g_1)</math>
 
 
= Ejercicio 6 =
 
Usando las macros vistas en clase, escribir programas en <math>\mathcal{S}</math> que computen las siguientes funciones:
Usando las macros vistas en clase, escribir programas en <math>\mathcal{S}</math> que computen las siguientes funciones:


== Ítem a ==
=== Ítem a ===
 
<math>f(x) =\,\!</math> el mayor número natural <math>n\,\!</math> tal que <math>2n \le x\,\!</math>
<math>f(x) =\,\!</math> el mayor número natural <math>n\,\!</math> tal que <math>2n \le x\,\!</math>


=== Solución ===
==== Solución ====
 
  [A1] Z1 ← Z1 + 2
  [A1] Z1 ← Z1 + 2
       Z2 ← Z1 > X1
       Z2 ← Z1 > X1
Línea 197: Línea 150:
       GOTO A1
       GOTO A1


== Ítem b ==
=== Ítem b ===
 
<math>P(x_1, x_2) = \begin{cases}
<math>P(x_1, x_2) = \begin{cases}
  1 & \mbox{si } x_2 \mbox{ es multiplo de } x_1 \\
  1 & \mbox{si } x_2 \mbox{ es multiplo de } x_1 \\
Línea 204: Línea 156:
\end{cases}\,\!</math>
\end{cases}\,\!</math>


=== Solución ===
==== Solución ====
       IF Z2 = 0 GOTO A2 ''// si Z2 = 0 entonces es múltiplo de X1 ''
       IF Z2 = 0 GOTO A2 ''// si Z2 = 0 entonces es múltiplo de X1 ''
                         ''// voy a A2 y como Z1 = X2 = 0  devuelvo 1 ''  
                         ''// voy a A2 y como Z1 = X2 = 0  devuelvo 1 ''  
Línea 214: Línea 166:
       IF Z3 ≠ 0 GOTO E
       IF Z3 ≠ 0 GOTO E
       Y ← Y - 1
       Y ← Y - 1
<br>


= Ejercicio 7 =
= Ejercicio 6 =
 
 
Escribir un programa que compute el mínimo común múltiplo y otro que compute el máximo común divisor entre dos números naturales. Se puede utilizar cualquier macro vista en clase.
Escribir un programa que compute el mínimo común múltiplo y otro que compute el máximo común divisor entre dos números naturales. Se puede utilizar cualquier macro vista en clase.


== Solución ==
==== Solución ====
mcm: N x N -> N
<math>MCM:\ \mathbb{N} \times \mathbb{N} \rightarrow \mathbb{N}</math>
       Y ← X1
       Y ← X1
  [A]  Z ← multiplo(Y, X2)
  [A]  Z ← multiplo(Y, X2)
Línea 228: Línea 179:
       GOTO A
       GOTO A


MCD : N x N -> N
<math>MCD:\ \mathbb{N} \times \mathbb{N} \rightarrow \mathbb{N}</math>
     Y ← X1
     Y ← X1
     Z2 ← X2
     Z2 ← X2
Línea 247: Línea 198:
   }
   }
   return a
   return a
<br>
= Ejercicio 7 =
Mostrar que el lenguaje <math>\mathcal{S}</math> es minimal, en el sentido que ninguna de las instrucciones <pre style="display: inline">V ← V + 1</pre>, <pre style="display: inline">V ← V - 1</pre> y <pre style="display: inline">IF V ≠ 0 GOTO A</pre>  pueden eliminarse del lenguaje sin perder expresividad.
==== Solución ====
Pistas:
* Para la primera probar por inducción que no importa las instrucciones que ponga el valor de salida siempre será 0.
* Para la segunda ''no se me ocurre en este momento''.
* Para la tercera probar que cualquier función que haga va a estar acotada por el tamaño del programa asi que f(x) = x no puede hacerse (por ejemplo).


= Ejercicio 8 =
= Ejercicio 8 =
Sean <math>g: I\!\!N^{n+1} \to I\!\!N, s, t: I\!\!N \to I\!\!N</math> funciones computables. Usando las macros vistas en clase, escribir programas que computen las siguientes funciones:
Sean <math>g: I\!\!N^{n+1} \to I\!\!N, s, t: I\!\!N \to I\!\!N</math> funciones computables. Usando las macros vistas en clase, escribir programas que computen las siguientes funciones:


== Ítem a ==
=== Ítem a ===
 
<math>f_1(x_1, \dots, x_n, y) = \mbox{max}\{g(x_1, \dots, x_n, i): 0 \le i \le y\}</math>
<math>f_1(x_1, \dots, x_n, y) = \mbox{max}\{g(x_1, \dots, x_n, i): 0 \le i \le y\}</math>


=== Solución ===
==== Solución ====
 
  [A1] Z2 ← g(X1, ..., Xn, Z1)
  [A1] Z2 ← g(X1, ..., Xn, Z1)
       Z3 ← Z2 < Y
       Z3 ← Z2 < Y
Línea 266: Línea 224:
       IF Z4 ≠ 0 GOTO A1
       IF Z4 ≠ 0 GOTO A1


== Ítem a ==
== Ítem b ==
 
<math>f_2(x_1, \dots, x_n, y) = \begin{cases}
<math>f_2(x_1, \dots, x_n, y) = \begin{cases}
  \mbox{max}\{g(x_1, \dots, x_n, i): s(y) \le i \le t(y)\}
  \mbox{max}\{g(x_1, \dots, x_n, i): s(y) \le i \le t(y)\}
Línea 275: Línea 232:
</math>
</math>


=== Solución ===
==== Solución ====
 
       Z1 ← s(Xn+1)
       Z1 ← s(Xn+1)
       Z5 ← t(Xn+1)
       Z5 ← t(Xn+1)
Línea 288: Línea 244:
       Z4 ← Z1 < Z5
       Z4 ← Z1 < Z5
       IF Z4 ≠ 0 GOTO A1
       IF Z4 ≠ 0 GOTO A1
<br>
== Ejercicio Extra 1 ==
Si <math>f, g_1, \dots, g_k\,\!</math> son computables con <math>Dom(f) \subseteq I\!\!N^k</math> y <math>Dom(g_i) \subseteq I\!\!N^r</math> para todo <math>i \in \{1, \dots, k\}</math>, entonces la composición <math>h\,\!</math> es computable:
<center><math>h(x_1, \dots, x_r) = f(g_1(x_1, \dots, x_r), \dots, g_k(x_1, \dots, x_r))\,\!</math>.</center>
¿Cuál es el dominio de <math>h\,\!</math>?
Nota: hay un pequeño error en el enunciado, <math>h\,\!</math> es computable sólo si
<math>Dom(f) \supseteq Img(g_1) \times \dots \times Img(g_k)</math>
=== Solución ===
<math>Dom(h) = \bigcap_{0 < i \le k} Dom(g_1)</math>


[[Category:Prácticas]]
[[Category:Prácticas]]

Revisión del 11:57 31 ene 2009

Plantilla:Back

Ejercicio 1

Sin usar macros, mostrar en un programa que compute la función vacía ; es decir, la función que no está definida para ninguna k-tupla de naturales.

Solución

     Y ← Y + 1
[A1] IF Y ≠ 0 GOTO A1


Ejercicio 2

Escribir en programas que computen los siguientes predicados.

Pueden utilizarse las macros

GOTO A

(salto incondicional),

V ← k

(asignación de constantes) y

V1 ← V2

(asignación de variables).

Ítem a

Solución

[A1] IF X1 ≠ 0 GOTO A2
     IF X2 ≠ 0 GOTO E
     Y ← Y + 1
     GOTO E
[A2] IF X2 ≠ 0 GOTO A3
     GOTO E
[A3] X1 ← X1 - 1
     X2 ← X2 - 1
     GOTO A1

Ítem b

Solución

     Y ← Y + 1
[A1] IF X1 ≠ 0 GOTO A2
     IF X2 ≠ 0 GOTO E
     Y ← Y - 1
     GOTO E
[A2] IF X1 ≠ 0 GOTO A3
     GOTO E
[A3] X1 ← X1 - 1
     X2 ← X2 - 1
     GOTO A1

Ítem c

Solución

[A1] IF X1 ≠ 0 GOTO A2
     GOTO E
[A2] IF X2 ≠ 0 GOTO A3
     Y ← Y + 1
     GOTO E
[A3] X1 ← X1 - 1
     X2 ← X2 - 1
     GOTO A1

Ítem d

Solución

[A1] IF X2 ≠ 0 GOTO A2
     GOTO E
[A2] IF X1 ≠ 0 GOTO A3
     Y ← Y + 1
     GOTO E
[A3] X1 ← X1 - 1
     X2 ← X2 - 1
     GOTO A1


Ejercicio 3

Escribir en programas que calculen las siguientes funciones.

Además, pueden utilizarse las macros

GOTO A

,

V ← k

y

V1 ← V2

.

Ítem a

(usando suma como macro)

Solución

     Z1 ← X1
[A1] IF Z1 ≠ 0 GOTO A2
     GOTO E
[A2] Y ← Y + X2
     Z1 ← Z1 - 1
     GOTO A1

Ítem b

(usando producto como macro)

Solución

     Z1 ← X2
     Y ← 1
[A1] IF Z1 ≠ 0 GOTO A2
     GOTO E
[A2] Y ← Y * X1
     Z1 ← Z1 - 1
     GOTO A1


Ejercicio 4

Demostrar que las siguientes funciones son computables:

  • la función sucesor
  • las proyecciones (para tal que .
  • las funciones constantes (para cualquier ).

Solución

     Y ← X1 + 1

     Y ← Xi

     Y ← k


Ejercicio 5

Usando las macros vistas en clase, escribir programas en que computen las siguientes funciones:

Ítem a

el mayor número natural tal que

Solución

[A1] Z1 ← Z1 + 2
     Z2 ← Z1 > X1
     IF Z2 ≠ 0 GOTO E
     Y ← Y + 1
     GOTO A1

Ítem b

Solución

     IF Z2 = 0 GOTO A2 // si Z2 = 0 entonces es múltiplo de X1 
                       // voy a A2 y como Z1 = X2 = 0  devuelvo 1  
[A1] Z1 ← Z1 + X1      // Z1 guarda los múltiplos de X1
     Z2 ← Z1 < X2
     IF Z2 ≠ 0 GOTO A1
[A2] Y ← Y + 1          // se tiene Z1 = k * X1 >= X2 
     Z3 ← Z1 = X2
     IF Z3 ≠ 0 GOTO E
     Y ← Y - 1


Ejercicio 6

Escribir un programa que compute el mínimo común múltiplo y otro que compute el máximo común divisor entre dos números naturales. Se puede utilizar cualquier macro vista en clase.

Solución

     Y ← X1
[A]  Z ← multiplo(Y, X2)
     IF Z ≠ 0 GOTO E
     Y ← Y + X1   // Y = X1, 2X1, 3X1....
     GOTO A

    Y ← X1
    Z2 ← X2
[A] IF Z2 = 0 GOTO E
[B]    Z3 ← mayor(Y,Z2)
       IF Z3 ≠ 0 GOTO C
          Z2 ← Z2 - Y
          GOTO A
[C]       Y ← Y - Z2
          GOTO A

IDEA: ALGORITMO DE EUCLIDES ORIGINAL

 MCD(a,b) = 
  while (b > 0) {
    if (a > b)
       then a <- a-b
       else b <- b-a
  }
  return a


Ejercicio 7

Mostrar que el lenguaje es minimal, en el sentido que ninguna de las instrucciones

V ← V + 1

,

V ← V - 1

y

IF V ≠ 0 GOTO A

pueden eliminarse del lenguaje sin perder expresividad.

Solución

Pistas:

  • Para la primera probar por inducción que no importa las instrucciones que ponga el valor de salida siempre será 0.
  • Para la segunda no se me ocurre en este momento.
  • Para la tercera probar que cualquier función que haga va a estar acotada por el tamaño del programa asi que f(x) = x no puede hacerse (por ejemplo).

Ejercicio 8

Sean funciones computables. Usando las macros vistas en clase, escribir programas que computen las siguientes funciones:

Ítem a

Solución

[A1] Z2 ← g(X1, ..., Xn, Z1)
     Z3 ← Z2 < Y
     IF Z3 ≠ 0 GOTO A2
     Y ← Z2
[A2] Z1 ← Z1 + 1
     Z4 ← Z1 < Xn+1
     IF Z4 ≠ 0 GOTO A1

Ítem b

Solución

     Z1 ← s(Xn+1)
     Z5 ← t(Xn+1)
     Z6 ← Z1 > Z5
     IF Z6 ≠ 0 GOTO E
[A1] Z2 ← g(X1, ..., Xn, Z1)
     Z3 ← Z2 < Y
     IF Z3 ≠ 0 GOTO A2
     Y ← Z2
[A2] Z1 ← Z1 + 1
     Z4 ← Z1 < Z5
     IF Z4 ≠ 0 GOTO A1


Ejercicio Extra 1

Si son computables con y para todo , entonces la composición es computable:

.

¿Cuál es el dominio de ?

Nota: hay un pequeño error en el enunciado, es computable sólo si

Solución