Objetivos de aprendizaje:
Conocimiento: Comprende la estructura de un traductor como un autómata que recibe como parámetros el mensaje y la gramática del lenguaje para codificarlo.
Habilidades: Reconoce las estructuras sintácticas de PROLOG en el programa XSLT.
Se tiene una lista de calificaciones de los estudiantes de la secuencia 5CM1 y se debe traducir a código PROLOG.
Revisa la gramática de Prolog y escribe el código XSLT para que genere una cadena de caracteres que declare el contenido XML como un hecho en la base de conocimiento de Prolog. Nota que en el código XSLT está fija la estructura de datos que debe ser leída, corrige los errores de las comas y modifica el código para que lea cualquier estructura y codifique como un hecho en Prolog.
Entra al intérprete XSLT para que veas el resultado en la vista del navegador.
Gramática de Prolog
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Definicion de un parser simple (SICStus Prolog): Gramatica: --> terminales: objetos entre comillas simples --> no terminales: el resto --> "|" : alternativa; "[...]" : opcional; "()*": 0 o mas veces; "()+": 1 o mas veces ----------------------------------------------------------------------- programa = clausula+ clausula = hecho | regla | query hecho = atomo '.' regla = atomo ':-' atomo+ '.' query = '?-' atomo+ '.' atomo = ident | ident '(' args ')' /* un atomo puede no tener argumentos */ args = (term ',')* term term = variable | struct struct = ident | ident '(' args ')' /* una constante es una estructura sin argumentos */ ident = minus alfanum* variable = mayus alfanum* alfanum = letra | num letra = minus | mayus mayus = 'A' | ... | 'Z' minus = 'a' | ... | 'z' num = '0' | ... | '9'
<lista>
<secuencia>5CM1</secuencia>
<alumno>
<boleta>201060365</boleta>
<calificacion>10</calificacion>
</alumno>
<alumno>
<boleta>201060123</boleta>
<calificacion>9</calificacion>
</alumno>
<alumno>
<boleta>201060321</boleta>
<calificacion>10</calificacion>
</alumno>
<alumno>
<boleta>201060458</boleta>
<calificacion>8</calificacion>
</alumno>
</lista>
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<h2>Traducción de XML a Prolog</h2>
<table border="1">
<tr><th>Instrucción</th></tr>
<tr><td>
lista(
secuencia(<xsl:value-of select="lista/secuencia"/>),
alumnos(
<xsl:for-each select="lista/alumno">
alumno(boleta(<xsl:value-of select="boleta"/>) ,
calificacion(<xsl:value-of select="calificacion"/>)),
</xsl:for-each>
)).
</td></tr>
</table> </body> </html>
</xsl:template>
</xsl:stylesheet>
El resultado debe ser:
lista( secuencia(5CM1), alumno(boleta(201060365), calificacion(10)), alumno(boleta(201060123), calificacion(9)), alumno(boleta(201060321), calificacion(10)), alumno(boleta(201060458), calificacion(8))).
El archivo XSLT tiene un error en la cadena de salida, genera una ',' de más porque debe agregarse una etiqueta <xsl:choose> con una condición, si no es el último alumno, escribe una coma, y si es el último, no escribe nada, hagan la corrección para que practiquen