docs: public SemanticDifference semanticDifference(Atom parentAtom, Unifier unifier) {
          Set<VariableDefinition> diff = new HashSet<>();
          ImmutableMap<Variable, Type> childVarTypeMap = this.getParentQuery().getVarTypeMap(false);
          ImmutableMap<Variable, Type> parentVarTypeMap = parentAtom.getParentQuery().getVarTypeMap(false);
          Unifier unifierInverse = unifier.inverse();
  
          unifier.mappings().forEach(m -> {
              Variable childVar = m.getKey();
              Variable parentVar = m.getValue();
              Type childType = childVarTypeMap.get(childVar);
              Type parentType = parentVarTypeMap.get(parentVar);
              Type type = childType != null ?
                      parentType != null ?
                              (!parentType.equals(childType) ? childType : null) :
                              childType
                      : null;
  
              Set<ValuePredicate> predicates = this.getPredicates(childVar, ValuePredicate.class).collect(toSet());
              parentAtom.getPredicates(parentVar, ValuePredicate.class)
                      .flatMap(vp -> vp.unify(unifierInverse).stream())
                      .forEach(predicates::remove);
  
              diff.add(new VariableDefinition(childVar, type, null, new HashSet<>(), predicates));
          });
          return new SemanticDifference(diff);
      }