مسیرها
/
Prolog
Prolog
/
تمرین‌ها
/
سیستم موقعیت‌یابی جهانی
سیستم موقعیت‌یابی جهانی

سیستم موقعیت‌یابی جهانی

متوسط

مقدمه

شما طرفدار پروپاقرص جیوکشینگ هستید، سرگرمی‌ای که علاقه‌ی شما به طبیعت‌گردی را با علاقه به حل معما در هم می‌آمیزد. وب‌سایت محلی جیوکشینگ مختصات 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) استفاده خواهید کرد که برای تجزیه‌ی متن ساختاریافته طراحی شده‌اند.

Note

برای اینکه راحت‌تر شروع کنید، فایل اولیه از قبل کتابخانه‌ی dcg/basics را از این طریق وارد کرده است:

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

1. تجزیه‌ی یک ویرگول

قاعده‌ی comma را پیاده‌سازی کنید تا یک ویرگول (",") را تجزیه کند:

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

2. تجزیه‌ی یک فاصله

قاعده‌ی space را پیاده‌سازی کنید تا یک فاصله (" ") را تجزیه کند:

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

3. پشتیبانی از همه‌ی فضای خالی (به‌جز خط‌های جدید)

قاعده‌ی space را طوری تغییر دهید که همه‌ی فضای خالی، به‌جز خط‌های جدید، را تجزیه کند:

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

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

4. تجزیه‌ی نیمکره‌ی عرض جغرافیایی

نیمکره‌ی عرض جغرافیایی می‌تواند "N" یا "S" باشد که باید به اتم north یا south تجزیه شود. قاعده‌ی latitude_hemisphere را برای تجزیه‌ی نیمکره‌ی عرض جغرافیایی پیاده‌سازی کنید:

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

5. تجزیه‌ی نیمکره‌ی طول جغرافیایی

نیمکره‌ی طول جغرافیایی می‌تواند "E" یا "W" باشد که باید به اتم east یا west تجزیه شود. قاعده‌ی longitude_hemisphere را برای تجزیه‌ی نیمکره‌ی طول جغرافیایی پیاده‌سازی کنید:

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

6. تجزیه‌ی درجه‌ها

درجه‌های طول یا عرض جغرافیایی به‌صورت یک عدد اعشاری تعریف می‌شوند. قاعده‌ی degrees را برای تجزیه‌ی اعداد اعشاری پیاده‌سازی کنید:

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

7. تجزیه‌ی درجه‌های عرض جغرافیایی

درجه‌های عرض جغرافیایی فقط عدد اعشاری نیستند، بلکه اعداد اعشاری در بازه‌ی ۰ تا ۹۰ (شامل هر دو سر) هستند. قاعده‌ی 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.

8. تجزیه‌ی درجه‌های طول جغرافیایی

درجه‌های طول جغرافیایی فقط عدد اعشاری نیستند، بلکه اعداد اعشاری در بازه‌ی ۰ تا ۱۸۰ (شامل هر دو سر) هستند. قاعده‌ی 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.

9. تجزیه‌ی عرض جغرافیایی

عرض‌های جغرافیایی دو بخش دارند: درجه‌ها و نیمکره‌ی آن‌ها که با یک فاصله از هم جدا می‌شوند. قاعده‌ی latitude را برای تجزیه‌ی یک عرض جغرافیایی پیاده‌سازی کنید:

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

10. تجزیه‌ی طول جغرافیایی

عرض‌های جغرافیایی دو بخش دارند: درجه‌ها و نیمکره‌ی آن‌ها که با یک فاصله از هم جدا می‌شوند. قاعده‌ی latitude را برای تجزیه‌ی یک عرض جغرافیایی پیاده‌سازی کنید:

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

11. تجزیه‌ی مختصات

مختصات دو بخش دارند: عرض و طول جغرافیایی که با یک ویرگول و سپس یک فاصله از هم جدا می‌شوند. قاعده‌ی 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.
ویرایش از طریق GitHub این لینک در پنجره یا زبانه‌ی جدیدی باز می‌شود
Prolog Exercism

آماده‌اید سیستم موقعیت‌یابی جهانی را شروع کنید؟

در Exercism ثبت‌نام کنید تا Prolog را همراه با 109 تمرین و مربی‌گری انسانی واقعی یاد بگیرید و در آن استاد شوید، همه‌ی این‌ها رایگان.