':param ex: ``AbstractBoxerDrs``
:return: ``DrtExpression``'

def interpret(self, ex):

    if isinstance(ex, BoxerDrs):
        drs = DRS([Variable(r) for r in ex.refs], list(map(self.interpret, ex.conds)))
        if (ex.consequent is not None):
            drs.consequent = self.interpret(ex.consequent)
        return drs
    elif isinstance(ex, BoxerNot):
        return DrtNegatedExpression(self.interpret(ex.drs))
    elif isinstance(ex, BoxerPred):
        pred = self._add_occur_indexing((u'%s_%s' % (ex.pos, ex.name)), ex)
        return self._make_atom(pred, ex.var)
    elif isinstance(ex, BoxerNamed):
        pred = self._add_occur_indexing((u'ne_%s_%s' % (ex.type, ex.name)), ex)
        return self._make_atom(pred, ex.var)
    elif isinstance(ex, BoxerRel):
        pred = self._add_occur_indexing((u'%s' % ex.rel), ex)
        return self._make_atom(pred, ex.var1, ex.var2)
    elif isinstance(ex, BoxerProp):
        return DrtProposition(Variable(ex.var), self.interpret(ex.drs))
    elif isinstance(ex, BoxerEq):
        return DrtEqualityExpression(DrtVariableExpression(Variable(ex.var1)), DrtVariableExpression(Variable(ex.var2)))
    elif isinstance(ex, BoxerCard):
        pred = self._add_occur_indexing((u'card_%s_%s' % (ex.type, ex.value)), ex)
        return self._make_atom(pred, ex.var)
    elif isinstance(ex, BoxerOr):
        return DrtOrExpression(self.interpret(ex.drs1), self.interpret(ex.drs2))
    elif isinstance(ex, BoxerWhq):
        drs1 = self.interpret(ex.drs1)
        drs2 = self.interpret(ex.drs2)
        return DRS((drs1.refs + drs2.refs), (drs1.conds + drs2.conds))
    assert False, (u'%s:    %s' % (ex.__class__.__name__, ex))
