Задача про лагерь Артек и ребят. Переделать решение - Prolog

Узнай цену своей работы

Формулировка задачи:

Здравствуйте. Есть задача:
Однажды в Артеке за круглым столом оказалось пятеро ребят родом из Москвы, Санкт-Петербурга, Новгорода, Перми и Томска: Юра, Толя, Алеша, Коля и Витя. Москвич сидел между томичем и Витей, санкт-петербуржец - между Юрой и Толей, а напротив него сидели пермяк и Алеша. Коля никогда не был в Санкт-Петербурге, а Юра не бывал в Москве и Томске, а томич с Толей регулярно переписываются. Определите, в каком городе живет каждый из ребят.
Есть решение с использованием списков:
Листинг программы
  1. domains
  2. strings_d = string*
  3. live_d = live(string, string) % who, where
  4. live_list_d = live_d*
  5. predicates
  6. nondeterm man(string)
  7. nondeterm city(string)
  8. nondeterm member(string, strings_d)
  9. nondeterm member(live_d, live_list_d)
  10. unique(strings_d)
  11. append(live_list_d, live_list_d, live_list_d)
  12. not_member(live_d, live_list_d)
  13. between_list(live_list_d, live_d, live_d, live_d)
  14. between_round(live_list_d, live_d, live_d, live_d)
  15. against(live_list_d, live_d, live_d, live_d)
  16. nondeterm solution(live_list_d)
  17. clauses
  18. unique([]):-!.
  19. unique([Head|Tail]):-
  20. member(Head, Tail), !, fail;
  21. unique(Tail).
  22. member(Elem, [Elem|_Tail]).
  23. member(Elem, [_Head|Tail]):-
  24. member(Elem, Tail).
  25. append([], List2, List2):-!.
  26. append([Head|Tail], List2, [Head|TailResult]):-
  27. append(Tail, List2, TailResult).
  28. not_member(Elem, List):-
  29. member(Elem, List), !, fail; !.
  30. man("Yura").
  31. man("Tolya").
  32. man("Alesha").
  33. man("Kolya").
  34. man("Vitya").
  35. city("Moskva").
  36. city("SP").
  37. city("Novgorod").
  38. city("Perm").
  39. city("Tomsk").
  40. between_list(List, A, B, C):-
  41. append(_Left, [A, B, C|_Tail], List), !;
  42. append(_Left, [C, B, A|_Tail], List).
  43. between_round(List, A, B, C):-
  44. between_list(List, A, B, C), !;
  45. append(Left, [X, Y], List),
  46. between_list([X, Y|Left], A, B, C).
  47. against([A, B, C, D, E], A, C, D):-!.
  48. against([A, B, C, D, E], A, D, C):-!.
  49. against([A, B, C, D, E], B, D, E):-!.
  50. against([A, B, C, D, E], B, E, D):-!.
  51. against([A, B, C, D, E], C, E, A):-!.
  52. against([A, B, C, D, E], C, A, E):-!.
  53. against([A, B, C, D, E], D, A, B):-!.
  54. against([A, B, C, D, E], D, B, A):-!.
  55. against([A, B, C, D, E], E, B, C):-!.
  56. against([A, B, C, D, E], E, C, B):-!.
  57. solution(Solution):-
  58. man(AM), man(BM), man(CM), man(DM), man(EM),
  59. city(AC), city(BC), city(CC), city(DC), city(EC),
  60. Peoples = [AM, BM, CM, DM, EM], unique(Peoples),
  61. Cities = [AC, BC, CC, DC, EC], unique(Cities),
  62. Solution = [live(AM, AC), live(BM, BC), live(CM, CC), live(DM, DC), live(EM, EC)],
  63. between_round(Solution, live(_Tomich, "Tomsk"), live(_Moskvich, "Moskva"), live("Vitya", _VityaCity)),
  64. between_round(Solution, live("Yura", _YuraCity), live(SPec, "SP"), live("Tolya", _TolyaCity)),
  65. against(Solution, live(SPec, "SP"), live(_Permyak, "Perm"), live("Alesha", _AleshaCity)),
  66. not_member(live("Kolya", "SP"), Solution),
  67. not_member(live("Yura", "Moskva"), Solution), not_member(live("Yura", "Tomsk"), Solution),
  68. not_member(live("Tolya", "Tomsk"), Solution).
  69.  
  70. goal
  71. solution(Solution).
