PARADIGMAS Guía de Prácticos

54
PARADIGMAS DE PROGRAMACIÓN GUÍA DE EJERCICIOS PRÁCTICOS 2012 Ing. José Oscar Mugetti Mare

description

APUNTE PARA PARADGIMAS ESTA MATERIA DE UTN SAN FCO EN LA CUAL ES UN PARTO

Transcript of PARADIGMAS Guía de Prácticos

Page 1: PARADIGMAS Guía de Prácticos

PARADIGMAS DE PROGRAMACIÓN

GUÍA DE EJERCICIOS

PRÁCTICOS 2012

Ing. José Oscar Mugetti Mare

Page 2: PARADIGMAS Guía de Prácticos

Paradigmas de Programación José Oscar Mugetti Mare

Página 2 de 54

PARADIGMA FUNCIONAL

TRABAJO PRÁCTICO 1: Teniendo en cuenta la estructura de los lenguajes funcionales y sabiendo especificar los algoritmos funcionales se pide que realice una primera introducción a las técnicas de diseño de los lenguajes funcionales: 1) Utilizando funciones auxiliares (que suponemos están definidas previamente) deberá

escribir una función que calcule el máximo común divisor de dos números naturales dados.

2) Usando selectores y funciones auxiliares (que no se definirán), escribir una función

que sume todos los elementos de un árbol binario. 3) Escribir la definición de una función que aplicada a una lista de enteros, devuelva un

árbol binario ordenado. 4) Escribir definiciones de funciones que, aplicadas a un árbol binario, devuelva la lista

de sus elementos en: a) De mayor a menor. b) De menor a mayor.

5) Utilizando las funciones definidas en 3 y 4, escribir la definición de una función que

ordene una lista dada. 6) Escribir la definición de una función de orden superior con el significado de

"reduce" pero aplicable a árboles binarios. 7) Utilizando 6, escribir funciones que calculen la suma y el producto de un árbol

binario. 8) Escribir funciones que decida si algunos de los elementos de una lista de valores

"booleanos" es verdadero. 9) Escribir una función que calcule el largo de una lista. 10) Escribir una función que concatene dos listas. 11) Escribir una función filtro que, aplicada a una lista, devuelva otra que contenga

solamente los elementos de la original que cumplan con la condición dada.

Page 3: PARADIGMAS Guía de Prácticos

Paradigmas de Programación José Oscar Mugetti Mare

Página 3 de 54

TRABAJO PRÁCTICO 2: 1) A continuación deberás evaluar en el interprete (Scheme) las siguientes

expresiones: x1 (define x1 7) x1 'x1 (define x2 'x1) x2 (define total (+ (* 3 x1) 2)) total 2) Calcular, usando el interprete, el valor de las siguientes expresiones: 3 + 4 ;;;[1a] 15 / 7 ;;;[1b] (3 + a1) * a1 ;;;[1c] (donde a1 vale 7) 3 * (5 + 12 / 6) / (4 + (3 * a1)) ;;;[1d] (donde a1 vale como antes) 5 + ((b1 / 2) * (a1 / 2)) + 3 * (4 + 5) ;;;[1e] (donde a1 vale como antes y b1 vale 57*46) 3) Define las siguientes funciones:

a) Función suma = que realice la suma de dos números enteros b) Función Cuadrado = que realice el cuadrado de un número c) Función Cubo = que realice el cubo de un número, pero utilizando la función

"cuadrado" d) Realizar las siguientes operaciones utilizando siempre las funciones previamente

definidas: i) (X + Y) / 2 ii) ((X - Y) + Z) / Z2 iii) (X3 + Y2) / 2Y

e) Definir la función que calcule el factorial de un número 4) Evaluar, razonando la respuesta, las siguientes expresiones: (cons 1 ()) (cons 2 (cons 1 ())) (define a2 'juan) (define b2 (cons 2 (cons 1 ()))) (cons a2 b2) (juan 2 1) (define c2 (cons a2 b2)) (cons c2 b2) 5) Construir expresiones que, formadas Solo por cons, quotes ('), números símbolos y

paréntesis, tengan como valor: (1 2 pepe) ((1 2) pepe) ((1 2) (pepe)) (((1)))

Page 4: PARADIGMAS Guía de Prácticos

Paradigmas de Programación José Oscar Mugetti Mare

Página 4 de 54

6) Usar el símbolo de quote para asignar a los símbolos las listas (agua papel dinero tierra) ;;;[4a] ((agua papel) dinero (tierra)) ;;;[4b] 7) Usar la función list para asignar a los símbolos l3 y l4 respectivamente las listas: ((agua papel) (dinero tierra)) ;;;[4c] (agua (papel (dinero)) tierra) ;;;[4d] 8) Obtener el car y el cdr de 4a y 4b, razonando la respuesta. Obtener, con funciones

del tipo c..a..d..r cada uno de los elementos de primer nivel de 4c y (dinero) de 4d. 9) En cada caso, sustituir el carácter "$" por una expresión de manera que cada una de

las siguientes expresiones tenga el valor #t y el valor #f: a) (number? $) ;;;[5a] b) (symbol? $) ;;;[5b] c) (boolean? $) ;;;[5c] d) (list? $) ;;;[5d] e) (null? $) ;;;[5e]

10) Evaluar, razonadamente:

a) (= 2 3) b) (= 3 3) c) (equal? 'pepe 'pepe) d) (define pepe 'jose) e) (equal? 'pepe pepe) f) (equal? '(a b) (cons 'a (cons 'b ()))) g) (equal? '(1 (2 3) 4) '(1 2 3 4)) h) (equal? '(1 (2 3) 4) (cons 1 '((2 3) 4)))

11) Evaluar, razonadamente:

a) (define x '(2 3)) b) (if (null? x) 0 (car x)) c) (+ 3 (if (null? x) 0 (car x))) d) (define x ()) e) (+ 3 (if (null? x) 0 (car x)))

Page 5: PARADIGMAS Guía de Prácticos

Paradigmas de Programación José Oscar Mugetti Mare

Página 5 de 54

TRABAJO PRÁCTICO 3: 1) Evalúa, razonando la respuesta, las siguientes expresiones, suponiendo que a, b y c

tienen como valor #t, mientras que d y e tienen como valor #f. Utiliza el interprete para comprobar tus resultados. a) (or a (and b e)) b) (not (and b c (or a e))) c) (not (or (not a) (not b))) d) (and (or (symbol? e) (not (symbol? a))) (not e))

2) Intenta predecir el valor de las siguientes expresiones condicionales y utiliza luego

el interprete para comprobar la validez de cada predicción. a) (if (null? (car '())) 'vacío 'no-vacio) b) (if (null? (cdr '(2 3))) 'vacío 'no-vacio) c) (cond

i) ((symbol? (cadr '(a (b)))) 'símbolo) ((number? (caar '((a) 5))) 'numero) ((pair? (cddr '(a (b)))) 'par) (else 'nada-de-lo-anterior))

d) (+ (if (null? #f) (+ 4 8) (* (+ 3 2) 2)) (cond ((equal? 0 (caadr '(2 ((0))))) 9) (else 12)))

3) Evalúa las siguientes expresiones e intenta comprender los resultados obtenidos.

a) ((lambda (x) (+ x (* x x) 1)) 3) b) ((lambda (x y) (if (number? x) x y)) 'a 'b) c) ((lambda (l1 l2) (list (car l1) (car l2))) '(1 2 3) '(a b))

4) Evalúa la siguiente expresión en el interprete de Scheme:

a) (define borra-el-segundo (lambda (l) (cons (car l) (cddr l))))

Intenta entender qué ocurre cuando el procedimiento definido recibe una lista de menos de 2 elementos. Evalúa las expresiones:

a) (borra-el-segundo '()) b) (borra-el-segundo '(2)) c) (borra-el-segundo '(a b)) d) (borra-el-segundo '(1 3 4 2))

5) Define un procedimiento pega2 que tome como argumentos dos listas de dos

elementos y devuelva las lista resultante de unir ambas. Por ejemplo, a) (pega2 '(a b) '(c d)) ==> (a b c d)

6) Define una función que concatene dos listas y evalúa su realización 7) Define una función que concatene tres listas y evalúa su realización 8) Define una función que realice el reverso de un lista y evalúa su realización

Page 6: PARADIGMAS Guía de Prácticos

Paradigmas de Programación José Oscar Mugetti Mare

Página 6 de 54

TRABAJO PRÁCTICO 4: 1) Definir una función cuad-list que reciba una lista de números como argumento y

devuelva la lista de los cuadrados de los elementos de la lista de entrada. Por ejemplo: a) (cuad-list '(1 2 3 4)) ==> (1 4 9 16) b) (cuad-list '(5 3)) ==> (25 9) c) (cuad-list '()) ==> ()

2) Define una función sum-cuad que reciba como argumento una lista de números y

devuelva la suma de los cuadrados de los elementos de la lista.Por ejemplo: a) (sum-cuad '(1 2 3)) ==> 14 b) (sum-cuad '(3 0 3)) ==> 18 c) (sum-cuad '()) ==> 0

3) Define un procedimiento sparimp que reciba como entrada una lista numérica y

devuelva como salida una lista de dos números: el primero, la suma de los pares de la lista de entrada y el segundo la suma de los impares de la lista de entrada. Por ejemplo: (investiga y utiliza la función "even") a) (sparimp '(1 2 3 4 5 6)) ==> (12 9) b) (sparimp '(2 4 6)) ==> (12 0) c) (sparimp '()) ==> (0 0)

4) Definir una función lista-simb que reciba una lista como argumento y devuelva la

lista de los símbolos de la lista de entrada. Por ejemplo: (investiga y utiliza la función "even") a) (lista-simb '(1 iacs hse ccia 2)) ==> (iacs hse ccia) b) (lista-simb '(cordoba 2 beti 1)) ==> (cordoba beti) c) (lista-simb '(1 2 3)) ==> ()

5) Define un procedimiento llamado quita-ultimo-profundo que recibe una lista como

