anchor.diff:        }
       }
   
  -    yield* solutions(0, Map<Variable, Node>.identity());
  -  }
  -
  -  @override
  -  Node substitute(Map<Variable, Node> bindings) =>
  +    yield* solutions(0, newBindings());
  +  }
  +
  +  @override
  +  Conjunction substitute(Map<Variable, Node> bindings) =>
         Conjunction(arguments.map((arg) => arg.substitute(bindings)));
   
     @override
  
positive.code: }
  
  class Database {
    final List<Rule> rules = [];
    final Map<String, List<Rule>> terms = {};
  
    factory Database.parse(String rules) =>
        Database(rulesParser.parse(rules).value);
  
    Database(Iterable<Rule> rules) {
      rules.forEach(add);
    }
  
    add(Rule rule) {
      rules.add(rule);
      terms.putIfAbsent(rule.head.name, () => []).add(rule);
    }
  
    Stream<Node> query(Term goal) async* {
      final candidates = terms[goal.name];
      if (candidates != null) {
        for (final rule in candidates) {
          yield* rule.query(this, goal);
  
negative.code:   }
  
    @override
    Value substitute(Map<Variable, Node> bindings) => this;
  
    @override
    bool operator ==(Object other) => other is Value && name == other.name;
  