public AllSubstitution sumUpTheta(AllSubstitution x, AllSubstitution y) {
    List<Substitution> newList = new LinkedList<Substitution>(x.SubstList);
    newList.addAll(y.SubstList);
    AllSubstitution newObj = new AllSubstitution();
    newObj.SubstList = newList;
    newObj.status = y.status;

    return newObj;
  }
  public AllSubstitution UNIFY(Predicate x, Predicate y, Sentence sent) {
    // 1. Find an array of substitutiion tsubstList
    // 2. Now the linked hashmap contains all the array of substitution.
    // 3. If 1 is contained in 2 then return false and delete from hash map
    // else add in the map.

    // This is the returned value.
    AllSubstitution tAllSubst = new AllSubstitution();
    // This is part of return value. This is part of tAllSubst.
    List<Substitution> tSubstList = new LinkedList<Substitution>();
    // Current subst.
    Substitution s = null;
    // Unification success or failure.
    // 1. Fails when same sentence comes with same substitution.
    boolean tStatus = false;

    boolean available = true;
    // Just make sure length of args of x and y are same. Also just check if they are same fnName.
    for (int i = 0; i < x.args.size(); i++) {
      // x and y both can be variable. I don't know what to do.
      if (isVariable(x, i)) {
        s = new Substitution(x.args.get(i), y.args.get(i));
        tStatus = true;
      }

      // x and y both can be variable. I don't know what to do.
      else if (isVariable(y, i)) {
        s = new Substitution(y.args.get(i), x.args.get(i));
        // tSubstList.add(s);
        tStatus = true;
      }

      // x and y both are not variables. Just make status as true.
      else if (x.args.get(i).equals(y.args.get(i))) {
        s = new Substitution(y.args.get(i), x.args.get(i));
        // tSubstList.add(s);
        tStatus = true;
      } else {
        s = null;
        tStatus = false;
        break;
      }

      /*
      for(int j=0; j<tlist.size();j++)
      {
      	Substitution tSub = tlist.get(j);
      	if(tSub!=null && tSub.var.equals(s.var) && tSub.val.equals(s.val))
      	{
      		tStatus = false;
      		available = true;
      		tlist.remove(j);
      		break;
      	}
      }
      */
      if (s != null) {
        tSubstList.add(s);
      }
      /*
      if(!available)
      {
      	tlist.add(s);
      }
      */
    }
    // AllSubstitution temp = new AllSubstitution();
    // temp.SubstList = tlist;

    // LinkedList<AllSubstitution> tglobalSubst = substList.get(x.fnName);
    // if(tglobalSubst == null)
    // tglobalSubst = new AllSubstitution();
    // List<Substitution> tlist=tglobalSubst.SubstList;

    // check tstatus is true or false. If false return.
    if (tStatus) {
      Map<String, String> temp = new HashMap<String, String>();
      //
      for (Substitution substitution : tSubstList) {

        String match = temp.get(substitution.var);
        if (match != null && !match.equals("") && !substitution.val.equals(match)) {
          tStatus = false;
          break;
        } else {
          temp.put(substitution.var, substitution.val);
        }
      }

      // now check if all elements of tSubstList are present in global hashmap.
      if (sent.allSubst == null || sent.allSubst.size() == 0) {
        if (sent.allSubst == null) {
          sent.allSubst = new LinkedList<AllSubstitution>();
        }
        tAllSubst.SubstList = tSubstList;
        tAllSubst.status = tStatus;
        if (sent.lhs.size() != 0) sent.allSubst.add(tAllSubst);
      } else {

        for (AllSubstitution lsubst : sent.allSubst) {
          available = true;
          for (int i = 0; i < tSubstList.size(); i++) {
            if (!tSubstList.get(i).var.equals(lsubst.SubstList.get(i).var)
                || !tSubstList.get(i).val.equals(lsubst.SubstList.get(i).val)) {
              available = false;
              break;
            }
          }
          if (available) {
            tStatus = false;
            // sent.allSubst.remove(lsubst);
            break;
          }
        }

        if (!available) {
          tAllSubst.SubstList = tSubstList;
          tAllSubst.status = tStatus;
          sent.allSubst.add(tAllSubst);
        }
      }
    } else {
      tAllSubst.SubstList = tSubstList;
      tAllSubst.status = tStatus;
    }
    return tAllSubst;
  }