# input: a Polar policy, a set of facts, and a query fact
fn evaluate(policy, facts, query):
  do {
    new_facts = {}
    for rule in policy.rules {
      new_facts += apply(facts, rule) - facts
    }
    facts += new_facts
  } while new_facts.is_not_empty()
  return facts.contains(query)