fork download
  1. % Задання фактів про кімнати
  2.  
  3. room(kitchen).
  4. room(living_room).
  5. room(bedroom).
  6. room(bathroom).
  7.  
  8. % Запитання про початкові дані
  9.  
  10. :- dynamic monkey_location/1, box_location/1, banana_location/1.
  11.  
  12. ask_user_input :-
  13. write('Введіть де знаходиться мавпа: '),
  14. read(MonkeyRoom),
  15. assertz(monkey_location(MonkeyRoom)),
  16.  
  17. write('Введіть де знаходиться коробка: '),
  18. read(BoxRoom),
  19. assertz(box_location(BoxRoom)),
  20.  
  21. write('Введіть де знаходиться банан: '),
  22. read(BananaRoom),
  23. assertz(banana_location(BananaRoom)).
  24.  
  25. % Створення правил для руху мавпи
  26.  
  27. % Мавпа може залізти на коробку, якщо вона поруч
  28. can_climb_on_box(monkey, Box, [Box | Rooms], Rooms).
  29.  
  30. % Мавпа може піднести коробку, якщо вона поруч
  31. can_pick_up_box(monkey, Box, [Box | Rooms], Rooms, [Box]).
  32.  
  33. % Мавпа може рухатись з кімнати в кімнату
  34. can_move(monkey, CurrentRoom, [NextRoom | Rooms], Rooms, [NextRoom | VisitedRooms]) :-
  35. % Мавпа не може рухатись, якщо вона не знаходиться в кімнаті
  36. CurrentRoom \= NextRoom,
  37. % Мавпа не може рухатись, якщо на коробці знаходиться банан
  38. \+ has_banana_on_box(Box),
  39. % Мавпа може рухатись на коробці, якщо коробка знаходиться в тій самій кімнаті
  40. (has_box(Box, CurrentRoom), can_climb_on_box(monkey, Box, [NextRoom | Rooms], Rooms));
  41. % Мавпа може рухатись з коробкою, якщо коробка знаходиться в наступній кімнаті
  42. (has_box(Box, NextRoom), can_pick_up_box(monkey, Box, [NextRoom | Rooms], Rooms, [Box, NextRoom | VisitedRooms])).
  43.  
  44. % Мавпа може взяти банан, якщо вона знаходиться в тій самій кімнаті та знаходиться на коробці
  45. can_take_banana(monkey, CurrentRoom, [CurrentRoom | VisitedRooms]) :-
  46. has_banana_on_box(Box),
  47. has_box(Box, CurrentRoom).
  48.  
  49. % Створення допоміжних правил
  50.  
  51. % Перевірка наявності коробки у вказаній кімнаті
  52. has_box(Box, Room) :-
  53. box_location(Box, Room).
  54.  
  55. % Перевірка наявності банана на коробці
  56. has_banana_on_box(Box) :-
  57. banana_location(Banana), box_location(Box), on_top_of(Banana, Box).
  58.  
  59. % Відвідані кімнати - це всі кімнати, окрім початкової та кінцевої
  60. visited_rooms([StartRoom | VisitedRooms], _, [EndRoom | _], VisitedRooms) :-
  61. StartRoom == EndRoom.
  62. visited_rooms([StartRoom | VisitedRooms], StartRoom, EndRoom, AllVisitedRooms) :-
  63. can_move(monkey, StartRoom, AllRooms, RestRooms, NewVisitedRooms),
  64. visited_rooms(NewVisitedRooms, RestRooms, EndRoom, VisitedRooms),
  65. append([StartRoom | NewVisitedRooms], VisitedRooms, AllVisitedRooms).
  66.  
  67. % Пошук шляху мавпи
  68.  
  69. find_path(StartRoom, EndRoom, Path) :-
  70. visited_rooms([StartRoom], StartRoom, EndRoom, VisitedRooms),
  71. reverse(VisitedRooms, Path).
  72.  
  73. % Запуск програми
  74.  
  75. start :-
  76. ask_user_input,
  77. monkey_location(StartRoom),
  78. banana_location(EndRoom),
  79. find_path(StartRoom, EndRoom, Path),
  80. write('Маршрут мавпи: '),
  81. write(Path),
  82. write('Всі кімнати, які були відвідані: '),
  83. write(Path),
  84. %retractall(monkey_location()),
  85. %retractall(box_location()),
  86. %retractall(banana_location(_)).
  87.  
  88. % Допоміжні правила
  89.  
  90. box(box, kitchen).
  91. banana(banana).
  92. on_top_of(banana, box).
  93.  
Success #stdin #stdout #stderr 0.03s 6924KB
stdin
start.
stdout
Standard output is empty
stderr
Warning: /home/wsTUgz/prog:34:
	Singleton variable in \+: Box
Warning: /home/wsTUgz/prog:45:
	Singleton variables: [VisitedRooms]
Warning: /home/wsTUgz/prog:62:
	Singleton variables: [AllRooms]
ERROR: '$runtoplevel'/0: Undefined procedure: program/0
   Exception: (3) program ? EOF: exit