Diferencia entre revisiones de «Práctica 1 (LyC Verano)»
(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 | [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 = | ||
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 | Demostrar que las siguientes funciones son computables: | ||
Demostrar que | |||
* 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> | |||
= Ejercicio 5 = | |||
= Ejercicio | |||
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 | = 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 ==== | ||
<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 | ||
<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 | == Í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
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