pddl_parser/domain/
predicate.rs

1use nom::multi::many0;
2use nom::sequence::{delimited, pair, preceded};
3use nom::IResult;
4use serde::{Deserialize, Serialize};
5
6use super::parameter::Parameter;
7use crate::error::ParserError;
8use crate::lexer::{Token, TokenStream};
9use crate::tokens::id;
10
11/// A predicate with parameters (untyped).
12#[derive(Debug, Deserialize, Serialize, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
13pub struct Predicate {
14    /// The name of the predicate.
15    pub name: String,
16    /// The parameters of the predicate.
17    #[serde(default)]
18    pub parameters: Vec<Parameter>,
19}
20
21impl Predicate {
22    /// Parse a list of functions from a token stream.
23    pub fn parse_predicates(input: TokenStream) -> IResult<TokenStream, Vec<Predicate>, ParserError> {
24        log::debug!("BEGIN > parse_predicates {:?}", input.span());
25        let (output, predicates) = delimited(
26            Token::OpenParen,
27            preceded(
28                Token::Predicates,
29                many0(delimited(
30                    Token::OpenParen,
31                    pair(id, Parameter::parse_parameters),
32                    Token::CloseParen,
33                )),
34            ),
35            Token::CloseParen,
36        )(input)?;
37        let predicates = predicates
38            .into_iter()
39            .map(|(name, parameters)| Predicate { name, parameters })
40            .collect();
41        log::debug!("END < parse_predicates {:?}", output.span());
42        Ok((output, predicates))
43    }
44
45    /// Convert the predicate to PDDL.
46    pub fn to_pddl(&self) -> String {
47        format!(
48            "({} {})",
49            self.name,
50            self.parameters
51                .iter()
52                .map(Parameter::to_pddl)
53                .collect::<Vec<_>>()
54                .join(" ")
55        )
56    }
57}