Я пытаюсь написать функцию, в которой она получает новые значения при каждом вызове recursion
, а в случае неудачи набирает increase
числа и повторяет попытку, пока число не достигнет 6
или 1
.
Важной частью здесь является то, что она должна перейти ко второй части только в том случае, если она прошла успешно один раз, и увеличить или уменьшить число.И если он был успешен один раз и увеличился / уменьшился, он должен проверить, работает ли функция try_to_do_math
с новым номером, и если нет, то снова увеличить или уменьшить число, пока число не достигнет 6
или 1
если это не удастся, прежде чем число достигнет 6
или 1
.
Также он должен проверить, следует ли add
или substract
, проверив th-значение higer_or_lower
.
?- iterate_over(1, 1, Z, X).
iterate_over(X,Y,Z,higher_or_lower):-
try_to_do_math(X,Y,X1,Y1,high_low),
iterate_over(X1, Y1,1,high_low).
iterate_over(X,Y,Z,higher_or_lower):-
higher_or_lower = 1, %Go higher
Z = 1,
X1 is X+1, X=<6,
Y1 is Y+1, Y=<6,
iterate_over(X1, Y1, 0,higher_or_lower).
iterate_over(X,Y,Z,higher_or_lower):-
higher_or_lower = 2, %Go lower
Z = 1,
X1 is X-1, 1=< X,
Y1 is Y-1, 1=< Y,
iterate_over(X1, Y1, 0,higher_or_lower).
Я использую переменную Z
, чтобы проверить, удалось ли этодо или нет.Если оно равно 1
, это означает, что оно успешно выполнено, а если оно _
пусто, то его нет.
С этим кодом всегда происходит сбой на Z=1
, поскольку оно не имеет значения 1
когда он доберется туда, чтобы проверить его.
Если try_to_do_math
не удастся с первой попытки, то ничего не произойдет, и будет возвращено false
.
Если try_to_do_math
завершится успешно с первойвремя, то это возвращает новый X1 and Y1 and higer/lower
.И затем я попытался передать переменную Z
в качестве переменной состояния, которая изменяется на 1, просто при повторном вызове здесь iterate_over(X1, Y1,1,high_low).
.
РЕДАКТИРОВАТЬ
Я постараюсь сделать пример, который будет успешным.Допустим, правильный X = 5 и Y = 5.
Сначала вызывается ?- iterate_over(1, 1, Z, X).
.
Затем он переходит к try_to_do_math(1, 1, X, Y, Z)
и возвращает try_to_do_math(1, 1, 3, 3, 0)
.
Затем следует повторить попытку, позвонив ?- iterate_over(3, 3, 1, 0).
.Теперь он пытается вызвать try_to_do_math(3,3,X1,Y1,higher_or_lower),
, и это не удается.
Теперь следует перейти к более низким iterate_over
методам со значениями iterate_over(3, 3, 1, 0)
, но это то место, где оно не работает так, как я хочу.Метод вызывается с номерами iterate_over(3, 3, _, 0)
, и, поскольку 1 != _
все это терпит неудачу.
Я не уверен, что это полезно, но я попытался объяснить его так, как я его вижу.
Кроме того, если это удастся, тогда мне наплевать на ответ, поскольку try_to_do_math
будет только менять вещи.