Beispiel #1
0
        public bool preCheck(PredicateInstance pi)
        {
            var pn = pi.pnPAInstances;
            var pg = pi.pgPAInstances;
            var nn = pi.nnPAInstances;
            var ng = pi.ngPAInstances;

            var pnc = pn.Count;
            var pgc = pg.Count;
            var nnc = nn.Count;
            var ngc = ng.Count;

            var preClauses = pnc + pgc + nnc + ngc;

            var pna = pi.pnAtoms;
            var pga = pi.pgAtoms;
            var nna = pi.nnAtoms;
            var nga = pi.ngAtoms;

            var postAtomsMax = (pna + pga) * (nna + nga) - preClauses;
            var curAtoms     = (pna + pga + nna + nga);
            var arity        = pi.predicate.argumentTypes.Count();

            if (isGoal(pi.predicate))
            {
                return(false);
            }

            if (arity == 0 && !CSRS.isCNFName(pi.predicate.nameN)) //currently avoid to keep cfg shape
            {
                return(false);
            }

            if (pnc + pgc == 0 || nnc + ngc == 0) //monopolar
            {
                return(true);
            }

            if (pnc == 0 && pgc == 1 && pg.First().clause.literals.Count == 1)
            {
                return(true);
            }
            if (pnc == 1 && pgc == 0 && pn.First().clause.literals.Count == 1)
            {
                return(true);
            }
            if (nnc == 0 && ngc == 1 && ng.First().clause.literals.Count == 1)
            {
                return(true);
            }
            if (nnc == 1 && ngc == 0 && nn.First().clause.literals.Count == 1)
            {
                return(true);
            }

            if (pnc + pgc <= 2 && nnc + ngc <= 2)
            {
                return(true);
            }

//                if (pnc + pgc <= 1 || nnc + ngc <= 1) //(almost)monopolar
            //                  return true;

            //                if (isInterpreted(pi.predicate))
//                    return false;

/*
 *              if (arity > 0 && (pnc <= 1 || nnc <= 1) && (pgc*ngc < 10))
 *                  return true;
 *
 *              if (arity > 0 && (pnc + pgc)*(nnc + ngc) <= 20)
 *                  return true;
 *
 *              if (arity == 0 && postAtomsMax < curAtoms + 4) //Too many resultant atoms
 *                  return false;
 *
 * //                if (postAtomsMax < curAtoms + 20) //Too many resultant atoms
 * //                    return true;
 *
 *                  if (arity > 0 && (pgc*ngc == 0) && (pnc <= 1 || nnc <= 1))
 *                      return true;
 *
 * //                if (((pnc + pgc) * (nnc + ngc) < preClauses + 30) && (pnc == 0 || nnc == 0) && (pnc * ngc) + (nnc * pgc) < (ngc + pgc + 10) && (pgc * ngc < 20)) // non-ground on at most one side
 * //                    return true;
 */
            return(false);
        }
Beispiel #2
0
        public bool postCheck(PredicateInstance pi, ClauseSet cs, HashSet <Clause> goals)
        {
            var pn = pi.pnPAInstances;
            var pg = pi.pgPAInstances;
            var nn = pi.nnPAInstances;
            var ng = pi.ngPAInstances;

            var pnc = pn.Count;
            var pgc = pg.Count;
            var nnc = nn.Count;
            var ngc = ng.Count;

            var curClauses = pnc + pgc + nnc + ngc;

            var pna = pi.pnAtoms;
            var pga = pi.pgAtoms;
            var nna = pi.nnAtoms;
            var nga = pi.ngAtoms;

            var preAtoms    = (pna + pga + nna + nga);
            var postAtoms   = cs.numAtoms;
            var postClauses = cs.clauses.Count();

            var arity = pi.predicate.argumentTypes.Count();

            if (cs.clauses.Any(c => c.literals.Any(a => a.f.spredicate.Equals(pi.predicate))))
            {
                return(false);
            }

            if (arity == 0 && postAtoms <= preAtoms + 2) //Too many resultant atoms
            {
                return(true);
            }

            if (arity > 0 && postAtoms < preAtoms + 20) //Not too many resultant atoms
            {
                return(true);
            }

            if (arity > 0 && pnc <= 1 && nnc <= 1 && (pgc == 0 || ngc == 0))
            {
                return(true);
            }

            if (pnc + pgc <= 1 || nnc + ngc <= 1) //monopolar
            {
                return(true);
            }

            if (arity > 0 && ((pnc <= 2 && pgc * ngc == 0) || (nnc <= 2 && pgc * ngc == 0)))
            {
                return(true);
            }

            foreach (var c in cs.clauses)
            {
                foreach (var pa in c.predicates(true).Union(c.predicates(false)))
                {
                    if (pa.predicate == pi.predicate)
                    {
                        Console.WriteLine("Rejected for recursiveness");
                        return(false);
                    }
                }
            }

            return(arity > 0 && postAtoms < preAtoms + 10);

//                if (pnc == 0 || nnc == 0) // non-ground only on one side
//                    return true;


//                if (cs.Count > pnc + pgc + nnc + ngc)
//                    return false;
        }