argumento y devuelve la lista obtenida quitando el último elemento, cualquiera que sea su nivel. Por ejemplo: a) (quita-ultimo-profundo '(a (b c) (d (e (f))))) ==> (a (b c) (d (e ()))) b) (quita-ultimo-profundo '()) ==> () c) (quita-ultimo-profundo '(a (((b))) (()))) ==> '(a (((b))) ()) d) (quita-ultimo-profundo '((((b))))) ==> (((())))

6) Define un procedimiento acumula-profundo que recibe como entrada una lista y

devuelve la suma de sus elementos que sean números, sea cual sea su nivel. Por ejemplo: a) (acumula-profundo '(1 (4 (a #t () (3 b)) 5 juan) (((a))) ((3)))) ==> 16 b) (acumula-profundo '(a (b c ()) d)) ==> 0 c) (acumula-profundo '()) ==> 0 d) (acumula-profundo '(1 (uno (2 (dos (3 (tres (4 (cuatro))))))))) ==> 10

Page 7: PARADIGMAS Guía de Prácticos

Paradigmas de Programación José Oscar Mugetti Mare

Página 7 de 54

TRABAJO PRÁCTICO 5: Manipulación simbólica de polinomios. (algunos de estos ejercicios son de realización opcional) 1) En esta práctica trabajaremos con polinomios con coeficientes reales como un tipo

abstracto de dato. Representaremos los polinomios como una lista en la que están los coeficientes del polinomio ordenados desde el coeficiente líder al término independiente.

Realiza las definiciones de los selectores y constructores, teniendo en cuenta lo definido en Trabajo práctico 5 auxiliar (prac7.s)que contiene las funciones pertinentes. Realiza las siguientes operaciones, interpretando los resultados:

a) (grado '(3 0 1 3)) b) (coef-lider '(4 5 1 2 3 5)) c) (rest-de-poly '(1 0 0 3 4)) d) (poly-cons 6 2 '(1 2 5)) e) (zero-poly? el-zero-poly) f) (haz-term 5 6) g) (term-lider '(3 4 5 6)) h) (p+ '(1 3 0 5) '(2 3 1)) i) (p* '(1 0 1) '(1 0 1)) j) (neg-poly '(2 3 4 4 -3 4)) k) (p- '(1 2 3 4) '(2 3 4 5 6)) l) (valor-poly '(1 -2 1) 1)

2) Define un procedimiento cociente-poly que, dados dos polinomios poly1 y poly2,

devuelva el cociente de dividir poly1 entre poly2. A continuación define otro procedimiento resto-poly que dados poly1 y poly2 nos devuelva el resto de la división.

La siguiente definición de t* en el procedimiento p* no es muy buena: cada vez que hacemos una llamada recursiva a t*, se evalúan tanto (grado term) como (coef-lider term), a pesar de estos no cambian. Además la variable term no necesita pasar por t*, ya que su valor no cambia. Modifica la definición de p* para que sea más eficiente. (define p* (letrec ((t* (lambda (term poly) (if (zero-poly? poly) el-zero-poly (poly-cons (+ (grado term) (grado poly)) (* (coef-lider term) (coef-lider poly)) (t* term (rest-de-poly poly))))))) (lambda (poly1 poly2) (letrec ((p*-aux (lambda (p1) (if (zero-poly? p1) el-zero-poly (p+ (t* (term-lider p1) poly2) (p*-aux (rest-de-poly p1))))))) (p*-aux poly1)))))

Page 8: PARADIGMAS Guía de Prácticos

Paradigmas de Programación José Oscar Mugetti Mare

Página 8 de 54

3) En la siguiente definición de poly-cons, tanto lista-de-ceros como append hacen recursión sobre una lista de ceros. Reescribe poly-cons para que sea más eficiente. (Usa iteración).

(define poly-cons (lambda (gra coef poly) (let ((gra-p (grado poly))) (cond ((and (zero? gra) (equal? poly el-zero-poly)) (list coef)) ((< gra-p gra) (if (zero? coef) poly (cons coef (append (lista-de-ceros (- (- gra gra-p) 1)) poly)))) (else (error "poly-cons: Grado demasiado alto en:" poly)))))) (define lista-de-ceros (lambda (n) (if (zero? n) '() (cons 0 (lista-de-ceros (- n 1)))))) 4) Considerando a los polinomios como simples tiras de términos. Cada término será

un par, donde el primer componente es el coeficiente y el segundo el exponente, deberá definir las funciones que: a) Construya un término del polinomio b) Identifique el coeficiente del término c) Identifique el exponente del término d) Construya una función que derive un término simple e) Obtener un polinomio derivado a partir de la derivación de cada uno de sus

términos (utilice la función "map") Trabajo práctico 5 auxiliar ;;;;;;;;;;;;;;;;;;;;;;;;;;;; prac7.s;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Manipulación simbólica de polinomios. Desarrollo de un álgebra ; simbólica de polinomios. ;;; UNA DEFINICIÓN DEL TIPO ABSTRACTO DE DATO POLINOMIO. ;;; ****************************************************** ;;; NOTA: Este fichero deberá ser cargado al principio de la ;;; práctica 5 (ver ejercicio 1) ;;; I) OPERACIONES CON POLINOMIOS. ;;; Procedimientos que definimos para realizar las operaciones con ;;; polinomios. ;;; ¿ Es el polinomio cero ? (define zero-poly? (lambda (poly) (and (zero? (grado poly)) (zero? (coef-lider poly)))))

Page 9: PARADIGMAS Guía de Prácticos

Paradigmas de Programación José Oscar Mugetti Mare

Página 9 de 54

;;; Construye el monomio con el grado y coeficiente dados. (define haz-term (lambda (gra coef) (poly-cons gra coef el-zero-poly))) ;;; Devuelve el monomio de mayor grado del polinomio. (define term-lider (lambda (poly) (haz-term (grado poly) (coef-lider poly)))) ;;; Suma de polinomios. (define p+ (lambda (poly1 poly2) (cond ((zero-poly? poly1) poly2) ((zero-poly? poly2) poly1) (else (let ((n1 (grado poly1)) (n2 (grado poly2)) (a1 (coef-lider poly1)) (a2 (coef-lider poly2)) (rest1 (rest-de-poly poly1)) (rest2 (rest-de-poly poly2))) (cond ((> n1 n2) (poly-cons n1 a1 (p+ rest1 poly2))) ((< n1 n2) (poly-cons n2 a2 (p+ poly1 rest2))) (else (poly-cons n1 (+ a1 a2) (p+ rest1 rest2))))))))) ;;; Producto de polinomios. (define p* (letrec ((t* (lambda (term poly) (if (zero-poly? poly) el-zero-poly (poly-cons (+ (grado term) (grado poly)) (* (coef-lider term) (coef-lider poly)) (t* term (rest-de-poly poly))))))) (lambda (poly1 poly2) (letrec ((p*-aux (lambda (p1) (if (zero-poly? p1) el-zero-poly (p+ (t* (term-lider p1) poly2) (p*-aux (rest-de-poly p1))))))) (p*-aux poly1))))) ;;; Opuesto de un polinomio.

Page 10: PARADIGMAS Guía de Prácticos

Paradigmas de Programación José Oscar Mugetti Mare

Página 10 de 54

(define neg-poly (lambda (poly) (let ((poly-neg-uno (haz-term 0 -1))) (p* poly-neg-uno poly)))) ;;; Resta de polinomios. (define p- (lambda (poly1 poly2) (p+ poly1 (neg-poly poly2)))) ;;; Valor de un polinomio (visto como función) en un número. (define valor-poly (lambda (poly num) (letrec ((pvalor (lambda (p) (let ((n (grado p))) (if (zero? n) (coef-lider p) (let ((rest (rest-de-poly p))) (if (< (grado rest) (- n 1)) (pvalor (poly-cons (- n 1) (* num (coef-lider p)) rest)) (pvalor (poly-cons (- n 1) (+ (* num (coef-lider p)) (coef-lider rest)) (rest-de-poly rest)))))))))) (pvalor poly)))) ;;; II) CONSTRUCTORES Y SELECTORES (1a. forma). ;;; Representamos los polinomios por una lista en la que están los ;;; coeficientes del polinomio, ordenados desde el coeficiente de la ;;; máxima potencia (coef-lider) al término independiente. ;;; Necesitamos (ver operaciones anteriores): ;;; * el polinomio cero ;;; * tener acceso al grado, al coef-líder y al resto del polinomio ;;; * construir un polinomio, a partir de su grado, su coef-lider, y ;;; el resto del polinomio (un pol. de grado menor). ;;; El polinomio cero. (define el-zero-poly '(0)) ;;; Grado de un polinomio. (define grado (lambda (poly) (- (length poly) 1))) ;;; Coeficiente del monomio de mayor grado.

Page 11: PARADIGMAS Guía de Prácticos

Paradigmas de Programación José Oscar Mugetti Mare

Página 11 de 54

(define coef-lider (lambda (poly) (car poly))) ;;; Polinomio obtenido quitando el monomio de mayor grado. (define rest-de-poly (lambda (poly) (cond ((zero? (grado poly)) el-zero-poly) ((zero? (coef-lider (cdr poly))) (rest-de-poly (cdr poly))) (else (cdr poly))))) ;;; Polinomio obtenido añadiendo un termino de mayor grado (gra) con ;;; coeficiente (coef) al polinomio (poly) (define poly-cons (lambda (gra coef poly) (let ((gra-p (grado poly))) (cond ((and (zero? gra) (equal? poly el-zero-poly)) (list coef)) ((< gra-p gra) (if (zero? coef) poly (cons coef (append (lista-de-ceros (- (- gra gra-p) 1)) poly)))) (else (error "poly-cons: Grado demasiado alto en:" poly)))))) ;;; Lista de n ceros. (define lista-de-ceros (lambda (n) (if (zero? n) '() (cons 0 (lista-de-ceros (- n 1))))))

Page 12: PARADIGMAS Guía de Prácticos

Paradigmas de Programación José Oscar Mugetti Mare

Página 12 de 54

TRABAJO PRÁCTICO 6: 1) Evalúa las siguientes expresiones, razonando el resultado:

a) (map (lambda (x) (* x x)) '(1 2 3 4 5 6)) b) (map pair? '((a.b) (1 2 3) 1 2 3)) c) (let ((imprime (lambda (x) (display x) (newline) (string-length x))))

(for-each imprime '("Lista" "de" "strings"))) d) (let ((imprime (lambda (x) (display x) (newline) (string-length x))))

(map imprime '("Lista" "de" "strings"))) e) (define aplica-a-dos

(lambda (f) (f 2))) f) (aplica-a-dos sqrt) g) (aplica-a-dos (lambda (x) (* x x))) h) (aplica-a-dos even?) i) (map aplica-a-dos (list sin (lambda (x) (expt x 3)) odd?)) j) (define tonta

(lambda (f) (lambda (x) (f x))))

a) ((tonta sqrt) 2) b) (apply + '(1 2)) c) (apply (lambda (x y z) (list z y x)) '(a b c))

2) Definir una función que contenga "map", utilizarla y evaluar sus resultados 3) Definir una función que contenga "set!", utilizarla y evaluar sus resultados 4) Definir una función que contenga "set-car!", utilizarla y evaluar sus resultados 5) Definir una función que contenga "set-cdr!", utilizarla y evaluar sus resultados 6) Definir una función que contenga "putprop", utilizarla y evaluar sus resultados 7) Definir una función que contenga "getprop", utilizarla y evaluar sus resultados 8) Definir una función que contenga "member", utilizarla y evaluar sus resultados 9) Definir una función que contenga "list-ref", utilizarla y evaluar sus resultados 10) Evalúa las siguientes expresiones, razonando el resultado:

a) (define v1 (vector 1 45 67 8)) b) (define v2 (make-vector 5 'hola)) c) (vector-ref v1 0) d) (vector-ref v1 2) e) (vector-set! v2 4 'adiós) f) (vector-ref v2 4)

11) Observa cual es el valor de x después de evaluar cada expresión:

a) (define x 100) b) (set! x 200)

Page 13: PARADIGMAS Guía de Prácticos

Paradigmas de Programación José Oscar Mugetti Mare

Página 13 de 54

c) (set! x (+ x 3)) d) (define lista-vect1

(let ((v (make-vector 3 0))) (list v v)))

e) (vector-set! (car lista-vect1) 1 45) lista-vect1

f) (define lista-vect2 (list (make-vector 3 0) (make-vector 3 0)))

(vector-set! (car lista-vect2) 1 45) lista-vect2

12) Define un procedimiento producto-escalar que tome como entrada dos vectores numéricos y devuelva el producto escalar de ambos, si son de la misma dimensión, y un mensaje de error en caso contrario. (producto-escalar #(1 3 2) #(3 5 7)) ==> 32 (producto-escalar #(1 3 2) #(3 5))

==> ERROR: producto-escalar: dimensiones erróneas 13) Define un procedimiento vector-sust de tres argumentos de modo que (vector-sust x

y v) devuelve como valor un vector igual que v, salvo en aquellas componentes iguales a x, que habrán sido sustituidas por y. (vector-sust 2 'dos #(c 2 45 8 2 #t)) ==> #(c dos 45 8 dos #t) (vector-sust 'par 'impar #(3 par "oh" par 8)) ==> #(3 impar "oh" impar 8) (vector-sust 'par 'impar #(1 3 4 5 6)) ==> #(1 3 4 5 6) (vector-sust 'par 'impar #()) ==> #()

14) Define un procedimiento filtra-vector que tome como entrada un predicado, p, y

evuelva como valor un procedimiento que reciba como entrada un vector, v, y devuelva como valor un vector formado por los elementos de v que verifican p. ((filtra-vector even?) #(2 3 6 8 9)) ==> #(2 6 8) ((filtra-vector symbol?) #(a b 3 "hola" #t 6 fin)) ==> #(a b fin) ((filtra-vector symbol?) #(1 2 3)) ==> #()

Page 14: PARADIGMAS Guía de Prácticos

Paradigmas de Programación José Oscar Mugetti Mare

Página 14 de 54

TRABAJO PRÁCTICO 7: 1) Definir un grafo que contenga la siguiente estructura:

a) (define Grafo1 '((A1 () ) (A2 () ) (A3 (A1 A2) ) (A4 (A2 A3) ) ) ) comprueba su comportamiento y analiza si puedes transformar lo definido en un grafo dirigido 2) Definir los siguientes grafos dirigidos con la siguiente estructura (hijo (padres) )

a) m1 -- m3 m2 -- m3 m2 -- m4 m3 -- m4

b) m1 -- m2 m2 -- m3 m2 -- m4 m3 -- m5 m3 -- m6 m4 -- m5 m5 -- m6

c) m1 -- m2 m2 -- m3 m2 -- m4 m3 -- m5 m4 -- m3 m4 -- m5 m5 -- m6

3) Definir una función que muestre un hijo a partir de su posición 4) Definir una función que muestre un padre a partir de su posición 5) Definir una función que muestre todos los hijos y a todos los padres 6) Armar una lista con todos los hijos de un grafo 7) Armar una lista con todos los padres de un grafo 8) Borrar un nodo determinado de un grafo 9) Agregar un nodo al comienzo y al final del grafo 10) Un árbol binario numérico (ABN de aquí en adelante) es una estructura de datos

recursiva que consta de un número entero no negativo (llamado raíz del árbol) y de dos ABN llamados hijo izquierdo e hijo derecho. Existe un ABN muy particular que no tiene raíz ni hijos que llamaremos el árbol vacío. En nuestra implementación, usaremos la siguiente representación de los ABN:

- El árbol vacío lo representaremos por la lista vacía ().

Page 15: PARADIGMAS Guía de Prácticos

Paradigmas de Programación José Oscar Mugetti Mare

Página 15 de 54

- Un árbol binario con raíz n, hijo izquierdo HI e hijo derecho HD lo representaremos por la lista de tres elementos (HI n HD) donde HI, HD son la representación del hijo izquierdo e hijo derecho respectivamente.

a) Evalúa las siguientes definiciones de constructores y selectores que define el tipo abstracto de dato ABN:

;;; es árbol vacío? (define vacío? null?) ;;; El árbol vacío (define el-vacio ()) ;;; raíz de un árbol (define raíz (lambda (a) (if (vacío? a) (error "raíz: es un árbol vacío") (cadr a)))) ;;; hijo izquierdo (define hi (lambda (a) (if (vacío? a) (error "hi: es un árbol vacío") (car a)))) ;;; hijo derecho (define hd (lambda (a) (if (vacío? a) (error "hd: es un árbol vacío") (caddr a)))) ;;; construye un árbol (define haz-arbol (lambda (raíz hi hd) (list hi raíz hd)))

b) Evalúa la siguiente definición de recursion-abn y explica su comportamiento general.

;;; Patrón de recursión sobre arboles binarios. (define recursion-abn (lambda (germen proc) (letrec ((aux (lambda (a) (if (vacío? a) germen (proc (raíz a) (aux (hi a)) (aux (hd a))))))) aux)))

Page 16: PARADIGMAS Guía de Prácticos

Paradigmas de Programación José Oscar Mugetti Mare

Página 16 de 54

c) Usando el anterior patrón de recursión, define: * Una función suma1 que recibiendo como entrada un ABN A devuelve el ABN A' obtenido a partir de A sumando 1 a cada nodo

* Una función aplicaf que recibiendo como entrada una función f (con argumento numérico y valor numérico) y un ABN A, devuelve el ABN A' obtenido de A aplicando a cada nodo la función f

* Una función elimina-si-no-p que recibiendo como entrada un predicado p (con argumento numérico) y un ABN A, devuelve el ABN A' en el que se han "podado" aquellos subárboles cuya raíz no verifica p.

Page 17: PARADIGMAS Guía de Prácticos

Paradigmas de Programación José Oscar Mugetti Mare

Página 17 de 54

TRABAJO PRÁCTICO 8: Cálculo Lambda 1) Utilice la definición dirigida por sintaxis para sustitución a fin de verificar las

siguientes igualdades: a) {u/x} (u.x) = (z. u) b) {u/x} (u.u) = (z. z) c) {u/x} (y.x) = (y. u) d) {u/x} (y.u) = (y. u)

2) Indicar cuales de los siguientes son términos bien formados del cálculo lambda:

a) (x. z. ((x z) (y t)) (w x. (x x))) b) (xy. (x (x y)) x. y. (x (x y))) c) (x (x. (t u) (s. (s s. S))))

3) Para los anteriores, indicar el conjunto de variables libres. 4) Evaluar las siguientes sustituciones

a) [y. ( x y) /x] y. (x x. x) b) [y. (v y) /x] (y v. (x v)) c) [(x y) /x] xy. X

5) Reducir aplicando Beta:

a) (xy. x (x y)) b) ((x. z. (z x) z) v) c) (v. (x y) (x. (x (x y)) x. (x (x y)))

6) Verifique las siguientes igualdades:

a) SIII= I donde S es igual a xyz. (x z) (y z) e I es igual a x. x b) doble(doble) f x = f (f (f (f x ))), donde doble es igual a fx. f (f x))

7) Construya términos del cálculo lambda, añadiendo tipos a cada uno de los siguientes

términos puros: a) x. x b) xy. x c) xyz. (x z) (y z) d) (x. x) (x. x) e) (xyz. (x z) (y z)) (x. x) (x. x)

8) Definir en el cálculo lambda extendido la constante >= de modo que represente la

relación orden usual ("mayor o igual") sobre los números naturales. 9) Definir max de modo que represente la función que determina el máximo de dos

naturales dados.

Page 18: PARADIGMAS Guía de Prácticos

