Лекция: Объемы(8,5,3).
решение:-перелить(8,0,0,[]).
перелить(4,4,0,_пройденные):-write(_пройденные).
минимум(_x,_y,_x):-_x=<_y,!.
Минимум(_x,_y,_y).
принадлежит(_x,[_x|_]):-!.
принадлежит(_x,[_y|_l]):-!, принадлежит(_x,_l),!.
%1->2
перелить(_в_первом,_во_втором,_в_третьем, _пройденные):-
Объемы(_объем1,_объем2,_объем3),
_в_первом>0,
_свободно is _объем2-_во_втором,
_свободно>0,
Минимум(_в_первом,_свободно, _количество),
_стало_в_первом is _в_первом-_количество,
_стало_во_втором is _во_втором+_количество,
_новое=сост(_стало_в_первом,_стало_во_втором,_в_третьем),
Not(принадлежит(_новое,_пройденные)),
перелить(_стало_в_первом,_стало_во_втором,_в_третьем,[_новое|_пройденные]).
ЗАДАНИЕ 4.1
Допишите оставшиеся правила допустимого переливания. Проверьте правильность работы программы, задав вопрос ?-решение.
Другой вариант решения той же задачи:
Объемы(8,5,3).
Исходное(состояние(8,0,0)).
Цель(состояние(4,4,0)).
решение:-исходное(_s), перелить([_s]).
перелить([_s|_p]):- цель(_s), отобразить_решение([_s|_p]).
перелить([состояние(_1,_2,_3)|_p]):-
Допустимо(_1,_2,_3,_n1,_n2,_n3),g
Not(принадлежит(состояние(_n1,_n2,_n3),
[состояние(_1,_2,_3)|_p])),
перелить([состояние(_n1,_n2,_n3),
состояние(_1,_2,_3)|_p]).
перелито(_1,_2,_f,_n1,_n2):- минимум(_1,_f,_k), _n1 is _1 — _k,_n2 is _2 + _k.
минимум(_x,_y,_x):-_x=<_y,!.
Минимум(_x,_y,_y).
принадлежит(_x,[_x|_]):-!.
принадлежит(_x,[_y|_l]):-!, принадлежит(_x,_l),!.
отобразить_решение([]):-!.
отобразить_решение([_x|_l]):-отобразить_решение(_l),!,write(_x),nl.
%1->2
допустимо(_1,_2,_3,_n1,_n2,_3):-
_1>0, объемы(_v1,_v2,_v3),
_f is _v2-_2,
_f>0,
Перелито(_1,_2,_f,_n1,_n2).