Задача о переливаниях с 4-мя кувшинами - Prolog
Формулировка задачи:
Взял код для своей задачи отсюда Три бидона – 16л, 8л и 5л (спасибо Грымзик)
Попытался приспособить для своей задачи - не выходит. Переполняется стёк:
Может поможете, знатоки пролога?
Листинг программы
- m([b(Max1,A),b(Max2,B),B3],[b(Max1,0),b(Max2,B1),B3]):- A=<Max2-B, B1=B+A.
- m([b(Max1,A),b(Max2,B),B3],[b(Max1,A1),b(Max2,Max2),B3]):- A>Max2-B, A1=A-Max2+B.
- move([A,B,C,D],[A1,B1,C1,D1]):-
- m([A,B,C],[A1,B1,C1]);
- m([A,C,B],[A1,C1,B1]);
- m([A,D,C],[A1,D1,C1]);
- m([A,B,D],[A1,B1,D1]);
- m([A,C,D],[A1,C1,D1]);
- m([A,D,B],[A1,D1,B1]);
- m([B,A,C],[B1,A1,C1]);
- m([B,C,A],[B1,C1,A1]);
- m([B,D,C],[B1,D1,C1]);
- m([B,A,D],[B1,A1,D1]);
- m([B,C,D],[B1,C1,D1]);
- m([B,D,A],[B1,D1,A1]);
- m([C,A,B],[C1,A1,B1]);
- m([C,B,A],[C1,B1,A1]);
- m([C,D,B],[C1,D1,B1]);
- m([C,A,D],[C1,A1,D1]);
- m([C,B,D],[C1,B1,D1]);
- m([C,D,A],[C1,D1,A1]);
- m([D,A,B],[D1,A1,B1]);
- m([D,B,A],[D1,B1,A1]);
- m([D,C,B],[D1,C1,B1]);
- m([D,A,C],[D1,A1,C1]);
- m([D,B,C],[D1,B1,C1]);
- m([D,C,A],[D1,C1,A1]).
- search_dpth(Start,Finish):-dpth([Start],Finish,Way),show_answer(Way).
- member(H,[H|_]).
- member(H,[_|Tail]):-member(H,Tail).
- prolong([Temp|Tail],[New,Temp|Tail]):-
- move(Temp,New),not(member(New,[Temp|Tail])).
- dpth([Finish|Tail],Finish,[Finish|Tail]).
- dpth(TempWay,Finish,Way):-
- prolong(TempWay,NewWay),dpth(NewWay,Finish,Way).
- show_answer([_]):-!.
- show_answer([A,B|Tail]):-
- show_answer([B|Tail]),nl,write(B),write(" -> "),write(A).
- 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
Листинг программы
- 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)
.
- Если
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д