Paradigmas de Programación José Oscar Mugetti Mare

Página 18 de 54

PARADIGMA ORIENTADO A

OBJETOS

TRABAJO PRÁCTICO 1: 1) En la figura siguiente Mueble es una clase. Mesa y Sillas son subclases (hijos) y así

sucesivamente. Como representaría la jerarquía por medio de textos sangrados.

2) En una jerarquía de herencia orientada a objetos, tal como la que se muestra en el

gráfico precedente en que cada nivel es una forma más especializada del anterior. Dé tres ejemplos mas de una jerarquía encontrada en la vida diaria que tenga la misma propiedad.

3) Tome un problema del mundo real, como la acción de enviar flores a la abuela, vista

en clase, y describa la solución al problema en términos de objetos y responsabilidades.

4) Describa las responsabilidades de una organización que comprenda al menos seis

tipos de individuos. (Por ejs. En una escuela: estudiantes, profesores, director, conserje - en un negocio: secretaria, gerente, trabajadores...) para cada de individuos, describa responsabilidades y colaboradores.

5) Para cada uno de los pares siguientes, diga si la relación es es-un o tiene-un:

a) casa - techo b) conserje - empleado c) ratón digital - dispositivo de entrada d) menú - ventana e) conjunto - colección f) Describa luego 5 (cinco) pares más de cada una de las relaciones

Mueble

Mesa Silla

Mesa-2 Mesa-1

Silla-1

Page 19: PARADIGMAS Guía de Prácticos

Paradigmas de Programación José Oscar Mugetti Mare

Página 19 de 54

6) Entre dos objetos puede existir todo tipo de relaciones semánticas, que dependen de

la aplicación concreta en la que participan dichos objetos. Veamos un ejemplo: Supongamos que vamos a construir un diccionario on-line, un diccionario informatizado que permita al usuario obtener sobre la pantalla la definición de una palabra cualquiera. Supongamos que, en dicho diccionario, las palabras són objetos

y que la organización jerárquica es la que procede de forma natural de la estructura de nuestros conocimientos sobre el mundo. Estableciendo una relación Trabajo (trazo discontinuo) ¿Cuáles serán las preguntas que se podrán responder con las relación

7) Veamos el caso de una jerarquía compleja, como la de la siguiente figura y los

objetos heredan cierta propiedad o cierto método. Paro ello tendremos que analizar si lo poseen algunos de sus padres, y si no lo tienen a los padres de estos y así sucesivamente , o bien si lo poseen dos de sus antecesores, deberá analizar y explicar las siguientes consideraciones: a) Que predomine en primer antepasado en el que aparezca en método. b) Que predomine el antepasado cuyo parentesco con el objeto considerado sea

más próximo. c) Que no predomine ninguno de los dos, sino que el objeto herede ambas

propiedades simultáneamente considerando lo siguiente: i) Que el objeto herede la disyunción de los dos valores.

Page 20: PARADIGMAS Guía de Prácticos

Paradigmas de Programación José Oscar Mugetti Mare

Página 20 de 54

ii) Que el objeto herede la conjunción de los dos valores. iii) Que el objeto herede un valor predominante, pero no en función del

antepasado sino en función del valor mismo.

¿Cuántos atributos tiene la clase Cirujano?: ___ ¿Cuántos atributos tiene la clase MedicoDeCabecera?: ___

A

J

IH

D

GFE

CB

Page 21: PARADIGMAS Guía de Prácticos

Paradigmas de Programación José Oscar Mugetti Mare

Página 21 de 54

¿Cuántos métodos tiene la clase Doctor?: ____ ¿Cuántos métodos tiene la clase Cirujano?: ____ ¿Cuántos métodos tiene la clase MedicoDeCabecera?: ____ ¿Puede un MedicoDeCabecera tratar pacientes?: ____ ¿Puede un MedicoDeCabecera hacer incisiones?: ____

Page 22: PARADIGMAS Guía de Prácticos

Paradigmas de Programación José Oscar Mugetti Mare

Página 22 de 54

TRABAJO PRÁCTICO 2: 1) Con un editor de texto cualquiera editar un fichero llamado: HolaMundo.java // La clase HolaMundo simplemente muestra // el mensaje “Hola mundo” por pantalla class HolaMundo { public static void main (String[] args) { System.out.println(“Hola mundo!”); } } Compilación C:\> dir HolaMundo.java C:\> javac HolaMundo.java C:\> dir HolaMundo.class HolaMundo.java Ejecución C:\> dir HolaMundo.class HolaMundo.java C:\> java HolaMundo Hola mundo! 2) Ejemplo public MiClase { int i; public MiClase() { i = 10; } public void sumaAi( int j { i = i + j; } }

Page 23: PARADIGMAS Guía de Prácticos

Paradigmas de Programación José Oscar Mugetti Mare

Página 23 de 54

3) AWT - Ejemplos

// Circunferencia.java = dibuja 2 circunferencias import java.awt.*; import java.awt.event.*; class Circunferencia extends Frame { public j007() { setTitle("Dos circunferencias"); } public static void main(String [] args) { Frame f=new Circunferencia(); f.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); f.setSize(300,200); f.setVisible(true); } public void paint(Graphics g){ g.setColor(Color.red); g.drawOval(10,30,30,30); g.setColor(Color.blue); g.drawOval(35,30,30,30); g.drawString("Dos circunferencias",40,100); } }

Page 24: PARADIGMAS Guía de Prácticos

Paradigmas de Programación José Oscar Mugetti Mare

Página 24 de 54

// Elipses.java = dibuja 2 elipses import java.awt.*; import java.awt.event.*; class j008 extends Frame { public Elipses() { setTitle("Dos Elipses"); } public static void main(String [] args) { Frame f=new Elipses(); f.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); f.setSize(300,200); f.setVisible(true); } public void paint(Graphics g){ g.setColor(Color.green); g.drawOval(10,30,250,150); g.setColor(Color.yellow); g.drawOval(40,55,200,125); g.setColor(Color.black); g.drawString("Dos Elipses",100,100); } } 4)

Ejemplo (Promedio.java) class Promedio { public static void main(String[] args) { int i = 11, j = 20; double a = (i + j) / 2.0; System.out.println(“El valor de i es:” + i + “y el de j es: ” + j);

Page 25: PARADIGMAS Guía de Prácticos

Paradigmas de Programación José Oscar Mugetti Mare

Página 25 de 54

System.out.println(“El promedio es de: ” + a); } } 5) Control de Flujo (Bucles)

Public class Bucles { public static void main(String[] args) { int cont1 = 0; while(cont1 <3) { System.out.println(cont1); Cont1++; } int cont2 = 0; do { System.out.println(cont2); Cont2++; } while(cont2 < 2); for(int cont3 = 0; cont3 < 3; cont3++) { System.out.println(cont3); } } }

6) Desarrollar un programa que muestre por pantalla los números primos del 1 al 1000 y todos los años bisiestos entre el año 2000 y el año 3000. Public class Practica { public static void main(String[] args) { //Mostrar los números primos del 1 al 1000. bolean sw; int contador = 0; System.out.println(“Los números primos del 1 al 1000 son:”); for(int i=1; i<1001; i++) { sw = true; for(int j=i; j>0; j--) {

Page 26: PARADIGMAS Guía de Prácticos

Paradigmas de Programación José Oscar Mugetti Mare

Página 26 de 54

if(i%j == 0 && j != i && j ! = 1) { sw = false; break; } } } if(sw) { System.out.println(i + “,”); Contador++; } } System.out.println(“”); System.out.println(“Hay: “ + contador + “números primos entre el 1 y el 1000.”); //Mostrar los años bisiestos del 2000 al 3000. Contador = 0; System.out.println(“Los años bisiestos del 2000 al 3000 son:”); for(int i=2000; i<3001; i++) { if((i%4 == 0 && i%100 != 0) || i%400 == 0) { System.ut.println(i + “,”); Contador++; } } System.out.prinln(“”); System.out.printl(“Hay:” + contador + “años bisiestos entre el 2000 y el 3000.”);

}

}

Page 27: PARADIGMAS Guía de Prácticos

Paradigmas de Programación José Oscar Mugetti Mare

Página 27 de 54

TRABAJO PRÁCTICO 3: HERENCIA 1) Ejemplo Figuras geométricas

// fichero Figura.java /** Orientación a objetos */ public abstract class Figura { public abstract double area (); public abstract double perimetro (); }

// fichero Rectangulo.java /** Orientación a objetos */ public class Rectangulo extends Figura { // Variables de la clase private double ancho; private double alto; // Métodos de la clase // Método constructor public Rectangulo (double anchura, double altura) { ancho = anchura; alto = altura;

Figura

area (): double perimetro (): double

Rectangulo ancho: double alto: double

Rectangulo (double anchura, double altura) area (): double perimetro (): double getAncho (): double getAlto (): double

ElipsesemiMayor: double semiMenor: double

Elipse (double a, double b) area (): double perimetro (): double getMayor (): double getMenor (): double

Cuadrado

Cuadrado (double lado) getLado (): double

Circulo

Circulo (double radio) getRadio(): double

CCllaassee AAbbssttrraaccttaa ((NNoo ppoosseeee oobbjjeettooss nnii ccoonnttrruuccttoorr))

CCoonnssttrruuccttoorr Atributos/Variables de la clase

Métodos/Funciones u Operaciones de la clase

Relación de Herencia

MMééttooddoo qquuee ddeevvuueellvvee eell vvaalloorr ddeell AAttrriibbuuttoo ““aanncchhoo””

Page 28: PARADIGMAS Guía de Prácticos

Paradigmas de Programación José Oscar Mugetti Mare

