Перемещение между состояниями (реализация Пролога)

Я пытаюсь реализовать пролог, который реализует поиск в глубину и поиск в ширину, решает следующую проблему

У Ровены три безымянных стакана разных размеров: 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 
Другие вопросы по тегам