Ми великі шанувальники геокешингу, який поєднує нашу любов до природи з любовʼю до розвʼязування головоломок. Хоча місцевий сайт геокешингу перелічує GPS-координати всіх схованок, він не підтримує створення ефективного маршруту для їхнього збирання. Так сталося, що на нашому компʼютері встановлено програмне забезпечення для пошуку шляхів, але воно використовує інший формат GPS, ніж сайт геокешингу. Щоб передати дані в програму для пошуку шляхів, нам потрібно розібрати градуси і півкулю для широти і довготи кожної GPS-координати на сайті.
Мета цієї вправи - розібрати координати GPS. Кожна координата має формат десяткових градусів із явним зазначенням півкулі:
<LATITUDE_DEGREES> <LATITUDE_HEMISPHERE>, <LONGITUDE_DEGREES> <LONGITUDE_HEMISPHERE>
Ось дозволені значення для кожного окремого компонента:
<LATITUDE_DEGREES>: число з плаваючою комою в діапазоні 0..90 (включно)<LATITUDE_HEMISPHERE>: N або S
<LONGITUDE_DEGREES>: число з плаваючою комою в діапазоні 0..180 (включно)<LONGITUDE_HEMISPHERE>: E або W
Наприклад, "48.8584 N, 2.2945 E" розбирається на:
<LATITUDE_DEGREES>: 48.8584<LATITUDE_HEMISPHERE>: N<LONGITUDE_DEGREES>: 2.2945<LONGITUDE_HEMISPHERE>: EНа нас чекає 11 завдань, у яких ми будемо крок за кроком розбирати координати GPS. Ми будемо використовувати підтримку Definite Clause Grammar (DCG) у Prolog, призначену для розбору структурованого тексту.
Щоб полегшити нам старт, файл-заготовка вже містить бібліотеку dcg/basics, підключену так:
:- use_module(library(dcg/basics)).
Реалізуйте правило comma, яке розбирає одну кому (","):
?- string_codes(",", Codes), phrase(comma, Codes).
Реалізуйте правило space, яке розбирає один пробіл (" "):
?- string_codes(" ", Codes), phrase(space, Codes).
Змініть правило space так, щоб воно розбирало всі пробільні символи, крім символів нового рядка:
?- string_codes("\t", Codes), phrase(space, Codes).
?- string_codes("\n", Codes), phrase(space, Codes).
false.
Півкуля широти може бути "N" або "S", і під час розбору її треба перетворити на атом north або south.
Реалізуйте правило latitude_hemisphere, яке розбирає півкулю широти:
?- string_codes("N", Codes), phrase(latitude_hemisphere(Hemisphere), Codes).
Hemisphere = north.
Півкуля довготи може бути "E" або "W", і під час розбору її треба перетворити на атом east або west.
Реалізуйте правило longitude_hemisphere, яке розбирає півкулю довготи:
?- string_codes("E", Codes), phrase(longitude_hemisphere(Hemisphere), Codes).
Hemisphere = east.
Градуси довготи чи широти задаються числом з плаваючою комою.
Реалізуйте правило degrees, яке розбирає числа з плаваючою комою:
?- string_codes("748.012", Codes), phrase(degrees(Degrees), Codes).
Degrees = 748.012.
Градуси широти - це не просто числа з плаваючою комою, а числа з плаваючою комою в діапазоні 0..90 (включно).
Реалізуйте правило latitude_degrees, яке розбирає градуси широти в межах зазначеного діапазону:
?- string_codes("48.745", Codes), phrase(latitude_degrees(Degrees), Codes).
Degrees = 48.745.
?- string_codes("117.844", Codes), phrase(latitude_degrees(Degrees), Codes).
false.
Градуси довготи - це не просто числа з плаваючою комою, а числа з плаваючою комою в діапазоні 0..180 (включно).
Реалізуйте правило longitude_degrees, яке розбирає градуси довготи в межах зазначеного діапазону:
?- string_codes("178.773", Codes), phrase(longitude_degrees(Degrees), Codes).
Degrees = 178.773.
?- string_codes("-22.523", Codes), phrase(longitude_degrees(Degrees), Codes).
false.
Широта складається з двох частин: градусів і півкулі, розділених пробілом.
Реалізуйте правило latitude, яке розбирає широту:
?- string_codes("56.101 N", Codes), phrase(latitude(Degrees, Hemisphere), Codes).
Degrees = 56.101,
Hemisphere = north.
Довгота складається з двох частин: градусів і півкулі, розділених пробілом.
Реалізуйте правило longitude, яке розбирає довготу:
?- string_codes("143.889 W", Codes), phrase(longitude(Degrees, Hemisphere), Codes).
Degrees = 143.889,
Hemisphere = west.
Координата складається з двох частин: широти і довготи, розділених комою та пробілом після неї.
Реалізуйте правило coordinate, яке розбирає і широту (градуси та півкулю), і довготу:
?- 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.