Página 28 de 54

} public double area () { return alto*ancho; } public double perimetro () { return 2*(alto+alto); } public double getAncho () { return ancho; } public double getAlto () { return alto; } } // fichero Cuadrado.java /** Orientación a objetos */ public class Cuadrado extends Rectangulo { // Métodos de la clase // Método constructor public Cuadrado (double lado) { ancho = lado; // equivalente a: “super (lado, lado);” alto = lado; } // Método que retorna el valor del Atributo o miembro “ancho” public double getLado () { return ancho; } } // fichero Elipse.java /** Orientación a objetos */ public class Elipse extends Figura { // Variables de la clase protected double semiMayor; protected double semiMenor; // Métodos de la clase // Método constructor public Elipse (double a, double b) { if (a >= b) { semiMayor = a;

Page 29: PARADIGMAS Guía de Prácticos

Paradigmas de Programación José Oscar Mugetti Mare

Página 29 de 54

semiMenor = b; } else { semiMayor = b; semiMenor = a; } } public double area () { return Math.PI*semiMayor*semiMenor; } public double perimetro () { return Math.PI*(semiMayor+semiMenor); } public double getMayor () { return semiMayor; } public double getMenor () { return semiMenor; } } // fichero Circulo.java /** Orientación a objetos */ public class Circulo extends Elipse { // Métodos de la clase // Método constructor public Circulo (double radio) { super (radio, radio); } public double getRadio () { return semiMayor; } } La palabra clave this hace referencia al objeto o instancia actual

public class MiClase { int i; public MiClase() { this.i = 10; } }

Page 30: PARADIGMAS Guía de Prácticos

Paradigmas de Programación José Oscar Mugetti Mare

Página 30 de 54

La palabra clave super hace referencia a la superclase de la clase que se

emplea public class MiNuevaClase extends MiClase { public void sumaAi( int j ) { i = i + ( j/2 ); super.sumaAi( j ); } } 2) Ejemplo Animales

Clase 1

class Animal { int miVelocidad; String miNombre; public Animal (int vel, String nom) { miNombre= nom; miVelocidad= vel; }; public void saluda () { System.out.println("Hola, soy "+miNombre); } } class OOP1 { public static void main (String arg []) { Animal laLiebre; Animal laTortuga; laLiebre= new Animal (5,"L"); laLiebre.saluda(); laTortuga= new Animal (1,"T"); laTortuga.saluda(); } }

Animal miVelocidad: int miNombre: String Animal(int vel, String nom) saluda (): void

Page 31: PARADIGMAS Guía de Prácticos

Paradigmas de Programación José Oscar Mugetti Mare

Página 31 de 54

Clase 2

class Animal { int miVelocidad; String miNombre; static int animales=0; public Animal (int velocidad, String nombre) { animales++; miNombre= nombre; miVelocidad= velocidad; } public void saluda () { System.out.println ("Hola, soy "+miNombre); } public static void cuantosAnimales () { System.out.println ("Hay "+animales+" animales"); } } class OOP2_static { public static void main (String arg []) { Animal laLiebre; Animal laTortuga; laLiebre= new Animal (5,"L"); Animal.cuantosAnimales(); laLiebre.saluda(); laTortuga= new Animal (1,"T"); Animal.cuantosAnimales(); laTortuga.saluda(); } }

Animal miVelocidad: int miNombre: String Animales: static int Animal(int velocidad, String nombre) saluda (): void cuantosAnimales(): void

Page 32: PARADIGMAS Guía de Prácticos

Paradigmas de Programación José Oscar Mugetti Mare

Página 32 de 54

Clase 3

class Animal { int miVelocidad; String miNombre; public Animal (int velocidad, String nombre) { miNombre= nombre; miVelocidad= velocidad; }; public void saluda () { System.out.println ("Hola, soy "+miNombre); } } class Acuatico extends Animal { boolean marino; public Acuatico (int vel, String nom, boolean mar){ super(vel, nom); marino=mar; // los animales Acuaticos llevan prefijo "A_" miNombre="A_"+miNombre; } public void saluda() { super.saluda(); System.out.println("y soy acuático."); }

Animal miVelocidad: int miNombre: String Animal(int velocidad, String nombre) saluda (): void

Acuatico

marino: boolean

Acuatico(int vel, String nom, boolean mar) saluda (): void

Page 33: PARADIGMAS Guía de Prácticos

Paradigmas de Programación José Oscar Mugetti Mare

Página 33 de 54

} class OOP3_subclases { public static void main (String arg []) { Animal laLiebre; Acuatico laTortuga1; Animal laTortuga2; laLiebre= new Animal (5,"L"); laLiebre.saluda(); laTortuga1= new Acuatico (1,"T1",true); laTortuga2= new Animal (1,"T2"); laTortuga1.saluda(); laTortuga2.saluda(); } }

Clase 4

class Animal { int miVelocidad; String miNombre; public Animal (int velocidad, String nombre) { miNombre= nombre; miVelocidad= velocidad;

Animal miVelocidad: int miNombre: String Animal(int velocidad, String nombre) saluda (): void corre (long distancia): void

Tortuga

deTierra: boolean

Tortuga(int velocidad, String nombre, boolean tierra) saluda (): void

Page 34: PARADIGMAS Guía de Prácticos

Paradigmas de Programación José Oscar Mugetti Mare

Página 34 de 54

} public void saluda () { System.out.println("\nHola, soy "+miNombre+" y mi velocidad es "+miVelocidad); } public void corre (long distancia) { for (long i=0; i<distancia;i++){ for (long j=0; j<100000000; j+=miVelocidad){;} System.out.print (" "+miNombre); } System.out.println ("\n"+miNombre+" ha llegado !!!"); } } class Tortuga extends Animal { boolean deTierra; public Tortuga(int velocidad, String nombre, boolean tierra){ super(velocidad, nombre); deTierra=tierra; // las tortugas de tierra son el doble de veloces if (deTierra) miVelocidad*=2; } public void saluda() { super.saluda(); if (deTierra) System.out.print ("y soy una tortuga de tierra\n"); else System.out.print ("y soy una tortuga de mar\n"); } } class OOP4_corre { public static void main (String arg []) { Animal laLiebre; Tortuga laTortuga1; Animal laTortuga2; laLiebre= new Animal (5,"L"); laLiebre.saluda(); laTortuga1= new Tortuga (1,"T1",false); laTortuga2= new Tortuga (1,"T2",true);

Page 35: PARADIGMAS Guía de Prácticos

Paradigmas de Programación José Oscar Mugetti Mare

Página 35 de 54

laTortuga1.saluda(); laTortuga2.saluda(); System.out.println("\nComienza la carrera:\n"); laLiebre.corre(10); laTortuga1.corre(10); laTortuga2.corre(10); } } 3) Ejemplo Turno de médico

1- Según el diagrama UML anterior, definir las clases Paciente, Medico y Turno. 2- Crear una clase llamada ReservaTurnos que:

a) Instancie dos pacientes, b) Instancie dos medicos; c) Instancie un turno para el paciente 1 del medico 2 a las 16 hrs, d) Instancie un turno para el paciente 2 del medico 1 a las 18 hrs, e) Suspenda el turno anterior, colocando su estado en “Desocupado”.

Nota: se deberá mostrar los datos principales de los objetos a medida que sean creados, ejemplo: “El paciente Maria reservo el turno el dia 05/11/2003 a las 16:00 hrs. para el Dr. Pirulo”.

Paciente int dni String nombre String direccion String telefono int: getDni() String: getNombre() String: getDireccion() String: getTelefono()

Medico int matricula String nombre String especialidad int: getMatricula() String: getNombre() String: getEspecialidad()

Turno int numeroOrden String fecha String hora int dniPaciente int matriculaMedico String estado int: getNumeroOrden() String: getFecha() String: getHora() int: getDniPaciente() String: getMatriculaMedico() String: getEstado() void: actualizarEstadoTurno(String nuevoEstado)

Page 36: PARADIGMAS Guía de Prácticos

Paradigmas de Programación José Oscar Mugetti Mare

Página 36 de 54

4) Ejemplo Reserva de un video club

1- Según el diagrama UML anterior, y teniendo en cuenta las clases reserva y socio

(ver que pueden haber sido creadas para otro ejemplo y se pueden utilizar) definir las clases Película y Cd.

2- Crear una clase llamada Biblioteca que: f) Instacie dos socios, g) Instancie una película cuyo estado sea “No Disponible”, h) Actualice el estado de la película anterior a “Disponible”, i) Instancie un CD cuyo estado sea “No Disponible”, j) Actualice el estado del CD anterior a “Disponible”, k) Instancie una reserva para el socio 1 de la película del apartado b), l) Instancie una reserva para el socio 2 del CD del apartado d),

Nota: se deberá mostrar los datos principales de los objetos a medida que sean creados. 5) Ejemplo Cuentas de Banco y operaciones bancarias Desarrollar una clase llamada CuentaCorriente que:

Tenga dos atributos private de tipo Titular (Nombre – String, Apellidos – String y Edad - int), de tipo String (el número de la cuenta) y el tipo double (el saldo).

Socio int dni String nombre String direccion String telefono int: getDni() String: getNombre() String: getDireccion() String: getTelefono()

Cd String codigo String nombre String estado String tipo String: getCodigo() String: getNombre() String: getEstado() void: actualizarEstadoCd(String nuevoestado)

Pelicula String codigo String nombre String estado String categoria String: getCodigo() String: getNombre() String: getEstado() void: actualizarEstadoPelicula(String nuevoestado)

Reserva int numero String fecha int dniSocio String codigo int: getNumero() String: getFecha() int: getDniSocio() String: getCodigo()

Page 37: PARADIGMAS Guía de Prácticos

Paradigmas de Programación José Oscar Mugetti Mare

Página 37 de 54

Tenga un constructor con parámetros de tipo Titular, String y double. Tenga un constructor con parámetros de tipo Titular y String. El saldo se

inicializará en 150,30. Tenga un getter para cada uno de los atributos. Tenga un setter solo para el saldo. Tenga un método ingresar que incremente el saldo en una cantidad. Tenga un método reintegro que decremente el saldo en una cantidad. Tenga un método para que al imprimir la cuenta salga por pantalla el número de

