code: private Set<Function> chaseAtoms(Collection<Function> atoms) {
  
  		Set<Function> derivedAtoms = new HashSet<>();
  		for (Function fact : atoms) {
  			derivedAtoms.add(fact);
  			for (LinearInclusionDependency d : dependencies.get(fact.getFunctionSymbol())) {
  				CQIE rule = datalogFactory.getFreshCQIECopy(datalogFactory.getCQIE(d.getHead(), d.getBody()));
  				Function ruleBody = rule.getBody().get(0);
  				Substitution theta = unifierUtilities.getMGU(ruleBody, fact);
  				if (theta != null && !theta.isEmpty()) {
  					Function ruleHead = rule.getHead();
  					Function newFact = (Function)ruleHead.clone();
  					// unify to get fact is needed because the dependencies are not necessarily full
  					// (in other words, they may contain existentials in the head)
  					substitutionUtilities.applySubstitution(newFact, theta);
  					derivedAtoms.add(newFact);
  				}
  			}
  		}
  		return derivedAtoms;
  	}
docs: This method is used to chase foreign key constraint rule in which the rule
  has only one atom in the body.
  
  IMPORTANT: each rule is applied only ONCE to each atom
  
  @param atoms
  @return set of atoms