public override IExpr /*!*/ ToPredicate(IVariable /*!*/ var, Element /*!*/ element) { //Contract.Requires(element != null); //Contract.Requires(var != null); Contract.Ensures(Contract.Result <IExpr>() != null); Elt e = (Elt)element; switch (e.what) { case What.Bottom: return(propFactory.False); case What.Exact: return(factory.IsExactlyA(var, cce.NonNull(e.ty))); case What.Bounds: if (e.ty == null && e.manyBounds == null) { return(propFactory.True); } else if (e.ty != null) { return(factory.IsA(var, e.ty)); } else { IExpr /*!*/ p = factory.IsA(var, (IExpr /*!*/)cce.NonNull(e.manyBounds)[0]); for (int i = 1; i < e.manyBounds.Length; i++) { p = propFactory.And(p, factory.IsA(var, (IExpr /*!*/)cce.NonNull(e.manyBounds[i]))); } return(p); } default: { Contract.Assert(false); throw new cce.UnreachableException(); } throw new System.Exception(); } }
public override IExpr /*!*/ ToPredicate(Element /*!*/ element) { //Contract.Requires(element != null); Contract.Ensures(Contract.Result <IExpr>() != null); if (IsTop(element)) { return(propExprFactory.True); } if (IsBottom(element)) { return(propExprFactory.False); } Elt e = (Elt)element; IExpr truth = propExprFactory.True; IExpr result = truth; foreach (IVariable /*!*/ variable in e.SortedVariables(variableComparer)) { Contract.Assert(variable != null); Element value = (Element)e[variable]; if (value == null || this.microLattice.IsTop(value)) { continue; } // Skip variables about which we know nothing. if (this.microLattice.IsBottom(value)) { return(propExprFactory.False); } IExpr conjunct = this.microLattice.ToPredicate(variable, value); result = (result == truth) ? (IExpr)conjunct : (IExpr)propExprFactory.And(result, conjunct); } return(result); }
// // Utility Methods // public static IExpr/*!*/ SimplifiedAnd(IPropExprFactory/*!*/ factory, IExpr/*!*/ e0, IExpr/*!*/ e1) { Contract.Requires(e1 != null); Contract.Requires(e0 != null); Contract.Requires(factory != null); Contract.Ensures(Contract.Result<IExpr>() != null); IFunApp fun0 = e0 as IFunApp; if (fun0 != null) { if (fun0.FunctionSymbol.Equals(Prop.True)) { return e1; } else if (fun0.FunctionSymbol.Equals(Prop.False)) { return e0; } } IFunApp fun1 = e1 as IFunApp; if (fun1 != null) { if (fun1.FunctionSymbol.Equals(Prop.True)) { return e0; } else if (fun1.FunctionSymbol.Equals(Prop.False)) { return e1; } } return factory.And(e0, e1); }