Rutas
/
Prolog
Prolog
/
Ejercicios
/
Sistema de posicionamiento global
Sistema de posicionamiento global

Sistema de posicionamiento global

Media

Introducción

Eres un gran fan del geocaching, que combina tu amor por la naturaleza con tu pasión por resolver puzles. Aunque la web de geocaching de tu zona incluye las coordenadas GPS de todas las cachés, no admite crear una ruta eficiente para recogerlas. Resulta que tienes instalado en tu ordenador un software de búsqueda de rutas, pero usa un formato GPS distinto al de la web de geocaching. Para introducir los datos en el software de búsqueda de rutas, tendrás que analizar los grados y el hemisferio tanto de la latitud como de la longitud de cada coordenada GPS de la web.

Instrucciones

Tu tarea es parsear coordenadas GPS. Cada coordenada está formateada usando la variante del formato de grados decimales con hemisferios explícitos:

<LATITUDE_DEGREES> <LATITUDE_HEMISPHERE>, <LONGITUDE_DEGREES> <LONGITUDE_HEMISPHERE>

Estos son los valores permitidos para cada componente individual:

  • <LATITUDE_DEGREES>: un número de coma flotante en el rango 0..90 (ambos inclusive)
  • <LATITUDE_HEMISPHERE>: ya sea N o S
  • <LONGITUDE_DEGREES>: un número de coma flotante en el rango 0..180 (ambos inclusive)
  • <LONGITUDE_HEMISPHERE>: ya sea E o W

Por ejemplo, "48.8584 N, 2.2945 E" se parsea como:

  • <LATITUDE_DEGREES>: 48.8584
  • <LATITUDE_HEMISPHERE>: N
  • <LONGITUDE_DEGREES>: 2.2945
  • <LONGITUDE_HEMISPHERE>: E

Tienes 11 tareas en las que irás parseando coordenadas GPS de forma incremental. Usarás el soporte de Gramáticas de Cláusulas Definidas (DCG) de Prolog, que están diseñadas para parsear texto estructurado.

Note

Para ayudarte a empezar, el archivo stub ya incluye la biblioteca dcg/basics mediante:

:- use_module(library(dcg/basics)).

1. Parsear una coma

Implementa la regla comma para parsear una sola coma (","):

?- string_codes(",", Codes), phrase(comma, Codes).

2. Parsear un espacio

Implementa la regla space para parsear un solo espacio (" "):

?- string_codes(" ", Codes), phrase(space, Codes).

3. Admitir todos los espacios en blanco (excepto los saltos de línea)

Modifica la regla space para parsear todos los espacios en blanco, excepto los saltos de línea:

?- string_codes("\t", Codes), phrase(space, Codes).

?- string_codes("\n", Codes), phrase(space, Codes).
false.

4. Parsear el hemisferio de la latitud

El hemisferio de la latitud puede ser "N" o "S", y debe parsearse al átomo north o south. Implementa la regla latitude_hemisphere para parsear el hemisferio de la latitud:

?- string_codes("N", Codes), phrase(latitude_hemisphere(Hemisphere), Codes).
Hemisphere = north.

5. Parsear el hemisferio de la longitud

El hemisferio de la longitud puede ser "E" o "W", y debe parsearse al átomo east o west. Implementa la regla longitude_hemisphere para parsear el hemisferio de la longitud:

?- string_codes("E", Codes), phrase(longitude_hemisphere(Hemisphere), Codes).
Hemisphere = east.

6. Parsear los grados

Los grados de una longitud o de una latitud se definen como un número de coma flotante. Implementa la regla degrees para parsear números de coma flotante:

?- string_codes("748.012", Codes), phrase(degrees(Degrees), Codes).
Degrees = 748.012.

7. Parsear los grados de la latitud

Los grados de la latitud no son solo números de coma flotante, sino números de coma flotante en el rango 0..90 (ambos inclusive). Implementa la regla latitude_degrees para parsear los grados de la latitud usando el rango anterior:

?- string_codes("48.745", Codes), phrase(latitude_degrees(Degrees), Codes).
Degrees = 48.745.

?- string_codes("117.844", Codes), phrase(latitude_degrees(Degrees), Codes).
false.

8. Parsear los grados de la longitud

Los grados de la longitud no son solo números de coma flotante, sino números de coma flotante en el rango 0..180 (ambos inclusive). Implementa la regla longitude_degrees para parsear los grados de la longitud usando el rango anterior:

?- string_codes("178.773", Codes), phrase(longitude_degrees(Degrees), Codes).
Degrees = 178.773.

?- string_codes("-22.523", Codes), phrase(longitude_degrees(Degrees), Codes).
false.

9. Parsear la latitud

Las latitudes tienen dos partes: sus grados y su hemisferio, que están separados por un espacio. Implementa la regla latitude para parsear una latitud:

?- string_codes("56.101 N", Codes), phrase(latitude(Degrees, Hemisphere), Codes).
Degrees = 56.101,
Hemisphere = north.

10. Parsear la longitud

Las latitudes tienen dos partes: sus grados y su hemisferio, que están separados por un espacio. Implementa la regla latitude para parsear una latitud:

?- string_codes("143.889 W", Codes), phrase(longitude(Degrees, Hemisphere), Codes).
Degrees = 143.889,
Hemisphere = west.

11. Parsear la coordenada

Las coordenadas tienen dos partes: su latitud y su longitud, que están separadas por una coma seguida de un espacio. Implementa la regla coordinate para parsear tanto la latitud (grados y hemisferio):

?- string_codes("48.8584 N, 2.2945 E", Codes), phrase(coordinate(Latitude, LatitudeHemisphere, Longitude, LongitudeHemisphere), Codes).
Latitude = 48.8584,
LatitudeHemisphere = north,
Longitude = 2.2945,
LongitudeHemisphere = east.
Editar en GitHub El enlace se abre en una ventana o pestaña nueva
Prolog Exercism

¿Listo para empezar Sistema de posicionamiento global?

Regístrate en Exercism para aprender y dominar Prolog con 109 ejercicios y mentoría humana real, todo gratis.