private ArrayList<ArrayList<String>> distributeAndOverOr(ArrayList<ArrayList<String>> work,  LinkedList<List<String>> dnfs)
	{
		
		if (work == null)
		{
			ArrayList<ArrayList<String>> nwork = new ArrayList<ArrayList<String>>();
			for (String sa : dnfs.get(0))
			{
				for (String sb : dnfs.get(1))
				{
					ArrayList<String> n = new ArrayList<String>();
					n.add(sa);
					n.add(sb);
					nwork.add(n);
				}
			}
			dnfs.removeFirst();
			dnfs.removeFirst();
			work = distributeAndOverOr(nwork, dnfs);
		}
		
		if (dnfs.size() > 0)
		{
			ArrayList<ArrayList<String>> nwork = new ArrayList<ArrayList<String>>();
			for (String sa : dnfs.get(0))
			{
				for (ArrayList<String> sb : work)
				{
					ArrayList<String> n = new ArrayList<String>();
					for (String s : sb)
					{
						n.add(s);
					}
					n.add(sa);
					nwork.add(n);
				}
			}
			dnfs.removeFirst();
			work = distributeAndOverOr(nwork,dnfs);
		}
		
		return work;
	}