use of at.ac.tuwien.kr.alpha.api.rules.NormalRule in project Alpha by alpha-asp.
the class ArithmeticTermsRewriting method apply.
@Override
public NormalProgram apply(NormalProgram inputProgram) {
List<NormalRule> rewrittenRules = new ArrayList<>();
boolean didRewrite = false;
for (NormalRule inputProgramRule : inputProgram.getRules()) {
if (containsArithmeticTermsToRewrite(inputProgramRule)) {
rewrittenRules.add(rewriteRule(inputProgramRule));
didRewrite = true;
} else {
// Keep rule as-is if no ArithmeticTerm occurs.
rewrittenRules.add(inputProgramRule);
}
}
if (!didRewrite) {
return inputProgram;
}
// Create new program with rewritten rules.
return new NormalProgramImpl(rewrittenRules, inputProgram.getFacts(), inputProgram.getInlineDirectives());
}
use of at.ac.tuwien.kr.alpha.api.rules.NormalRule in project Alpha by alpha-asp.
the class IntervalTermToIntervalAtom method apply.
@Override
public NormalProgram apply(NormalProgram inputProgram) {
boolean didChange = false;
List<NormalRule> rewrittenRules = new ArrayList<>();
for (NormalRule rule : inputProgram.getRules()) {
NormalRule rewrittenRule = rewriteIntervalSpecifications(rule);
rewrittenRules.add(rewrittenRule);
// If no rewriting occurred, the output rule is the same as the input to the rewriting.
if (rewrittenRule != rule) {
didChange = true;
}
}
// Return original program if no rule was actually rewritten.
if (!didChange) {
return inputProgram;
}
return new NormalProgramImpl(rewrittenRules, inputProgram.getFacts(), inputProgram.getInlineDirectives());
}
use of at.ac.tuwien.kr.alpha.api.rules.NormalRule in project Alpha by alpha-asp.
the class ArithmeticTermsRewritingTest method rewriteRule.
@Test
public void rewriteRule() {
NormalProgram inputProgram = NormalProgramImpl.fromInputProgram(parser.parse("p(X+1) :- q(Y/2), r(f(X*2),Y), X-2 = Y*3, X = 0..9."));
assertEquals(1, inputProgram.getRules().size());
ArithmeticTermsRewriting arithmeticTermsRewriting = new ArithmeticTermsRewriting();
NormalProgram rewrittenProgram = arithmeticTermsRewriting.apply(inputProgram);
// Expect the rewritten program to be one rule with: p(_A0) :- _A0 = X+1, _A1 = Y/2, q(_A1), _A2 = X*2, r(f(_A2),Y), X-2 = Y*3, X = 0..9.
assertEquals(1, rewrittenProgram.getRules().size());
NormalRule rewrittenRule = rewrittenProgram.getRules().get(0);
assertTrue(rewrittenRule.getHeadAtom().getTerms().get(0) instanceof VariableTerm);
assertEquals(7, rewrittenRule.getBody().size());
}
use of at.ac.tuwien.kr.alpha.api.rules.NormalRule in project Alpha by alpha-asp.
the class ArithmeticTermsRewritingTest method rewriteExternalAtom.
@Test
public void rewriteExternalAtom() {
NormalProgram inputProgram = NormalProgramImpl.fromInputProgram(parser.parse("p :- Y = 13, &extArithTest[Y*5](Y-4)."));
assertEquals(1, inputProgram.getRules().size());
ArithmeticTermsRewriting arithmeticTermsRewriting = new ArithmeticTermsRewriting();
NormalProgram rewrittenProgram = arithmeticTermsRewriting.apply(inputProgram);
assertEquals(1, rewrittenProgram.getRules().size());
NormalRule rewrittenRule = rewrittenProgram.getRules().get(0);
assertEquals(4, rewrittenRule.getBody().size());
List<Literal> externalLiterals = rewrittenRule.getBody().stream().filter(lit -> lit instanceof ExternalLiteral).collect(toList());
assertEquals(1, externalLiterals.size());
ExternalAtom rewrittenExternal = ((ExternalLiteral) externalLiterals.get(0)).getAtom();
assertEquals(1, rewrittenExternal.getInput().size());
assertTrue(rewrittenExternal.getInput().get(0) instanceof VariableTerm);
assertEquals(1, rewrittenExternal.getOutput().size());
assertTrue(rewrittenExternal.getOutput().get(0) instanceof VariableTerm);
}
Aggregations