Allowing “at” as a predicate name even though it is an expression identifier.

This commit is contained in:
Patrick Lühne 2017-06-21 22:54:07 +02:00
parent 08c55adfbd
commit 12e55da662
Signed by: patrick
GPG Key ID: 05F3611E97A70ABF
3 changed files with 197 additions and 4 deletions

View File

@ -26,8 +26,7 @@ std::experimental::optional<ast::Fact> parseFact(Context &context, ASTContext &a
tokenizer.expect<std::string>("(");
tokenizer.skipWhiteSpace();
if (tokenizer.testIdentifierAndReturn("=")
|| tokenizer.testIdentifierAndReturn("at"))
if (tokenizer.testIdentifierAndReturn("="))
{
tokenizer.seek(position);
return parseUnsupported(context);
@ -39,12 +38,20 @@ std::experimental::optional<ast::Fact> parseFact(Context &context, ASTContext &a
std::experimental::optional<ast::Fact> fact;
if ((fact = parseNot<ast::Fact>(context, astContext, variableStack, parseAtomicFormula))
|| (fact = parseAtomicFormula(context, astContext, variableStack)))
|| (fact = parseAtomicFormula(context, astContext, variableStack)))
{
return std::move(fact.value());
}
return parseAtomicFormula(context, astContext, variableStack);
// Test for “at” expressions only now to allow “at” as a predicate name
// TODO: allow this in compatibility mode only?
if (tokenizer.testIdentifierAndReturn("at"))
{
tokenizer.seek(position);
return parseUnsupported(context);
}
return std::experimental::nullopt;
}
////////////////////////////////////////////////////////////////////////////////////////////////////

View File

@ -60,4 +60,30 @@ TEST_CASE("[PDDL parser issues] Check past issues", "[PDDL parser issues]")
context.tokenizer.read(domainFile);
CHECK_THROWS(pddl::parseDescription(context));
}
// Check that “at” is allowed as a predicate name and not exclusively for “at” expressions
SECTION("“at” as predicate name")
{
const auto domainFile = fs::path("data") / "issues" / "issue-10.pddl";
context.tokenizer.read(domainFile);
const auto description = pddl::parseDescription(context);
REQUIRE(description.problem);
const auto &problem = description.problem.value();
const auto &facts = problem->initialState.facts;
const auto invalidFact = std::find_if(facts.cbegin(), facts.cend(),
[](const auto &fact)
{
return
fact.template is<pddl::ast::AtPointer<pddl::ast::Literal>>()
|| (fact.template is<pddl::ast::AtomicFormula>() && fact.template get<pddl::ast::AtomicFormula>().template is<pddl::ast::UnsupportedPointer>());
});
const auto containsInvalidFact = (invalidFact != facts.cend());
CHECK(!containsInvalidFact);
}
}

View File

@ -0,0 +1,160 @@
(define (domain logistics-strips)
(:requirements :strips)
(:predicates (OBJ ?obj)
(TRUCK ?truck)
(LOCATION ?loc)
(AIRPLANE ?airplane)
(CITY ?city)
(AIRPORT ?airport)
(at ?obj ?loc)
(in ?obj1 ?obj2)
(in-city ?obj ?city))
; (:types ) ; default object
(:action LOAD-TRUCK
:parameters
(?obj
?truck
?loc)
:precondition
(and (OBJ ?obj) (TRUCK ?truck) (LOCATION ?loc)
(at ?truck ?loc) (at ?obj ?loc))
:effect
(and (not (at ?obj ?loc)) (in ?obj ?truck)))
(:action LOAD-AIRPLANE
:parameters
(?obj
?airplane
?loc)
:precondition
(and (OBJ ?obj) (AIRPLANE ?airplane) (LOCATION ?loc)
(at ?obj ?loc) (at ?airplane ?loc))
:effect
(and (not (at ?obj ?loc)) (in ?obj ?airplane)))
(:action UNLOAD-TRUCK
:parameters
(?obj
?truck
?loc)
:precondition
(and (OBJ ?obj) (TRUCK ?truck) (LOCATION ?loc)
(at ?truck ?loc) (in ?obj ?truck))
:effect
(and (not (in ?obj ?truck)) (at ?obj ?loc)))
(:action UNLOAD-AIRPLANE
:parameters
(?obj
?airplane
?loc)
:precondition
(and (OBJ ?obj) (AIRPLANE ?airplane) (LOCATION ?loc)
(in ?obj ?airplane) (at ?airplane ?loc))
:effect
(and (not (in ?obj ?airplane)) (at ?obj ?loc)))
(:action DRIVE-TRUCK
:parameters
(?truck
?loc-from
?loc-to
?city)
:precondition
(and (TRUCK ?truck) (LOCATION ?loc-from) (LOCATION ?loc-to) (CITY ?city)
(at ?truck ?loc-from)
(in-city ?loc-from ?city)
(in-city ?loc-to ?city))
:effect
(and (not (at ?truck ?loc-from)) (at ?truck ?loc-to)))
(:action FLY-AIRPLANE
:parameters
(?airplane
?loc-from
?loc-to)
:precondition
(and (AIRPLANE ?airplane) (AIRPORT ?loc-from) (AIRPORT ?loc-to)
(at ?airplane ?loc-from))
:effect
(and (not (at ?airplane ?loc-from)) (at ?airplane ?loc-to)))
)
(define (problem strips-log-x-1)
(:domain logistics-strips)
(:objects package6 package5 package4 package3 package2 package1
city6 city5 city4 city3 city2 city1 truck6 truck5 truck4
truck3 truck2 truck1 plane2 plane1 city6-1 city5-1 city4-1
city3-1 city2-1 city1-1 city6-2 city5-2 city4-2 city3-2
city2-2 city1-2)
(:init (obj package6)
(obj package5)
(obj package4)
(obj package3)
(obj package2)
(obj package1)
(city city6)
(city city5)
(city city4)
(city city3)
(city city2)
(city city1)
(truck truck6)
(truck truck5)
(truck truck4)
(truck truck3)
(truck truck2)
(truck truck1)
(airplane plane2)
(airplane plane1)
(location city6-1)
(location city5-1)
(location city4-1)
(location city3-1)
(location city2-1)
(location city1-1)
(airport city6-2)
(location city6-2)
(airport city5-2)
(location city5-2)
(airport city4-2)
(location city4-2)
(airport city3-2)
(location city3-2)
(airport city2-2)
(location city2-2)
(airport city1-2)
(location city1-2)
(in-city city6-2 city6)
(in-city city6-1 city6)
(in-city city5-2 city5)
(in-city city5-1 city5)
(in-city city4-2 city4)
(in-city city4-1 city4)
(in-city city3-2 city3)
(in-city city3-1 city3)
(in-city city2-2 city2)
(in-city city2-1 city2)
(in-city city1-2 city1)
(in-city city1-1 city1)
(at plane2 city4-2)
(at plane1 city4-2)
(at truck6 city6-1)
(at truck5 city5-1)
(at truck4 city4-1)
(at truck3 city3-1)
(at truck2 city2-1)
(at truck1 city1-1)
(at package6 city3-1)
(at package5 city4-2)
(at package4 city1-1)
(at package3 city1-1)
(at package2 city1-2)
(at package1 city2-1))
(:goal (and (at package6 city1-2)
(at package5 city6-2)
(at package4 city3-2)
(at package3 city6-1)
(at package2 city6-2)
(at package1 city2-1))))