% Представление состояния: state(Миссионеры_слева, Каннибалы_слева, Лодка, Миссионеры_справа, Каннибалы_справа)
% Начальное и конечное состояния
начальное_состояние(state(3, 3, left, 0, 0)).
целевое_состояние(state(0, 0, right, 3, 3)).
% Операторы (переправы)
оператор(m1). % 1 миссионер
оператор(c1). % 1 каннибал
оператор(m2). % 2 миссионера
оператор(c2). % 2 каннибала
оператор(mc). % 1 миссионер, 1 каннибал
% Правила переходов (определяют, как оператор меняет состояние)
переход(state(M1, C1, left, M2, C2), m1, state(M1_next, C1, right, M2_next, C2)) :-
M1 > 0, % Проверяем, есть ли миссионеры для переправы
безопасное_состояние(state(M1_next, C1, right, M2_next, C2)).
переход(state(M1, C1, left, M2, C2), c1, state(M1, C1_next, right, M2, C2_next)) :-
C1 > 0, % Проверяем, есть ли каннибалы для переправы
безопасное_состояние(state(M1, C1_next, right, M2, C2_next)).
% ... (добавьте правила для остальных операторов)
переход(state(M1, C1, right, M2, C2), m1, state(M1_next, C1, left, M2_next, C2)) :-
M2 > 0,
безопасное_состояние(state(M1_next, C1, left, M2_next, C2)).
% Предикат безопасного состояния
безопасное_состояние(state(M, C, _, M_goal, C_goal)) :-
безопасно(M, C),
безопасно(M_goal, C_goal).
безопасно(M, C) :-
(M >= C ; M = 0),
M >= 0,
C >= 0.
% Поиск в глубину
решить(Начальное_состояние, Целевое_состояние, Путь) :-
решить_dfs(Начальное_состояние, Целевое_состояние, [Начальное_состояние], [], Путь).
решить_dfs(Текущее_состояние, Целевое_состояние, Посещенные, ПутьДоТекущегоСостояния, [Текущее_состояние | ПутьДоТекущегоСостояния]) :-
Текущее_состояние = Целевое_состояние,
!.
решить_dfs(Текущее_состояние, Целевое_состояние, Посещенные, ПутьДоТекущегоСостояния, Путь) :-
findall(Следующее_состояние
, (переход
(Текущее_состояние
, _
, Следующее_состояние
), \+ member
(Следующее_состояние
, Посещенные
)), Возможные_состояния
), member(Новое_состояние, Возможные_состояния),
решить_dfs(Новое_состояние, Целевое_состояние, [Новое_состояние | Посещенные], [Текущее_состояние | ПутьДоТекущегоСостояния], Путь).
% Точка входа для запуска решения
go :-
начальное_состояние(Начальное),
целевое_состояние(Целевое),
решить(Начальное, Целевое, Путь),
reverse(Путь, Обратный_путь),
вывести_путь(Обратный_путь).
вывести_путь([]).
вывести_путь([H|T]) :-
вывести_путь(T).
вывести_состояние(state(M1, C1, Лодка, M2, C2)) :-
JSDQn9GA0LXQtNGB0YLQsNCy0LvQtdC90LjQtSDRgdC+0YHRgtC+0Y/QvdC40Y86IHN0YXRlKNCc0LjRgdGB0LjQvtC90LXRgNGLX9GB0LvQtdCy0LAsINCa0LDQvdC90LjQsdCw0LvRi1/RgdC70LXQstCwLCDQm9C+0LTQutCwLCDQnNC40YHRgdC40L7QvdC10YDRi1/RgdC/0YDQsNCy0LAsINCa0LDQvdC90LjQsdCw0LvRi1/RgdC/0YDQsNCy0LApCgolINCd0LDRh9Cw0LvRjNC90L7QtSDQuCDQutC+0L3QtdGH0L3QvtC1INGB0L7RgdGC0L7Rj9C90LjRjwrQvdCw0YfQsNC70YzQvdC+0LVf0YHQvtGB0YLQvtGP0L3QuNC1KHN0YXRlKDMsIDMsIGxlZnQsIDAsIDApKS4K0YbQtdC70LXQstC+0LVf0YHQvtGB0YLQvtGP0L3QuNC1KHN0YXRlKDAsIDAsIHJpZ2h0LCAzLCAzKSkuCgolINCe0L/QtdGA0LDRgtC+0YDRiyAo0L/QtdGA0LXQv9GA0LDQstGLKQrQvtC/0LXRgNCw0YLQvtGAKG0xKS4gJSAxINC80LjRgdGB0LjQvtC90LXRgArQvtC/0LXRgNCw0YLQvtGAKGMxKS4gJSAxINC60LDQvdC90LjQsdCw0LsK0L7Qv9C10YDQsNGC0L7RgChtMikuICUgMiDQvNC40YHRgdC40L7QvdC10YDQsArQvtC/0LXRgNCw0YLQvtGAKGMyKS4gJSAyINC60LDQvdC90LjQsdCw0LvQsArQvtC/0LXRgNCw0YLQvtGAKG1jKS4gJSAxINC80LjRgdGB0LjQvtC90LXRgCwgMSDQutCw0L3QvdC40LHQsNC7CgolINCf0YDQsNCy0LjQu9CwINC/0LXRgNC10YXQvtC00L7QsiAo0L7Qv9GA0LXQtNC10LvRj9GO0YIsINC60LDQuiDQvtC/0LXRgNCw0YLQvtGAINC80LXQvdGP0LXRgiDRgdC+0YHRgtC+0Y/QvdC40LUpCtC/0LXRgNC10YXQvtC0KHN0YXRlKE0xLCBDMSwgbGVmdCwgTTIsIEMyKSwgbTEsIHN0YXRlKE0xX25leHQsIEMxLCByaWdodCwgTTJfbmV4dCwgQzIpKSA6LQogIE0xID4gMCwgICUg0J/RgNC+0LLQtdGA0Y/QtdC8LCDQtdGB0YLRjCDQu9C4INC80LjRgdGB0LjQvtC90LXRgNGLINC00LvRjyDQv9C10YDQtdC/0YDQsNCy0YsKICBNMV9uZXh0IGlzIE0xIC0gMSwKICBNMl9uZXh0IGlzIE0yICsgMSwKICDQsdC10LfQvtC/0LDRgdC90L7QtV/RgdC+0YHRgtC+0Y/QvdC40LUoc3RhdGUoTTFfbmV4dCwgQzEsIHJpZ2h0LCBNMl9uZXh0LCBDMikpLgoK0L/QtdGA0LXRhdC+0LQoc3RhdGUoTTEsIEMxLCBsZWZ0LCBNMiwgQzIpLCBjMSwgc3RhdGUoTTEsIEMxX25leHQsIHJpZ2h0LCBNMiwgQzJfbmV4dCkpIDotCiAgQzEgPiAwLCAgJSDQn9GA0L7QstC10YDRj9C10LwsINC10YHRgtGMINC70Lgg0LrQsNC90L3QuNCx0LDQu9GLINC00LvRjyDQv9C10YDQtdC/0YDQsNCy0YsKICBDMV9uZXh0IGlzIEMxIC0gMSwKICBDMl9uZXh0IGlzIEMyICsgMSwKICDQsdC10LfQvtC/0LDRgdC90L7QtV/RgdC+0YHRgtC+0Y/QvdC40LUoc3RhdGUoTTEsIEMxX25leHQsIHJpZ2h0LCBNMiwgQzJfbmV4dCkpLgolIC4uLiAo0LTQvtCx0LDQstGM0YLQtSDQv9GA0LDQstC40LvQsCDQtNC70Y8g0L7RgdGC0LDQu9GM0L3Ri9GFINC+0L/QtdGA0LDRgtC+0YDQvtCyKQoK0L/QtdGA0LXRhdC+0LQoc3RhdGUoTTEsIEMxLCByaWdodCwgTTIsIEMyKSwgbTEsIHN0YXRlKE0xX25leHQsIEMxLCBsZWZ0LCBNMl9uZXh0LCBDMikpIDotCiAgTTIgPiAwLAogICAgTTFfbmV4dCBpcyBNMSArIDEsCiAgICBNMl9uZXh0IGlzIE0yIC0gMSwKICDQsdC10LfQvtC/0LDRgdC90L7QtV/RgdC+0YHRgtC+0Y/QvdC40LUoc3RhdGUoTTFfbmV4dCwgQzEsIGxlZnQsIE0yX25leHQsIEMyKSkuCgolINCf0YDQtdC00LjQutCw0YIg0LHQtdC30L7Qv9Cw0YHQvdC+0LPQviDRgdC+0YHRgtC+0Y/QvdC40Y8K0LHQtdC30L7Qv9Cw0YHQvdC+0LVf0YHQvtGB0YLQvtGP0L3QuNC1KHN0YXRlKE0sIEMsIF8sIE1fZ29hbCwgQ19nb2FsKSkgOi0KICDQsdC10LfQvtC/0LDRgdC90L4oTSwgQyksCiAg0LHQtdC30L7Qv9Cw0YHQvdC+KE1fZ29hbCwgQ19nb2FsKS4KCtCx0LXQt9C+0L/QsNGB0L3QvihNLCBDKSA6LQogICAgKE0gPj0gQyA7IE0gPSAwKSwKICAgIE0gPj0gMCwKICAgIEMgPj0gMC4KCiUg0J/QvtC40YHQuiDQsiDQs9C70YPQsdC40L3RgwrRgNC10YjQuNGC0Ywo0J3QsNGH0LDQu9GM0L3QvtC1X9GB0L7RgdGC0L7Rj9C90LjQtSwg0KbQtdC70LXQstC+0LVf0YHQvtGB0YLQvtGP0L3QuNC1LCDQn9GD0YLRjCkgOi0KICAgINGA0LXRiNC40YLRjF9kZnMo0J3QsNGH0LDQu9GM0L3QvtC1X9GB0L7RgdGC0L7Rj9C90LjQtSwg0KbQtdC70LXQstC+0LVf0YHQvtGB0YLQvtGP0L3QuNC1LCBb0J3QsNGH0LDQu9GM0L3QvtC1X9GB0L7RgdGC0L7Rj9C90LjQtV0sIFtdLCDQn9GD0YLRjCkuCgrRgNC10YjQuNGC0YxfZGZzKNCi0LXQutGD0YnQtdC1X9GB0L7RgdGC0L7Rj9C90LjQtSwg0KbQtdC70LXQstC+0LVf0YHQvtGB0YLQvtGP0L3QuNC1LCDQn9C+0YHQtdGJ0LXQvdC90YvQtSwgINCf0YPRgtGM0JTQvtCi0LXQutGD0YnQtdCz0L7QodC+0YHRgtC+0Y/QvdC40Y8sIFvQotC10LrRg9GJ0LXQtV/RgdC+0YHRgtC+0Y/QvdC40LUgfCDQn9GD0YLRjNCU0L7QotC10LrRg9GJ0LXQs9C+0KHQvtGB0YLQvtGP0L3QuNGPXSkgOi0KICAgINCi0LXQutGD0YnQtdC1X9GB0L7RgdGC0L7Rj9C90LjQtSA9INCm0LXQu9C10LLQvtC1X9GB0L7RgdGC0L7Rj9C90LjQtSwKICAgICEuCgrRgNC10YjQuNGC0YxfZGZzKNCi0LXQutGD0YnQtdC1X9GB0L7RgdGC0L7Rj9C90LjQtSwg0KbQtdC70LXQstC+0LVf0YHQvtGB0YLQvtGP0L3QuNC1LCDQn9C+0YHQtdGJ0LXQvdC90YvQtSwg0J/Rg9GC0YzQlNC+0KLQtdC60YPRidC10LPQvtCh0L7RgdGC0L7Rj9C90LjRjywg0J/Rg9GC0YwpIDotCiAgICBmaW5kYWxsKNCh0LvQtdC00YPRjtGJ0LXQtV/RgdC+0YHRgtC+0Y/QvdC40LUsICjQv9C10YDQtdGF0L7QtCjQotC10LrRg9GJ0LXQtV/RgdC+0YHRgtC+0Y/QvdC40LUsIF8sINCh0LvQtdC00YPRjtGJ0LXQtV/RgdC+0YHRgtC+0Y/QvdC40LUpLCBcKyBtZW1iZXIo0KHQu9C10LTRg9GO0YnQtdC1X9GB0L7RgdGC0L7Rj9C90LjQtSwg0J/QvtGB0LXRidC10L3QvdGL0LUpKSwg0JLQvtC30LzQvtC20L3Ri9C1X9GB0L7RgdGC0L7Rj9C90LjRjyksCiAgICBtZW1iZXIo0J3QvtCy0L7QtV/RgdC+0YHRgtC+0Y/QvdC40LUsINCS0L7Qt9C80L7QttC90YvQtV/RgdC+0YHRgtC+0Y/QvdC40Y8pLAogICAg0YDQtdGI0LjRgtGMX2RmcyjQndC+0LLQvtC1X9GB0L7RgdGC0L7Rj9C90LjQtSwg0KbQtdC70LXQstC+0LVf0YHQvtGB0YLQvtGP0L3QuNC1LCBb0J3QvtCy0L7QtV/RgdC+0YHRgtC+0Y/QvdC40LUgfCDQn9C+0YHQtdGJ0LXQvdC90YvQtV0sIFvQotC10LrRg9GJ0LXQtV/RgdC+0YHRgtC+0Y/QvdC40LUgfCDQn9GD0YLRjNCU0L7QotC10LrRg9GJ0LXQs9C+0KHQvtGB0YLQvtGP0L3QuNGPXSwg0J/Rg9GC0YwpLgoKJSDQotC+0YfQutCwINCy0YXQvtC00LAg0LTQu9GPINC30LDQv9GD0YHQutCwINGA0LXRiNC10L3QuNGPCmdvIDotCiAgICDQvdCw0YfQsNC70YzQvdC+0LVf0YHQvtGB0YLQvtGP0L3QuNC1KNCd0LDRh9Cw0LvRjNC90L7QtSksCiAgICDRhtC10LvQtdCy0L7QtV/RgdC+0YHRgtC+0Y/QvdC40LUo0KbQtdC70LXQstC+0LUpLAogICAg0YDQtdGI0LjRgtGMKNCd0LDRh9Cw0LvRjNC90L7QtSwg0KbQtdC70LXQstC+0LUsINCf0YPRgtGMKSwKICAgIHJldmVyc2Uo0J/Rg9GC0YwsINCe0LHRgNCw0YLQvdGL0Llf0L/Rg9GC0YwpLAogICAgd3JpdGUoJ9Cg0LXRiNC10L3QuNC1OicpLCBubCwKICAgINCy0YvQstC10YHRgtC4X9C/0YPRgtGMKNCe0LHRgNCw0YLQvdGL0Llf0L/Rg9GC0YwpLgoK0LLRi9Cy0LXRgdGC0Lhf0L/Rg9GC0YwoW10pLgrQstGL0LLQtdGB0YLQuF/Qv9GD0YLRjChbSHxUXSkgOi0KICAgIHdyaXRlKEgpLCBubCwKICAgINCy0YvQstC10YHRgtC4X9C/0YPRgtGMKFQpLgogICAg0LLRi9Cy0LXRgdGC0Lhf0YHQvtGB0YLQvtGP0L3QuNC1KHN0YXRlKE0xLCBDMSwg0JvQvtC00LrQsCwgTTIsIEMyKSkgOi0KICAgIHdyaXRlKCfQodC+0YHRgtC+0Y/QvdC40LU6JyksIG5sLAogICAgd3JpdGUoJyAg0JvQtdCy0YvQuSDQsdC10YDQtdCzOiDQnNC40YHRgdC40L7QvdC10YDRiyA9ICcpLCB3cml0ZShNMSksIHdyaXRlKCcsINCa0LDQvdC90LjQsdCw0LvRiyA9ICcpLCB3cml0ZShDMSksIG5sLAogICAgd3JpdGUoJyAg0JvQvtC00LrQsDogJyksIHdyaXRlKNCb0L7QtNC60LApLCBubCwKICAgIHdyaXRlKCcgINCf0YDQsNCy0YvQuSDQsdC10YDQtdCzOiDQnNC40YHRgdC40L7QvdC10YDRiyA9ICcpLCB3cml0ZShNMiksIHdyaXRlKCcsINCa0LDQvdC90LjQsdCw0LvRiyA9ICcpLCB3cml0ZShDMiksIG5sLg==