Exemple #1
0
def op_card(arg):
    '''
    :param arg:
    :type left: :class:`~arg`
    :param right:
    :type right: :class:`~ExprArg`
    :returns: :class:`~IntArg` 
    
    Returns the number of instances that are *on* in arg.
    '''
    assert isinstance(arg, ExprArg)

    instances = []
    matches = getSetInstancePairs(arg)
    known_card = 0
    if arg.getInts():
        card_cons = compute_int_set(arg.getInts())
        for i in card_cons:
            if isinstance(i, SMTLib.SMT_BoolConst):
                if i.value:
                    known_card = known_card + 1
            else:
                instances.append(
                    SMTLib.SMT_If(i, SMTLib.SMT_IntConst(1),
                                  SMTLib.SMT_IntConst(0)))
    for (instance, _) in matches.values():
        (expr, polarity) = instance
        if polarity == Common.DEFINITELY_ON:
            known_card = known_card + 1
        else:
            instances.append(
                SMTLib.SMT_If(expr, SMTLib.SMT_IntConst(1),
                              SMTLib.SMT_IntConst(0)))
    instances.append(SMTLib.SMT_IntConst(known_card))
    return IntArg(SMTLib.createSum(instances))
Exemple #2
0
def op_replace(whole_string, from_string, to_string):
    (_, whole_mask) = whole_string.getInstanceSort(0)
    whole_i = whole_mask.get(0)
    (_, from_mask) = from_string.getInstanceSort(0)
    from_i = from_mask.get(0)
    (_, to_mask) = to_string.getInstanceSort(0)
    to_i = to_mask.get(0)
    return IntArg(["Replace$" + whole_i + "$" + from_i + "$" + to_i])
Exemple #3
0
def op_substring(whole_string, left_index, right_index):
    (_, whole_mask) = whole_string.getInstanceSort(0)
    whole_i = whole_mask.get(0)
    left_stringID = Common.STRCONS_SUB + str(Common.getStringUID())
    right_stringID = Common.STRCONS_SUB + str(Common.getStringUID())
    Common.string_map[left_stringID] = left_index
    Common.string_map[right_stringID] = right_index
    return IntArg(
        ["Substring$" + whole_i + "$" + left_stringID + "$" + right_stringID])
Exemple #4
0
def op_sum(arg):
    '''
    :param arg:
    :type arg: :class:`~ExprArg`
    :returns: :class:`~IntArg`
     
    Computes the sum of all integer instances in arg. May not match the semantics of the Alloy backend.
    '''
    assert isinstance(arg, ExprArg)
    sum_list = []
    for (e, c) in arg.getInts():
        sum_list.append(SMTLib.createIf(c, e, SMTLib.SMT_IntConst(0)))
    return IntArg(SMTLib.createSum(sum_list))
Exemple #5
0
def op_un_minus(arg):
    '''
    :param arg:
    :type arg: :class:`~ExprArg`
    :returns: :class:`~IntArg` 
    
    Negates arg.
    '''
    assert isinstance(arg, IntArg)
    val = arg.getInts()
    val = [SMTLib.createIf(c, e, SMTLib.SMT_IntConst(0)) for (e, c) in val]
    val_sum = SMTLib.createSum(val)
    return IntArg(SMTLib.createNeg(val_sum))
Exemple #6
0
def op_mul(left, right):
    '''
    :param left:
    :type left: :class:`~ExprArg`
    :param right:
    :type right: :class:`~ExprArg`
    :returns: :class:`~IntArg` 
    
    Returns left * right.
    '''
    assert isinstance(left, ExprArg)
    assert isinstance(right, ExprArg)
    lval = left.getInts()
    lval = [SMTLib.createIf(c, e, SMTLib.SMT_IntConst(0)) for (e, c) in lval]
    lval = SMTLib.createSum(lval)
    rval = right.getInts()
    rval = [SMTLib.createIf(c, e, SMTLib.SMT_IntConst(0)) for (e, c) in rval]
    rval = SMTLib.createSum(rval)
    return IntArg(SMTLib.SMT_Times(lval, rval))
Exemple #7
0
def op_div(left, right):
    '''
    :param left:
    :type left: :class:`~ExprArg`
    :param right:
    :type right: :class:`~ExprArg`
    :returns: :class:`~IntArg` 
    Returns left / right.
    '''
    assert isinstance(left, ExprArg)
    assert isinstance(right, ExprArg)
    lval = left.getInts()
    lval = [SMTLib.createIf(c, e, SMTLib.SMT_IntConst(0)) for (e, c) in lval]
    lval = SMTLib.createSum(lval)
    rval = right.getInts()
    rval = [SMTLib.createIf(c, e, SMTLib.SMT_IntConst(0)) for (e, c) in rval]
    rval = SMTLib.createSum(rval)
    return IntArg(
        SMTLib.SMT_Divide(lval, rval) if (
            (not isinstance(lval, SMTLib.SMT_IntConst)) or (
                not isinstance(rval, SMTLib.SMT_IntConst))
        ) else SMTLib.SMT_IntDivide(lval, rval))
Exemple #8
0
 def integerliteralVisit(self, element):
     if (self.inConstraint):
         self.currentConstraint.addArg(
             [IntArg(SMTLib.SMT_IntConst(element.value))])
Exemple #9
0
def op_indexof(left, right):
    (_, mask) = left.getInstanceSort(0)
    left_i = mask.get(0)
    (_, mask) = right.getInstanceSort(0)
    right_i = mask.get(0)
    return IntArg([SMTLib.SMT_Int("Indexof$" + left_i + "$" + right_i)])
Exemple #10
0
def op_length(arg):
    (_, mask) = arg.getInstanceSort(0)
    arg_i = mask.get(0)
    stringID = Common.STRCONS_SUB + str(Common.getStringUID())
    Common.string_map[stringID] = arg_i
    return IntArg([SMTLib.SMT_Int("Length$" + str(stringID))])
Exemple #11
0
def op_concat(left, right):
    (_, left_mask) = left.getInstanceSort(0)
    left_i = left_mask.get(0)
    (_, right_mask) = right.getInstanceSort(0)
    right_i = right_mask.get(0)
    return IntArg(["Concat$" + left_i + "$" + right_i])