Перемещение между состояниями (реализация Пролога)
Я пытаюсь реализовать пролог, который реализует поиск в глубину и поиск в ширину, решает следующую проблему
У Ровены три безымянных стакана разных размеров: 3 унции, 5 унций и 8 унций. Самый большой стакан полон. Что может сделать Ровена, чтобы получить 4 унции жидкости в каждый из двух больших стаканов?
Я буду иметь (большой, средний, маленький)
Итак, начальное состояние (8,0,0) и целевое состояние (4,4,0).
Теперь я знаю, что у меня есть 6 доступных ходов в пространстве состояний.
(1,2) Налейте большой на средний или маленький (3,4) Налейте средний на большой или маленький (5,6) Налейте маленький на средний или большой
Теперь мне просто нужна помощь с первым правилом, а остальное я выясню. Таким образом, я могу вылить большое в среду только в том случае, если большое> 0 и среда не заполнены, а новый большой становится старым большим минус количество, которое было вылито в среду, а новая среда становится старой средой плюс количество это вылилось в это, и маленькое конечно никогда не изменяется.
Вот что я пытался.
%move rule #1: Pour Large into Medium (L--> M)
%move(oldstate,newstate)
move([L, M, S], [NewLarge,NewMedium,S]) :-
L > 0, %We can't move large into medium if Large has nothing
M < 5, %We can't pour into the medium if medium is full
Diff = 5 - M,
NewLarge is L - Diff, %calculate the new Large
NewMedium is M + (L - NewLarge). %calculate the new Medium
Это правильная реализация первого доступного хода (Большой в средний). Я понял правильную логику там?
1 ответ
Я думаю, что логика должна быть вместо
move([L, M, S], [NewLarge, NewMedium, S]) :-
Diff is min(5 - M, L),
Diff > 0,
NewLarge is L - Diff, %calculate the new Large
NewMedium is M + Diff. %calculate the new Medium