Programación Funcional - Ayuda programa en Scheme

 
Vista:
sin imagen de perfil

Ayuda programa en Scheme

Publicado por carlos (1 intervención) el 02/05/2014 22:28:53
Leyendo en paginas de internet para encontrar ejercicios y poder ocupar mas el Lenguaje SCHEME encontre este desafio planteado:

Desarrollar un programa en el lenguaje de programación Scheme que permita a través de un intérprete y entorno interactivo realizar operaciones de manipulación - especificadas como parámetros sobre un conjunto de datos de entrada contenidos en archivos de texto plano.

Los archivos de entrada corresponden a muestras de nuestra bases datos y contienen registros sobre artículos y sus autores. El primero de los archivos corresponde a “articulos.txt” el cual contiene N registros (tuplas), donde cada registro contiene los siguientes datos: identificador único del artículo (ID), título del artículo, palabras claves, número de páginas, año, revista, volumen, número, doi (Digital Object Identifier, es un identificador único que tienen los documentos en linea).

El segundo archivo corresponde a “autores.txt” el cual contiene M registros (tuplas), donde cada registro contiene los siguientes datos: identificador único de autor, nombres, apellidos, email primario, email secundario, afiliación, dirección.

El tercer archivo corresponde a “articulos_autores.txt” el cual mantiene la vinculación entre artículos y autores. El archivo contiene P registros (tuplas), donde cada registro contiene los siguientes datos: ID artículo, ID autor, esAutorPrincipal?. El último de estos datos corresponde a un valor binario que indica si el autor vinculado al artículo es el autor principal (1) o no (0).

Con los datos presentados en cada archivo el sistema implementado debe permitir las siguientes operaciones (Nota: Lo que se encuentra con letras pequeñas, son las salidas del ejemplo. Estas deben ser escritas en un archivo llamado “output.txt”):

Como parte del diseño e implementación de su solución se requiere que implemente una representación para autores, artículos, y sus vinculaciones. Las representaciones internas que decida emplear como parte de su TDA (Tipo de datos abstractos) son una decisión personal. Además de la representación, debe crear constructores apropiados, funciones de pertenencia, selectores necesarios para extraer información de su representación, y modificadores necesarios.

Considere la siguiente estructura de TDA.

Funciones que operan sobre el nuevo tipo de dato
Modificadores
Selectores
Funciones de pertenencia
Constructores
Representación

- Los constructores básicos solicitados son:

a) (createAuthor ID nombres apellidos email1 email2 afiliacion direccion)
ej: (createAuthor 14 “Juan Carlos” “Perez Aguirre” “ [email protected]” “[email protected]” “University of North” “myAddress”)
b) (createArticle ID titulo palabrasClave numeroPaginas año revista volumen numero doi)
ej: (createArticle 43 "The Art of Collaboration" "collaboration synergy team" 15 2012 "Journal of Collaboration" 42 3 "doi:432.4.3.1")

c) (createLinkArticleAuthor IdArticulo IdAutor mainAuthor)
ej (createLinkArticleAuthor 43 14 1)

- Las funciones de pertenencia requeridas son:

d) Función booleana (#t o #f) que indica si un parámetro pertenece al tipo de dato Autor en base a su representación interna, la cual es implementada a partir de los constructores.

(isAuthor? author)

ej1. (isAuthor? (createAuthor 14 “Juan Carlos” “Perez Aguirre” “ [email protected]” “[email protected]” “University of North”
“myAddress”))
#t

ej2. (isAuthor? 212)
#f

e) Función booleana (#t o #f) que indica si un parámetro pertenece al tipo de dato Articulo en base a su representación interna, la cual es implementada a partir de los constructores.

(isArticle? article)

ej1. (isArticle? (createArticle 43 "The Art of Collaboration" "collaboration synergy team" 15 2012 "Journal of
Collaboration" 42 3 "doi:432.4.3.1"))
#t

ej2. (isArticle? (createAuthor 14 “Juan Carlos” “Perez Aguirre” “ [email protected]” “[email protected]” “University of North”
“myAddress”))
#f

f) Función booleana (#t o #f) que indica si un parámetro pertenece al tipo de dato Articulo en base a su representación interna, la cual es implementada a partir de los constructores.

(isLinkArticleAuthor? linkArticleAuthor)

ej1. (isLinkArticleAuthor? (createLinkArticleAuthor 43 14 1))
#t

ej2. (isLinkArticleAuthor? 3131)
#f


- Las funciones selectoras y modificadoras dependerán de las necesidades particulares del problema. No es requerido implementar selectores para cada uno de los elementos que constituyen la representación interna de los TDAs artículo, autor y vinculación entre autores y artículos.

- También es decisión de los desarrolladores la manera en que representarán las agrupaciones de artículos, autores las vinculaciones entre estos. Algunos podrán usar pares, listas, estructuras, u otras representaciones internas. Lo mismo para los TDAs. Lo importante es que los inputs y outputs sean los requeridos según las especificaciones del presente enunciado.

Considere como punto de partida que se deben definir las siguientes funciones constantes a partir de los archivos de entrada (RESPETAR LOS NOMBRES). ESTO DEBE VENIR IMPLEMENTADO AL COMIENZO DE SU CODIGO.

(define listadoArticulos (llamado a función para carga de artículos desde “articulos.txt”))
(define listadoAutores (llamado a función para carga de autores desde “articulos.txt”))
(define listadoVinculaciones (llamado a función para carga de vinculaciones desde “articulos_autores.txt”))

En las siguientes funciones asuma que las operaciones se realizan sobre estas funciones constantes.













- Las funciones que operan sobre los TDAs antes señalados son:

g) Obtener la información de un artículo a partir de su ID

(getArticleByID ID)

Ej: (getArticleByID 43)

43,The Art of Collaboration, collaboration synergy team, 15, 2012, Journal of Collaboration, 42, 3, doi:432.4.3.1


h) Obtener la información de un artículo en base a su título (Exact Match). Se asume que el título es único.

(getArticleByTitle Titulo)

Ej: (getArticleByTitle “The Art of Collaboration”)

43,The Art of Collaboration, collaboration synergy team, 15, 2012, Journal of Collaboration, 42, 3, doi:432.4.3.1

i) Obtener un listado de artículos en base a una palabra clave especificada.

