Я пытаюсь реализовать пролога progarm, которые реализуют глубины первого поиск и широту первого поиска в решает следующие задачиПеремещение между состояниями (Реализация Пролога)
Ровена имеет три немаркированного стекло разных размеров: 3 унции , 5 унций и 8 унций. Самое большое стекло заполнено. Что может сделать Rowena , чтобы получить 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
Является ли это правильной реализацией первого доступного перемещения (Large in medium). Я получил правильную логику там?
, что делает много смысла, но что, если хотите, чтобы перейти от средних до больших, ли мы вычислим Diff является макс (8 L, M) ?? – Pro
Это очевидно, но, возможно, вам не хватает проверки того, что состояние уже проверено, чтобы избежать циклизации навсегда. В вашем рекурсивном предикате состояния изменения должен присутствовать Активный накопитель, и после генерации движения проверьте его (используя \ + memberchk (NewState, Посещенные)) – CapelliC
Нет. Я предполагаю, что он все еще должен быть мин (8-L, M) а затем, если Diff> 0, то новый Large становится L + Diff, а новый Medium становится M - Diff right @Capellic ?? – Pro