Задача о переливаниях с 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)
.
- Если
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д