Computable Sets in the Euclidean plane using Python

#####################################################################
#
# Implementing the notion of Computable Set in the euclidean plane 
#
# Every weakly computable set in the euclidean plane is a set 
# of zeroes of some a computable function.
#
# Konrad Burnik, June 2017.
#
#####################################################################

from math import *
from decimal import *
import matplotlib.pyplot as plt

class ComputableSet:
    '''A computable subset of the euclidean plane is given by its computable function representing it.'''
    def f(self, x, y):
        '''A function whose zeroes represent this computable set. 
           For example: def f(x, y): return x**2 + y**2 - 1 has zeroes which represents a unit circle.
        '''
        raise Exception("Not implemented!")
    
    def points(self, k):
        return [(x/2**k, y/2**k) 
                        for y in range(-2**k, 2**k + 1) 
                        for x in range(-2**k, 2**k + 1) 
                        if Decimal(-1) / Decimal(2**k) < self.f(Decimal(x)/Decimal(2**k), Decimal(y)/Decimal(2**k)) < Decimal(1) / Decimal(2**k)]  class Circle(ComputableSet):
    def f(self, x, y):
        return x**2 + y**2 - Decimal(1/2)
class EllipticCurve(ComputableSet):
    def f(self, x, y):
        return x**2 + y**3 - Decimal(1/2)
def plot_set(s, k):
    points = s.points(k)
    x = list(map(lambda x : x[0], points))
    y = list(map(lambda x : x[1], points))

    plt.plot(x, y, 'ro')
    plt.show()
class Circle(ComputableSet):
    def f(self, x, y):
        return x**2 + y**2 - Decimal(1/2)

class EllipticCurve(ComputableSet):
    def f(self, x, y):
        return x**2 + y**3 - Decimal(1/2)

class ComputableSetUnion(ComputableSet):
    def __init__(self):
        self.A = ComputableSet()
        self.B = ComputableSet()
        
    def f(self, x, y):
        return self.A.f(x, y) * self.B.f(x, y)