[−][src]Trait canrun::Query
Derive reified values potential resolved states.
Query is implemented for Goals
and
States
(and other types), meaning you can call
.query()
on them with any type that implements
ReifyIn for a matching Domain.
This is a convenient wrapper around the pattern of iterating over a sequence
of ResolvedStates
and calling
state.reify(query)
and returning only the
valid, fully resolved results. Query is implemented on a variety of
State
related types, allowing it to be used in many
contexts.
A blanket impl covers anything that implements IterResolved
, so many
types including Goal
and State
are
queryable.
Required methods
fn query<Q>(self, query: Q) -> Box<dyn Iterator<Item = Q::Reified> + 'a> where
Q: ReifyIn<'a, D> + 'a,
Q: ReifyIn<'a, D> + 'a,
Get reified results from an iterator of
ResolvedStates
.
Examples:
Goals
use canrun::{Goal, unify, var, State}; use canrun::domains::example::I32; let x = var(); let goal: Goal<I32> = unify(x, 1); let result: Vec<_> = goal.query(x).collect(); assert_eq!(result, vec![1])
States
use canrun::{State, IterResolved, Query, val, var}; use canrun::domains::example::I32; let x = var(); let state: State<I32> = State::new(); let result: Vec<_> = state.query(x).collect(); assert_eq!(result, vec![]) // Nothing has been added to the State
Option<State<D>>
Note that most of the lower level State
update methods
return an Option<State<D>>
. Since IterResolved
is implemented for
this type, Query is as well!
let state: Option<State<I32>> = State::new().unify(&val!(x), &val!(1)); let result: Vec<_> = state.query(x).collect(); assert_eq!(result, vec![1])