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