use of at.ac.tuwien.kr.alpha.api.grounder.Substitution in project Alpha by alpha-asp.
the class LiteralInstantiationStrategyTest method defaultLazyGroundingSubstituteNonGroundLiteralWithUnassignedInstance.
/**
* Uses {@link DefaultLazyGroundingInstantiationStrategy} to find the ground
* instance "q(a, b)" for the partially ground positive literal "q(a, X)".
*
* In this case, the instantiation strategy has an empty assignment, so we
* expect the assignment status (i.e. assignment status of the found ground
* instance) passed back with the substitution to be UNASSIGNED. Since
* UNASSIGNED and FALSE atoms are (potentially) stale in working memory, we
* expect the atom "q(a, b)" to be added to the stale set by the instantiation
* strategy.
*/
@Test
public void defaultLazyGroundingSubstituteNonGroundLiteralWithUnassignedInstance() {
Predicate q = Predicates.getPredicate("q", 2);
BasicAtom nonGroundAtom = Atoms.newBasicAtom(q, Terms.newSymbolicConstant("a"), Terms.newVariable("X"));
WorkingMemory workingMemory = new WorkingMemory();
workingMemory.initialize(q);
workingMemory.addInstance(Atoms.newBasicAtom(q, Terms.newSymbolicConstant("a"), Terms.newSymbolicConstant("b")), true);
AtomStore atomStore = new AtomStoreImpl();
WritableAssignment assignment = new TrailAssignment(atomStore);
LinkedHashSet<Atom> staleSet = new LinkedHashSet<>();
DefaultLazyGroundingInstantiationStrategy strategy = new DefaultLazyGroundingInstantiationStrategy(workingMemory, atomStore, Collections.emptyMap(), false);
strategy.setStaleWorkingMemoryEntries(staleSet);
strategy.setCurrentAssignment(assignment);
List<ImmutablePair<Substitution, AssignmentStatus>> result = strategy.getAcceptedSubstitutions(Literals.fromAtom(nonGroundAtom, true), new BasicSubstitution());
assertEquals(1, result.size());
ImmutablePair<Substitution, AssignmentStatus> substitutionInfo = result.get(0);
Substitution substitution = substitutionInfo.left;
AssignmentStatus assignmentStatus = substitutionInfo.right;
assertEquals(AssignmentStatus.UNASSIGNED, assignmentStatus);
assertTrue(substitution.isVariableSet(Terms.newVariable("X")));
assertEquals(Terms.newSymbolicConstant("b"), substitution.eval(Terms.newVariable("X")));
assertEquals(1, staleSet.size());
assertTrue(staleSet.contains(Atoms.newBasicAtom(q, Terms.newSymbolicConstant("a"), Terms.newSymbolicConstant("b"))));
}
use of at.ac.tuwien.kr.alpha.api.grounder.Substitution in project Alpha by alpha-asp.
the class StratifiedEvaluation method evaluateRule.
private void evaluateRule(CompiledRule rule, boolean checkAllStartingLiterals) {
LOGGER.debug("Evaluating rule {}", rule);
List<Substitution> satisfyingSubstitutions = calculateSatisfyingSubstitutionsForRule(rule, checkAllStartingLiterals);
for (Substitution subst : satisfyingSubstitutions) {
fireRule(rule, subst);
}
}
use of at.ac.tuwien.kr.alpha.api.grounder.Substitution in project Alpha by alpha-asp.
the class StratifiedEvaluation method calculateSatisfyingSubstitutionsForRule.
private List<Substitution> calculateSatisfyingSubstitutionsForRule(CompiledRule rule, boolean checkAllStartingLiterals) {
LOGGER.debug("Grounding rule {}", rule);
RuleGroundingInfo groundingOrders = rule.getGroundingInfo();
// Treat rules with fixed instantiation first.
LOGGER.debug("Is fixed rule? {}", rule.getGroundingInfo().hasFixedInstantiation());
if (groundingOrders.hasFixedInstantiation()) {
RuleGroundingOrder fixedGroundingOrder = groundingOrders.getFixedGroundingOrder();
return calcSubstitutionsWithGroundingOrder(fixedGroundingOrder, Collections.singletonList(new BasicSubstitution()));
}
List<Literal> startingLiterals = groundingOrders.getStartingLiterals();
// Check only one starting literal if indicated by the parameter.
if (!checkAllStartingLiterals) {
// If this is the first evaluation run, it suffices to start from the first starting literal only.
Literal lit = startingLiterals.get(0);
return calcSubstitutionsWithGroundingOrder(groundingOrders.orderStartingFrom(lit), substituteFromRecentlyAddedInstances(lit));
}
// Ground from all starting literals.
// Collection of full ground substitutions for the given rule.
List<Substitution> groundSubstitutions = new ArrayList<>();
for (Literal lit : startingLiterals) {
List<Substitution> substitutionsForStartingLiteral = calcSubstitutionsWithGroundingOrder(groundingOrders.orderStartingFrom(lit), substituteFromRecentlyAddedInstances(lit));
groundSubstitutions.addAll(substitutionsForStartingLiteral);
}
return groundSubstitutions;
}
use of at.ac.tuwien.kr.alpha.api.grounder.Substitution in project Alpha by alpha-asp.
the class NaiveGrounderTest method testDeadEnd.
/**
* Tests the method {@link NaiveGrounder#getGroundInstantiations(InternalRule, RuleGroundingOrder, Substitution, Assignment)} on a
* predefined program:
* <code>
* p1(1). q1(1). <br/>
* x :- p1(X), p2(X), q1(Y), q2(Y). <br/>
* p2(X) :- something(X). <br/>
* q2(X) :- something(X). <br/>
* </code>
* Given one grounding order {@code groundingOrder} for the first rule in this program which starts with
* the literal whose predicate name is {@code predicateNameOfStartingLiteral} and a substitution substituting
* the variable in this literal by 1 it is attempted to ground the rule.
* It is then asserted that ground instantiations are produced if and only if {@code expectNoGoods} is true.
*
* @param predicateNameOfStartingLiteral the predicate name of the starting literal, either "p1" or "q1".
* @param groundingOrder a grounding order for the first rule in the predefined program that starts with the literal
* whose predicate name is {@code predicateNameOfStartingLiteral}.
* @param expectNoGoods {@code true} iff ground instantiations are expected to be produced under the conditions
* described above.
*/
private void testDeadEnd(String predicateNameOfStartingLiteral, RuleGroundingOrderImpl groundingOrder, boolean expectNoGoods) {
String aspStr = "p1(1). q1(1). " + "x :- p1(X), p2(X), q1(Y), q2(Y). " + "p2(X) :- something(X). " + "q2(X) :- something(X). ";
CompiledProgram program = InternalProgram.fromNormalProgram(NORMALIZE_TRANSFORM.apply(PROGRAM_PARSER.parse(aspStr)));
AtomStore atomStore = new AtomStoreImpl();
NaiveGrounder grounder = (NaiveGrounder) GrounderFactory.getInstance("naive", program, atomStore, p -> true, GrounderHeuristicsConfiguration.permissive(), true);
CompiledRule nonGroundRule = grounder.getNonGroundRule(0);
String strLiteral = "p1".equals(predicateNameOfStartingLiteral) ? "p1(X)" : "p1(Y)";
final Literal startingLiteral = PROGRAM_PART_PARSER.parseLiteral(strLiteral);
((RuleGroundingInfoImpl) nonGroundRule.getGroundingInfo()).groundingOrders.put(startingLiteral, groundingOrder);
grounder.bootstrap();
TrailAssignment currentAssignment = new TrailAssignment(atomStore);
final Substitution subst1 = BasicSubstitution.specializeSubstitution(startingLiteral, new Instance(Terms.newConstant(1)), BasicSubstitution.EMPTY_SUBSTITUTION);
final BindingResult bindingResult = grounder.getGroundInstantiations(nonGroundRule, groundingOrder, subst1, currentAssignment);
assertEquals(expectNoGoods, bindingResult.size() > 0);
}
use of at.ac.tuwien.kr.alpha.api.grounder.Substitution in project Alpha by alpha-asp.
the class NaiveGrounderTest method testIfGrounderGroundsRule.
/**
* Tests if {@link NaiveGrounder#getGroundInstantiations(InternalRule, RuleGroundingOrder, Substitution, Assignment)}
* produces ground instantiations for the rule with ID {@code ruleID} in {@code program} when {@code startingLiteral}
* unified with the numeric instance {@code startingInstance} is used as starting literal and {@code b(1)} is assigned
* {@code bTruth}.
* It is asserted that ground instantiations are produced if and only if {@code expectNoGoods} is true.
*/
private void testIfGrounderGroundsRule(ASPCore2Program program, int ruleID, Literal startingLiteral, int startingInstance, ThriceTruth bTruth, boolean expectNoGoods) {
CompiledProgram internalPrg = InternalProgram.fromNormalProgram(NORMALIZE_TRANSFORM.apply(program));
AtomStore atomStore = new AtomStoreImpl();
TrailAssignment currentAssignment = new TrailAssignment(atomStore);
NaiveGrounder grounder = (NaiveGrounder) GrounderFactory.getInstance("naive", internalPrg, atomStore, p -> true, GrounderHeuristicsConfiguration.permissive(), true);
int b = atomStore.putIfAbsent(atom("b", 1));
currentAssignment.growForMaxAtomId();
currentAssignment.assign(b, bTruth);
grounder.bootstrap();
final CompiledRule nonGroundRule = grounder.getNonGroundRule(ruleID);
final Substitution substStartingLiteral = BasicSubstitution.specializeSubstitution(startingLiteral, new Instance(Terms.newConstant(startingInstance)), BasicSubstitution.EMPTY_SUBSTITUTION);
final BindingResult bindingResult = grounder.getGroundInstantiations(nonGroundRule, nonGroundRule.getGroundingInfo().orderStartingFrom(startingLiteral), substStartingLiteral, currentAssignment);
assertEquals(expectNoGoods, bindingResult.size() > 0);
}
Aggregations