Задача о переливаниях с 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).
Объяснение кода листинга программы
- Написана функция
m, которая принимает четыре аргумента:b(Max1,A),b(Max2,B),b(Max1,A1),b(Max2,B1). ЗдесьA,B,A1иB1являются переменными, аMax1иMax2- константами. - Если
A=<Max2-BиB1=B+A, то выполняется одно действие переливания. - Если
A>Max2-BиA1=A-Max2+B, то выполняется другое действие переливания. - Функция
mmпринимает четыре аргумента:A,B,A1,B1. Она рекурсивно вызывает функциюmдля этих аргументов. - Функция
moveпринимает два списка, и рекурсивно вызывает функциюmmдля каждого элемента первого списка с соответствующим элементом второго списка. - В функции
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).
- Если