Если заявление в прологе
Здравствуйте, у меня есть проблема с оператором if. у меня есть это
final(C1-W1,C2-W2,C3-W3):-
retractall(end_jug),
asserta( end_jug(C1,W1) ),
asserta( end_jug(C2,W2) ),
asserta( end_jug(C3,W3) ).
и этот
katastasi(L) :-
findall(X-W, jug(X,W), L0), sort(L0,L).
Как я могу получить эту проверку????:
if(jug(C1,W1) == end_jug(C1,W1) && jug(C2,W2) == end_jug(C2,W2) && jug(C3,W3) == end_jug(C3,W3)) write('Congrats').
Заранее спасибо!!
2 ответа
Как это:
is_final_state :-
katastasi(S), writeln(S),
S=[C1-W1,C2-W2,C3-W3],
( end_jug(C1,W1),
end_jug(C2,W2),
end_jug(C3,W3)
-> writeln('Congrats!')
; W1+W2+W3 < 6
-> writeln('WARNING: not enough water left!'),
fail
).
Вы должны были упомянуть свой предыдущий вопрос. Этот код является частью кода в ответе там.
Ваш код написан на Прологе, но проверка, о которой вы спрашивали, была в "Основном". Отпусти основной менталитет.:) Пролог делает проверки для вас, как часть объединения.
Значение 6
в приведенном выше коде должны быть рассчитаны действительно, в соответствии с окончательными значениями, которые пользователь указывает при вызове final
в начале игры. Конечное значение (каждого end_jug
факт) можно получить так же, как текущее значение (каждого jug
факт) извлекается jugsState
предикат (который я предполагаю, теперь называется katastasi
).
Теперь вы должны завершить свою игру, написав stop
предикат, который должен сделать очистку (т.е. вызвать retract
на все заявленные факты). Вы даже можете сделать undo
сказуемое.:)
Просто напишите условия, к которым присоединяются ,
под новым предикатом:
win(C1, W1, C2, W2, C3, W3):-
jug(C1,W1) \== end_jug(C1,W1),
jug(C2,W2) \== end_jug(C2,W2),
jug(C3,W3) \== end_jug(C3,W3).
Затем используйте этот предикат при необходимости.
finish(C1, W1, C2, W2, C3, W3):-
win(C1, W1, C2, W2, C3, W3),
write('Congrats').
Или напишите это в целом:
finish(C1, W1, C2, W2, C3, W3):-
jug(C1,W1) \== end_jug(C1,W1),
jug(C2,W2) \== end_jug(C2,W2),
jug(C3,W3) \== end_jug(C3,W3),
write('Congrats').