tarea 1

Transcripción

tarea 1
Nathalia Garcés David Mendez Agosto / 2011 TAREA 1 PUNTO 1 Considere el lenguaje para manipular una pila. Las instrucciones posibles son: empilar un
valor, desempilar, operar los elementos del tope de la pila con suma, resta, multiplicación y
división. Defina la sintaxis para su lenguaje y la semántica denotacional de tal forma que el
resultado de un programa de pila sea una secuencia que representa el estado de la pila al
final de la ejecución del programa.
Notación •
•
•
MEM : representa la pila del programa en el estado actual. [] : representa la memoria inicial del programa, el cual empieza con la pila vacia. ⊥ : representa un estado indefinido. Funciones Suponga que se tienen las siguientes funciones para manejar la pila. •
•
•
fst () Esta función retorna el primer elemento de la pila. rest () Esta función remueve el primer elemento de la pila y retorna la pila resultante. Si la pila está vacía no hace nada. length () Esta función retorna el tamaño de la pila. Cero si no hay elementos. Gramática 1.
2.
3.
4.
5.
6.
7.
8.
9.
ProgramaBegin Instrucciones End InstruccionesInstrucciones; Inst InstruccionesInst Inst Empilar NUM Inst Desempilar InstOperador Operador  Suma Operador  Resta Operador  Multiplicacion 10. Operador  Division Semantica Denotacional 1. Programa [| Begin Instrucciones End|] =Instrucciones [| Instrucciones |][] 2. Instrucciones [|Instrucciones; Inst |][MEM] = let M1 = Instrucciones [| Instrucciones |][MEM] in Inst[| Inst |][M1] endlet 3. Instrucciones [| Inst |][MEM] = Inst[| Inst |][MEM] 4. Inst [| Empilar NUM|][MEM] = [ NUM.val MEM ] 5. Inst [| Desempilar |][MEM] = [ MEM.rest() ] 6. Inst [| Operador |][MEM] = Operador [| Operador |][MEM] 7. Operador [| suma |][MEM] = if ( MEM.length () < 2 ) then ⊥ else let R = MEM.fst().val + MEM.rest().fst().val [ R MEM.rest() ] endlet fi 8. Operador [| resta |][MEM] = if ( MEM.length () < 2 ) then ⊥ else let R = MEM.fst().val ‐ MEM.rest().fst().val [ R MEM.rest() ] endlet fi 9. Operador [| multiplicacion |][MEM] = if ( MEM.length () < 2 ) then ⊥ else let R = MEM.fst().val * MEM.rest().fst().val [ R MEM.rest() ] endlet fi 10. Operador[| division |][MEM] = if ( MEM.length () < 2 ) then ⊥ else let A = MEM.fst().val B = MEM.rest().fst().val if B = 0 then ⊥ else [ (A / B) MEM.rest() ] fi endlet fi PUNTO 2 Considere el problema de las torres de Hanoi. Defina un lenguaje que permita darle órdenes
a un brazo mecánico para manipular las torres de Hanoi, Debe definir tanto una
representación como la sintaxis de su lenguaje (que puede ser muy sencilla). Defina la
semántica denotacional para traducir de una secuencia de instrucciones de su robot a la
representación. Debe tener en cuenta que se puede llegar a estados erróneos.
Notación •
•
•
Juego: representa la memoria actual del juego. Esta está conformada por la tripleta <Izquierda, Centro, Derecha>, las cuales son pilas que representan las torres 1, 2, y 3 respectivamente. [INIC]: representa la memoria inicial del juego <I, ε, ε>, donde las pilas de Centro y Derecha se inicializan como listas vacías, mientras la pila de la izquierda se inicializa con la secuencia de discos del 1 al 9 ordenados de mayor a menor. Es decir, el primer elemento de Izquierda es el disco 1 y el último es el 9. ⊥ : representa un estado de error Funciones Suponga que se tienen las siguientes funciones para manejar el programa •
•
•
fst (x r) = x Esta función retorna el primer elemento de la secuencia rest (x r) = r Esta función remueve el primer elemento de la pila y retorna la pila que resulta. isEmpty (MEM) = if ( fst(MEM) = ε)? true:false Esta función retorna true si No existe al menos un elemento en la secuencia, false en caso contrario Gramática 1.
2.
3.
4.
5.
6.
7.
Programa  Begin Instrucciones End InstruccionesInstrucciones;Move InstruccionesMove Move ( disco de T a T) T  Izquierda T  Medio T  Derecha Semantica Denotacional 1. Programa [| Begin Instrucciones End |] = Instrucciones [| Instrucciones |][INIC] 2. Instrucciones [| Instrucciones;Move |]juego = let J1 = Instrucciones [| Instrucciones |]juego in Move[| Move |][J1] endlet 3. Move[|( disco de T1 a T2) |][I,M,D] = let A = T [| T1|][I,M,D] and B = T [| T2|][I,M,D] if isEmpty(A) then ⊥ elseif A = B then ⊥ else Da = fst(A) if A = I then if B = M then if isEmpty(B) then [rest(I),Da,D] elseif Da < fst(B) then [rest(I), Da M,D] elseif Da > fst(B) then ⊥
fi
else if isEmpty(B) then [rest(I),M,Da] elseif Da < fst(B) then [rest(I), M, Da D] elseif Da > fst(B) then ⊥
fi
fi elseif A= M then if B = I then if isEmpty(B) then [Da,rest(M),D] elseif Da < fst(B) then [Da M,rest(M),D] elseif Da > fst(B) then ⊥
fi
else if isEmpty(B) then [I,rest(M),Da] elseif Da < fst(B) then [I,rest(M), Da D] elseif Da > fst(B) then ⊥
fi
fi elseif A= D then if B = I then if isEmpty(B) then [Da,M,rest(D)] elseif Da < fst(B) then [Da I,M, rest(D)] elseif Da > fst(B) then ⊥
fi
else if isEmpty(B) then [I,Da,rest(D)] elseif Da < fst(B) then [I,Da M,rest(D)] elseif Da > fst(B) then ⊥
fi
fi endlet fi 4. T [| Izquierda |][MEM] = I 5. T [|Medio|][MEM] = M 6. T [|Derecha|][MEM] = D fi 

Documentos relacionados