2015-11-08 7 views
4

Я пытаюсь реализовать пролога 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). Я получил правильную логику там?

ответ

2

Я думаю, что логика должна быть вместо

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 
+0

, что делает много смысла, но что, если хотите, чтобы перейти от средних до больших, ли мы вычислим Diff является макс (8 L, M) ?? – Pro

+0

Это очевидно, но, возможно, вам не хватает проверки того, что состояние уже проверено, чтобы избежать циклизации навсегда. В вашем рекурсивном предикате состояния изменения должен присутствовать Активный накопитель, и после генерации движения проверьте его (используя \ + memberchk (NewState, Посещенные)) – CapelliC

+0

Нет. Я предполагаю, что он все еще должен быть мин (8-L, M) а затем, если Diff> 0, то новый Large становится L + Diff, а новый Medium становится M - Diff right @Capellic ?? – Pro

 Смежные вопросы

  • Нет связанных вопросов^_^