% Задання фактів про кімнати
room(kitchen).
room(living_room).
room(bedroom).
room(bathroom).
% Запитання про початкові дані
:- dynamic monkey_location
/1, box_location
/1, banana_location
/1.
ask_user_input :-
write('Введіть де знаходиться мавпа: '), assertz(monkey_location
(MonkeyRoom
)),
write('Введіть де знаходиться коробка: '),
write('Введіть де знаходиться банан: '), assertz(banana_location
(BananaRoom
)).
% Створення правил для руху мавпи
% Мавпа може залізти на коробку, якщо вона поруч
can_climb_on_box(monkey, Box, [Box | Rooms], Rooms).
% Мавпа може піднести коробку, якщо вона поруч
can_pick_up_box(monkey, Box, [Box | Rooms], Rooms, [Box]).
% Мавпа може рухатись з кімнати в кімнату
can_move(monkey, CurrentRoom, [NextRoom | Rooms], Rooms, [NextRoom | VisitedRooms]) :-
% Мавпа не може рухатись, якщо вона не знаходиться в кімнаті
CurrentRoom \= NextRoom,
% Мавпа не може рухатись, якщо на коробці знаходиться банан
\+ has_banana_on_box(Box),
% Мавпа може рухатись на коробці, якщо коробка знаходиться в тій самій кімнаті
(has_box(Box, CurrentRoom), can_climb_on_box(monkey, Box, [NextRoom | Rooms], Rooms));
% Мавпа може рухатись з коробкою, якщо коробка знаходиться в наступній кімнаті
(has_box(Box, NextRoom), can_pick_up_box(monkey, Box, [NextRoom | Rooms], Rooms, [Box, NextRoom | VisitedRooms])).
% Мавпа може взяти банан, якщо вона знаходиться в тій самій кімнаті та знаходиться на коробці
can_take_banana(monkey, CurrentRoom, [CurrentRoom | VisitedRooms]) :-
has_banana_on_box(Box),
has_box(Box, CurrentRoom).
% Створення допоміжних правил
% Перевірка наявності коробки у вказаній кімнаті
has_box(Box, Room) :-
box_location(Box, Room).
% Перевірка наявності банана на коробці
has_banana_on_box(Box) :-
banana_location(Banana), box_location(Box), on_top_of(Banana, Box).
% Відвідані кімнати - це всі кімнати, окрім початкової та кінцевої
visited_rooms([StartRoom | VisitedRooms], _, [EndRoom | _], VisitedRooms) :-
StartRoom == EndRoom.
visited_rooms([StartRoom | VisitedRooms], StartRoom, EndRoom, AllVisitedRooms) :-
can_move(monkey, StartRoom, AllRooms, RestRooms, NewVisitedRooms),
visited_rooms(NewVisitedRooms, RestRooms, EndRoom, VisitedRooms),
append([StartRoom | NewVisitedRooms], VisitedRooms, AllVisitedRooms).
% Пошук шляху мавпи
find_path(StartRoom, EndRoom, Path) :-
visited_rooms([StartRoom], StartRoom, EndRoom, VisitedRooms),
reverse(VisitedRooms, Path).
% Запуск програми
start :-
ask_user_input,
monkey_location(StartRoom),
banana_location(EndRoom),
find_path(StartRoom, EndRoom, Path),
write('Маршрут мавпи: '), write('Всі кімнати, які були відвідані: '), %retractall(monkey_location()),
%retractall(box_location()),
%retractall(banana_location(_)).
% Допоміжні правила
box(box, kitchen).
banana(banana).
on_top_of(banana, box).
JSDQl9Cw0LTQsNC90L3RjyDRhNCw0LrRgtGW0LIg0L/RgNC+INC60ZbQvNC90LDRgtC4Cgpyb29tKGtpdGNoZW4pLgpyb29tKGxpdmluZ19yb29tKS4Kcm9vbShiZWRyb29tKS4Kcm9vbShiYXRocm9vbSkuCgolINCX0LDQv9C40YLQsNC90L3RjyDQv9GA0L4g0L/QvtGH0LDRgtC60L7QstGWINC00LDQvdGWCgo6LSBkeW5hbWljIG1vbmtleV9sb2NhdGlvbi8xLCBib3hfbG9jYXRpb24vMSwgYmFuYW5hX2xvY2F0aW9uLzEuCgphc2tfdXNlcl9pbnB1dCA6LQogICAgd3JpdGUoJ9CS0LLQtdC00ZbRgtGMINC00LUg0LfQvdCw0YXQvtC00LjRgtGM0YHRjyDQvNCw0LLQv9CwOiAnKSwKICAgIHJlYWQoTW9ua2V5Um9vbSksCiAgICBhc3NlcnR6KG1vbmtleV9sb2NhdGlvbihNb25rZXlSb29tKSksCgogICAgd3JpdGUoJ9CS0LLQtdC00ZbRgtGMINC00LUg0LfQvdCw0YXQvtC00LjRgtGM0YHRjyDQutC+0YDQvtCx0LrQsDogJyksCiAgICByZWFkKEJveFJvb20pLAogICAgYXNzZXJ0eihib3hfbG9jYXRpb24oQm94Um9vbSkpLAoKICAgIHdyaXRlKCfQktCy0LXQtNGW0YLRjCDQtNC1INC30L3QsNGF0L7QtNC40YLRjNGB0Y8g0LHQsNC90LDQvTogJyksCiAgICByZWFkKEJhbmFuYVJvb20pLAogICAgYXNzZXJ0eihiYW5hbmFfbG9jYXRpb24oQmFuYW5hUm9vbSkpLgoKJSDQodGC0LLQvtGA0LXQvdC90Y8g0L/RgNCw0LLQuNC7INC00LvRjyDRgNGD0YXRgyDQvNCw0LLQv9C4CgolINCc0LDQstC/0LAg0LzQvtC20LUg0LfQsNC70ZbQt9GC0Lgg0L3QsCDQutC+0YDQvtCx0LrRgywg0Y/QutGJ0L4g0LLQvtC90LAg0L/QvtGA0YPRhwpjYW5fY2xpbWJfb25fYm94KG1vbmtleSwgQm94LCBbQm94IHwgUm9vbXNdLCBSb29tcykuCgolINCc0LDQstC/0LAg0LzQvtC20LUg0L/RltC00L3QtdGB0YLQuCDQutC+0YDQvtCx0LrRgywg0Y/QutGJ0L4g0LLQvtC90LAg0L/QvtGA0YPRhwpjYW5fcGlja191cF9ib3gobW9ua2V5LCBCb3gsIFtCb3ggfCBSb29tc10sIFJvb21zLCBbQm94XSkuCgolINCc0LDQstC/0LAg0LzQvtC20LUg0YDRg9GF0LDRgtC40YHRjCDQtyDQutGW0LzQvdCw0YLQuCDQsiDQutGW0LzQvdCw0YLRgwpjYW5fbW92ZShtb25rZXksIEN1cnJlbnRSb29tLCBbTmV4dFJvb20gfCBSb29tc10sIFJvb21zLCBbTmV4dFJvb20gfCBWaXNpdGVkUm9vbXNdKSA6LQogICAgJSDQnNCw0LLQv9CwINC90LUg0LzQvtC20LUg0YDRg9GF0LDRgtC40YHRjCwg0Y/QutGJ0L4g0LLQvtC90LAg0L3QtSDQt9C90LDRhdC+0LTQuNGC0YzRgdGPINCyINC60ZbQvNC90LDRgtGWCiAgICBDdXJyZW50Um9vbSBcPSBOZXh0Um9vbSwKICAgICUg0JzQsNCy0L/QsCDQvdC1INC80L7QttC1INGA0YPRhdCw0YLQuNGB0YwsINGP0LrRidC+INC90LAg0LrQvtGA0L7QsdGG0ZYg0LfQvdCw0YXQvtC00LjRgtGM0YHRjyDQsdCw0L3QsNC9CiAgICBcKyBoYXNfYmFuYW5hX29uX2JveChCb3gpLAogICAgJSDQnNCw0LLQv9CwINC80L7QttC1INGA0YPRhdCw0YLQuNGB0Ywg0L3QsCDQutC+0YDQvtCx0YbRliwg0Y/QutGJ0L4g0LrQvtGA0L7QsdC60LAg0LfQvdCw0YXQvtC00LjRgtGM0YHRjyDQsiDRgtGW0Lkg0YHQsNC80ZbQuSDQutGW0LzQvdCw0YLRlgogICAgKGhhc19ib3goQm94LCBDdXJyZW50Um9vbSksIGNhbl9jbGltYl9vbl9ib3gobW9ua2V5LCBCb3gsIFtOZXh0Um9vbSB8IFJvb21zXSwgUm9vbXMpKTsKICAgICUg0JzQsNCy0L/QsCDQvNC+0LbQtSDRgNGD0YXQsNGC0LjRgdGMINC3INC60L7RgNC+0LHQutC+0Y4sINGP0LrRidC+INC60L7RgNC+0LHQutCwINC30L3QsNGF0L7QtNC40YLRjNGB0Y8g0LIg0L3QsNGB0YLRg9C/0L3RltC5INC60ZbQvNC90LDRgtGWCiAgICAoaGFzX2JveChCb3gsIE5leHRSb29tKSwgY2FuX3BpY2tfdXBfYm94KG1vbmtleSwgQm94LCBbTmV4dFJvb20gfCBSb29tc10sIFJvb21zLCBbQm94LCBOZXh0Um9vbSB8IFZpc2l0ZWRSb29tc10pKS4KCiUg0JzQsNCy0L/QsCDQvNC+0LbQtSDQstC30Y/RgtC4INCx0LDQvdCw0L0sINGP0LrRidC+INCy0L7QvdCwINC30L3QsNGF0L7QtNC40YLRjNGB0Y8g0LIg0YLRltC5INGB0LDQvNGW0Lkg0LrRltC80L3QsNGC0ZYg0YLQsCDQt9C90LDRhdC+0LTQuNGC0YzRgdGPINC90LAg0LrQvtGA0L7QsdGG0ZYKY2FuX3Rha2VfYmFuYW5hKG1vbmtleSwgQ3VycmVudFJvb20sIFtDdXJyZW50Um9vbSB8IFZpc2l0ZWRSb29tc10pIDotCiAgICBoYXNfYmFuYW5hX29uX2JveChCb3gpLAogICAgaGFzX2JveChCb3gsIEN1cnJlbnRSb29tKS4KCiUg0KHRgtCy0L7RgNC10L3QvdGPINC00L7Qv9C+0LzRltC20L3QuNGFINC/0YDQsNCy0LjQuwoKJSDQn9C10YDQtdCy0ZbRgNC60LAg0L3QsNGP0LLQvdC+0YHRgtGWINC60L7RgNC+0LHQutC4INGDINCy0LrQsNC30LDQvdGW0Lkg0LrRltC80L3QsNGC0ZYKaGFzX2JveChCb3gsIFJvb20pIDotIAogICAgYm94X2xvY2F0aW9uKEJveCwgUm9vbSkuCiAgICAKJSDQn9C10YDQtdCy0ZbRgNC60LAg0L3QsNGP0LLQvdC+0YHRgtGWINCx0LDQvdCw0L3QsCDQvdCwINC60L7RgNC+0LHRhtGWCmhhc19iYW5hbmFfb25fYm94KEJveCkgOi0KYmFuYW5hX2xvY2F0aW9uKEJhbmFuYSksIGJveF9sb2NhdGlvbihCb3gpLCBvbl90b3Bfb2YoQmFuYW5hLCBCb3gpLgoKJSDQktGW0LTQstGW0LTQsNC90ZYg0LrRltC80L3QsNGC0LggLSDRhtC1INCy0YHRliDQutGW0LzQvdCw0YLQuCwg0L7QutGA0ZbQvCDQv9C+0YfQsNGC0LrQvtCy0L7RlyDRgtCwINC60ZbQvdGG0LXQstC+0ZcKdmlzaXRlZF9yb29tcyhbU3RhcnRSb29tIHwgVmlzaXRlZFJvb21zXSwgXywgW0VuZFJvb20gfCBfXSwgVmlzaXRlZFJvb21zKSA6LQpTdGFydFJvb20gPT0gRW5kUm9vbS4KdmlzaXRlZF9yb29tcyhbU3RhcnRSb29tIHwgVmlzaXRlZFJvb21zXSwgU3RhcnRSb29tLCBFbmRSb29tLCBBbGxWaXNpdGVkUm9vbXMpIDotCmNhbl9tb3ZlKG1vbmtleSwgU3RhcnRSb29tLCBBbGxSb29tcywgUmVzdFJvb21zLCBOZXdWaXNpdGVkUm9vbXMpLAp2aXNpdGVkX3Jvb21zKE5ld1Zpc2l0ZWRSb29tcywgUmVzdFJvb21zLCBFbmRSb29tLCBWaXNpdGVkUm9vbXMpLAphcHBlbmQoW1N0YXJ0Um9vbSB8IE5ld1Zpc2l0ZWRSb29tc10sIFZpc2l0ZWRSb29tcywgQWxsVmlzaXRlZFJvb21zKS4KCiUg0J/QvtGI0YPQuiDRiNC70Y/RhdGDINC80LDQstC/0LgKCmZpbmRfcGF0aChTdGFydFJvb20sIEVuZFJvb20sIFBhdGgpIDotCnZpc2l0ZWRfcm9vbXMoW1N0YXJ0Um9vbV0sIFN0YXJ0Um9vbSwgRW5kUm9vbSwgVmlzaXRlZFJvb21zKSwKcmV2ZXJzZShWaXNpdGVkUm9vbXMsIFBhdGgpLgoKJSDQl9Cw0L/Rg9GB0Log0L/RgNC+0LPRgNCw0LzQuAoKc3RhcnQgOi0KYXNrX3VzZXJfaW5wdXQsCm1vbmtleV9sb2NhdGlvbihTdGFydFJvb20pLApiYW5hbmFfbG9jYXRpb24oRW5kUm9vbSksCmZpbmRfcGF0aChTdGFydFJvb20sIEVuZFJvb20sIFBhdGgpLAp3cml0ZSgn0JzQsNGA0YjRgNGD0YIg0LzQsNCy0L/QuDogJyksCndyaXRlKFBhdGgpLApubCwKd3JpdGUoJ9CS0YHRliDQutGW0LzQvdCw0YLQuCwg0Y/QutGWINCx0YPQu9C4INCy0ZbQtNCy0ZbQtNCw0L3RljogJyksCndyaXRlKFBhdGgpLApubC4KJXJldHJhY3RhbGwobW9ua2V5X2xvY2F0aW9uKCkpLAolcmV0cmFjdGFsbChib3hfbG9jYXRpb24oKSksCiVyZXRyYWN0YWxsKGJhbmFuYV9sb2NhdGlvbihfKSkuCgolINCU0L7Qv9C+0LzRltC20L3RliDQv9GA0LDQstC40LvQsAoKYm94KGJveCwga2l0Y2hlbikuCmJhbmFuYShiYW5hbmEpLgpvbl90b3Bfb2YoYmFuYW5hLCBib3gpLgo=