شما طرفدار پروپاقرص جیوکشینگ هستید، سرگرمیای که علاقهی شما به طبیعتگردی را با علاقه به حل معما در هم میآمیزد. وبسایت محلی جیوکشینگ مختصات GPS همهی مخفیگاهها را فهرست میکند، اما از ساختن مسیری کارآمد برای جمعآوری آنها پشتیبانی نمیکند. اتفاقاً روی دستگاه شما نرمافزار مسیریابی نصب است، اما این نرمافزار قالبی متفاوت از وبسایت جیوکشینگ برای GPS به کار میبرد. برای اینکه دادهها را به نرمافزار مسیریابی بدهید، باید درجه و نیمکرهی هر دو مقدار عرض و طول جغرافیایی هر مختصات GPS روی وبسایت را تجزیه کنید.
وظیفهی شما تجزیهی مختصات GPS است. هر مختصات با گونهای از قالب درجات اعشاری قالببندی میشود که نیمکرهها را صریحاً مشخص میکند:
<LATITUDE_DEGREES> <LATITUDE_HEMISPHERE>, <LONGITUDE_DEGREES> <LONGITUDE_HEMISPHERE>
اینها مقادیر مجاز برای هر مؤلفهی جداگانه هستند:
<LATITUDE_DEGREES>: یک عدد اعشاری در بازهی ۰ تا ۹۰ (شامل هر دو سر)<LATITUDE_HEMISPHERE>: یا N یا S
<LONGITUDE_DEGREES>: یک عدد اعشاری در بازهی ۰ تا ۱۸۰ (شامل هر دو سر)<LONGITUDE_HEMISPHERE>: یا E یا W
برای نمونه، "48.8584 N, 2.2945 E" به این مقادیر تجزیه میشود:
<LATITUDE_DEGREES>: 48.8584<LATITUDE_HEMISPHERE>: N<LONGITUDE_DEGREES>: 2.2945<LONGITUDE_HEMISPHERE>: Eشما ۱۱ وظیفه دارید که در آنها بهتدریج مختصات GPS را تجزیه میکنید. شما از پشتیبانی Prolog از گرامر بندهای معین (DCG) استفاده خواهید کرد که برای تجزیهی متن ساختاریافته طراحی شدهاند.
برای اینکه راحتتر شروع کنید، فایل اولیه از قبل کتابخانهی 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.
درجههای عرض جغرافیایی فقط عدد اعشاری نیستند، بلکه اعداد اعشاری در بازهی ۰ تا ۹۰ (شامل هر دو سر) هستند.
قاعدهی 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.
درجههای طول جغرافیایی فقط عدد اعشاری نیستند، بلکه اعداد اعشاری در بازهی ۰ تا ۱۸۰ (شامل هر دو سر) هستند.
قاعدهی 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.
عرضهای جغرافیایی دو بخش دارند: درجهها و نیمکرهی آنها که با یک فاصله از هم جدا میشوند.
قاعدهی latitude را برای تجزیهی یک عرض جغرافیایی پیادهسازی کنید:
?- 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.