anchor.diff:  
     operator <=(DLTerm right) => new DLRule(this, right);
   
  -  operator ^(DLAtom right) => new DLAnd(this, right);
  +  operator ^(DLAtom right) => new DLAnd(new PSet.from([this, right]));
   
     Substitution unify(DLTerm b) {
       if (!(b is DLAtom && fact == b.fact && args.length == b.args.length)) return new Substitution.empty();
  
positive.code: 
  class DLRule {
    DLAtom left;
    DLTerm right;
  
    DLRule(this.left, this.right);
  
  
negative.code: }
  
  class DLAnd extends DLTerm {
    PSet<DLAtom> goals;
  
    DLAnd(this.goals);
  
    DLAnd.list(List<DLAtom> l) : this(new PSet.from(l));
  
    DLAnd subst(Substitution subst) => new DLAnd(new PSet.from(goals.map((x) => x.subst(subst))));
  
    bool get isGround => goals.every((x) => x.isGround);
  
    operator ^(DLAtom right) => new DLAnd(goals.insert(right));
  
    operator ==(dynamic o) => o is DLAnd && goals == o.goals;
  
    int get hashCode => goals.hashCode;
  
    String toString() => "${goals.join(" & ")}";
  }
  
  class DL {
  