Parcours
/
Prolog
Prolog
/
Exercices
/
Système de positionnement mondial
Système de positionnement mondial

Système de positionnement mondial

Moyen

Introduction

Tu es un immense fan de géocaching, qui allie ton amour du plein air à celui des énigmes. Même si le site local de géocaching liste les coordonnées GPS de toutes les caches, il ne prend pas en charge la création d'un itinéraire efficace pour les récupérer. Il se trouve que tu as un logiciel de recherche de chemin installé sur ta machine, mais celui-ci utilise un format GPS différent de celui du site de géocaching. Pour transmettre les données au logiciel de recherche de chemin, tu devras analyser les degrés et l'hémisphère, pour la latitude comme pour la longitude, de chaque coordonnée GPS figurant sur le site.

Instructions

Ta tâche consiste à analyser des coordonnées GPS. Chaque coordonnée est écrite selon la variante du format degrés décimaux avec des hémisphères explicites :

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

Voici les valeurs autorisées pour chaque composant :

  • <LATITUDE_DEGREES> : un nombre à virgule flottante compris entre 0 et 90 (bornes incluses)
  • <LATITUDE_HEMISPHERE> : soit N, soit S
  • <LONGITUDE_DEGREES> : un nombre à virgule flottante compris entre 0 et 180 (bornes incluses)
  • <LONGITUDE_HEMISPHERE> : soit E, soit W

Par exemple, "48.8584 N, 2.2945 E" s'analyse en :

  • <LATITUDE_DEGREES> : 48,8584
  • <LATITUDE_HEMISPHERE> : N
  • <LONGITUDE_DEGREES> : 2,2945
  • <LONGITUDE_HEMISPHERE> : E

Tu as 11 tâches, au cours desquelles tu vas analyser des coordonnées GPS progressivement. Tu vas utiliser la prise en charge des grammaires de clauses définies (DCG) de Prolog, qui sont conçues pour analyser du texte structuré.

Note

Pour t'aider à démarrer, le fichier d'ébauche inclut déjà la bibliothèque dcg/basics via :

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

1. Analyse une virgule

Implémente la règle comma pour analyser une virgule seule (",") :

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

2. Analyse un espace

Implémente la règle space pour analyser un espace seul (" ") :

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

3. Prends en charge tous les espaces blancs (sauf les sauts de ligne)

Modifie la règle space pour analyser tous les espaces blancs, sauf les sauts de ligne :

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

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

4. Analyse l'hémisphère de la latitude

L'hémisphère de la latitude peut être soit "N", soit "S", qui doit être analysé en l'atome north ou south. Implémente la règle latitude_hemisphere pour analyser l'hémisphère de la latitude :

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

5. Analyse l'hémisphère de la longitude

L'hémisphère de la longitude peut être soit "E", soit "W", qui doit être analysé en l'atome east ou west. Implémente la règle longitude_hemisphere pour analyser l'hémisphère de la longitude :

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

6. Analyse les degrés

Les degrés d'une longitude ou d'une latitude sont définis comme un nombre à virgule flottante. Implémente la règle degrees pour analyser des nombres à virgule flottante :

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

7. Analyse les degrés de latitude

Les degrés de latitude ne sont pas de simples nombres à virgule flottante, mais des nombres à virgule flottante compris entre 0 et 90 (bornes incluses). Implémente la règle latitude_degrees pour analyser les degrés de latitude en utilisant l'intervalle ci-dessus :

?- 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. Analyse les degrés de longitude

Les degrés de longitude ne sont pas de simples nombres à virgule flottante, mais des nombres à virgule flottante compris entre 0 et 180 (bornes incluses). Implémente la règle longitude_degrees pour analyser les degrés de longitude en utilisant l'intervalle ci-dessus :

?- 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. Analyse une latitude

Une latitude comporte deux parties : ses degrés et son hémisphère, séparés par un espace. Implémente la règle latitude pour analyser une latitude :

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

10. Analyse une longitude

Une latitude comporte deux parties : ses degrés et son hémisphère, séparés par un espace. Implémente la règle latitude pour analyser une latitude :

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

11. Analyse une coordonnée

Une coordonnée comporte deux parties : sa latitude et sa longitude, séparées par une virgule suivie d'un espace. Implémente la règle coordinate pour analyser à la fois la latitude (les degrés et l'hémisphère) :

?- 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.
Modifie via GitHub Le lien s'ouvre dans une nouvelle fenêtre ou un nouvel onglet
Prolog Exercism

Prêt à commencer Système de positionnement mondial ?

Inscris-toi sur Exercism pour apprendre et maîtriser Prolog avec 109 exercices, et un vrai mentorat humain, le tout gratuitement.