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

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

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

Взял код для своей задачи отсюда Три бидона – 16л, 8л и 5л (спасибо Грымзик) Попытался приспособить для своей задачи - не выходит. Переполняется стёк:
Может поможете, знатоки пролога?

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

textual
Листинг программы
m(b(Max1,A),b(Max2,B),b(Max1,0),b(Max2,B1)):- A=<Max2-B, B1=B+A.
m(b(Max1,A),b(Max2,B),b(Max1,A1),b(Max2,Max2)):- A>Max2-B, A1=A-Max2+B.
 
mm(A,B,A1,B1):-m(A,B,A1,B1); m(B,A,B1,A1).
 
move([A,B,C,D],[A1,B1,C,D]) :- mm(A,B,A1,B1).
move([A,B,C,D],[A1,B,C1,D]) :- mm(A,C,A1,C1).
move([A,B,C,D],[A1,B,C,D1]) :- mm(A,D,A1,D1).
move([A,B,C,D],[A,B1,C1,D]) :- mm(B,C,B1,C1).
move([A,B,C,D],[A,B1,C,D1]) :- mm(B,D,B1,D1).
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