pddl_parser/domain/
typed_predicate.rs

1use nom::combinator::opt;
2use nom::multi::many0;
3use nom::sequence::{delimited, pair, preceded};
4use nom::IResult;
5use serde::{Deserialize, Serialize};
6
7use crate::domain::typed_parameter::TypedParameter;
8use crate::error::ParserError;
9use crate::lexer::{Token, TokenStream};
10use crate::tokens::id;
11
12/// A predicate with typed parameters.
13#[derive(Debug, Deserialize, Serialize, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
14pub struct TypedPredicate {
15    /// The name of the predicate.
16    pub name: String,
17    /// The parameters of the predicate.
18    #[serde(default)]
19    pub parameters: Vec<TypedParameter>,
20}
21
22impl TypedPredicate {
23    /// Parse a list of functions from a token stream.
24    pub fn parse_functions(input: TokenStream) -> IResult<TokenStream, Vec<TypedPredicate>, ParserError> {
25        log::debug!("BEGIN > parse_functions {:?}", input.span());
26        let (output, functions) = opt(delimited(
27            Token::OpenParen,
28            preceded(
29                Token::Functions,
30                many0(delimited(
31                    Token::OpenParen,
32                    pair(id, TypedParameter::parse_typed_parameters),
33                    Token::CloseParen,
34                )),
35            ),
36            Token::CloseParen,
37        ))(input)?;
38        let functions = functions
39            .unwrap_or_default()
40            .into_iter()
41            .map(|(name, parameters)| TypedPredicate { name, parameters })
42            .collect();
43        log::debug!("END < parse_functions {:?}", output.span());
44        Ok((output, functions))
45    }
46
47    /// Parse a list of predicates from a token stream.
48    pub fn parse_predicates(input: TokenStream) -> IResult<TokenStream, Vec<TypedPredicate>, ParserError> {
49        log::debug!("BEGIN > parse_predicates {:?}", input.span());
50        let (output, predicates) = delimited(
51            Token::OpenParen,
52            preceded(
53                Token::Predicates,
54                many0(delimited(
55                    Token::OpenParen,
56                    pair(id, TypedParameter::parse_typed_parameters),
57                    Token::CloseParen,
58                )),
59            ),
60            Token::CloseParen,
61        )(input)?;
62        let predicates = predicates
63            .into_iter()
64            .map(|(name, parameters)| TypedPredicate { name, parameters })
65            .collect();
66        log::debug!("END < parse_predicates {:?}", output.span());
67        Ok((output, predicates))
68    }
69
70    /// Convert the predicate to PDDL.
71    pub fn to_pddl(&self) -> String {
72        format!(
73            "({} {})",
74            self.name,
75            self.parameters
76                .iter()
77                .map(TypedParameter::to_pddl)
78                .collect::<Vec<_>>()
79                .join(" ")
80        )
81    }
82}