fork download
  1. % Представление состояния: state(Миссионеры_слева, Каннибалы_слева, Лодка, Миссионеры_справа, Каннибалы_справа)
  2.  
  3. % Начальное и конечное состояния
  4. начальное_состояние(state(3, 3, left, 0, 0)).
  5. целевое_состояние(state(0, 0, right, 3, 3)).
  6.  
  7. % Операторы (переправы)
  8. оператор(m1). % 1 миссионер
  9. оператор(c1). % 1 каннибал
  10. оператор(m2). % 2 миссионера
  11. оператор(c2). % 2 каннибала
  12. оператор(mc). % 1 миссионер, 1 каннибал
  13.  
  14. % Правила переходов (определяют, как оператор меняет состояние)
  15. переход(state(M1, C1, left, M2, C2), m1, state(M1_next, C1, right, M2_next, C2)) :-
  16. M1 > 0, % Проверяем, есть ли миссионеры для переправы
  17. M1_next is M1 - 1,
  18. M2_next is M2 + 1,
  19. безопасное_состояние(state(M1_next, C1, right, M2_next, C2)).
  20.  
  21. переход(state(M1, C1, left, M2, C2), c1, state(M1, C1_next, right, M2, C2_next)) :-
  22. C1 > 0, % Проверяем, есть ли каннибалы для переправы
  23. C1_next is C1 - 1,
  24. C2_next is C2 + 1,
  25. безопасное_состояние(state(M1, C1_next, right, M2, C2_next)).
  26. % ... (добавьте правила для остальных операторов)
  27.  
  28. переход(state(M1, C1, right, M2, C2), m1, state(M1_next, C1, left, M2_next, C2)) :-
  29. M2 > 0,
  30. M1_next is M1 + 1,
  31. M2_next is M2 - 1,
  32. безопасное_состояние(state(M1_next, C1, left, M2_next, C2)).
  33.  
  34. % Предикат безопасного состояния
  35. безопасное_состояние(state(M, C, _, M_goal, C_goal)) :-
  36. безопасно(M, C),
  37. безопасно(M_goal, C_goal).
  38.  
  39. безопасно(M, C) :-
  40. (M >= C ; M = 0),
  41. M >= 0,
  42. C >= 0.
  43.  
  44. % Поиск в глубину
  45. решить(Начальное_состояние, Целевое_состояние, Путь) :-
  46. решить_dfs(Начальное_состояние, Целевое_состояние, [Начальное_состояние], [], Путь).
  47.  
  48. решить_dfs(Текущее_состояние, Целевое_состояние, Посещенные, ПутьДоТекущегоСостояния, [Текущее_состояние | ПутьДоТекущегоСостояния]) :-
  49. Текущее_состояние = Целевое_состояние,
  50. !.
  51.  
  52. решить_dfs(Текущее_состояние, Целевое_состояние, Посещенные, ПутьДоТекущегоСостояния, Путь) :-
  53. findall(Следующее_состояние, (переход(Текущее_состояние, _, Следующее_состояние), \+ member(Следующее_состояние, Посещенные)), Возможные_состояния),
  54. member(Новое_состояние, Возможные_состояния),
  55. решить_dfs(Новое_состояние, Целевое_состояние, [Новое_состояние | Посещенные], [Текущее_состояние | ПутьДоТекущегоСостояния], Путь).
  56.  
  57. % Точка входа для запуска решения
  58. go :-
  59. начальное_состояние(Начальное),
  60. целевое_состояние(Целевое),
  61. решить(Начальное, Целевое, Путь),
  62. reverse(Путь, Обратный_путь),
  63. write('Решение:'), nl,
  64. вывести_путь(Обратный_путь).
  65.  
  66. вывести_путь([]).
  67. вывести_путь([H|T]) :-
  68. write(H), nl,
  69. вывести_путь(T).
  70. вывести_состояние(state(M1, C1, Лодка, M2, C2)) :-
  71. write('Состояние:'), nl,
  72. write(' Левый берег: Миссионеры = '), write(M1), write(', Каннибалы = '), write(C1), nl,
  73. write(' Лодка: '), write(Лодка), nl,
  74. write(' Правый берег: Миссионеры = '), write(M2), write(', Каннибалы = '), write(C2), nl.
Success #stdin #stdout #stderr 0.03s 7068KB
stdin
Standard input is empty
stdout
Standard output is empty
stderr
Warning: /home/oP5PH7/prog:48:
	Singleton variables: [Посещенные]
ERROR: '$runtoplevel'/0: Undefined procedure: program/0
   Exception: (3) program ? EOF: exit