001package org.clafer.ir;
002
003import org.clafer.common.Check;
004
005/**
006 *
007 * @author jimmy
008 */
009public class IrNotImplies extends IrAbstractBool implements IrBoolExpr {
010
011    private final IrBoolExpr antecedent;
012    private final IrBoolExpr consequent;
013
014    IrNotImplies(IrBoolExpr antecedent, IrBoolExpr consequent, IrBoolDomain domain) {
015        super(domain);
016        this.antecedent = Check.notNull(antecedent);
017        this.consequent = Check.notNull(consequent);
018    }
019
020    public IrBoolExpr getAntecedent() {
021        return antecedent;
022    }
023
024    public IrBoolExpr getConsequent() {
025        return consequent;
026    }
027
028    @Override
029    public IrBoolExpr negate() {
030        return new IrImplies(antecedent, consequent, getDomain().invert());
031    }
032
033    @Override
034    public boolean isNegative() {
035        return true;
036    }
037
038    @Override
039    public <A, B> B accept(IrBoolExprVisitor<A, B> visitor, A a) {
040        return visitor.visit(this, a);
041    }
042
043    @Override
044    public <A, B> B accept(IrIntExprVisitor<A, B> visitor, A a) {
045        return visitor.visit(this, a);
046    }
047
048    @Override
049    public boolean equals(Object obj) {
050        if (obj instanceof IrNotImplies) {
051            IrNotImplies other = (IrNotImplies) obj;
052            return antecedent.equals(other.antecedent) && consequent.equals(other.consequent) && super.equals(other);
053        }
054        return false;
055    }
056
057    @Override
058    public int hashCode() {
059        return ~(antecedent.hashCode() ^ consequent.hashCode());
060    }
061
062    @Override
063    public String toString() {
064        return antecedent + " =/> " + consequent;
065    }
066}