Skip to content

Domain queries

A top-level <query> defines an answer for a predicate. A query has one predicate and exactly one body form: implications, random selection, or enumeration.

<query predicate="greeting">
  <implication>
    <antecedent predicate="time_of_day" value="morning"/>
    <consequent predicate="greeting" value="good_morning"/>
  </implication>
  <implication>
    <antecedent predicate="time_of_day" value="evening"/>
    <consequent predicate="greeting" value="good_evening"/>
  </implication>
</query>
  • Implications: each antecedent may be one proposition or a configuration; all propositions in a configuration must hold. Define exhaustive cases for the expected state space.
  • Random selection: <select_at_random> contains individuals; consecutive calls may return the same individual.
  • Enumeration: <enumerate> returns individuals in declaration order and restarts after its final value. Set randomize="true" to randomize the order.

Choose a value at random; repeated calls may choose the same value:

<query predicate="direction">
  <select_at_random>
    <individual value="left"/>
    <individual value="right"/>
  </select_at_random>
</query>

Enumerate all declared values in sequence:

<query predicate="season_to_consider">
  <enumerate>
    <individual value="spring"/>
    <individual value="summer"/>
    <individual value="autumn"/>
    <individual value="winter"/>
  </enumerate>
</query>

To enumerate the same values in random order, set randomize="true" on enumerate. For implication bodies with multiple conditions, place all antecedent propositions inside one <antecedent>; every proposition must hold for that implication to match.

invoke_domain_query resolves a question through a matching domain query. Use reset_domain_query to restart an enumeration. has_more_items can test for remaining values.