prolog
Копировать
% Представление состояния: 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(Новое_состояние, Целевое_состояние, [Новое_состояние | Посещенные], [Текущее_состояние | ПутьДоТекущегоСостояния], Путь).
% Визуализация состояния (ПРИМЕР 1 - базовый)
вывести_состояние(state(M1, C1, Лодка, M2, C2)) :-
% Визуализация состояния (ПРИМЕР 2 - с рекой)
% Раскомментируйте этот блок, чтобы использовать визуализацию с рекой
вывести_состояние(state(M1, C1, left, M2, C2)) :-
gen_string(M1, 'M', Миссионеры_лево), % Вспомогательный предикат
gen_string(C1, 'C', Каннибалы_лево), % Вспомогательный предикат
gen_string(M2, 'M', Миссионеры_право),
gen_string(C2, 'C', Каннибалы_право),
atomic_list_concat([Миссионеры_лево, Каннибалы_лево, ' |~~~~~| ', Миссионеры_право, Каннибалы_право], Строка),
вывести_состояние(state(M1, C1, right, M2, C2)) :-
% Аналогично, но лодка плывет вправо
gen_string(M1, 'M', Миссионеры_лево), % Вспомогательный предикат
gen_string(C1, 'C', Каннибалы_лево), % Вспомогательный предикат
gen_string(M2, 'M', Миссионеры_право),
gen_string(C2, 'C', Каннибалы_право),
atomic_list_concat([Миссионеры_лево, Каннибалы_лево, ' |~~~~~| ', Миссионеры_право, Каннибалы_право], Строка),
gen_string(0, _, '') :- !.
gen_string(N, Char, String) :-
N > 0,
gen_string(N1, Char, Rest),
atomic_list_concat([Char, Rest], String).
% Точка входа для запуска решения
go :-
начальное_состояние(Начальное),
целевое_состояние(Целевое),
решить(Начальное, Целевое, Путь),
reverse(Путь, Обратный_путь),
вывести_путь(Обратный_путь).
вывести_путь([]).
вывести_путь([H|T]) :-
вывести_путь(T).
cHJvbG9nCtCa0L7Qv9C40YDQvtCy0LDRgtGMCiUg0J/RgNC10LTRgdGC0LDQstC70LXQvdC40LUg0YHQvtGB0YLQvtGP0L3QuNGPOiBzdGF0ZSjQnNC40YHRgdC40L7QvdC10YDRi1/RgdC70LXQstCwLCDQmtCw0L3QvdC40LHQsNC70Ytf0YHQu9C10LLQsCwg0JvQvtC00LrQsCwg0JzQuNGB0YHQuNC+0L3QtdGA0Ytf0YHQv9GA0LDQstCwLCDQmtCw0L3QvdC40LHQsNC70Ytf0YHQv9GA0LDQstCwKQoKJSDQndCw0YfQsNC70YzQvdC+0LUg0Lgg0LrQvtC90LXRh9C90L7QtSDRgdC+0YHRgtC+0Y/QvdC40Y8K0L3QsNGH0LDQu9GM0L3QvtC1X9GB0L7RgdGC0L7Rj9C90LjQtShzdGF0ZSgzLCAzLCBsZWZ0LCAwLCAwKSkuCtGG0LXQu9C10LLQvtC1X9GB0L7RgdGC0L7Rj9C90LjQtShzdGF0ZSgwLCAwLCByaWdodCwgMywgMykpLgoKJSDQntC/0LXRgNCw0YLQvtGA0YsgKNC/0LXRgNC10L/RgNCw0LLRiykK0L7Qv9C10YDQsNGC0L7RgChtMSkuICUgMSDQvNC40YHRgdC40L7QvdC10YAK0L7Qv9C10YDQsNGC0L7RgChjMSkuICUgMSDQutCw0L3QvdC40LHQsNC7CtC+0L/QtdGA0LDRgtC+0YAobTIpLiAlIDIg0LzQuNGB0YHQuNC+0L3QtdGA0LAK0L7Qv9C10YDQsNGC0L7RgChjMikuICUgMiDQutCw0L3QvdC40LHQsNC70LAK0L7Qv9C10YDQsNGC0L7RgChtYykuICUgMSDQvNC40YHRgdC40L7QvdC10YAsIDEg0LrQsNC90L3QuNCx0LDQuwoKJSDQn9GA0LDQstC40LvQsCDQv9C10YDQtdGF0L7QtNC+0LIgKNC+0L/RgNC10LTQtdC70Y/RjtGCLCDQutCw0Log0L7Qv9C10YDQsNGC0L7RgCDQvNC10L3Rj9C10YIg0YHQvtGB0YLQvtGP0L3QuNC1KQrQv9C10YDQtdGF0L7QtChzdGF0ZShNMSwgQzEsIGxlZnQsIE0yLCBDMiksIG0xLCBzdGF0ZShNMV9uZXh0LCBDMSwgcmlnaHQsIE0yX25leHQsIEMyKSkgOi0KICBNMSA+IDAsICAlINCf0YDQvtCy0LXRgNGP0LXQvCwg0LXRgdGC0Ywg0LvQuCDQvNC40YHRgdC40L7QvdC10YDRiyDQtNC70Y8g0L/QtdGA0LXQv9GA0LDQstGLCiAgTTFfbmV4dCBpcyBNMSAtIDEsCiAgTTJfbmV4dCBpcyBNMiArIDEsCiAg0LHQtdC30L7Qv9Cw0YHQvdC+0LVf0YHQvtGB0YLQvtGP0L3QuNC1KHN0YXRlKE0xX25leHQsIEMxLCByaWdodCwgTTJfbmV4dCwgQzIpKS4KCtC/0LXRgNC10YXQvtC0KHN0YXRlKE0xLCBDMSwgbGVmdCwgTTIsIEMyKSwgYzEsIHN0YXRlKE0xLCBDMV9uZXh0LCByaWdodCwgTTIsIEMyX25leHQpKSA6LQogIEMxID4gMCwgICUg0J/RgNC+0LLQtdGA0Y/QtdC8LCDQtdGB0YLRjCDQu9C4INC60LDQvdC90LjQsdCw0LvRiyDQtNC70Y8g0L/QtdGA0LXQv9GA0LDQstGLCiAgQzFfbmV4dCBpcyBDMSAtIDEsCiAgQzJfbmV4dCBpcyBDMiArIDEsCiAg0LHQtdC30L7Qv9Cw0YHQvdC+0LVf0YHQvtGB0YLQvtGP0L3QuNC1KHN0YXRlKE0xLCBDMV9uZXh0LCByaWdodCwgTTIsIEMyX25leHQpKS4KJSAuLi4gKNC00L7QsdCw0LLRjNGC0LUg0L/RgNCw0LLQuNC70LAg0LTQu9GPINC+0YHRgtCw0LvRjNC90YvRhSDQvtC/0LXRgNCw0YLQvtGA0L7QsikKCtC/0LXRgNC10YXQvtC0KHN0YXRlKE0xLCBDMSwgcmlnaHQsIE0yLCBDMiksIG0xLCBzdGF0ZShNMV9uZXh0LCBDMSwgbGVmdCwgTTJfbmV4dCwgQzIpKSA6LQogIE0yID4gMCwKICAgIE0xX25leHQgaXMgTTEgKyAxLAogICAgTTJfbmV4dCBpcyBNMiAtIDEsCiAg0LHQtdC30L7Qv9Cw0YHQvdC+0LVf0YHQvtGB0YLQvtGP0L3QuNC1KHN0YXRlKE0xX25leHQsIEMxLCBsZWZ0LCBNMl9uZXh0LCBDMikpLgoKJSDQn9GA0LXQtNC40LrQsNGCINCx0LXQt9C+0L/QsNGB0L3QvtCz0L4g0YHQvtGB0YLQvtGP0L3QuNGPCtCx0LXQt9C+0L/QsNGB0L3QvtC1X9GB0L7RgdGC0L7Rj9C90LjQtShzdGF0ZShNLCBDLCBfLCBNX2dvYWwsIENfZ29hbCkpIDotCiAg0LHQtdC30L7Qv9Cw0YHQvdC+KE0sIEMpLAogINCx0LXQt9C+0L/QsNGB0L3QvihNX2dvYWwsIENfZ29hbCkuCgrQsdC10LfQvtC/0LDRgdC90L4oTSwgQykgOi0KICAgIChNID49IEMgOyBNID0gMCksCiAgICBNID49IDAsCiAgICBDID49IDAuCgolINCf0L7QuNGB0Log0LIg0LPQu9GD0LHQuNC90YMK0YDQtdGI0LjRgtGMKNCd0LDRh9Cw0LvRjNC90L7QtV/RgdC+0YHRgtC+0Y/QvdC40LUsINCm0LXQu9C10LLQvtC1X9GB0L7RgdGC0L7Rj9C90LjQtSwg0J/Rg9GC0YwpIDotCiAgICDRgNC10YjQuNGC0YxfZGZzKNCd0LDRh9Cw0LvRjNC90L7QtV/RgdC+0YHRgtC+0Y/QvdC40LUsINCm0LXQu9C10LLQvtC1X9GB0L7RgdGC0L7Rj9C90LjQtSwgW9Cd0LDRh9Cw0LvRjNC90L7QtV/RgdC+0YHRgtC+0Y/QvdC40LVdLCBbXSwg0J/Rg9GC0YwpLgoK0YDQtdGI0LjRgtGMX2RmcyjQotC10LrRg9GJ0LXQtV/RgdC+0YHRgtC+0Y/QvdC40LUsINCm0LXQu9C10LLQvtC1X9GB0L7RgdGC0L7Rj9C90LjQtSwg0J/QvtGB0LXRidC10L3QvdGL0LUsICDQn9GD0YLRjNCU0L7QotC10LrRg9GJ0LXQs9C+0KHQvtGB0YLQvtGP0L3QuNGPLCBb0KLQtdC60YPRidC10LVf0YHQvtGB0YLQvtGP0L3QuNC1IHwg0J/Rg9GC0YzQlNC+0KLQtdC60YPRidC10LPQvtCh0L7RgdGC0L7Rj9C90LjRj10pIDotCiAgICDQotC10LrRg9GJ0LXQtV/RgdC+0YHRgtC+0Y/QvdC40LUgPSDQptC10LvQtdCy0L7QtV/RgdC+0YHRgtC+0Y/QvdC40LUsCiAgICAhLgoK0YDQtdGI0LjRgtGMX2RmcyjQotC10LrRg9GJ0LXQtV/RgdC+0YHRgtC+0Y/QvdC40LUsINCm0LXQu9C10LLQvtC1X9GB0L7RgdGC0L7Rj9C90LjQtSwg0J/QvtGB0LXRidC10L3QvdGL0LUsINCf0YPRgtGM0JTQvtCi0LXQutGD0YnQtdCz0L7QodC+0YHRgtC+0Y/QvdC40Y8sINCf0YPRgtGMKSA6LQogICAgJSDQktC+0YIg0YLRg9GCINCy0YvQt9GL0LLQsNC10Lwg0LLQuNC30YPQsNC70LjQt9Cw0YbQuNGOINGC0LXQutGD0YnQtdCz0L4g0YHQvtGB0YLQvtGP0L3QuNGPCiAgICDQstGL0LLQtdGB0YLQuF/RgdC+0YHRgtC+0Y/QvdC40LUo0KLQtdC60YPRidC10LVf0YHQvtGB0YLQvtGP0L3QuNC1KSwgJSA8LS0tLSAg0JTQntCR0JDQktCb0JXQndCeCgogICAgZmluZGFsbCjQodC70LXQtNGD0Y7RidC10LVf0YHQvtGB0YLQvtGP0L3QuNC1LCAo0L/QtdGA0LXRhdC+0LQo0KLQtdC60YPRidC10LVf0YHQvtGB0YLQvtGP0L3QuNC1LCBfLCDQodC70LXQtNGD0Y7RidC10LVf0YHQvtGB0YLQvtGP0L3QuNC1KSwgXCsgbWVtYmVyKNCh0LvQtdC00YPRjtGJ0LXQtV/RgdC+0YHRgtC+0Y/QvdC40LUsINCf0L7RgdC10YnQtdC90L3Ri9C1KSksINCS0L7Qt9C80L7QttC90YvQtV/RgdC+0YHRgtC+0Y/QvdC40Y8pLAogICAgbWVtYmVyKNCd0L7QstC+0LVf0YHQvtGB0YLQvtGP0L3QuNC1LCDQktC+0LfQvNC+0LbQvdGL0LVf0YHQvtGB0YLQvtGP0L3QuNGPKSwKICAgINGA0LXRiNC40YLRjF9kZnMo0J3QvtCy0L7QtV/RgdC+0YHRgtC+0Y/QvdC40LUsINCm0LXQu9C10LLQvtC1X9GB0L7RgdGC0L7Rj9C90LjQtSwgW9Cd0L7QstC+0LVf0YHQvtGB0YLQvtGP0L3QuNC1IHwg0J/QvtGB0LXRidC10L3QvdGL0LVdLCBb0KLQtdC60YPRidC10LVf0YHQvtGB0YLQvtGP0L3QuNC1IHwg0J/Rg9GC0YzQlNC+0KLQtdC60YPRidC10LPQvtCh0L7RgdGC0L7Rj9C90LjRj10sINCf0YPRgtGMKS4KCiUg0JLQuNC30YPQsNC70LjQt9Cw0YbQuNGPINGB0L7RgdGC0L7Rj9C90LjRjyAo0J/QoNCY0JzQldCgIDEgLSDQsdCw0LfQvtCy0YvQuSkK0LLRi9Cy0LXRgdGC0Lhf0YHQvtGB0YLQvtGP0L3QuNC1KHN0YXRlKE0xLCBDMSwg0JvQvtC00LrQsCwgTTIsIEMyKSkgOi0KICAgIHdyaXRlKCfQodC+0YHRgtC+0Y/QvdC40LU6JyksIG5sLAogICAgd3JpdGUoJyAg0JvQtdCy0YvQuSDQsdC10YDQtdCzOiDQnNC40YHRgdC40L7QvdC10YDRiyA9ICcpLCB3cml0ZShNMSksIHdyaXRlKCcsINCa0LDQvdC90LjQsdCw0LvRiyA9ICcpLCB3cml0ZShDMSksIG5sLAogICAgd3JpdGUoJyAg0JvQvtC00LrQsDogJyksIHdyaXRlKNCb0L7QtNC60LApLCBubCwKICAgIHdyaXRlKCcgINCf0YDQsNCy0YvQuSDQsdC10YDQtdCzOiDQnNC40YHRgdC40L7QvdC10YDRiyA9ICcpLCB3cml0ZShNMiksIHdyaXRlKCcsINCa0LDQvdC90LjQsdCw0LvRiyA9ICcpLCB3cml0ZShDMiksIG5sLCBubC4KCiUg0JLQuNC30YPQsNC70LjQt9Cw0YbQuNGPINGB0L7RgdGC0L7Rj9C90LjRjyAo0J/QoNCY0JzQldCgIDIgLSDRgSDRgNC10LrQvtC5KQoKJSDQoNCw0YHQutC+0LzQvNC10L3RgtC40YDRg9C50YLQtSDRjdGC0L7RgiDQsdC70L7Quiwg0YfRgtC+0LHRiyDQuNGB0L/QvtC70YzQt9C+0LLQsNGC0Ywg0LLQuNC30YPQsNC70LjQt9Cw0YbQuNGOINGBINGA0LXQutC+0LkK0LLRi9Cy0LXRgdGC0Lhf0YHQvtGB0YLQvtGP0L3QuNC1KHN0YXRlKE0xLCBDMSwgbGVmdCwgTTIsIEMyKSkgOi0KICAgIGdlbl9zdHJpbmcoTTEsICdNJywg0JzQuNGB0YHQuNC+0L3QtdGA0Ytf0LvQtdCy0L4pLCAgJSDQktGB0L/QvtC80L7Qs9Cw0YLQtdC70YzQvdGL0Lkg0L/RgNC10LTQuNC60LDRggogICAgZ2VuX3N0cmluZyhDMSwgJ0MnLCDQmtCw0L3QvdC40LHQsNC70Ytf0LvQtdCy0L4pLCAgJSDQktGB0L/QvtC80L7Qs9Cw0YLQtdC70YzQvdGL0Lkg0L/RgNC10LTQuNC60LDRggogICAgZ2VuX3N0cmluZyhNMiwgJ00nLCDQnNC40YHRgdC40L7QvdC10YDRi1/Qv9GA0LDQstC+KSwKICAgIGdlbl9zdHJpbmcoQzIsICdDJywg0JrQsNC90L3QuNCx0LDQu9GLX9C/0YDQsNCy0L4pLAogICAgYXRvbWljX2xpc3RfY29uY2F0KFvQnNC40YHRgdC40L7QvdC10YDRi1/Qu9C10LLQviwg0JrQsNC90L3QuNCx0LDQu9GLX9C70LXQstC+LCAnIHx+fn5+fnwgJywg0JzQuNGB0YHQuNC+0L3QtdGA0Ytf0L/RgNCw0LLQviwg0JrQsNC90L3QuNCx0LDQu9GLX9C/0YDQsNCy0L5dLCDQodGC0YDQvtC60LApLAogICAgd3JpdGUo0KHRgtGA0L7QutCwKSwgbmwsCiAgICB3cml0ZSgn0JvQvtC00LrQsDogPC0tLScpLCBubCwgbmwuCgrQstGL0LLQtdGB0YLQuF/RgdC+0YHRgtC+0Y/QvdC40LUoc3RhdGUoTTEsIEMxLCByaWdodCwgTTIsIEMyKSkgOi0KJSDQkNC90LDQu9C+0LPQuNGH0L3Qviwg0L3QviDQu9C+0LTQutCwINC/0LvRi9Cy0LXRgiDQstC/0YDQsNCy0L4KICAgIGdlbl9zdHJpbmcoTTEsICdNJywg0JzQuNGB0YHQuNC+0L3QtdGA0Ytf0LvQtdCy0L4pLCAgJSDQktGB0L/QvtC80L7Qs9Cw0YLQtdC70YzQvdGL0Lkg0L/RgNC10LTQuNC60LDRggogICAgZ2VuX3N0cmluZyhDMSwgJ0MnLCDQmtCw0L3QvdC40LHQsNC70Ytf0LvQtdCy0L4pLCAgJSDQktGB0L/QvtC80L7Qs9Cw0YLQtdC70YzQvdGL0Lkg0L/RgNC10LTQuNC60LDRggogICAgZ2VuX3N0cmluZyhNMiwgJ00nLCDQnNC40YHRgdC40L7QvdC10YDRi1/Qv9GA0LDQstC+KSwKICAgIGdlbl9zdHJpbmcoQzIsICdDJywg0JrQsNC90L3QuNCx0LDQu9GLX9C/0YDQsNCy0L4pLAogICAgYXRvbWljX2xpc3RfY29uY2F0KFvQnNC40YHRgdC40L7QvdC10YDRi1/Qu9C10LLQviwg0JrQsNC90L3QuNCx0LDQu9GLX9C70LXQstC+LCAnIHx+fn5+fnwgJywg0JzQuNGB0YHQuNC+0L3QtdGA0Ytf0L/RgNCw0LLQviwg0JrQsNC90L3QuNCx0LDQu9GLX9C/0YDQsNCy0L5dLCDQodGC0YDQvtC60LApLAogICAgd3JpdGUo0KHRgtGA0L7QutCwKSwgbmwsCiAgICB3cml0ZSgn0JvQvtC00LrQsDogLS0tPicpLCBubCwgbmwuCgpnZW5fc3RyaW5nKDAsIF8sICcnKSA6LSAhLgpnZW5fc3RyaW5nKE4sIENoYXIsIFN0cmluZykgOi0KICBOID4gMCwKICBOMSBpcyBOIC0gMSwKICBnZW5fc3RyaW5nKE4xLCBDaGFyLCBSZXN0KSwKICBhdG9taWNfbGlzdF9jb25jYXQoW0NoYXIsIFJlc3RdLCBTdHJpbmcpLgoKCgolINCi0L7Rh9C60LAg0LLRhdC+0LTQsCDQtNC70Y8g0LfQsNC/0YPRgdC60LAg0YDQtdGI0LXQvdC40Y8KZ28gOi0KICAgINC90LDRh9Cw0LvRjNC90L7QtV/RgdC+0YHRgtC+0Y/QvdC40LUo0J3QsNGH0LDQu9GM0L3QvtC1KSwKICAgINGG0LXQu9C10LLQvtC1X9GB0L7RgdGC0L7Rj9C90LjQtSjQptC10LvQtdCy0L7QtSksCiAgICDRgNC10YjQuNGC0Ywo0J3QsNGH0LDQu9GM0L3QvtC1LCDQptC10LvQtdCy0L7QtSwg0J/Rg9GC0YwpLAogICAgcmV2ZXJzZSjQn9GD0YLRjCwg0J7QsdGA0LDRgtC90YvQuV/Qv9GD0YLRjCksCiAgICB3cml0ZSgn0KDQtdGI0LXQvdC40LU6JyksIG5sLAogICAg0LLRi9Cy0LXRgdGC0Lhf0L/Rg9GC0Ywo0J7QsdGA0LDRgtC90YvQuV/Qv9GD0YLRjCkuCgrQstGL0LLQtdGB0YLQuF/Qv9GD0YLRjChbXSkuCtCy0YvQstC10YHRgtC4X9C/0YPRgtGMKFtIfFRdKSA6LQogICAgd3JpdGUoSCksIG5sLAogICAg0LLRi9Cy0LXRgdGC0Lhf0L/Rg9GC0YwoVCku