cuenta y su saldo. Tenga un método para comparar cuentas, sabiendo que dos cuentas serán iguales

si sus números de cuenta son iguales. o Nota: para comparar dos String utilizar el método compareTo(String)

que devuelve 0 si son iguales. Desarrollar una clase llamada CuentaAhorro que:

Es una especialización de CuentaCorriente. Tiene un atributo más de tipo double (el interés). Tiene un constructor con parámetros de tipo Titular, String, double y double. Tiene un constructor con parámetros de tipo Titular, String y double. El saldo se

inicializará en 150,30. Tiene un constructor con parámetros de tipo Titular y String. El saldo se

inicializará en 150,30 y el interés a 2,5. Tiene un getter para cada uno de los atributos. Tiene un método calcularInteres que incremente el saldo según el interés.

6)

Sistema de garaje

Titular nombre: String apellido: String edad: int Titular(String, String, int) toString(): String

CuentaCorriente titular: Titular num: String saldo: double CuentaCorriente(Titular, String, double) CuentaCorriente(Titular, String) getTitular(): Titular getNum(): String getSaldo(): double setSaldo(double) ingreso(double) reintegro(double) toString(): String equals(Object): boolean CuentaAhorro

interes: double CuentaAhorro(Titular, String, double, double) CuentaAhorro(Titular, String, double) CuentaAhorro(Titular, String) getInteres(): double

l l ()

Page 38: PARADIGMAS Guía de Prácticos

Paradigmas de Programación José Oscar Mugetti Mare

Página 38 de 54

Desarrollar un sistema de garaje siguiendo estas especificaciones: En el garaje se cambian las ruedas tanto de coches como de motos. El precio del cambio de una rueda se fija al abrir el garaje, al igual que la capacidad máxima de vehículos, ya sean motos o coches. Si no hubiese lugar para registrar un vehículo nuevo, habrá que tener contemplado un sistema de aviso para quien esté dejando su vehículo. El sistema de gestión de garaje requiere un mecanismo para ingresar y retirar los vehículos, conocer el número total de vehículos recibidos en ese momento, el precio que supondría cambiar todas las ruedas de todos los vehículos, y el kilometraje medio de todos ellos. La información que manejaremos de los coches, entre otras cosas es la marca y el número de puertas. Mientras que de las motos será la marca y la cilindrada. En el método main, se creará el garaje, una serie de vehículos que se irán recibiendo en el garaje y por último se imprimirá por pantalla toda la información general del garaje así como la información de cada vehículo. 7)

Taller mecánico

Desarrollar un sistema de gestión de partes de un taller mecánico. La información de las partes es: código, descripción e importe. Una parte irá asociada a la matrícula de un coche de manera que podamos añadir, mostrar y eliminar una parte a partir de la matrícula de coche al que está asociado. El método main mostrará por pantalla un menú de opciones: 1- Crear 2- Listas 3- Mostrar 4- Eliminar partes. 5- Salir Se usará una clase que nos permita obtener las entradas por teclado.

Page 39: PARADIGMAS Guía de Prácticos

Paradigmas de Programación José Oscar Mugetti Mare

Página 39 de 54

8) EJEMPLO: CLASES

El ejercicio consiste en que se empieza una ficticia guerra entre dos naves, una de marcianos y otra de terrícolas, cada uno de los cuales va disparando, generando números aleatorios, y si acierta con el número asignado a algún componente de la otra nave lo “mata”. Ganará aquella tripulación en que queden guerreros vivos. SerVivo

vivo: protected boolean isVivo(): boolean

Guerrero soy: private final String blanco: protected int Guerrero(String soy) dispara( ): int getBlanco( ): int generaBlanco( ): int

Marciano total: private static int soy: private String Marciano(String soy) recibeDisparo(int i) getTotal( ): static int

Terricola total: private static int soy: private String Terricola(String soy) recibeDisparo(int i) getTotal( ): static int

Nave tripulacion: Guerrero[ ] somos: String Nave(String somos) recibeDisparo(int i) generaDisparo(int i): int cuantosQuedan( ): int

Guerra nave1 : private Nave nave2 : private Nave Guerra( ) empiezaGuerra( ) main(String[ ] args)

Page 40: PARADIGMAS Guía de Prácticos

Paradigmas de Programación José Oscar Mugetti Mare

Página 40 de 54

PARADIGMA LÓGICO

TRABAJO PRÁCTICO 1: 1) Evalúa las siguientes expresiones y clasifícalas en átomos, variables, símbolos

predicativos negados y no negados y conectivos: a) raquel b) 3200 c) d) a, b, c, e) A, B, C, f) come (josé, pan) g) h) san francisco i) , j) ~juega(carlos, fútbol)

2) Para el cálculo de predicados deben considerarse equivalencias consideradas

básicas, deberá determinarlas: Expresión Equivalencias ~(~X1) X1 X2 ~(X1 X2) ~(X1 X2) X1 X2 X1 X2 X1 (X2 X3) X1 (X2 X3) X1 (X2 X3) X1 (X2 X3) X1 X2

3) Dados los siguientes predicados: padre (X, Y) X es el padre de Y madre (X, Y) X en la madre de Y femenino (X) X es femenino masculino (X) X es masculino Defina las relaciones para: a) hermanos b) hermanas c) nieto d) primo e) descendiente

4) A partir de los siguientes predicados:

padre (padre, hijo)

Page 41: PARADIGMAS Guía de Prácticos

Paradigmas de Programación José Oscar Mugetti Mare

Página 41 de 54

madre (madre, hijo) casados (hombre, mujer) lindo (X) y considerando los siguientes hechos: juan es padre de marcelo y maría miriam es la madre de ricardo raul es el padre de sergio marcelo es el padre de raul y rita rita es la madre de victor y verónica miriam y rita son lindas se desea extrar las siguientes respuestas: a) Quién es el abuelo de víctor b) Quién es el nieto de raúl c) Quién es la hermana de víctor d) Quién es la hermana de verónica e) De quién es hija verónica f) Quién está casado con alguien linda g) Qué relación familiar tienen las personas lindas h) Quiénes son tíos y cuales son sus sobrinos

Se debe escribir un programa capaz de responder a las interrogaciones anteriores 5) Plantear el siguiente problema en cláusulas de Horn: Un dragón es feliz si todas sus crías pueden volar Los dragones verdes pueden volar Un dragón es verde si al menos uno de sus progenitores es verde, en cualquier otro caso es rosa. Demostrar a través de inferencias:

a) Que los dragones verdes son felices b) Que debería ser un dragón rosa para ser feliz

Page 42: PARADIGMAS Guía de Prácticos

Paradigmas de Programación José Oscar Mugetti Mare

Página 42 de 54

TRABAJO PRÁCTICO 2: 1) Considerando los siguientes predicados:

Persona (nombre, edad, sexo) Mayor_edad (nombre, nombre) Y sabiendo que: Juan tiene 20 años Pedro tiene 30 años Luis tiene 28 años Ana tiene 10 años Alejandra tiene 43 años Jorge tiene 60 años ... ingresar 10 más a) escribir un programa que permita identificar a las personas mayores de edad,

identificándolas como hombres y mujeres (recordar la mayoría a los 21 años) b) escribir un programa que permita identificar a las personas de mayor edad en

cada uno de los sexos. 2) A partir de los siguientes predicados:

Persona (nombre, sexo) Amistad (nombre, nombre) Sospechoso (nombre) Y considerando: Bárbara es amiga de Juan Bárbara es amiga de Roberto Bárbara es amiga de María Susana es amiga de Juan Susana es amiga de Pedro

Se debe escribir un programa en turbo prolog que permita individualizar a los sospechosos del asesinato de susana. Para ello debemos considerar como sospechoso a: Los hombres que tuvieron amistad con Susana Las mujeres que tuvieron relación con hombres que Susana conocía Los amigos de mujeres que tuvieron relación con hombres que Susana conocía. 3) Dado la siguiente situación, un jurado debe determinar el orden de llegada de los

corredores de una carrera, pero por una extraña razón los corredores manifiestan lo siguiente:

Antonio: “Yo no he llegado último” Bernardo: “Carlos ha llegado tercero” Carlos: “Antonio ha llegado inmediatamente después de Ernesto” Daniel: “Ernesto ha llegado en segundo lugar” Ernesto: “Daniel no ganó la carrera” Carlos: “Llegó después de Antonio” Se logrado determinar que los dos primeros mienten y los otros no. ¿Podremos ayudar al jurado a determinar el orden de llegada de los corredores?. 4) En base a las siguientes afirmaciones: Todo hongo es una seta o un champignon.

Page 43: PARADIGMAS Guía de Prácticos

Paradigmas de Programación José Oscar Mugetti Mare

Página 43 de 54

Todo boletus es un hongo. Todas las setas son venenosas.

Ningún boletus es un champignon. Se pide realizar un programa en Turbo-prolog que determine cuales son los hongo posibles de ser comidos. 5) Resuelva a través de Turbo-Prolog el siguiente problema: Antonio y Miguel son socios del Club Alpino. Todo socio del Club Alpino que no es un esquiador es un escalador de montañas. A los escaladores de montañas no les gusta la lluvia. Si a alguien no le gusta la nieve no es un esquiador. A Miguel le disgusta todo lo que a Antonio le gusta, y le gusta todo lo que a Antonio le disgusta. A Antonio le gusta la lluvia y la nieve. Plantear el siguiente objetivo: Existe algún socio del Club Alpino que sea escalador de montañas pero no esquiador, ¿Quien?. 6) Deberá realizar un programa en turbo-prolog que determine identificar arcos:

Ejemplo: Objetivo identificar arcos: Arco: sucesión de bloques que forman un dintel y dos columnas. Dictaminar si hay algún arco formado por estos bloques: Y= dintel

X= pilar (este es un arco) Z= pilar

Ejercicios: a)

b)

Y

X Z

d

c a

b e

d

b

a

e

c

Page 44: PARADIGMAS Guía de Prácticos

