fork download
  1. /* Программа для решения задачи о волке, козе и капусте. */
  2.  
  3. /* Начальное и конечное состояние */
  4. initial_state('Исходное состояние: все находятся на левом берегу',
  5. wgc(left, ['волк', 'коза', 'капуста'], [])).
  6.  
  7. final_state(wgc(right, [], ['волк', 'коза', 'капуста'])).
  8.  
  9. /* Определение возможности перехода из состояния в состояние */
  10. move(wgc(left, L, _), Cargo) :-
  11. member(Cargo, L).
  12.  
  13. move(wgc(right, _, R), Cargo) :-
  14. member(Cargo, R).
  15.  
  16. move(wgc(_, _, _), none). % Перевозка без груза
  17.  
  18.  
  19. /* Поиск состояния, достижимого из заданного */
  20. update(wgc(Boat, L, R), Cargo, wgc(NewBoat, NewL, NewR)) :-
  21. update_boat(Boat, NewBoat),
  22. update_banks(Cargo, Boat, L, R, TempL, TempR),
  23. sort(TempL, NewL),
  24. sort(TempR, NewR).
  25.  
  26.  
  27. /* Изменение местонахождения лодки */
  28. update_boat(left, right).
  29. update_boat(right, left).
  30.  
  31.  
  32. /* Выбор груза для перевозки (Уже используется встроенный member, select не нужен) */
  33. /* Порядок сортировки (используем встроенный предикат @< для сравнения атомов) */
  34.  
  35.  
  36. /* Изменение состава обитателей берегов. */
  37. update_banks(none, _, L, R, L, R). % Без груза
  38. update_banks(Cargo, left, L, R, NewL, [Cargo|R]) :-
  39. select(Cargo, L, NewL).
  40.  
  41. update_banks(Cargo, right, L, R, [Cargo|L], NewR) :-
  42. select(Cargo, R, NewR).
  43.  
  44. /* Допустимость состояния */
  45. legal(wgc(_, L, R)) :-
  46. safe(L),
  47. safe(R).
  48.  
  49. safe(List) :-
  50. not((member(волк, List), member(коза, List), not(member(farmer, List)))),
  51. not((member(коза, List), member(капуста, List), not(member(farmer, List)))).
  52.  
  53.  
  54. /* solve(State, Path) - Найти путь от начального состояния до конечного */
  55. solve(State, [State]) :-
  56. final_state(State).
  57.  
  58. solve(State, [State | RestPath]) :-
  59. move(State, Cargo), /* Найти допустимый ход */
  60. update(State, Cargo, NextState), /* Получить следующее состояние */
  61. legal(NextState), /* Убедиться что состояние допустимо */
  62. not(member(NextState, [State | RestPath])), /* Проверка на зацикливание */
  63. solve(NextState, RestPath).
  64.  
  65. /* Добавим предикат для запуска поиска решения */
  66. solve_problem(Path) :-
  67. initial_state(_, InitialState),
  68. append([InitialState],Path2,Path),
  69. solve(InitialState, Path2).
  70.  
  71. /* Добавим правило, чтобы фермер всегда был с лодкой */
  72. member(X,[X|_]).
  73. member(X,[_|T]) :-
  74. member(X,T).
  75.  
  76. update_banks(none,left,L,R,L1,R1) :-
  77. select(farmer,L,L2),
  78. L1 = L2,
  79. R1 = R.
  80. update_banks(none,right,L,R,L1,R1) :-
  81. select(farmer,R,R2),
  82. R1 = R2,
  83. L1 = L.
  84.  
  85. move(wgc(left, L, _), Cargo) :-
  86. member(Cargo, L),
  87. member(farmer,L).
  88.  
  89. move(wgc(right, _, R), Cargo) :-
  90. member(Cargo, R),
  91. member(farmer,R).
  92.  
  93. initial_state('Исходное состояние: все находятся на левом берегу',
  94. wgc(left, [farmer, 'волк', 'коза', 'капуста'], [])).
  95.  
  96. /* Примеры вызовов: */
  97. /* ?- solve_problem(Path). */
  98. /* ?- print(Path). */
Success #stdin #stdout #stderr 0.04s 6928KB
stdin
Standard input is empty
stdout
Standard output is empty
stderr
Warning: /home/wzWVKo/prog:76:
	Clauses of update_banks/6 are not together in the source-file
	  Earlier definition at /home/wzWVKo/prog:37
	  Current predicate: member/2
	  Use :- discontiguous update_banks/6. to suppress this message
Warning: /home/wzWVKo/prog:85:
	Clauses of move/2 are not together in the source-file
	  Earlier definition at /home/wzWVKo/prog:10
	  Current predicate: update_banks/6
	  Use :- discontiguous move/2. to suppress this message
Warning: /home/wzWVKo/prog:93:
	Clauses of initial_state/2 are not together in the source-file
	  Earlier definition at /home/wzWVKo/prog:4
	  Current predicate: move/2
	  Use :- discontiguous initial_state/2. to suppress this message
ERROR: '$runtoplevel'/0: Undefined procedure: program/0
   Exception: (3) program ? EOF: exit