Задача о переливаниях с 4-мя кувшинами - Prolog

Узнай цену своей работы

Формулировка задачи:

Взял код для своей задачи отсюда Три бидона – 16л, 8л и 5л (спасибо Грымзик) Попытался приспособить для своей задачи - не выходит. Переполняется стёк:
Листинг программы
  1. m([b(Max1,A),b(Max2,B),B3],[b(Max1,0),b(Max2,B1),B3]):- A=<Max2-B, B1=B+A.
  2. m([b(Max1,A),b(Max2,B),B3],[b(Max1,A1),b(Max2,Max2),B3]):- A>Max2-B, A1=A-Max2+B.
  3. move([A,B,C,D],[A1,B1,C1,D1]):-
  4. m([A,B,C],[A1,B1,C1]);
  5. m([A,C,B],[A1,C1,B1]);
  6. m([A,D,C],[A1,D1,C1]);
  7. m([A,B,D],[A1,B1,D1]);
  8. m([A,C,D],[A1,C1,D1]);
  9. m([A,D,B],[A1,D1,B1]);
  10. m([B,A,C],[B1,A1,C1]);
  11. m([B,C,A],[B1,C1,A1]);
  12. m([B,D,C],[B1,D1,C1]);
  13. m([B,A,D],[B1,A1,D1]);
  14. m([B,C,D],[B1,C1,D1]);
  15. m([B,D,A],[B1,D1,A1]);
  16. m([C,A,B],[C1,A1,B1]);
  17. m([C,B,A],[C1,B1,A1]);
  18. m([C,D,B],[C1,D1,B1]);
  19. m([C,A,D],[C1,A1,D1]);
  20. m([C,B,D],[C1,B1,D1]);
  21. m([C,D,A],[C1,D1,A1]);
  22. m([D,A,B],[D1,A1,B1]);
  23. m([D,B,A],[D1,B1,A1]);
  24. m([D,C,B],[D1,C1,B1]);
  25. m([D,A,C],[D1,A1,C1]);
  26. m([D,B,C],[D1,B1,C1]);
  27. m([D,C,A],[D1,C1,A1]).
  28.  
  29. search_dpth(Start,Finish):-dpth([Start],Finish,Way),show_answer(Way).
  30. member(H,[H|_]).
  31. member(H,[_|Tail]):-member(H,Tail).
  32. prolong([Temp|Tail],[New,Temp|Tail]):-
  33. move(Temp,New),not(member(New,[Temp|Tail])).
  34. dpth([Finish|Tail],Finish,[Finish|Tail]).
  35. dpth(TempWay,Finish,Way):-
  36. prolong(TempWay,NewWay),dpth(NewWay,Finish,Way).
  37. show_answer([_]):-!.
  38. show_answer([A,B|Tail]):-
  39. show_answer([B|Tail]),nl,write(B),write(" -> "),write(A).
  40.  
  41. start:- search_dpth([b(24,24),b(5,0),b(11,0),b(13,0)],[b(24,8),b(5,0),b(11,8), b(13,8)]).
Может поможете, знатоки пролога?

Решение задачи: «Задача о переливаниях с 4-мя кувшинами»

textual
Листинг программы
  1. m(b(Max1,A),b(Max2,B),b(Max1,0),b(Max2,B1)):- A=<Max2-B, B1=B+A.
  2. m(b(Max1,A),b(Max2,B),b(Max1,A1),b(Max2,Max2)):- A>Max2-B, A1=A-Max2+B.
  3.  
  4. mm(A,B,A1,B1):-m(A,B,A1,B1); m(B,A,B1,A1).
  5.  
  6. move([A,B,C,D],[A1,B1,C,D]) :- mm(A,B,A1,B1).
  7. move([A,B,C,D],[A1,B,C1,D]) :- mm(A,C,A1,C1).
  8. move([A,B,C,D],[A1,B,C,D1]) :- mm(A,D,A1,D1).
  9. move([A,B,C,D],[A,B1,C1,D]) :- mm(B,C,B1,C1).
  10. move([A,B,C,D],[A,B1,C,D1]) :- mm(B,D,B1,D1).
  11. move([A,B,C,D],[A,B,C1,D1]) :- mm(C,D,C1,D1).

Объяснение кода листинга программы

  1. Написана функция m, которая принимает четыре аргумента: b(Max1,A), b(Max2,B), b(Max1,A1), b(Max2,B1). Здесь A, B, A1 и B1 являются переменными, а Max1 и Max2 - константами.
  2. Если A=<Max2-B и B1=B+A, то выполняется одно действие переливания.
  3. Если A>Max2-B и A1=A-Max2+B, то выполняется другое действие переливания.
  4. Функция mm принимает четыре аргумента: A, B, A1, B1. Она рекурсивно вызывает функцию m для этих аргументов.
  5. Функция move принимает два списка, и рекурсивно вызывает функцию mm для каждого элемента первого списка с соответствующим элементом второго списка.
  6. В функции move выполняются следующие действия переливания:
    • Если A=<Max2-B и B1=B+A, то выполняется переливание элементов с индексами (A,B) в (A1,B1).
    • Если A>Max2-B и A1=A-Max2+B, то выполняется переливание элементов с индексами (A,B) в (A1,B1).
    • Если A=A1 и B=B1, то выполняется переливание элементов с индексами (A,B) в (A1,B1).
    • Если A=B1 и B=A1, то выполняется переливание элементов с индексами (A,B) в (A1,B1).
    • Если A=C1 и B=D, то выполняется переливание элементов с индексами (A,B) в (A1,B1).
    • Если A=C и B=D1, то выполняется переливание элементов с индексами (A,B) в (A1,B1).
    • Если A=D1 и B=C, то выполняется переливание элементов с индексами (A,B) в (A1,B1).

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 4.071 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут