예제 #1
0
파일: elab.py 프로젝트: leodemoura/boole
def sig(var, codom):
    """Create the term
    Sig x:A.B from its constituents
    
    Arguments:
    - `var`: a constant expr
    - `codom`: an expression possibly containing var
    """
    if var.is_const():
        codom_abs = e.abstract_expr([var.name], codom)
        return e.Bound(e.Sig(var.name), var.type, codom_abs)
    else:
        mess = "Expected {0!s} to be a constant".format(var)
        raise e.ExprError(mess, var)
예제 #2
0
파일: elab.py 프로젝트: leodemoura/boole
def exists(var, prop):
    """Create the term
    exists x:A.t from its constituents
    
    Arguments:
    - `var`: a constant expr
    - `prop`: an expression possibly containing var
    """
    if var.is_const():
        prop_abs = e.abstract_expr([var.name], prop)
        return e.Bound(e.Exists(var.name), var.type, prop_abs)
    else:
        mess = "Expected {0!s} to be a constant".format(var)
        raise e.ExprError(mess, var)
예제 #3
0
파일: elab.py 프로젝트: leodemoura/boole
def pi(var, codom, impl=None):
    """Create the term
    Pi x:A.B from its constituents
    
    Arguments:
    - `var`: a constant expr
    - `codom`: an expression possibly containing var
    - `impl`: a flag which notes if the argument is implicit.
    """
    if var.is_const():
        codom_abs = e.abstract_expr([var.name], codom)
        ret = e.Bound(e.Pi(var.name), var.type, codom_abs)
        if impl:
            ret.info['implicit'] = True
        return ret
    else:
        mess = "Expected {0!s} to be a constant".format(var)
        raise e.ExprError(mess, var)
예제 #4
0
파일: elab.py 프로젝트: leodemoura/boole
def abst(var, body):
    """Create the term
    lambda x:A.t from its constituents
    
    Arguments:
    - `var`: a constant expr
    - `body`: an expression possibly containing var
    """
    if var.is_const():
        ty, _ = mvar_infer(var.type)
        if ty.equals(e.Bool()):
            body = enrich(var.name, var.type, body)
        else:
            pass
        body_abs = e.abstract_expr([var.name], body)
        return e.Bound(e.Abst(var.name), var.type, body_abs)
    else:
        print var.__class__
        mess = "Expected {0!s} to be a constant".format(var)
        raise e.ExprError(mess, var)
예제 #5
0
파일: elab.py 프로젝트: leodemoura/boole
 def visit_bound(self, expr, *args, **kwargs):
     var, open_expr = self.open_fresh(expr)
     new_open_expr = self.visit(open_expr)
     dom = self.visit(expr.dom)
     return e.Bound(expr.binder, dom, self.abst([var], new_open_expr))
예제 #6
0
파일: elab.py 프로젝트: leodemoura/boole
 def visit_bound(self, expr):
     dom = self.visit(expr.dom)
     body = self.visit(expr.body)
     return e.Bound(expr.binder, dom, body)