Paradigmas de Programación José Oscar Mugetti Mare

Página 44 de 54

TRABAJO PRÁCTICO 3: 1) Dado un mapa como el siguiente, en el cual se indican las ciudades, las distancias

entre ellas y cuantos kilómetros son de camino de tierra (la cantidad entre

paréntesis). Se le solicita que construya un programa PROLOG, cuyo predicado

permita indicar de cuantos caminos alternativos se

disponen para realizar el recorrido entre dos ciudades y cuales son sus distancias indicando cuantos de éstos kilómetros son de tierra para cada recorrido. 2) El objetivo del presente es poder llegar al tesoro de manera segura, para ello deberá

definir la ruta desde la entrada al tesoro, sabiendo que los predicados pueden ser

definidos de la siguiente manera:

GALERIA(caverna,caverna)

VECINAS(caverna,caverna) (unidas por una galería)

PELIGRO(caverna) (Los peligros son las cavernas de: Alarma, Ladrones y Monstruos

RUTA(caverna,caverna)

Estos son solamente ejemplos, Ud. puede utilizar los mismos o bien definir unos

nuevos.

El formato aproximado del laberinto sería el siguiente:

E

A

B

D C

2 (0)

5 (2)

6 (3)

10 (4)

4 (1)

2 (2)

2 (2)1(0)

6 (1)

3 (1)

ENTRADA GALERÍA

CAVERNA

LADRONES ALARMAS

FUENTE GALERÍA GALERÍA

GALERÍA

CAVERNA

MONSTRUOS

COMIDA

TESORO

Page 45: PARADIGMAS Guía de Prácticos

Paradigmas de Programación José Oscar Mugetti Mare

Página 45 de 54

TRABAJO PRÁCTICO 4: Listas 1) Ingresando un número real y su factorial, deberá responder verdadero si

corresponde, caso contrario falso. 2) Hallar el factorial de un número real. 3) Hacer una notación para separar a cabeza de la cola de la lista: a través del símbolo

"|". Así, la lista [a,b,c] es [a|[b,c]]. 4) Hallar los elementos que corresponde a la intersección de dos listas ingresadas 5) Encontrar el máximo elemento de una lista 6) Hallar la longitud de una lista 7) Sumar los elementos de una lista 8) Determinar si un elemento es miembro de una lista 9) Eliminar un elemento de una lista 10) Ordenar los elementos de una lista de enteros 11) Concatenar dos listas 12) Hallar el n-esimo elemento de una lista 13) Invertir una lista 14) Recorrer un árbol, formando una lista con los nodos que se visitan 15) Determinar si un elemento aparece en un árbol 16) Dada una lista y un elemento, obtener una lista que no contenga dicho elemento

Page 46: PARADIGMAS Guía de Prácticos

Paradigmas de Programación José Oscar Mugetti Mare

Página 46 de 54

TRABAJO PRÁCTICO 5: Programación avanzada (opcional) 1) Definir un predicado Hanoi (N, A, B, C, Movin) que resuelva el problema de la

torre de Hanoi, con N discos, pasándolos de A a B usando C como auxiliar y siendo Movim la secuencia de movimientos realizados.

2) Escribir un programa lógico para resolver el problema de las "ocho reinas". Esto es

determinar las formas en que pueden colocarse ocho reinas en un tablero de ajedrez de modo que no se amenacen mutuamente.

3) Escribir un programa de lógica para resolver el siguiente problema:

Tres misioneros y tres caníbales están en la orilla izquierda de un río. Hay un bote para cruzar el río, con capacidad a lo sumo para dos personas. Todos deben cruzar el río. Si en algún momento en una de las orillas quedan más misioneros que caníbales, éstos serán convertidos por aquellos. Encontrar modos de transportar los misioneros y caníbales a través del río sin exponer ningún caníbal al peligro de la conversión.

4) Escribir un programa de lógica para resolver el siguiente problema: Hay tres hombres: Juan, Pedro y José, cada uno de los cuales tiene dos profesiones. Sus ocupaciones son las siguientes: chófer, contrabandista de licores, músico, pintor, jardinero y barbero. En base a los siguientes hechos determínese el par de profesiones que corresponde a cada hombre: El chófer ofendió al músico riéndose de su cabello largo. El músico y el jardinero solían ir a pescar con Juan. El pintor compró al contrabandista un litro de ginebra. El chófer cortejaba a la hermana del pintor. Pedro debía $ 5 al jardinero. José venció a Pedro y al pintor jugando al tejo.

Page 47: PARADIGMAS Guía de Prácticos

Paradigmas de Programación José Oscar Mugetti Mare

Página 47 de 54

TUTORIAL DE TURBO-PROLOG F U N C T I O N K E Y S SPECIAL COMBINATIONS ÉÍÍÍÍÍÍÍÍÍÍÍÍ»ÉÍÍÍÍÍÍÍÍÍÍÍÍÍ» ÉÍÍÍÍ»ÉÍÍÍÍ» º F1 ºº F2 º ºCtrlºº <- º Move to previous word º Pop-Up ºº Goto to Lineº ÌÍÍÍ͹ÌÍÍÍ͹ º Help ºº º ºCtrlºº -> º Move to next word ÌÍÍÍÍÍÍÍÍÍÍÍ͹ÌÍÍÍÍÍÍÍÍÍÍÍÍ͹ ÌÍÍÍ͹ÌÍÍÍ͹ º F3 ºº F4 º ºCtrlººPgUpº Goto to start of the text º Search ºº Replace º ÌÍÍÍ͹ÌÍÍÍ͹ º Srch Again ºº R. Again º ºCtrlººPgDnº Goto the end of the text ÌÍÍÍÍÍÍÍÍÍÍÍ͹ÌÍÍÍÍÍÍÍÍÍÍÍÍ͹ ÌÍÍÍ͹ÌÍÍÍ͹ º F5 ºº F6 º ºCtrlººHomeº Goto start of page º Copy ºº Move Text º ÌÍÍÍ͹ÌÍÍÍ͹ º Copy Again ºº º ºCtrlººEnd º Goto end of page ÌÍÍÍÍÍÍÍÍÍÍÍ͹ÌÍÍÍÍÍÍÍÍÍÍÍÍ͹ ÌÍÍÍ͹ÌÍÍÍ͹ º F7 ºº F8 º ºCtrlººBKS º Delete actual line º Delete Textºº Aux Edit º ÌÍÍÍ͹ÌÍÍÍ͹ º ºº º ºCtrlºº V º Insert/Overwrite ÌÍÍÍÍÍÍÍÍÍÍÍ͹ÌÍÍÍÍÍÍÍÍÍÍÍÍ͹ ÌÍÍÍ͹ÈÍÍÍͼ º F9 ºº F10 º ºDel º Delete º Extern copyºº End editor º ÌÍÍÍ͹ º View wind ºº Resize wind º ºIns º Insert/Overwrite ÈÍÍÍÍÍÍÍÍÍÍÍͼÈÍÍÍÍÍÍÍÍÍÍÍÍͼ ÈÍÍÍͼ The second function of the function-keys is activated when SHIFT is used SPECIEL KEYS ============ Ctrl F10 Toggle the size of edit window Alt T Toggle trace mode WORDSTAR COMPATIBLE COMMANDS ============================ WORDSTAR PC CURSOR MOVEMENTS: COMMAND KEY Character left Ctrl-S � Character right Ctrl-D Word left Ctrl-A Ctrl - � Word right Ctrl-F Ctrl - Line up Ctrl-E � Line down Ctrl-X � Page up Ctrl-R PgUp Page down Ctrl-C PgDn To left on line Ctrl-Q-S Home To right on line Ctrl-Q-D End To top of page Ctrl-Q-R Ctrl - Home To bottom of page Ctrl-Q-X Ctrl - End To top of file Ctrl-Q-R Ctrl - PgUp To end of file Ctrl-Q-C Ctrl - PgDn To beginning of block Ctrl-Q-B To end of block Ctrl-Q-K To last cursor position Ctrl-Q-P INSERT & DELETE COMMAND KEY Insert mode on/off Ctrl-V Ins Insert line Ctrl-N Delete line Ctrl-Y Delete to end of line Ctrl-Q-Y Delete right word Ctrl-T

Page 48: PARADIGMAS Guía de Prácticos

Paradigmas de Programación José Oscar Mugetti Mare

Página 48 de 54

Delete char under cursor Ctrl-G Del Delete left character Ctrl-H � BLOCK COMMANDS COMMAND KEY Mark block begin Ctrl-K-B F7 Mark block end Ctrl-K-K F8 Hide/display block Ctrl-K-H Copy block Ctrl-K-C Move block Ctrl-K-V Delete block Ctrl-K-Y Read block from disk Ctrl-K-R Write block to disk Ctrl-K-W Print block Ctrl-K-P MISC. COMMANDS COMMAND KEY Tab Ctrl-I Repeat last find/replace Ctrl-L Find Ctrl-Q-F Find & replace Ctrl-Q-A Auto tab on/off Ctrl-Q-I ÛßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßÛ Û Û Û C O L O R S Û Û Û Û HOW TO CALCULATE SCREEN ATTRIBUTES. Û Û Û Û 1. Choose ONE foreground color and ONE background color. Û Û 2. Add the corresponding integer values below. Û Û 3. Add 128 if you want blinking. Û Û Û ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß BACKGROUND-COLORS (Screen) FOREGROUND-COLORS (Characters) ------------------------+---------+----------------+------------ Black 0 Black 0 Blue 16 Blue 1 Green 32 Green 2 Cyan 48 Cyan 3 Red 64 Red 4 Magenta 80 Magenta 5 Brown 96 Brown 6 White 112 White 7 Grey 8 Light Blue 24 Light Green 40 Light Red 72 Light Magenta 88 Yellow 104 White (High Intensity) 120 ÛßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßÛ Û Û Û STANDARD PREDICATES Û Û Û ÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛ

Page 49: PARADIGMAS Guía de Prácticos

