Trilhas
/
Prolog
Prolog
/
Exercícios
/
Sistema de Posicionamento Global
Sistema de Posicionamento Global

Sistema de Posicionamento Global

Médio

Introdução

Você é um grande fã de geocaching, que combina seu amor pela natureza com o amor por resolver quebra-cabeças. O site local de geocaching lista as coordenadas de GPS de todos os caches, mas não oferece suporte para criar uma rota eficiente para coletá-los. Acontece que você tem um software de busca de caminhos instalado na sua máquina, só que ele usa um formato de GPS diferente do site de geocaching. Para alimentar o software com os dados, você vai precisar interpretar os graus e o hemisfério tanto da latitude quanto da longitude de cada coordenada de GPS no site.

Instruções

Sua tarefa é analisar coordenadas de GPS. Cada coordenada é formatada usando a variante do formato de graus decimais com hemisférios explícitos:

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

Estes são os valores permitidos para cada componente individual:

  • <LATITUDE_DEGREES>: um número de ponto flutuante no intervalo de 0 a 90 (inclusive)
  • <LATITUDE_HEMISPHERE>: N ou S
  • <LONGITUDE_DEGREES>: um número de ponto flutuante no intervalo de 0 a 180 (inclusive)
  • <LONGITUDE_HEMISPHERE>: E ou W

Por exemplo, "48.8584 N, 2.2945 E" é analisado como:

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

Você tem 11 tarefas, nas quais vai analisar coordenadas de GPS de forma incremental. Você vai usar o suporte do Prolog a Gramática de Cláusulas Definidas (DCG), que serve para analisar texto estruturado.

Note

Para ajudar você a começar, o arquivo stub já inclui a biblioteca dcg/basics por meio de:

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

1. Analisar uma vírgula

Implemente a regra comma para analisar uma única vírgula (","):

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

2. Analisar um espaço

Implemente a regra space para analisar um único espaço (" "):

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

3. Suportar todos os espaços em branco (exceto quebras de linha)

Modifique a regra space para analisar todos os espaços em branco, exceto quebras de linha:

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

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

4. Analisar o hemisfério da latitude

O hemisfério da latitude pode ser "N" ou "S", que devem ser analisados como os átomos north ou south. Implemente a regra latitude_hemisphere para analisar o hemisfério da latitude:

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

5. Analisar o hemisfério da longitude

O hemisfério da longitude pode ser "E" ou "W", que devem ser analisados como os átomos east ou west. Implemente a regra longitude_hemisphere para analisar o hemisfério da longitude:

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

6. Analisar graus

Os graus de uma longitude ou latitude são definidos como um número de ponto flutuante. Implemente a regra degrees para analisar números de ponto flutuante:

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

7. Analisar os graus da latitude

Os graus da latitude não são apenas números de ponto flutuante, mas números de ponto flutuante no intervalo de 0 a 90 (inclusive). Implemente a regra latitude_degrees para analisar os graus da latitude usando o intervalo acima:

?- 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. Analisar os graus da longitude

Os graus da longitude não são apenas números de ponto flutuante, mas números de ponto flutuante no intervalo de 0 a 180 (inclusive). Implemente a regra longitude_degrees para analisar os graus da longitude usando o intervalo acima:

?- 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. Analisar a latitude

As latitudes têm duas partes: os graus e o hemisfério, que são separados por um espaço. Implemente a regra latitude para analisar uma latitude:

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

10. Analisar a longitude

As latitudes têm duas partes: os graus e o hemisfério, que são separados por um espaço. Implemente a regra latitude para analisar uma latitude:

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

11. Analisar a coordenada

As coordenadas têm duas partes: a latitude e a longitude, que são separadas por uma vírgula seguida de um espaço. Implemente a regra coordinate para analisar tanto a latitude (graus e hemisfério):

?- 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 via GitHub O link abre em uma nova janela ou aba
Prolog Exercism

Tudo pronto para começar Sistema de Posicionamento Global?

Crie sua conta no Exercism para aprender e dominar Prolog com 109 exercícios e mentoria humana de verdade, tudo de graça.