(getArticlesByKeyword keyword)

Ej: (getArticlesByKeyword “collaboration”)

43,The Art of Collaboration, collaboration synergy team, 15, 2012, Journal of Collaboration, 42, 3, doi:432.4.3.1
126,Nice to work with you, synchrony collaboration groupware, 25, 2014, Journal of Collaboration, 44, 1, doi:531.2.5.5

j) Obtener la cantidad de artículos de un autor a partir de su identificador único.

(getNumberOfArticlesByAuthorID ID)

Ej: (getNumberOfArticlesByAuthorID 14)

3

k) Obtener la información personal de el o los autores de un artículo a partir de su identificador único.

(getAuthorsByArticleID ID)

Ej: (getAuthorsByArticleID 43)

14, Juan Carlos, Perez Aguirre, [email protected], [email protected], University of North, myAddress
28, Pedro Diego, Pavez Aguilar, [email protected], [email protected], University of North, myAddress

l) Obtener la información personal del autor principal de un artículo a partir de su identificador único.

(getMainAuthorByArticleID ID)

Ej: (getMainAuthorByArticleID 43)

14, Juan Carlos, Perez Aguirre, [email protected], [email protected], University of North, myAddress

m) Obtener el listado de artículos de un autor a partir de su dirección de correo. Se asume que la dirección de correo no está duplicada.

(getArticlesByAuthorEmail email)
Ej: (getArticlesByAuthorEmail “[email protected]”)

43,The Art of Collaboration, collaboration synergy team, 15, 2012, Journal of Collaboration, 42, 3, doi:432.4.3.1
23,Advanced techniques of IR, information retrieval search, 25, 2010, Journal of IR, 41, 1, doi:133.3.1.2
14,A browsing model, search information retrieval, 10, 2009, Journal of Enginering, 22, 6, doi:731.4.5.6

Las siguientes funciones modificadoras deben producir nuevas estructuras a partir de la entrada. Por ejemplo, si se modifica un autor dentro de una agrupación de autores que representa el archivo de entrada “autor.txt”, se debe construir una nueva lista de autores donde solo cambia lo modificado dentro del autor de interés. En otras palabras, NO se realizan cambios sobre las funciones constantes que se emplean para realizar las operaciones. Esto partiendo desde la base que no se pueden emplear ningún tipo de variables.

n) Modificar el email primario de un autor a partir de su ID. Resultado produce una nueva lista considerando que no existen variables por modificar

(updateAuthorEmail ID email)

Ej: (updateAuthorEmail 14 “[email protected]”)

En este caso se produce una nueva agrupación de autores donde aquel que tiene el identificador 14 verá su email modificado a “[email protected]”. La función constante sobre la cual se realizan las operaciones (en este caso listadoAutores) permanece constante (i.e. sin cambios).

Por ejemplo, si listadoAutores se representa como una lista de listas, entonces el resultado será
(list ....
(list 14 “Juan Carlos” “Perez Aguirre” “[email protected]” “[email protected]” “University of North” “myAddress”)
.....
)

Por otro lado, esta nueva agrupación se debe guardar en formato CSV en el mismo archivo de entrada “autores.txt”



o) Añadir un nuevo autor a la agrupación de autores

(addNewAuthor nombres apellidos email1 email2 afiliacion direccion)

Ej: (addNewAuthor “Nombres” ”Apellidos” “email1” ”email2” “Afiliación” “Dirección”)

Al igual que en el caso anterior, se crea una nueva agrupación de autores a partir de la función constante listadoAutores que contenga el nuevo registro. El nuevo autor debe generarse a partir de la función constructora createAuthor. El ID requerido para la construcción de un nuevo autor corresponde al sucesor del autor con el mayor valor de ID en el registro de autores (+ maxID 1).

Por otro lado, esta nueva agrupación se debe guardar en formato CSV en el mismo archivo de entrada “autores.txt”

Para efectos de la escritura de los archivos de salida los llamados a sus funciones se realizarán a través de la función “call-with-output-file*”. Esta función recibe como entrada la path y archivo sobre el cual quieren escribir datos y luego el procedimiento que se quiere ejecutar para escribir en archivo. A continuación un ejemplo:

(call-with-output-file* "output.txt" #:exists 'append
(lambda (out)
(display (getArticleByTitle “The Art of Collaboration”) out)))

Esta operación debería escribirá en el archivo “output.txt” lo siguiente (en base al ejemplo provisto en h)

43,The Art of Collaboration, collaboration synergy team, 15, 2012, Journal of Collaboration, 42, 3, doi:432.4.3.1








Yo llevo solo una parte, saludos y el que lo logre o pueda hacer que publique.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder