Прологические методы с определенными условиями - PullRequest
0 голосов
/ 19 ноября 2018

Я пытаюсь написать функцию, в которой она получает новые значения при каждом вызове 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 будет только менять вещи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...