我正在尝试编写一个函数,该函数在每次recursion
调用中获取新值,如果失败,则increase
个数字并再次尝试直到数字达到{{1} }或6
。
这里重要的一点是,只有成功一次并增加或减少数字时,才应该进入第二部分。并且如果成功一次并增加/降低了它,则应检查函数1
是否适用于新的数字,如果它没有再次增加或降低该数字,直到数字达到try_to_do_math
或6
,除非在数字达到1
或6
之前成功。
它还应该通过检查1
的值来检查是add
还是substract
。
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。
编辑
我将尝试做一个成功的例子。 可以说正确的是X = 5和Y = 5。
首先调用iterate_over(X1, Y1,1,high_low).
。
然后,它转到?- 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 != _
只会改变事情。