Paradigmas de Programación José Oscar Mugetti Mare

Página 49 de 54

INPUT ===== file_str(DosFileName,StringVariable) File <---> String (string,string) -- (inp,outp) (inp,inp) inkey(CharVariable) (Char) -- (outp) keypressed readchar(CharVariable) (char) -- (outp) readint(IntgVariable) (integer) -- (outp) readln(StringVariable) (string) -- (outp) readreal(RealVariable) (real) -- (outp) FILESYSTEM ========== closefile(SymbolicFileName) (file) -- (inp) deletefile(DosFileName) (string) -- (inp) disk(DosPath) (string) -- (inp) (outp) eof(SymbolicFileName) (file) -- (inp) existfile(DosFileName) (string) -- (inp) filemode(SymbolicFileName,TextOrBinaryMode) (file,integer) -- (inp,inp) filepos(SymbolicFileName,FilePosition,Mode) (file,real,integer) -- (inp,inp,inp) (inp,outp,inp) Mode specifies: 0:Start 1:Relative 2:End (When using mode 2, negative filepositions points inside the file) flush(SymbolicFileName) (file) -- (inp) openappend(SymbolicFileName,DosFileName) (file,string) -- (inp,inp) openmodify(SymbolicFileName,DosFileName) (file,string) -- (inp,inp) openread(SymbolicFileName,DosFileName) (file,string) -- (inp,inp)

Page 50: PARADIGMAS Guía de Prácticos

Paradigmas de Programación José Oscar Mugetti Mare

Página 50 de 54

openwrite(SymbolicFileName,DosFileName) (file,string) -- (inp,inp) readdevice(SymbolicFileName) (file) -- (inp) (outp) renamefile(OldDosFileName,NewDosFileName) (string,string) -- (inp,inp) writedevice(SymbolicFileName) (file) -- (inp) (outp) SCREEN HANDLING =============== attribute(Attr) (integer) -- (inp) (outp) cursor(Row,Column) (integer,integer) -- (inp,inp) (outp,outp) cursorform(Startline,Endline) 0<Startline<14, 0<Endline<14 (integer,integer) -- (inp,inp) field_str(Row,Column,Length,String) (integer,integer,integer,string) -- (inp,inp,inp,inp) (inp,inp,inp,outp) field_attr(Row,Column,Length,Attr) (integer,integer,integer,integer) -- (inp,inp,inp,inp) (inp,inp,inp,outp) scr_char(Row,Column,Char) (integer,integer,char) -- (inp,inp,inp) (inp,inp,outp) scr_attr(Row,Column,Attr) (integer,integer,integer) -- (inp,inp,inp) (inp,inp,outp) WINDOW SYSTEM ============= clearwindow() gotowindow(WindowNo) (integer) -- (inp) makewindow(WindowNo,ScrAtt,FrameAtt,Framestr,Row,Column,Height,Width) (integer,integer,integer,string,integer,integer,integer,integer) -- (inp,inp,inp,inp,inp,inp,inp,inp) (outp,outp,outp,outp,outp,outp,outp,outp) removewindow() scroll(RowsToScroll,ColsToScroll) (integer,integer) -- (inp,inp) shiftwindow(WindowNo) (integer) -- (inp) (outp) window_str(ScreenString) (string) -- (inp) (outp)

Page 51: PARADIGMAS Guía de Prácticos

Paradigmas de Programación José Oscar Mugetti Mare

Página 51 de 54

window_attr(Attr) (integer) -- (inp) STRING HANDLING =============== concat(String1,String2,String3) String3 = String1 + String2 (string,string,string) -- (inp,inp,outp) (inp,outp,inp) (outp,inp,inp) (inp,inp,inp) frontchar(String,FrontChar,RestString) (string,char,string) -- (inp,outp,outp) (inp,inp,outp) (inp,outp,inp) (inp,inp,inp) (outp,inp,inp) frontstr(Lenght,Inpstring,StartString,RestString) (integer,string,string,string) -- (inp,inp,outp,outp) fronttoken(String,Token,RestString) (string,string,string) -- (inp,outp,outp) (inp,inp,outp) (inp,outp,inp) (inp,inp,inp) (outp,inp,inp) isname(StringParam) (string) -- (inp) str_len(String,Length) (string,integer) -- (inp,inp) (inp,outp) CONVERSIONS =========== char_int(CharParam,IntgParam) (char,integer) -- (inp,outp) (outp,inp) (inp,inp) str_int(StringParam,IntgParam) (string,integer) -- (inp,outp) (outp,inp) (inp,inp) str_char(StringParam,CharParam) (string,char) -- (inp,outp) (outp,inp) (inp,inp) str_real(StringParam,RealParam) (string,real) -- (inp,outp) (outp,inp) (inp,inp) upper_lower(StringInUpperCase,StringInLowerCase) (string,string) -- (inp,inp) (inp,outp) (outp,inp) GRAPHICS ======== dot(Row,Column,Colour) (integer,integer,integer) -- (inp,inp,inp) (inp,inp,outp) graphics(ModeParam,Palette,Background) (integer,integer,integer) -- (inp,inp,inp) line(Row1,Col1,Row2,Col2,Colour) (integer,integer,integer,integer,integer) -- (inp,inp,inp,inp,inp) text()

Page 52: PARADIGMAS Guía de Prácticos

Paradigmas de Programación José Oscar Mugetti Mare

Página 52 de 54

TURTLE GRAPHICS =============== back(Step) (integer) -- (inp) forward(Step) (integer) -- (inp) left(Angle) (integer) -- (inp) pencolor(Color) (integer) -- (inp) pendown penpos(RowCoordinate,ColumnCoordinate,Angle) (Integer,Integer,Integer) -- (inp,inp,inp) (outp,outp,outp) penup right(Angle) (integer) -- (inp) MISCELLANEOUS ============= beep A short sound bios(Interruptno,reg(AXi,BXi,CXi,DXi,SIi,DIi,DSi,ESi), reg(AXo,BXo,CXo,DXo,SIo,DIo,DSo,ESo)) Activate a system interrupt (integer,REG,REG) -- (inp,inp,outp) (inp,inp,reg(outp,outp ... ) bitand(X,Y,Z) : Z=X and Y (integer,integer,integer) -- (inp,inp,outp) bitleft(X,Y,Z) : Z=X shiftet Y places to the left (integer,integer,integer) -- (inp,inp,outp) bitnot(X,Y) : Y= not X (integer,integer) -- (inp,outp) bitor(X,Y,Z) : Z=X or Y (integer,integer,integer) -- (inp,inp,outp) bitright(X,Y,Z) : Z=X shiftet Y places to the left (integer,integer,integer) -- (inp,inp,outp) bitxor(X,Y,Z) : Z=X exor Y (integer,integer,integer) -- (inp,inp,outp) comline(LineBuffer) (String) -- (inp) consult(DosFileName) Load a database from file (string) -- (inp) date(Year,Month,Day)

Page 53: PARADIGMAS Guía de Prácticos

Paradigmas de Programación José Oscar Mugetti Mare

Página 53 de 54

(integer,integer,integer) -- (outp,outp,outp) (inp,inp,inp) /* Show a picture of the directory and return a filename */ dir(Path,Filespec,Filename) (string,string,string) -- (inp,inp,outp) display(String) (string) -- (inp) edit(InputString,OutputString) (string,string) -- (inp,outp) editmsg(InputString,OutputString,Headstr,Headstr2,Msg,Pos,Helpfileename,RetStatus) (string,string,string,string,string,integer,string,integer) -- (inp,outp,inp,inp,inp,inp,inp,outp) exit Return to menu system fail is always false and force backtracking membyte(Segment,Offset,Byte) (integer,integer,integer) -- (inp,inp,inp) (inp,inp,outp) memword(Segment,Offset,Word) (integer,integer,integer) -- (inp,inp,inp) (inp,inp,outp) nl New line port_byte(PortNo,Value) (integer,integer) -- (inp,inp) (inp,outp) ptr_dword(8086Ptr,Segment,Offset) (string,integer,integer) -- (inp,otp,outp) (outp,inp,inp) random(RealVariable) (real) -- (outp) save(DosFileName) Save the database on file (string) -- (inp) sound(Duration,Frequency) (integer,integer) -- (inp,inp) storage(StackSize,HeapSize,TrailSize) (real,real,real) -- (outp,outp,outp) system(DosCommandString) Call the dos system shell (string) -- (inp) time(Hours,Minutes,Seconds,Hundredths) (integer,integer,integer,integer) -- (outp,outp,outp,outp) (inp,inp,inp,inp) SPECIAL - PREDICATES ==================== asserta( Term ) assertz( Term ) bound( Variable ) findall( Variable, Atom, ListVariable )

Page 54: PARADIGMAS Guía de Prácticos

Paradigmas de Programación José Oscar Mugetti Mare

Página 54 de 54

free( Variable ) not( Atom ) readterm( Domain, Variable ) retract( Term ) write( Variable|Constant * ) writef( FormatString, Variable|Constant * ) ÛßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßÛ Û Û Û OPTIONS Û Û Û ÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛ trace traces all predicates. trace p1,p2,.. trace predicates p1,p2,... only. shorttrace tracing without disturbing system optimizing. (Ref. p11.4.9) nowarnings Suppress warnings from variable used only once nobreak Predicates should not scan the keyboard to see if CTRL-BREAK has been pressed. check_determ This directive instructs the compiler to give a warning about the presence of a nondeterministic clause. In combination with this directive, the programmer has the option to explicitly describe which state of determinism any predicate is supposed to have - by prefixing the predicate-declaration with either of the two keywords: determ or nondeterm. check_cmpio Check for use of compound flowpatterns. diagnostics Print compiler diagnostics config "ConfigFileName" Configuration file loaded by EXE-module. include "filename" Include a PROLOG file during compilation. Adjustment of compiler tables: ****************************** code=nnn Size of the code array in paragraphs (default 1000). trail=nnn Size of the trail in paragraphs (default 10). �