コード例 #1
0
        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();
            }
        }
コード例 #2
0
ファイル: VariableMapLattice.cs プロジェクト: omaragb/tlp182
        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);
        }
コード例 #3
0
    //
    // 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);
    }