class SymbolicAddressMap {

	public boolean isSubset(SymbolicAddressMap other) {
		if(other.isTop())       return true;
		else if(this.isTop())   return false;
		else if(other == null)  return false;
		/* Neither is \bot or \top -> pointwise subseteq */
		for(Location l : this.mapP.keySet()) {
			BoundedSet<SymbolicAddress> thisEntry = mapP.get(l);
			BoundedSet<SymbolicAddress> otherEntry = other.mapP.get(l);
			if(otherEntry == null) return false;
			if(! thisEntry.isSubset(otherEntry)) return false;
		}
		for(String l : this.mapA.keySet()) {
			BoundedSet<SymbolicAddress> thisEntry = mapP.get(l);
			BoundedSet<SymbolicAddress> otherEntry = other.mapP.get(l);
			if(otherEntry == null) return false;
			if(! thisEntry.isSubset(otherEntry)) return false;
		}
		return true;
	}

	public  SymbolicAddressMap(BoundedSetFactory<SymbolicAddress> bsFactory);
	private  SymbolicAddressMap(BoundedSetFactory<SymbolicAddress> bsFactory,
							   HashMap<Location,BoundedSet<SymbolicAddress>> initP,
							   HashMap<String,BoundedSet<SymbolicAddress>> initA);

}