Non-structured Paradigm#
Initial Set-Up#
from goto import with_goto
Predecessor and Successor#
def predecessor(a: int) -> int:
return a - 1
assert predecessor(1) == 0
assert predecessor(10) == 9
def successor(a: int) -> int:
return a + 1
assert successor(0) == 1
assert successor(10) == 11
Addition#
@with_goto
def addition(addend_1: int, addend_2: int) -> int:
result = addend_1
label .start
if addend_2 == 0:
goto .end
result = successor(result)
addend_2 = predecessor(addend_2)
goto .start
label .end
return result
assert addition(0, 0) == 0, addition(0, 0)
assert addition(1, 0) == 1
assert addition(0, 1) == 1
assert addition(10, 10) == 20
Multiplication#
@with_goto
def multiplication(multiplicand: int, multiplier: int) -> int:
result = 0
label .start
if multiplier == 0:
goto .end
result = addition(result, multiplicand)
multiplier = predecessor(multiplier)
goto .start
label .end
return result
assert multiplication(0, 0) == 0
assert multiplication(2, 0) == 0
assert multiplication(0, 2) == 0
assert multiplication(10, 10) == 100
Exponentiation#
@with_goto
def exponentiation(base: int, exponent: int) -> float:
result = 1
label .start
if exponent == 0:
goto .end
result = multiplication(result, base)
exponent = predecessor(exponent)
goto .start
label .end
return result
assert exponentiation(1, 0) == 1
assert exponentiation(0, 1) == 0
assert exponentiation(3, 3) == 27