Помогите пожалуйста переписать решение без использования списков, только через предикаты.

Решение задачи: «Задача про лагерь Артек и ребят. Переделать решение»

textual
Листинг программы
  1. domains
  2. s=symbol
  3. predicates
  4.  
  5. solve(s,s,s,s,s)
  6. city(s)
  7.  
  8. clauses
  9. city("Moskva").
  10. city("Sankt_piter").
  11. city("Novgorod").
  12. city("Perm").
  13. city("Tomsk").
  14. solve(Ura,Vitia,Tolia,Alesha,Kolia):-
  15. city(Ura),Ura="Novgorod",
  16. city(Kolia),Ura<>Kolia,Kolia<>"Sankt_piter","Perm"<>"Sankt_piter",
  17. city(Tolia),Tolia<>Kolia,Tolia<>Ura,Tolia<>"Tomsk",Tolia<>"Sankt_piter",Tolia<>"Perm",
  18. city(Alesha),Alesha<>Tolia,Alesha<>Kolia,Alesha<>Ura,Alesha<>"Sankt_piter",Alesha<>"Perm",
  19. city(Vitia),Vitia<>Ura,Vitia<>Kolia,Vitia<>Tolia,Vitia<>Alesha,Vitia<>"Moskva","Moskva"<>"Tomsk".
  20. goal
  21. solve(Ura,Vitia,Tolia,Alesha,Kolia).

Объяснение кода листинга программы

В коде на языке Prolog дана задача, связанная с лагерем Артек и его воспитанниками. В коде определены следующие переменные:

  1. s - символ
  2. Ura, Vitia, Tolia, Alesha, Kolia - переменные, представляющие имена воспитанников лагеря Определены следующие предикаты:
  3. city(s) - предикат, определяющий, является ли символ s названием города
  4. solve(s,s,s,s,s) - предикат, решающий задачу В коде присутствуют следующие утверждения:
  5. city(Moskva) - Москва является городом
  6. city(Sankt_piter) - Санкт-Петербург является городом
  7. city(Novgorod) - Новгород является городом
  8. city(Perm) - Пермь является городом
  9. city(Tomsk) - Томск является городом Также в коде есть цель - решить задачу, то есть найти значения переменных Ura, Vitia, Tolia, Alesha, Kolia, при которых выполняются все условия. Условия задачи, которые заданы в коде, можно разделить на следующие группы:
  10. Условие на город Ura и Kolia:
    • Ura=Novgorod
    • Ura<>Kolia
    • Perm<>Kolia
  11. Условие на город Tolia и Kolia:
    • city(Tolia)
    • Tolia<>Kolia
    • Tolia<>Ura
    • Tolia<>Tomsk
    • Tolia<>Sankt_piter
    • Tolia<>Perm
  12. Условие на город Alesha и Kolia:
    • city(Alesha)
    • Alesha<>Tolia
    • Alesha<>Kolia
    • Alesha<>Ura
    • Alesha<>Sankt_piter
    • Alesha<>Perm
  13. Условие на город Vitia и Kolia:
    • city(Vitia)
    • Vitia<>Ura
    • Vitia<>Kolia
    • Vitia<>Tolia
    • Vitia<>Alesha
    • Vitia<>Moskva
    • Vitia<>Tomsk Таким образом, в коде дана система уравнений, которую нужно решить, чтобы найти значения переменных Ura, Vitia, Tolia, Alesha, Kolia, при которых все условия выполняются.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 3.846 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут