code: func (expr *Expr) Hash() int {
  	s := expr.Index
  	switch ts := expr.Terms.(type) {
  	case []*Term:
  		for _, t := range ts {
  			s += t.Value.Hash()
  		}
  	case *Term:
  		s += ts.Value.Hash()
  	}
  	if expr.Negated {
  		s++
  	}
  	for _, w := range expr.With {
  		s += w.Hash()
  	}
  	return s
  }
docs: // Hash returns the hash code of the Expr.